Rで因子分析

こんばんは。namakemonoです。
本日はRで因子分析を行う方法を記載していきます。

因子分析とは?

因子分析とは、多変量データに潜む共通因子を探り出すための手法といえます。
因子分析は要約のための手法であり、因子分析を使う目的には2つのものがあるといわれています。
1. 少数の説明要因に話をまとめるため
2.(調査対象者の)回答の奥に潜む要因をまとめるため

観測データにおける変数の間の関連成分をまとめたものを共通因子(common factor)と呼び、他の変数と関係がなく、その変数のみ持っている成分を独自因子(unique factor)と呼びます。
因子分析のイメージ図は以下のようなものです。
037
上記の共通因子A、共通因子Bを見つける手法といえます。また、共通因子がどの程度各データにどの程度影響を与えているのかを分析する手法でもあります。


今回は以下のデータを利用しようと思います。

国語 社会 英語 数学 理科
1 57 57 80 51 37
2 13 88 88 6 1
3 50 93 1 83 83
4 36 89 89 80 80
5 93 93 93 95 95
6 59 85 85 59 59
7 37 43 60 58 58
8 44 44 25 69 69
9 40 40 38 4 27
10 72 72 72 38 51
11 85 85 85 8 37
12 9 19 26 19 36
13 14 84 84 0 67
14 30 48 48 87 87
15 18 44 44 97 97
16 39 39 60 25 88
17 89 89 89 39 25
18 10 41 46 99 99
19 29 29 54 81 81
20 26 51 76 96 96
21 11 88 97 11 32
22 78 32 61 11 3
23 4 84 84 1 60
24 38 38 38 11 26
25 24 7 18 5 19
26 82 82 82 5 67
27 78 78 78 79 79
28 19 65 65 39 82
29 32 37 35 9 21
30 40 40 39 89 89
31 58 58 58 9 73
32 81 81 69 49 49
33 55 55 97 56 9
34 80 80 80 26 26
35 95 95 95 55 55
36 50 40 82 32 32
37 5 44 46 52 52
38 53 53 20 60 78
39 41 68 68 29 29
40 33 22 70 86 86
41 5 5 73 93 93
42 13 37 15 56 10
43 63 59 59 39 39
44 91 91 91 49 49
45 13 13 43 46 35
46 25 43 73 97 97
47 33 33 90 28 59
48 26 50 50 36 36
49 33 38 6 21 78
50 16 89 89 58 33
51 3 79 79 73 73
52 2 89 89 53 39
53 26 88 88 62 62
54 84 51 51 42 77
55 79 79 79 22 51
56 1 67 67 86 86
57 47 47 47 7 34
58 91 91 91 88 88
59 75 75 75 84 84
60 29 29 12 61 61
61 58 58 93 76 76
62 35 35 11 75 75
63 51 51 84 13 64
64 97 97 97 74 74
65 27 27 56 60 60
66 12 34 14 15 48
67 65 65 65 3 33
68 51 51 51 84 84
69 73 24 24 74 74
70 53 53 53 13 86
71 48 23 35 4 55
72 69 69 69 52 52
73 83 83 58 15 77
74 98 98 98 28 28
75 56 56 56 64 64
76 92 92 92 100 100
77 79 79 2 86 86
78 7 44 44 20 99
79 17 7 94 34 96
80 65 65 94 31 12
81 83 83 54 89 89

 

Rでの因子分析

Rでの因子分析は、以下の手順で行います。

1.共通因子の数の推定
2.データの分析
3.結果の検証

では、それぞれ見てみましょう。

1.共通因子の数の推定

まずは対象のデータの相関関係を確認します。
そこで、相関係数を求めてみましょう。
相関係数を求める場合、「cor」関数を利用します。

>>
cor(x)
国語 社会 英語 数学 理科
国語 1.00000000 0.47673701 0.259535504 0.036571408 -0.02023415
社会 0.47673701 1.00000000 0.537083416 0.062140467 -0.02206612
英語 0.25953550 0.53708342 1.000000000 -0.003607013 -0.08286620
数学 0.03657141 0.06214047 -0.003607013 1.000000000 0.60744715
理科 -0.02023415 -0.02206612 -0.082866201 0.607447149 1.00000000

相関係数をrとすると、相関係数の値と相関の強さは以下のようになります。

相関係数 大きさの評価
-0.2≦r≦0.2 ほとんど相関なし
-0.4≦r<-0.2
0.2<r≦0.4
弱い相関あり
-0.7≦r<-0.4
0.4<r≦0.7
中程度の相関あり
-1.0≦r<-0.7
0.7<r≦1.0
強い相関有あり

このことから、今回の例では、「国語」、「社会」、「英語」の間に相関があり、「数学」、「理科」の間に相関があると推察できます。
変数を2つのグループに分けられそうなため、共通因子は2つではないかと推察できます。

 

2.データの分析

