目次

課題2

今回のお題

Rのための準備

今回はgamパッケージとMASSパッケージという二つのパッケージの中の関数を用いるので,それらをインストールしておく. 下記の一行で実行できる.

install.packages(c("gam", "MASS"), dependencies = TRUE)

これが実行できない場合には,プロキシの設定を試してみるといい. その1の方が簡単なので,そちらから試すことをお勧めする.

データファイルの読み込み

このファイルをダウンロードし,中の「ticdata2000-with-headers.csv」というファイルを保存すること.

まずR上で

dummy <- rnorm(10, mean=0, sd=1)
dump("dummy")

の2行を実行してから,Windows,Mac,あるいはLinuxで「dumpdata.R」というファイルを探してみると良い.そのファイルが見つかった場所が,Rにとっての「ホームフォルダ」であり,そこに上のファイルを置けば,読み込みは完了する.

うまく保存されれば,次の1行がエラー表示なしに実行完了できる.

# データの読み込み
tic <- read.table("ticdata2000-with-headers.csv", header=T, sep=",")

上の一行の実行時にエラーが表示されるのは,例えば

などの状況が考えられる.フォルダを指定して読み込む場合,Windowsでも

tic <- read.table("c:/Users/DMB/ticdata2000-with-headers.csv", header=T, sep=",")

などと,フォルダ名の区切り文字を「¥」ではなく「/」を用いること.

事前加工

今回の課題には,このデータから13個のフィールドのみを用いる.以下の3行で,上のデータから部分データを切り出す. レコード数は全レコードを用いる.

# 13 個の変数のみ切り出す
tic.sub <- matrix(c(tic$V86, tic$V04, tic$V44, tic$V47, tic$V57,
                    tic$V58, tic$V59, tic$V76, tic$V78, tic$V79,
                    tic$V80, tic$V81, tic$V82), ncol=13)
colnames(tic.sub) <- c("V86", "V04", "V44", "V47", "V57",
                       "V58", "V59", "V76", "V78", "V79",
                       "V80", "V81", "V82")
tic.sub <- data.frame(tic.sub)

フィールド数とレコード数の確認.

dim(tic.sub)

事前解析

# 契約成功例を見る
table(tic.sub$V86)
hist(tic$V86)
# 成功割合を出す
mean(tic$V86)
# その他の変数について, 各変数ごとの平均を算出する( 小数点3 桁まで)
round(apply(tic.sub, 2, mean),3)
# 散布図行列を描く
pairs(tic.sub)
# 相関係数行列も計算する( 小数点2 桁まで)
round(cor(tic.sub),2)

重回帰分析による線形判別関数の学習

# 重回帰分析による線形判別関数の学習
tic.lm <- lm(V86~., data=tic.sub)
# 学習結果のパラメータを見る
summary(tic.lm)
# 元の学習用のV86 と学習結果に基づく予測結果とを、比較するために散布図とヒストグラムを描く
plot(tic.sub$V86, predict(tic.lm))
hist(predict(tic.lm)[tic.sub$V86==0])
hist(predict(tic.lm)[tic.sub$V86==1])
# 学習用データにおける誤判別数、誤判別率を検討するために、クロス集計も行う。
table(tic.sub$V86, 1*(predict(tic.lm)>0.5))
summary(tic.lm)の出力の読み方
Call:
lm(formula = V86 ~ ., data = tic.sub)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.58156 -0.08172 -0.05578 -0.00842  0.99657 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.001566   0.012368  -0.127 0.899216    
V04          0.002496   0.003737   0.668 0.504115    
V44          0.013748   0.003783   3.634 0.000282 ***
V47          0.010471   0.001069   9.797  < 2e-16 ***
V57          0.216507   0.079359   2.728 0.006387 ** 
V58          0.062955   0.025554   2.464 0.013783 *  
V59          0.013284   0.003304   4.021 5.86e-05 ***
V76          0.006850   0.008227   0.833 0.405118    
V78         -0.447549   0.189817  -2.358 0.018417 *  
V79         -0.234240   0.124002  -1.889 0.058941 .  
V80         -0.026739   0.011248  -2.377 0.017473 *  
V81          0.174599   0.134497   1.298 0.194284    
V82          0.287817   0.037417   7.692 1.69e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 0.2319 on 5809 degrees of freedom
Multiple R-squared: 0.04554,	Adjusted R-squared: 0.04357 
F-statistic:  23.1 on 12 and 5809 DF,  p-value: < 2.2e-16 
Calllm関数の呼び出され方
Residuals残差:最小値(Min),下側25%値(1Q),中央値(Median),上側25%点(3Q),最大値(Max)
Coefficients学習機械のパラメータ
Estimate推定値(学習結果)
Std. Error標準誤差(このパラメータの推定精度)
t valuet値(このパラメータが0という帰無仮説の検定統計量)
Pr(>.t.)P値(t値による検定の結果,0.05以下なら5%有意)
Residual standard error残差の標準偏差
degrees of freedom自由度
Multiple R-squared決定係数(重相関係数)
Adjusted R-squared自由度調整済み決定係数(重相関係数)
F-statisticF統計量(モデルのパラメータがすべて0かどうかの検定統計量)
p-valueF検定のP値(この数値が0.05以下なら,モデルは5%有意)

ロジスティック判別による線形判別関数の学習

