前回は因子分析の導入までやりました。
bananarian.hatenablog.com
Rで簡単に因子分析のやり方を確認したいと思います。
何か簡単に使えそうなデータを探したのですが、特に見つからなかったので、架空のデータで試してみます。
データ例
10人の学生が理数系科目の試験を受けました。試験の結果は次の通りです。
理数系科目の点数には背後に理数系科目に関する得意不得意の共通要因がありそうという仮説を立てて、因子分析を行います。
分析
まず、必要パッケージをインストールしておきます。
library(psych) library(GPArotation)
因子分析ですが、psychパッケージのfa関数で簡単にできます。
第一引数にデータを、nfactorsに要因の個数、fmに推定方法(規定値は最小二乗法で、mlにすると最尤法になります。)
rotateで回転方法を指定します(まだ記事では説明していないので、とりあえずpromaxとしておいてください。)
r_t_fa=fa(data,nfactors=1,fm="ml",rotate="promax")
出力結果は次のようになります。
まず、初めのML1は共通因子1からの影響の強さを表します。物理が少し低そうです。これを因子負荷と呼びます。
h2は共通性という指標です。共通因子によってどれくらい要因を説明出来ているかを表します。
u2は共通因子以外の要因によるものをさします。
h2+u2で1になっていますね。
この時、それぞれの点数は次のように表すことが出来ます。
ちなみに共通因子スコアは次のように、先ほどの出力に$scoresをつけるだけで簡単に出すことが出来ます。
>r_t_fa$scores ML1 鈴木 1.3596433 斎藤 1.0162983 西村 0.9671837 高橋 0.5732114 奥田 0.1989267 館 -0.7079295 田中 -0.5266822 小林 -0.7542849 小高 -1.0065090 佐々木 -1.1198578
スクリープロット
今回は、理数系科目の共通要因は一つしかないと決めつけて分析を行いましたが、この決定にも客観的な評価がほしいというのが本音です。
そこで便利なのがスクリープロットです。
スクリープロットとは固有値を順番に並べたもので、Rを使うと簡単に出力できます。
こんな感じです。
myscree=function(data,b="固有値の順位"){ plot(fa(data)$e.values,type="o",xlab=b,ylab="固有値") } myscree(data)
今回のプロットでは、1から2に向かうにあたって急激な低下が見られます。
この急激な低下が見られる部分を共通要因の個数の目安として扱います。
つまり今回は要因は1個が妥当であると考えることが出来ます。
まとめ
今回の分析によって次のことが分かります。
・このデータの背後には1つの共通要因がある。
・この共通要因は特に物理以外の3科目に大きな影響を与えている