バナナでもわかる話

開設当初は計量経済学・統計学が専門の大学院生でした。今はデータを扱うお仕事をしています。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

【初心者向け】Rで因子分析をやってみる

前回は因子分析の導入までやりました。
bananarian.hatenablog.com

Rで簡単に因子分析のやり方を確認したいと思います。
何か簡単に使えそうなデータを探したのですが、特に見つからなかったので、架空のデータで試してみます。

データ例

10人の学生が理数系科目の試験を受けました。試験の結果は次の通りです。
f:id:bananarian:20180906070641p:plain


理数系科目の点数には背後に理数系科目に関する得意不得意の共通要因がありそうという仮説を立てて、因子分析を行います。


分析

まず、必要パッケージをインストールしておきます。

library(psych)
library(GPArotation)


因子分析ですが、psychパッケージのfa関数で簡単にできます。
第一引数にデータを、nfactorsに要因の個数、fmに推定方法(規定値は最小二乗法で、mlにすると最尤法になります。)
rotateで回転方法を指定します(まだ記事では説明していないので、とりあえずpromaxとしておいてください。)

r_t_fa=fa(data,nfactors=1,fm="ml",rotate="promax")


出力結果は次のようになります。
f:id:bananarian:20180906071645p:plain

まず、初めの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)


f:id:bananarian:20180906074623p:plain
今回のプロットでは、1から2に向かうにあたって急激な低下が見られます。

この急激な低下が見られる部分を共通要因の個数の目安として扱います。

つまり今回は要因は1個が妥当であると考えることが出来ます。


まとめ

今回の分析によって次のことが分かります。


・このデータの背後には1つの共通要因がある。

・この共通要因は特に物理以外の3科目に大きな影響を与えている