# ロジスティック判別による線形判別関数の学習
tic.glm <- glm(V86~., data=tic.sub, family="binomial")
# 学習結果のパラメータを見る
summary(tic.glm)
# 元の学習用のV86と学習結果に基づく予測結果とを、比較するために散布図とヒストグラムを描く
plot(tic.sub$V86, predict(tic.glm))
hist(predict(tic.glm)[tic.sub$V86==0])
hist(predict(tic.glm)[tic.sub$V86==1])
# 学習用データにおける誤判別数、誤判別率を検討するために、クロス集計も行う。
table(tic.sub$V86, 1*(predict(tic.glm)>0))
Call:
glm(formula = V86 ~ ., family = "binomial", data = tic.sub)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.2943  -0.3842  -0.2873  -0.1897   2.8694  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -4.19384    0.25711 -16.311  < 2e-16 ***
V04          0.04677    0.07068   0.662 0.508154    
V44          0.25313    0.07146   3.542 0.000397 ***
V47          0.22086    0.02391   9.236  < 2e-16 ***
V57          1.48875    0.96677   1.540 0.123579    
V58          0.80334    0.56350   1.426 0.153972    
V59          0.21470    0.06186   3.471 0.000519 ***
V76          0.04504    0.11491   0.392 0.695051    
V78         -3.17157    2.55699  -1.240 0.214845    
V79         -3.43632    3.29457  -1.043 0.296936    
V80         -0.47634    0.24686  -1.930 0.053657 .  
V81          1.37207    1.36816   1.003 0.315928    
V82          1.99639    0.36271   5.504 3.71e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2635.5  on 5821  degrees of freedom
Residual deviance: 2408.5  on 5809  degrees of freedom
AIC: 2434.5

Number of Fisher Scoring iterations: 6

ほとんど結果の読み方は一緒.違うのは

Null devianceNullデビアンス
Residual deviance残差のデビアンス
AIC赤池情報量基準

の3つで,最初の二つは 

anova(tic.glm)
aov(tic.glm)

などのように,分散分析を行う際に用いる. AICは,この数値が一番小さくなるように,変数の組み合わせを選ぶのに用いる.

今回は今の変数セットのまま,進む.

フィッシャーの線形判別分析による線形判別関数の学習

# フィッシャーの線形判別分析による線形判別関数の学習
# MASSパッケージを読み込ませる
library(MASS)
tic.lda <- lda(V86~., data=tic.sub)
# 学習結果のパラメータを見る
tic.lda
# 元の学習用のV86と学習結果に基づく予測結果とを、比較するために散布図とヒストグラムを描く
plot(tic.sub$V86, predict(tic.lda)$x)
plot(tic.lda)
# 学習用データにおける誤判別数、誤判別率を検討するために、クロス集計も行う。
table(tic.sub$V86, 1*(predict(tic.lda)$x>0))
結果の読み方
Call:
lda(V86 ~ ., data = tic.sub)

Prior probabilities of groups:
         0          1 
0.94022673 0.05977327 

Group means:
       V04       V44      V47        V57        V58      V59        V76         V78
0 2.990318 0.7478992 2.859335 0.01333577 0.02064304 1.782974 0.07307271 0.005845817
1 3.005747 1.1379310 4.718391 0.04597701 0.06896552 2.531609 0.13218391 0.017241379
          V79       V80          V81         V82
0 0.004201681 0.5613811 0.0003653635 0.003836317
1 0.011494253 0.7068966 0.0028735632 0.040229885

Coefficients of linear discriminants:
            LD1
V04  0.05050244
V44  0.27811236
V47  0.21182486
V57  4.37978016
V58  1.27352740
V59  0.26873381
V76  0.13856260
V78 -9.05361744
V79 -4.73850831
V80 -0.54091586
V81  3.53202496
V82  5.82235211
Prior probabilities of groups各群の事前の出現確率(指定していなければ学習用データ中の比率)
Group means各フィールドの群別の平均
Coefficients of linear discriminants線形判別関数のパラメータ

一般化加法モデル(正規分布)による学習

# gamパッケージを読み込ませる
library(gam)
tic.am <- gam(V86~s(V04)+s(V44)+s(V47)+s(V57)+s(V58)+s(V59)+s(V76)+s(V78)+s(V79)+s(V80)+s(V81)+s(V82),
              data=tic.sub, family="gaussian")

これでは次のようなエラーが表示される.

Error in gam.match(data) : 
  A smoothing variable encountered with 3 or less unique values; at least 4 needed

散布図行列を参考に,V57,V78,V79,V81,V82などからs()という関数を取り除く必要がある.

tic.am <- gam(V86~s(V04)+s(V44)+s(V47)+V57+s(V58)+s(V59)+s(V76)+V78+V79+s(V80)+V81+V82,
              data=tic.sub, family="gaussian")

学習結果は

summary(tic.am)

win.graph()
par(mfrow=c(3,4))
plot(tic.am)

とで表示できる.

一般化加法モデル(ロジスティック回帰)による学習

library(gam)
tic.gam <- gam(V86~s(V04)+s(V44)+s(V47)+s(V57)+s(V58)+s(V59)+s(V76)+s(V78)+s(V79)+s(V80)+s(V81)+s(V82),
              data=tic.sub, family="binomial")

こちらもエラーが表示されるので,

散布図行列を参考に,V57,V78,V79,V81,V82などからs()という関数を取り除く必要がある.

tic.gam <- gam(V86~s(V04)+s(V44)+s(V47)+V57+s(V58)+s(V59)+s(V76)+V78+V79+s(V80)+V81+V82,
              data=tic.sub, family="binomial")

学習結果は

summary(tic.am)

win.graph()
par(mfrow=c(3,4))
plot(tic.am)

とで表示できる.