因子分析を行うには、「factanal()」関数を利用します。指定する引数は主に以下のものです。
これは最尤法で因子分析を行う関数です。他の方法で因子分析を行いたい場合は、「psych」パッケージの「fa」関数を利用してください。

factors 抽出する因子の数を指定します。 変数の数に対して因子の数が多いとエラーが返されます。
score 因子得点計算の方法を指定します。デフォルトでは計算しません。
rotation 因子軸の回転方法を指定します。デフォルトではバリマックス回転です。

因子分析は、因子得点の計算方法や、因子軸の回転方法が指定できます。
因子得点は各因子と対象データ(1レコード)の相関の程度を表します。
因子得点が高い場合、その因子に影響される度合いが高いといえます。

因子得点の計算方法

regression(回帰方法) 推定された因子得点と真の因子得点の誤差を できるだけ小さくすることを目的とした手法。
Bartlett(バートレット法) 独自因子得点を最小化するように因子得点を推定する手法

因子軸の回転は、因子負荷量をわかりやすくするために行います。因子が複数ある場合に行います。
因子間に相関がない場合は、直行回転、因子間に相関がある場合は斜交回転を利用します。
通常、因子間に相関がないということはないため、斜交回転を用いるのが一般的といえます。
因子軸の回転方法

varimax(バリマックス回転) 直交回転法のことで、各因子の負荷量が高い変数の個数を最小にします。 因子の解釈の単純化ができますが、逆に因子間の相関が無視される場合もあります。 ※因子が直行するモデルを仮定している。つまり因子間の相関がすべて0になるため。
promax(プロマックス回転) 斜交回転のことで、因子を相関させることができ、大規模なデータセットにも活用可能です。 ※ただし、斜交回転をしても相関が殆どない場合もあります。

では、実際に分析してみましょう。
今回は因子得点の計算方法や、因子軸の回転方法は特に指定せず分析します。また、因子数は2と仮定します。

> factanal(x,factor=2)Call:
factanal(x = x, factors = 2)

Uniquenesses:
国語 社会 英語 数学 理科
0.768 0.022 0.700 0.623 0.005

Loadings:
Factor1 Factor2
国語 0.482
社会 0.987
英語 0.546
数学 0.613
理科 0.995

Factor1 Factor2
SS loadings 1.512 1.370
Proportion Var 0.302 0.274
Cumulative Var 0.302 0.576

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 0.03 on 1 degree of freedom.
The p-value is 0.864

各パラメータは以下の意味です。

Uniquenesses 変数の独自性
Loading 因子負荷量
SS Loading 因子負荷の平方和(因子寄与)
Proportion Var 寄与率
Cumulative 累積寄与率

因子負荷が空欄の部分がありますが、0に近すぎるため、表示されていません。

また、結果から、以下の値を取得することができます。

$loadings 因子負荷量
$correlation 相関係数
$factors 求めた因子数
$STATISTIC カイ2乗値
$dof カイ2乗決定の自由度
$PVAL カイ2乗統計量のP値
$scores 因子得点(計算した場合)



例えば、因子負荷量を取得する場合は、以下のようになります。

> result<-factanal(x,factors=2) > result$loading

Loadings:
Factor1 Factor2
国語 0.482
社会 0.987
英語 0.546
数学 0.613
理科 0.995

Factor1 Factor2
SS loadings 1.512 1.370
Proportion Var 0.302 0.274
Cumulative Var 0.302 0.5760


3.結果の検証

さて、分析を終えたところで、結果の検証をしましょう。
結果の下部に適合度の検定が記載されています。
一般に、p値が0.05以下の場合、因子数が少ないとみなします。
今回の例では、p値が0.864のため、因子数は適切であるといえます。
p値が0.05を超える因子数が複数ある場合は、累積寄与率で判断します。

※試しに因子数1で行った場合の結果がこちらです。p値が限りなく0に近いため、、「2因子モデルはデータに適合していない」といえます。

> factanal(x,factor=1)

Call:
factanal(x = x, factors = 1)

Uniquenesses:
国語 社会 英語 数学 理科
0.772 0.005 0.710 0.996 1.000

Loadings:
Factor1
国語 0.478
社会 0.997
英語 0.538
数学
理科

Factor1
SS loadings 1.518
Proportion Var 0.304

Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 36.37 on 5 degrees of freedom.
The p-value is 8.02e-07

因子負荷量を棒グラフにしたら、このようになります。
左側が第1因子、右側が第2因子になります。

> par(mfrow=c(1,2))
> barplot(result$loading[,1])
> barplot(result$loading[,2])

067

これらの結果より、2つの因子で説明ができることがわかります。

最後に

さて、これらの結果から、今回の例では、共通因子が社会、国語、英語の成績に強く関係する「文系要素」と、数学と理科の成績に強く関係する「理系要素」の2つであると推察できます。
因子分析は直接は観測されない、潜在的な共通因子を見つける方法です。そのため、分析者によって解釈がまちまちになることがあります。
ある程度仮説を立てて、分析を行うようにしましょう。

ではでは


コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA