因子分析とは
因子分析では複雑な現象を単純な要因で理解するための手法。集められた個別のデータは結果である目的変数とその目的変数の原因である説明変数に分かれる。目的変数を観察できた結果とし、目的変数に影響を与えている見えない説明変数を見つけるのが因子分析である。
目的変数が複雑であっても因子分析により説明変数が単純化されるのでデータの取り回しが楽になる。
各目的変数は共通因子Fとそれぞれの変数に特定である独自因子からなりたつとする。このとき共通因子Fの各目的変数に対する影響の大きさを因子負荷量で表す。
X = a * F + Ex
国語、数学、英語、社会、理科の点数を文系・理系因子で説明するのは因子分析の例である。また人の性格を血液型で説明する方法もある。
因子分析の手順
因子分析は下記の手順で進められる
- データの前処理および因子分析可能性(相関係数)
- パラメータの計算(因子数)
- 因子分析の実行
- 検証
- バリマックス展開
1因子モデルの分析
Rで提供されているirisを使って1因子モデルの分析をしてみる。
正規分布を検証する
ヒストグラムとボックスプロットを使ってデータに偏りがないかを検証する。
hist(unlist(iris[1]))
データはおおむね真ん中に集まりはじに行くほど少なくなっている。
ボックスプロットで外れ値を見てみる。
上記からも大きな外れ値はない。よって正規分布と仮定できる。
すべての変数について検証をする。
相関を検証する
まず因子分析が有効であるかを相関係数から見てみる。
+ > cor(iris[1:4]) Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411 Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259 Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654 Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000>
Sepal.LengthはPetal.LenghtとPetal.Widthと強い相関がある。Sepal.Widthは相関が弱いので一因子モデル+独自因子としてのSepal.Widthが可能と予測できる。
散布図からも相関があることが見て取れる。
因子数を計算する
因子数は固有値の折れ線グラフから推定できる。因子分析では相関行列における固有値が1以上の要素について因子としてとりあつかう。
相関行列を作成する
> corx <- cor(iris[1:4])
固有値を取得する
> eigen(corx)$values [1] 2.91849782 0.91403047 0.14675688 0.02071484
2因子目が0.91でありわずかに1には足りない。よってirisの因子分析は1因子もしくは2因子と言える。因子数は説明変数の数を超えることはない。因子分析はモデルを単純にするために用いるのであり、説明変数の数を超える因子分析は意味がない。
寄与率を計算する
> eigen(corx)$values / sum(eigen(corx)$values) [1] 0.729624454 0.228507618 0.036689219 0.005178709
スクリー図を作成する
> plot(eigen(corx)$values, xlim=c(1,4), ylim=c(0,3), lab=c(4,3,0))
今回は一因子を採用する。
因子分析を実行
Rでは因子分析をfactanal()を用いる。
> iris.fact <- factanal(iris[1:4], factors=1) > iris.fact Call: factanal(x = iris[1:4], factors = 1) Uniquenesses: Sepal.Length Sepal.Width Petal.Length Petal.Width 0.240 0.822 0.005 0.069 Loadings: Factor1 Sepal.Length 0.872 Sepal.Width -0.422 Petal.Length 0.998 Petal.Width 0.965 Factor1 SS loadings 2.864 Proportion Var 0.716 Test of the hypothesis that 1 factor is sufficient. The chi square statistic is 85.51 on 2 degrees of freedom. The p-value is 2.7e-19
uniqunessは各変数に対する独自性を示す。ここではSepal.Widthの独自性が強く、因子1では説明できないことがわかる。
Loadingsは因子負荷量を示す。ここから因子1の式は以下のようになる。
Factor1 = 0.872 x Sepal.Length – 0.422 x Sepal.Width + 0.998 x Petal.Length + 0.965 x Petal.Width
因子負荷量を図に示す。
> barplot(iris.fact$loadings[1:4])
共通性はLoading ^ 2で計算できる。共通性により、因子が説明する各変数の変動割合がわかる。
> (iris.fact$loadings[1:4])^2 [1] 0.7597716 0.1781358 0.9950964 0.9306666
Sepal.Width以外は因子1により良く説明されていることがわかる。
因子寄与はSS Loadingsで示されていて、2.864.ここから計算される寄与率はProportion Varの0.716となっている。これは全変数に対する因子1の影響を示す。共通性は各変数に対する影響であるので区別する。
適合度の検証はカイ二乗分布を利用する。p-value = 2.7e-19となり有意であることがわかる。
因子得点について考察
考察
因子1は萼片の長さ、花弁の大きさおよび長さにより説明されているので花全体のボリュームといえる。
2因子モデルの分析
次に2因子モデルの分析をしてみる。データとしてはRで提供されているattitudeを利用する。
> data(attitude) > head(attitude) rating complaints privileges learning raises critical advance 1 43 51 30 39 61 92 45 2 63 64 51 54 63 73 47 3 71 70 68 69 76 86 48 4 61 63 45 47 54 84 35 5 81 78 56 66 71 83 47 6 43 55 49 44 54 49 34
データの検討は省略する。一因子分析で実施したのと同じ検討(正規分布、相関)をすること。
因子分析を実行する。
> attitude.fact <- factanal(attitude, factors=2) > attitude.fact Call: factanal(x = attitude, factors = 2) Uniquenesses: rating complaints privileges learning raises critical advance 0.210 0.132 0.641 0.396 0.318 0.897 0.037 Loadings: Factor1 Factor2 rating 0.882 0.111 complaints 0.914 0.180 privileges 0.505 0.323 learning 0.587 0.509 raises 0.613 0.554 critical 0.152 0.283 advance 0.980 Factor1 Factor2 SS loadings 2.614 1.756 Proportion Var 0.373 0.251 Cumulative Var 0.373 0.624 Test of the hypothesis that 2 factors are sufficient. The chi square statistic is 5.47 on 8 degrees of freedom. The p-value is 0.706 >
結果の見方は同じであるが、LoadingsにCumulative Varが追加されている。これは蓄積寄与率であり、Factor1だと37%であるが、Factor1とFactor2の組み合わせにより62%まで寄与していることがわかる。
Factor1および2について因子負荷量を比べてみる。
> barplot(attitude.fact$loadings[1:6]) > barplot(attitude.fact$loadings[7:12])
因子1はrating, complaintsなど相手側からの評価について寄与しているので、これは評価度と名付けた。因子2はcriticalとadvanceといった自己顕示欲につながる項目に高い寄与が見られたので、攻撃度と名付けた。
因子空間にプロットしてみる。
> plot(attitude.fact$loadings[,1:2], pch=20, col="red", xlim=c(-1,1), ylim=c(-1,1)) > text(attitude.fact$loadings[,1:2], colnames(attitude)) > abline(v=0) > abline(h=0)
learning, privileges, raisesには別の因子あるいは独自の因子が働いていることがわかる。