多変量解析はこれまでやってきた「回帰分析」や「因子分析」の他に、代表的なものとして「主成分分析」があげられる。今回は番外編として「主成分分析」を行うこととした。
データは技術評論社のFirstBookシリーズ「多変量解析がわかる」1主成分分析のデータ(変量)を用いた。
> 数学<-c(71,34,58,41,69,64,16,59,57,46,23,39,46,52,39,23,37,52,63,39)
> 理科<-c(64,48,59,51,56,65,45,59,54,54,49,48,55,56,53,43,45,51,56,49)
> 社会<-c(83,67,78,70,74,82,63,78,84,71,64,71,68,82,78,63,67,74,79,73)
> 英語<-c(100,57,87,60,81,100,7,59,73,43,33,29,42,67,52,35,39,65,91,64)
> 国語<-c(71,68,66,72,66,71,59,62,72,62,70,66,61,60,72,59,70,69,70,60)
> テスト結果<-cbind(数学,理科,社会,英語,国語)
> テスト結果
数学 理科 社会 英語 国語
[1,] 71 64 83 100 71
[2,] 34 48 67 57 68
[3,] 58 59 78 87 66
[4,] 41 51 70 60 72
[5,] 69 56 74 81 66
[6,] 64 65 82 100 71
[7,] 16 45 63 7 59
[8,] 59 59 78 59 62
[9,] 57 54 84 73 72
[10,] 46 54 71 43 62
[11,] 23 49 64 33 70
[12,] 39 48 71 29 66
[13,] 46 55 68 42 61
[14,] 52 56 82 67 60
[15,] 39 53 78 52 72
[16,] 23 43 63 35 59
[17,] 37 45 67 39 70
[18,] 52 51 74 65 69
[19,] 63 56 79 91 70
[20,] 39 49 73 64 60
第一主成分を求める
数学、理科、社会、英語、国語の各変量をx、y、u、v、wとするとき、合成変量p (p=ax+by+cu+dv+ew) が最大の分散値をもつときのpを第一主成分という。ただし、定数a~eはa2+b2+c2+d2+e2=1とする。
まずは、主成分負荷量を求める。下に示す固有値と固有値ベクトルのうち固有値ベクトルの値が主成分負荷量となる。
> テスト結果の共分散行列<-var(テスト結果)
> 主成分負荷量<-eigen(テスト結果の共分散行列)
> 主成分負荷量
eigen() decomposition
$values
[1] 888.895169 46.194367 17.903350 12.371821 6.906346
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] 0.49151300 0.7559881 0.10647703 0.39445342 -0.1413013
[2,] 0.17305310 0.2378355 -0.01310165 -0.34925878 0.8895693
[3,] 0.19588597 0.1986404 0.22761783 -0.83516616 -0.4157623
[4,] 0.82781535 -0.5257361 -0.19384988 0.02333993 -0.0141702
[5,] 0.06941201 -0.2367695 0.94821060 0.15613309 0.1250652
第一主成分から第5主成分までが求められたがまずは第一主成分から見てみる。
- 第一主成分p=+0.49x+0.17y+0.20u+0.83v+0.07w
上に記した第一主成分の主成分負荷量(係数)は総て正の値になっているので、この第一主成分pは各変量を総合的に加え合わせたもの
「総合学習力」を表していると解釈できる。
この総合学習力は、英語(v)にかかる係数が0.83と最大なので、英語がこのデータを特徴づける「目立つ」存在である。
つまり、英語の点数が少し異なるだけで、主成分が大きく異なることを意味する。
実際に主成分得点をみて確認してみる。
> 第一成分の負荷量<-主成分負荷量$vectors[,1]
> 第一成分の負荷量行列<-matrix(rep(第一成分の負荷量,20),nrow=20,ncol=5,byrow=TRUE)
> 合成p<-rowSums(第一成分の負荷量行列*テスト結果)
> 合成p
[1] 149.94114 90.04784 130.59812 97.35634 129.73517 146.47772 37.88243
[8] 107.63316 119.24371 85.76197 64.49785 69.97130 84.45014 110.94065
[15] 91.66399 64.15574 76.24137 107.47737 136.32132 99.09319
例えば、出席番号の2番と10番の成績をみてみると、合計得点では10番の得点が高いが、英語では2番のほうが高いため、主成分得点は、2番のほうが高くなっている。
出席番号 | 英語(v) | 合計点 | 主成分得点 |
2 | 57 | 274 | 90 |
10 | 43 | 276 | 86 |
では、この第一主成分はどれだけどれだけデータの特性を示しているのか?
資料全体の分散に占める主成分の分散の割合(寄与率)について求める。
> 数学の分散<-mean((数学-mean(数学))^2)
> 理科の分散<-mean((理科-mean(理科))^2)
> 社会の分散<-mean((社会-mean(社会))^2)
> 英語の分散<-mean((英語-mean(英語))^2)
> 国語の分散<-mean((国語-mean(国語))^2)
> 五教科分散計<-数学の分散+理科の分散+社会の分散+英語の分散+国語の分散
> 五教科分散計
[1] 923.6575
> 合成pの分散<-mean((合成p-mean(合成p))^2)
> 合成pの分散
[1] 844.4504
> 第一寄与率<-合成pの分散/五教科分散計
> 第一寄与率
[1] 0.9142463
このデータのもつ91%の分散を第一主成分が表している。
第二主成分を求める
第一主成分が取りこぼした情報に、第二主成分があると考えられるので、第二主成分の変量をx'、y'、u'、v'、w'とするとき、
x'-x-ap、 y'-y-ap、 u'-u-ap、 v'-v-ap、 w'-w-apが成り立つ。
> 第二変量<-cbind(数学,理科,社会,英語,国語)-(第一成分の負荷量行列*matrix(rep(合成p,20),nrow=20,ncol=5,byrow=FALSE))
> 第二変量
数学 理科 社会 英語 国語
[1,] -2.6980222 38.05222 53.62863 -24.12358 60.59228
[2,] -10.2596853 32.41694 49.36089 -17.54299 61.74960
[3,] -6.1906744 36.39959 52.41766 -21.11113 56.93492
[4,] -6.8519092 34.15218 50.92926 -20.59308 65.24230
[5,] 5.2334779 33.54893 48.58670 -26.39676 56.99482
[6,] -7.9957043 39.65158 53.30707 -21.25651 60.83269
[7,] -2.6197066 38.44433 55.57936 -24.35966 56.37050
[8,] 6.0969045 40.37375 56.91617 -30.10038 54.52897
[9,] -1.6098364 33.36451 60.64183 -25.71178 63.72305
[10,] 3.8468748 39.15862 54.20043 -27.99508 56.04709
[11,] -8.7015319 37.83845 51.36578 -20.39231 65.52307
[12,] 4.6081976 35.89125 57.29360 -28.92331 61.14315
[13,] 4.4916573 40.38564 51.45740 -27.90912 55.13815
[14,] -2.5287710 36.80138 60.26828 -24.83837 52.29939
[15,] -6.0540428 37.13726 60.04431 -23.88086 65.63742
[16,] -8.5333824 31.89765 50.43279 -18.10911 54.54682
[17,] -0.4736245 31.80619 52.06539 -24.11378 64.70793
[18,] -0.8265259 32.40071 52.94669 -23.97142 61.53978
[19,] -4.0037021 32.40917 52.29657 -21.84888 60.53766
[20,] -9.7055902 31.85162 53.58903 -18.03086 53.12174
ここから、先ほどと同様に合成変量qの分散値が最大になる第二主成分を求めればよい。
求め方は第一主成分のときと同じであり、先ほど第五主成分までの負荷量を求めていたので、今回はその中から第二主成分の負荷量のみを抽出して以下に示す。
> 第二成分の負荷量<-主成分負荷量$vectors[,2]
> 第二成分の負荷量
[1] 0.7559881 0.2378355 0.1986404 -0.5257361 -0.2367695
- 第二主成分q=0.76x'+0.24y'+0.20u'-0.53v'-0.24w'
負荷量(係数)を見ると、数学x'、理科y'、社会u'が正の値で、英語v'、国語w'が負の値になっている。
つまり、「理系・文系」の違いを表していると解釈できる。社会が正の値なのは、社会は理系的な能力に近いとも考えられる。
先ほどと同じように主成分得点と寄与率を見てみる。
> 第二成分の負荷量行列<-matrix(rep(第二成分の負荷量,20),nrow=20,ncol=5,byrow=TRUE)
> 合成q<-rowSums(第二成分の負荷量行列*第二変量)
> 合成q
[1] 15.999547 4.361331 12.007738 8.438389 21.969955 10.746825 17.663205
[8] 28.431414 17.194103 24.435685 7.831502 24.129982 24.840104 19.488202
[15] 13.197096 7.758841 14.905499 15.630448 12.222790 7.784952
> 合成qの分散<-mean((合成q-mean(合成q))^2)
> 合成qの分散
[1] 43.88465
> 第二寄与率<-合成qの分散/五教科分散計
> 第二寄与率
[1] 0.0475118
第二主成分の寄与率は5%となった。
ここまで求めた、第一主成分と第二主成分の合計は、データ全体の情報をどれくらい説明しているのだろうか。
累積寄与率を求めてみる。
> 累積寄与率<-第一寄与率+第二寄与率
> 累積寄与率
[1] 0.9617581
全体の96%をカバーしているので、第二主成分まで調べれば十分であることがわかる。
分析結果の可視化
- 変量を主成分から評価する変量プロット
> plot(第一成分の負荷量,第二成分の負荷量,type="n",main="変量を主成分から評価する変量プロット")
> ラベル<-rep(c("数学X","理科Y","社会U","英語V","国語W"))
> text(第一成分の負荷量,第二成分の負荷量,ラベル)

