勉強 11日目
因子分析(factor analysis)は,心理尺度などを用いる質問紙を行う場合は必須の分析手法である。 今回に限り,テキスト「行動科学の統計学」ではなく,因子分析についての記述が丁寧な南風原 (2002)『心理統計学の基礎』有斐閣を中心に進める。
8つの性格特性を200名の大学生について7件法で尋ねる。
すべてポジティブな用語であり,似ているものも多い。そこでより少数の変数で特性を測れないか,を考える。
RQ : 1つの特性にあてはまる人は,他のすべてにもあてはまる傾向があるのでは?あるいは,いくつかの特性群に分類することができるのでは?
この8つの特性を分類することで,個人の特性をより少数の変数で把握することができる。 情報量を減らさずに分析で利用する変数の数を減らすことができれば,分析が容易になる。 たとえば,回帰分析で回帰式に8個の特性をすべて入れ込むと,多重共線性もあり,好ましくない可能性がある。 因子分析では,複数の変数の共通因子を特定するこで,次元を落とすことを目的としている。
テキストに記載されている性格特性の相関係数を見てみると,外交的と社交的,積極的と外交的,積極的と社交的は高く正の相関がある。 これら8つの観測変数を,
に分類することを考える。 ここでは,因子分析により,複数(3項目以上)の連続変数の観測変数の共通する部分を抽出する。
因子分析の1因子モデルを数式で表すと,
\[ \text{温和} = \beta _1 \times f + \varepsilon_1\\ \text{陽気} = \beta _2 \times f + \varepsilon_2\\ \vdots\\ \text{素直} = \beta _8 \times f + \varepsilon_8\\ \]
となる。 ここで\(\beta\)は因子負荷(factor loading,あるいは因子スコア)であり,\(f\)は共通因子(common factor),\(\varepsilon\)は独自因子(unique factor)を表す。
8個の個人特性の背後に2つの共通因子\(f_1\)と\(f_2\)があると考える場合,因子モデルは次のように表すことができる。
\[ \text{温和} = \beta _{11} \times f_1 + \beta _{12} \times f_2 + \varepsilon_1\\ \text{陽気} = \beta _{21} \times f_2 + \beta _{22} \times f_2 + \varepsilon_2\\ \vdots\\ \text{素直} = \beta _{81} \times f_8 + \beta _{82} \times f_2 + \varepsilon_8\\ \]
一般的に,\(p\)個の観測変数(アンケート項目)に対して,\(m\)この共通因子によって説明されるとする因子モデルは,
\[ y_j = \beta_{j1} f_1 + \beta_{j2} f_2 + \cdots + \beta _{jm} f_m + \varepsilon_j\\ =\sum _{g=1}^m \beta_{jg} f_g + \varepsilon_j, \quad (j=1,2, \dots, p) \]
となる。
抽出した因子における個人の位置を因子得点(factor score)として保存し,分析に用いることがある。 この因子得点がアンケートなどで集められた複数の質問項目から抽出された因子に基づく合成尺度として利用される。
いつものテキスト302頁のデータを用いる。 飲み物の好みの仮想データであり,コーヒー(\(cafe\)),紅茶(\(tea\)),ミルク(\(milk\)),水(\(water\)),緑茶(\(g\_tea\)),ウーロン茶(\(w\_tea\)),性別(\(sex\))のデータから構成されている。 各項目に対する好みは,5点尺度で測定されている。
最初にデータを読み込む。
df <- read.csv("chap14.csv")
まずは記述統計と相関行列を確認する。
summary(df)
ID café tea milk
Min. : 1.00 Min. :0.00 Min. :1.00 Min. :2.0
1st Qu.: 5.75 1st Qu.:2.00 1st Qu.:2.75 1st Qu.:3.0
Median :10.50 Median :2.00 Median :3.00 Median :3.5
Mean :10.50 Mean :2.45 Mean :3.10 Mean :3.5
3rd Qu.:15.25 3rd Qu.:3.00 3rd Qu.:4.00 3rd Qu.:4.0
Max. :20.00 Max. :4.00 Max. :5.00 Max. :5.0
water g_tea w_tea sex
Min. :0.0 Min. :0.00 Min. :1.00 Min. :1.0
1st Qu.:0.0 1st Qu.:1.00 1st Qu.:2.00 1st Qu.:1.0
Median :1.5 Median :2.00 Median :2.50 Median :1.0
Mean :1.3 Mean :1.70 Mean :2.75 Mean :1.4
3rd Qu.:2.0 3rd Qu.:2.25 3rd Qu.:4.00 3rd Qu.:2.0
Max. :3.0 Max. :3.00 Max. :4.00 Max. :2.0
cor(df[,2:7])
café tea milk water g_tea w_tea
café 1.0000000 0.85391330 0.78157516 0.15326638 0.22996981 0.1902252
tea 0.8539133 1.00000000 0.89102797 0.01906146 0.08032598 0.1148106
milk 0.7815752 0.89102797 1.00000000 0.06170959 0.13002373 0.1486753
water 0.1532664 0.01906146 0.06170959 1.00000000 0.71972685 0.8826051
g_tea 0.2299698 0.08032598 0.13002373 0.71972685 1.00000000 0.7790519
w_tea 0.1902252 0.11481064 0.14867526 0.88260506 0.77905187 1.0000000
相関係数行列より,コーヒーと紅茶や,コーヒーと牛乳,紅茶と牛乳,水と緑茶,緑茶とウーロン茶といった相関が高い項目が見つけられる。
因子分析は,基本関数factanal()
関数を用いる。 第1引数はデータ・フレーム,第2引数で因子数を指定,第3引数で軸の回転を指定,第4因数で因子得点の計算方法を指定する。
軸の回転をしないときはnone
,プロマックス回転ならpromax
,バリマックス回転ならvarimax
とする。 因子得点の計算方法は,デフォルトはnone
,あとはregression
やBartlett
がある。
f1 <- factanal(df[,2:7],factors = 2, rotation = "promax", scores = "regression")
print(f1,cutoff=0)
Call:
factanal(x = df[, 2:7], factors = 2, scores = "regression", rotation = "promax")
Uniquenesses:
café tea milk water g_tea w_tea
0.247 0.015 0.192 0.163 0.356 0.063
Loadings:
Factor1 Factor2
café 0.855 0.069
tea 0.999 -0.056
milk 0.899 -0.001
water -0.064 0.922
g_tea 0.012 0.801
w_tea 0.026 0.964
Factor1 Factor2
SS loadings 2.544 2.429
Proportion Var 0.424 0.405
Cumulative Var 0.424 0.829
Factor Correlations:
Factor1 Factor2
Factor1 1.000 0.147
Factor2 0.147 1.000
Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.73 on 4 degrees of freedom.
The p-value is 0.786
因子負荷量をみると,因子1はコーヒー・紅茶・ミルク,因子2は水・緑茶・麦茶の負荷量が高い。 第1因子に「味の濃い飲み物」,第2因子に「味の薄い飲み物」という名前をつけてみる。
この因子負荷量を第1因子と第2因子の軸をもつ平面にプロットする。
plot(f1$loadings, type = "n")
text(f1$loadings, colnames(df[,2:7])) # 散布図の点を項目名にする
factanal()
で因子分析を行うと,オブジェクトとして因子得点が計算される。 因子得点は,scores
というオブジェクト(行列形式)で保存されているため,確認してみる。
f1$scores
Factor1 Factor2
[1,] -0.178523355 0.3690318
[2,] 1.015440684 -1.6155025
[3,] 0.877004772 -1.0030949
[4,] -1.131833963 1.1416150
[5,] 1.886141136 -1.1270865
[6,] -0.236835287 1.0050679
[7,] 0.807421122 1.2269626
[8,] 0.012360586 -0.7529136
[9,] -0.148168863 0.4826660
[10,] -1.101479472 1.2552492
[11,] 0.002527429 -0.7132283
[12,] -1.905266829 -0.3279822
[13,] -0.002238124 -0.9454804
[14,] 0.762593579 0.9828963
[15,] -0.081255768 -0.6121495
[16,] 0.702990932 1.1125873
[17,] 0.887818606 -0.7479554
[18,] -1.033460041 0.5173932
[19,] 0.722531589 0.9710820
[20,] -1.857768732 -1.2191579
この因子得点をもとのデータ・フレームに追加する。
df$fac1 <- f1$score[,1] # 行列の1列目が第1因子
df$fac2 <- f1$score[,2] # 行列の2列目が第2因子
attach(df)
因子得点を追加したデータ・フレームを用いて分析を進める。 因子に男女差があるかどうかを調べてみる。
t.test(fac1 ~ sex)
Welch Two Sample t-test
data: fac1 by sex
t = -0.057752, df = 17.892, p-value = 0.9546
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.9471975 0.8965368
sample estimates:
mean in group 1 mean in group 2
-0.01013213 0.01519819
t.test(fac2 ~ sex)
Welch Two Sample t-test
data: fac2 by sex
t = -1.0334, df = 14.195, p-value = 0.3187
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.4552064 0.5080329
sample estimates:
mean in group 1 mean in group 2
-0.1894347 0.2841520
男女差は統計的に有意ではないため,両因子において男女差があるとは言えない。
5教科の成績データ50名分を読み込む。
df2 <- read.csv("seiseki.csv")[2:6]
まずは変数間の相関係数を確認する。
cor(df2)
国語 英語 数学 物理 化学
国語 1.0000000 0.6851226 0.3009210 0.1851784 0.3686794
英語 0.6851226 1.0000000 0.4991927 0.3878504 0.4400419
数学 0.3009210 0.4991927 1.0000000 0.8084774 0.7666267
物理 0.1851784 0.3878504 0.8084774 1.0000000 0.7499504
化学 0.3686794 0.4400419 0.7666267 0.7499504 1.0000000
つぎに,因子分析を行う。「文系」と「理系」という2因子が表れることを予想して,因子数は2とする。
f2 <- factanal(df2,factors = 2, rotation = "promax", scores = "regression")
print(f2,cutoff=0)
Call:
factanal(x = df2, factors = 2, scores = "regression", rotation = "promax")
Uniquenesses:
国語 英語 数学 物理 化学
0.005 0.436 0.171 0.191 0.279
Loadings:
Factor1 Factor2
国語 -0.149 1.060
英語 0.239 0.607
数学 0.923 -0.026
物理 0.964 -0.158
化学 0.806 0.084
Factor1 Factor2
SS loadings 2.509 1.524
Proportion Var 0.502 0.305
Cumulative Var 0.502 0.807
Factor Correlations:
Factor1 Factor2
Factor1 1.000 -0.475
Factor2 -0.475 1.000
Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.47 on 1 degree of freedom.
The p-value is 0.225
これを因子を軸とする平面に描写する。
par(family="HiraKakuProN-W3")
plot(f2$loadings, type = "n")
text(f2$loadings, colnames(df2))
この結果より,第1因子は数学,物理,化学を代表しており,第2因子は国語と英語を代表していると考えられる。 そこで第1因子を「理系」,第2因子を「文系」と名付ける。
psych
パッケージpsych
パッケージは心理学で用いる分析手法が用意されたパッケージで,因子分析にはfa.parallel()
がある。
# install.packages("psych") # first time only
library(psych) # 心理学研究用
次に,上記のデータを用いて分析を再実行する。
fa.parallel(df2, fm = "minres", fa = "fa", cor = "cor")
Parallel analysis suggests that the number of factors = 2 and the number of components = NA