【Rによるデータサイエンス】主成分分析 ケーススタディ
「【Rによるデータサイエンス】主成分分析」の続き。
理論的な背景を理解したので、書籍に記載のある丘本円周の例を手を動かして実践してみる。
1.丘本演習の円周データをtempに作成する。
temp<-c( 50, 57, 74, 94, 112, 128, 140, 147, 150, 147, 140, 128, 112, 94, 74, 57, 57, 50, 57, 74, 94, 112, 128, 140, 147, 150, 147, 140, 128, 112, 94, 74, 74, 57, 50, 57, 74, 94, 112, 128, 140, 147, 150, 147, 140, 128, 112, 94, 94, 74, 57, 50, 57, 74, 94, 112, 128, 140, 147, 150, 147, 140, 128, 112, 112, 94, 74, 57, 50, 57, 74, 94, 112, 128, 140, 147, 150, 147, 140, 128) > temp [1] 50 57 74 94 112 128 140 147 150 147 140 128 112 94 74 57 57 50 [19] 57 74 94 112 128 140 147 150 147 140 128 112 94 74 74 57 50 57 [37] 74 94 112 128 140 147 150 147 140 128 112 94 94 74 57 50 57 74 [55] 94 112 128 140 147 150 147 140 128 112 112 94 74 57 50 57 74 94 [73] 112 128 140 147 150 147 140 128
2.tempを行列データに変換する
16行5列の行列に変換する。行方向に順番にデータを格納していくため、byrow=Fを指定する。
> okamoto<-matrix(temp,16,5,byrow=F) > colnames(okamoto)<-c("A","B","C","D","E") > okamoto A B C D E [1,] 50 57 74 94 112 [2,] 57 50 57 74 94 [3,] 74 57 50 57 74
3.主成分分析を実施する
主成分分析(Principal Component Analysis)の実施には、princomp関数を使用する。
主成分分析には、主成分得点の分散を最大にする考えに基づいて分散共分散行列の固有値問題に帰着する考え方と、相関係数行列の固有値問題に帰着する考え方がある。
今回は、分散共分散行列の固有値問題に帰着させるため、princomp関数のcor引数にはFALSEを指定する。
> oka.pc<-princomp(okamoto,cor=FALSE) > summary(oka.pc) Importance of components: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Standard deviation 65.8425316 39.5193986 3.714615982 1.2617966279 2.960714e-01 Proportion of Variance 0.7332328 0.2641493 0.002333763 0.0002692822 1.482593e-05 Cumulative Proportion 0.7332328 0.9973821 0.999715892 0.9999851741 1.000000e+00
累積寄与率(Cumulative Proportion)を見ると、第2主成分までで99.7%の情報を集約出来ているので、それ以降は無視する。
3.主成分を求める
主成分(固有ベクトル)は、主成分分析結果の$loadingsに格納される。
> oka.pc$loadings Loadings: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 A -0.365 0.620 0.584 -0.340 -0.162 B -0.481 0.340 -0.164 0.620 0.492 C -0.521 -0.514 -0.681 D -0.481 -0.340 -0.164 -0.620 0.492 E -0.365 -0.620 0.584 0.340 -0.162 Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 SS loadings 1.0 1.0 1.0 1.0 1.0 Proportion Var 0.2 0.2 0.2 0.2 0.2 Cumulative Var 0.2 0.4 0.6 0.8 1.0
ここで、主成分(固有ベクトル)は、観測データの分散共分散行列の固有値問題を解いて得られる固有ベクトルなので、それを確認する。
まず、観測データ(okamoto)の分散共分散行列を求める。分散共分散行列は関数varを使用して求められる。
> okaCorVar<-var(okamoto) > okaCorVar A B C D E A 1261.33333 1160.0000 875.3333 458.6667 -20.26667 B 1160.00000 1261.3333 1160.0000 875.3333 458.66667 C 875.33333 1160.0000 1261.3333 1160.0000 875.33333 D 458.66667 875.3333 1160.0000 1261.3333 1160.00000 E -20.26667 458.6667 875.3333 1160.0000 1261.33333
次に求めた分散共分散行列の固有値問題を解いて、観測データの分散共分散行列の固有ベクトル(主成分)を求める。
固有値問題は関数eigen()を使用して解くことができる。
> eigen(okaCorVar) $values [1] 4.624255e+03 1.665902e+03 1.471826e+01 1.698273e+00 9.350218e-02 $vectors [,1] [,2] [,3] [,4] [,5] [1,] -0.3648367 6.201120e-01 0.5837693 -3.397958e-01 -0.1615786 [2,] -0.4805596 3.397958e-01 -0.1641399 6.201120e-01 0.4920575 [3,] -0.5214531 -8.326673e-17 -0.5143375 1.877387e-13 -0.6808404 [4,] -0.4805596 -3.397958e-01 -0.1641399 -6.201120e-01 0.4920575 [5,] -0.3648367 -6.201120e-01 0.5837693 3.397958e-01 -0.1615786
これと、主成分分析関数princomp()によって求めた主成分の値は確かに一致している。
> eigen(var(okamoto))$vectors [,1] [,2] [,3] [,4] [,5] [1,] -0.3648367 6.201120e-01 0.5837693 -3.397958e-01 -0.1615786 [2,] -0.4805596 3.397958e-01 -0.1641399 6.201120e-01 0.4920575 [3,] -0.5214531 -8.326673e-17 -0.5143375 1.877387e-13 -0.6808404 [4,] -0.4805596 -3.397958e-01 -0.1641399 -6.201120e-01 0.4920575 [5,] -0.3648367 -6.201120e-01 0.5837693 3.397958e-01 -0.1615786 > oka.pc$loadings Loadings: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 A -0.365 0.620 0.584 -0.340 -0.162 B -0.481 0.340 -0.164 0.620 0.492 C -0.521 -0.514 -0.681 D -0.481 -0.340 -0.164 -0.620 0.492 E -0.365 -0.620 0.584 0.340 -0.162
4.観測データの分散共分散行列の固有ベクトル(主成分)と主成分得点を可視化する
Rで主成分と主成分得点を同じ散布図に可視化するバイプロット関数(biplot)を使用する。
> biplot(princomp(okamoto))
このように可視化は簡単にできる。
ただ、観測データの分散共分散行列の固有値問題を解いて得られた、固有ベクトル(主成分)の散布図って何だろう・・・。そして、それが丘本円周データの点A,B,C,D,Eに相当する理由がわからない。。。
また、主成分得点の散布図とは何だろう・・・。そして、それが16個の円周上のデータに相当する理由もわからない。。。
あとで考えておく。