- 個体を主成分から評価する主成分得点プロット
> plot(合成p,合成q,type="n",main="個体を主成分から評価する主成分得点プロット")
> text(合成p,合成q)

Rの関数による主成分分析
関数のprincomp()は固有値分解による主成分分析結果を以下に示す。
なお、この関数に引数にcor=を指定することで、相関行列を使うのか、共分散行列を使うのかを指定できる。
> 主成分結果<-princomp(テスト結果,cor=FALSE)
> summary(主成分結果,loadings=TRUE,cutoff=0)
Importance of components:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
Standard deviation 29.0594289 6.62454895 4.12409778 3.42829844 2.561450450
Proportion of Variance 0.9142463 0.04751182 0.01841395 0.01272466 0.007103313
Cumulative Proportion 0.9142463 0.96175807 0.98017202 0.99289669 1.000000000
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
数学 -0.492 0.756 0.106 0.394 -0.141
理科 -0.173 0.238 -0.013 -0.349 0.890
社会 -0.196 0.199 0.228 -0.835 -0.416
英語 -0.828 -0.526 -0.194 0.023 -0.014
国語 -0.069 -0.237 0.948 0.156 0.125
寄与率(Proportion of Variance)は第一主成分で91%、第二主成分で5%と先ほどと同じ値になっている。
累積寄与率(Cumulative Proportion)も第二主成分までで96%と先ほどと同じである。
次に、主成分得点がLoadings:以下に書かれているのでみると、先ほどの値とことなる。これは、自動で標準化して表示されていたからである。
したがって、先ほどの主成分負荷量も標準化すると上の値と同じになる。
> 標準化テスト結果<-scale(テスト結果)
> テスト結果の共分散行列<-var(標準化テスト結果)
> 主成分負荷量<-eigen(テスト結果の共分散行列)
> 主成分負荷量
eigen() decomposition
$values
[1] 3.69050152 0.84049352 0.19677733 0.17276561 0.09946201
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4925486 0.16871789 -0.26376350 -0.1417407 0.79954272
[2,] -0.4752247 0.23539394 -0.16956743 0.7894418 -0.25841784
[3,] -0.4776488 0.10486747 0.85618882 -0.1549984 -0.06140568
[4,] -0.4898071 -0.01089277 -0.41049896 -0.5542911 -0.53312502
[5,] -0.2519882 -0.95131915 0.01034465 0.1594618 0.07719273
最後に、散布図を示す。
このbiplot()関数を使うと、関連ある2セットの散布図を描くことができる。今回は、主成分と主成分得点を同じ画面上示している。
biplot(主成分結果)

