Rで主成分分析
おそらく今年最後のR入門記録記事です。
今回は下記のような五教科の点数を個人ごとに記録したデータを使います。
(実際のデータ量はもっと多いです)
> csv kokugo syakai suugaku rika eigo 1 35 24 4 10 43 2 39 74 30 43 61 3 70 94 33 33 85 4 49 42 33 22 88 5 7 8 13 5 33 6 24 56 24 10 62 7 57 74 36 43 87
それぞれのデータについて平均を引いて標準偏差で割った値を用いて、princomp を用いて分析を行います(引数cor=FALSEの場合)
> pc = princomp(~kokugo+syakai+rika+suugaku+eigo, data=csv) > pc Call: princomp(formula = ~kokugo + syakai + rika + suugaku + eigo, data = csv) Standard deviations: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 1.8781853 0.7837910 0.6922202 0.5242323 0.3226508 5 variables and 28 observations.
ここでのstandard deviationsは固有値を表す。(二乗すると固有値になる)
固有ベクトルは
> unclass(loadings(pc)) Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 kokugo -0.4198966 0.70995590 0.1388390 0.4041950 -0.3701346 syakai -0.4718859 0.26678238 0.3007108 -0.6091145 0.4946750 rika -0.4164392 -0.54803399 0.5499553 0.4560857 0.1255873 suugaku -0.4797564 -0.34643834 -0.2123652 -0.4176329 -0.6559710 eigo -0.4443227 -0.06655078 -0.7367136 0.2883999 0.4150022
固有値は
> pc$sd^2 Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 3.5275799 0.6143283 0.4791688 0.2748195 0.1041036
で表されるため、固有値の総和のうちの割合である寄与率を計算すると
> pc$sd^2/sum(pc$sd^2) Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 0.70551599 0.12286565 0.09583376 0.05496389 0.02082071
したがって、Comp.1, Comp.2 を持つデータを主成分であると判断できる。
この時の固有ベクトルは、Comp.1 に対してはすべてマイナスの0.4程度。これらは総合的な点数を表していると解釈できます。また、Comp.2 に対しては、国語と社会、理科と数学、で明らかにプラスとマイナスが分かれているのでこれは理系科目・文系科目の指標と言えます。
主成分スコアはデータと、固有ベクトルの積なので、
> a = data.matrix(csv) > b = data.matrix(unclass(loadings(pc))[,1:2]) > a %*% b Comp.1 Comp.2 [1,] 2.8477916 0.87904740 [2,] -1.0166761 -0.68571105 [3,] -2.4577717 0.86931935 [4,] -0.4767560 -0.32676212
これらに基づいてプロットすると
> plot(a %*% b) > grid(10,10)
最も右下に位置したデータは5番目のデータで、性質上理系科目が強く現れていることを示します。
なお、この分析結果をbiplotを使って描画すると下記のように示されますが、データの軸がすべて出てしまっていて、どの成分が・・・というのはちょっとよくわからないです。(不勉強だから)...これは実際は5次元のデータなんだよね・・・