スケールが先ほどと異なるのは標準化の違いの他に、主成分・主成分得点の正・負の符号が逆になることがある。これは、固有値・固有値ベクトルを求めるアルゴリズムに依存するためである。主成分分析では、変数間・個体間の相対的な関係を分析するので問題ない。
実際の事例として、主成分得点の場合を以下に示す。
- 関数 princomp()を用いた場合の主成分得点(自動で平均のみ標準化されている)
> 主成分結果$scores[,1:2]
Comp.1 Comp.2
[1,] -49.9666177 0.5476662
[2,] 9.9266846 -11.0905498
[3,] -30.6235937 -3.4441428
[4,] 2.6181823 -7.0134912
[5,] -29.7606415 6.5180747
[6,] -46.5031938 -4.7050556
[7,] 62.0920974 2.2113247
[8,] -7.6586289 12.9795333
[9,] -19.2691882 1.7422224
[10,] 14.2125530 8.9838043
[11,] 35.4766768 -7.6203780
[12,] 30.0032295 8.6781017
[13,] 15.5243852 9.3882241
[14,] -10.9661212 4.0363220
[15,] 8.3105371 -2.2547843
[16,] 35.8187827 -7.6930397
[17,] 23.7331571 -0.5463815
[18,] -7.5028454 0.1785679
[19,] -36.3467948 -3.2290905
[20,] 0.8813393 -7.6669279
- 先の値を上記と同じく平均のみ標準化
> 標準化合成p<-scale(合成p,scale=FALSE)
> 標準化合成q<-scale(合成q,scale=FALSE)
> 主成分結果<-cbind(標準化合成p,標準化合成q)
> 主成分結果
[,1] [,2]
[1,] 49.9666177 0.5476662
[2,] -9.9266846 -11.0905498
[3,] 30.6235937 -3.4441428
[4,] -2.6181823 -7.0134912
[5,] 29.7606415 6.5180747
[6,] 46.5031938 -4.7050556
[7,] -62.0920974 2.2113247
[8,] 7.6586289 12.9795333
[9,] 19.2691882 1.7422224
[10,] -14.2125530 8.9838043
[11,] -35.4766768 -7.6203780
[12,] -30.0032295 8.6781017
[13,] -15.5243852 9.3882241
[14,] 10.9661212 4.0363220
[15,] -8.3105371 -2.2547843
[16,] -35.8187827 -7.6930397
[17,] -23.7331571 -0.5463815
[18,] 7.5028454 0.1785679
[19,] 36.3467948 -3.2290905
[20,] -0.8813393 -7.6669279
このように、第一主成分の主成分得点だけ、正・負の符号が逆になっている。
- 涌井良幸ら (2011): 多変量解析がわかる: 多変量解析の入門書として最適具体的な例や図が豊富でわかりやすい!. 技術評論社, 東京, p.269. http://gihyo.jp/book/2011/978-4-7741-4639-3