11. 複数の変数間の潜在的な説明変数を仮定する

因子分析とは、相関関係の強い項目間に何らかの共通する潜在因子(直接測定することのできない変数)が存在すると考え、共通の因子を見出す分析方法です。扱う対象は量的データになります。

ここでは第45回衆議院議員総選挙(2009年)の有権者のアンケート結果のデータを使います(JES4_2009.csv)。数値は日本の主要政党の好感度(感情温度)を表しており、0(強い反感)から100(強い好意)で評価されています(50は完全に中立)。複数の政党に対する評価から、政党の評価に対する共通因子を検討していきます。

扱うデータ

因子分析で使用するデータ
In [18]:
#作業ディレクトリの処理は既に行っていれば不要(復習)
getwd() #作業ディレクトリの確認
setwd("R:/WinPython/WinPython-64bit-3.6.1.0Qt5/notebooks/data") #作業ディレクトリの変更
'R:/WinPython/WinPython-64bit-3.6.1.0Qt5/notebooks/data'
In [17]:
data = read.csv("11-1.csv", header = TRUE) #データの読み込み
attach(data) #データ入力省略
summary(data) #要約統計量の算出
The following objects are masked from data (pos = 4):

    共産党感情温度, 公明党感情温度, 国民新党感情温度, 自民党感情温度,
    社民党感情温度, 民主党感情温度

The following objects are masked from data (pos = 5):

    共産党感情温度, 公明党感情温度, 国民新党感情温度, 自民党感情温度,
    社民党感情温度, 民主党感情温度

 自民党感情温度   民主党感情温度   公明党感情温度  社民党感情温度  
 Min.   :  0.00   Min.   :  0.00   Min.   :  0.0   Min.   :  0.00  
 1st Qu.: 25.00   1st Qu.: 50.00   1st Qu.: 25.0   1st Qu.: 25.00  
 Median : 50.00   Median : 50.00   Median : 30.0   Median : 30.00  
 Mean   : 44.91   Mean   : 52.61   Mean   : 34.9   Mean   : 34.74  
 3rd Qu.: 50.00   3rd Qu.: 70.00   3rd Qu.: 50.0   3rd Qu.: 50.00  
 Max.   :100.00   Max.   :100.00   Max.   :100.0   Max.   :100.00  
 NA's   :7        NA's   :22       NA's   :80      NA's   :99      
 共産党感情温度   国民新党感情温度
 Min.   :  0.00   Min.   :  0.00  
 1st Qu.: 20.00   1st Qu.: 20.00  
 Median : 25.00   Median : 25.00  
 Mean   : 31.52   Mean   : 31.31  
 3rd Qu.: 50.00   3rd Qu.: 50.00  
 Max.   :100.00   Max.   :100.00  
 NA's   :97       NA's   :154     

相関行列

それぞれ変数間の相関係数の大きさを示します。欠損値を含むサンプルについては除いて分析を行います。

In [7]:
(result_cor = cor(data, use="complete.obs", method="p")) #欠損値を含むサンプルをすべて除きます。
自民党感情温度民主党感情温度公明党感情温度社民党感情温度共産党感情温度国民新党感情温度
自民党感情温度 1.000000000-0.221483932 0.434500947-0.1073259 -0.1241523 0.003844891
民主党感情温度-0.221483932 1.000000000-0.006628077 0.4001939 0.3152920 0.341592654
公明党感情温度 0.434500947-0.006628077 1.000000000 0.2522342 0.1963731 0.268695010
社民党感情温度-0.107325926 0.400193876 0.252234246 1.0000000 0.6990230 0.650261231
共産党感情温度-0.124152321 0.315292040 0.196373091 0.6990230 1.0000000 0.628972505
国民新党感情温度 0.003844891 0.341592654 0.268695010 0.6502612 0.6289725 1.000000000

固有値の算出とスクリープロットの作図

因子数を決定するために、固有値を確認します。固有値の値が大きいほどその因子と分析に用いた変数群との関係が強いことを表しています。因子数の決定にあたって、固有値が1以上の因子を採用する方法をガットマン基準といいます。

In [8]:
(result_eg = eigen(result_cor)) #固有値の算出
plot(result_eg$values, type="b", main="ScreePlot", xlab="Number", ylab="Eigenvalue")
eigen() decomposition
$values
[1] 2.6547277 1.4982795 0.7046234 0.4918871 0.3617450 0.2887374

$vectors
            [,1]        [,2]       [,3]        [,4]        [,5]        [,6]
[1,]  0.06405259  0.70299149  0.2181245 -0.62574296 -0.24750051  0.03621005
[2,] -0.34488095 -0.30082959  0.8765737 -0.04478693 -0.07554988 -0.12026472
[3,] -0.21022514  0.63838603  0.1676873  0.70592681  0.10696605 -0.10185892
[4,] -0.54268563 -0.01521130 -0.1355251  0.04031969 -0.29168578  0.77471775
[5,] -0.52104265 -0.03495609 -0.3450244 -0.05530684 -0.48711724 -0.60655481
[6,] -0.51649459  0.07946374 -0.1360600 -0.32159400  0.77409959 -0.07585288

固有値の大きさをプロットした図です。因子数の決定にあたって、推移がなだらかになる前までを抽出する方法をスクリー基準といいます。

因子分析

因子分析の課題は、データを説明するための潜在変数をいくつ設定しそれにどの変数を含めるかを決定することです。それぞれの因子が何を意味しているかは質問項目と照らし合わせて出力結果をもとに自分で推測します。

ここでは複数回の因子分析を通して、政党の評価が何因子構造となるのかの目安をつけ、出力結果をよみとり、因子構造をいくつか仮定し、因子分析の結果を比較し、試行錯誤を重ねて解釈した結果の一部を掲載します。

In [10]:
result = factanal(na.omit(data), factors = 2, rotation = "promax") #因子数2、プロマックス回転

因子の回転には直交解(バリマックス法)と斜交解(プロマックス法)が主に使われます。直交解は、因子が互いに直交するように定めます。結果の解釈が容易で、因子負荷量は因子と変数との相関を表すことになります。一方で斜交解は、直交の制約を特に定めません。潜在変数への重み付けを因子パターン、因子と変数との相関関係を因子構造とよびます。この結果では最尤法・プロマックス回転を実施しました。

In [11]:
print(result, cutoff=0) #factanal関数のオプション
Call:
factanal(x = na.omit(data), factors = 2, rotation = "promax")

Uniquenesses:
  自民党感情温度   民主党感情温度   公明党感情温度   社民党感情温度 
           0.282            0.765            0.610            0.255 
  共産党感情温度 国民新党感情温度 
           0.347            0.399 

Loadings:
                 Factor1 Factor2
自民党感情温度   -0.118   0.842 
民主党感情温度    0.440  -0.217 
公明党感情温度    0.280   0.550 
社民党感情温度    0.864  -0.032 
共産党感情温度    0.808  -0.057 
国民新党感情温度  0.768   0.083 

               Factor1 Factor2
SS loadings      2.274   1.071
Proportion Var   0.379   0.178
Cumulative Var   0.379   0.557

Factor Correlations:
        Factor1 Factor2
Factor1  1.0000 -0.0308
Factor2 -0.0308  1.0000

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 30.24 on 4 degrees of freedom.
The p-value is 4.37e-06 

因子負荷量

In [12]:
print(result$loadings, cutoff = 0)
Loadings:
                 Factor1 Factor2
自民党感情温度   -0.118   0.842 
民主党感情温度    0.440  -0.217 
公明党感情温度    0.280   0.550 
社民党感情温度    0.864  -0.032 
共産党感情温度    0.808  -0.057 
国民新党感情温度  0.768   0.083 

               Factor1 Factor2
SS loadings      2.274   1.071
Proportion Var   0.379   0.178
Cumulative Var   0.379   0.557

因子の解釈を行う際には回転後の因子負荷量をみます。この結果の場合、第1因子は野党因子、第2因子は与党因子と命名できるでしょうか?

共通性

共通性は各測定値に対して、共通因子の部分がどの程度あるのかを示す指標です。共通性が大きな値を示している項目は共通因子から大きな影響を受けていることを示しており、一方で独自因子の影響力は少ないことを意味します。factanal関数では共通性の値は出力されず、独自性の値が出力されます。

In [13]:
result$uniquenesses #共通性
自民党感情温度
0.282441377031039
民主党感情温度
0.765059894290266
公明党感情温度
0.609685154814794
社民党感情温度
0.254918020582739
共産党感情温度
0.34712288365906
国民新党感情温度
0.399293375425508

11.2. fa関数による因子分析

factanal関数は標準で実装されていますが、因子の推定方法の選択肢に制限があります。そこで、psychパッケージに実装されている関数fa()を使用した因子分析を紹介します。

psychパッケージはデフォルトではRに入っていないので、使用時にはlibrary("psych")を実行してパッケージを読み込む必要があります。

In [14]:
#作業ディレクトリの処理は既に行っていれば不要(復習)
getwd() #作業ディレクトリの確認
setwd("R:/WinPython/WinPython-64bit-3.6.1.0Qt5/notebooks/data") #作業ディレクトリの変更
'R:/WinPython/WinPython-64bit-3.6.1.0Qt5/notebooks/data'
In [15]:
data = read.csv("11-1.csv", header = TRUE) #データの読み込み
attach(data) #データ入力省略
#ここまではfactanal関数と同様
#パッケージの章でインストールをしていなければ、
#install.packages("psych")をあわせて実行してください。
library(psych)
The following objects are masked from data (pos = 3):

    共産党感情温度, 公明党感情温度, 国民新党感情温度, 自民党感情温度,
    社民党感情温度, 民主党感情温度

ここではSPSS緑本と同じ結果が出力されるか確認するため、主因子法・プロマックス回転を実施しました。

In [16]:
result = fa(r=data, nfactors=2, rotate="Promax", fm="pa", scores=T) #主因子法、プロマックス回転
print(result, cut=0, sort=T, digits=5)
Factor Analysis using method =  pa
Call: fa(r = data, nfactors = 2, rotate = "Promax", scores = T, fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
                 item      PA1      PA2      h2      u2    com
社民党感情温度      4  0.86739  0.00029 0.75239 0.24761 1.0000
共産党感情温度      5  0.79276 -0.03159 0.62816 0.37184 1.0032
国民新党感情温度    6  0.77189  0.10198 0.61032 0.38968 1.0349
民主党感情温度      2  0.44292 -0.20647 0.23404 0.76596 1.4150
自民党感情温度      1 -0.13321  0.74732 0.57104 0.42896 1.0635
公明党感情温度      3  0.26466  0.63311 0.47962 0.52038 1.3391

                          PA1     PA2
SS loadings           2.26142 1.01414
Proportion Var        0.37690 0.16902
Cumulative Var        0.37690 0.54593
Proportion Explained  0.69039 0.30961
Cumulative Proportion 0.69039 1.00000

 With factor correlations of 
        PA1     PA2
PA1 1.00000 0.02612
PA2 0.02612 1.00000

Mean item complexity =  1.1
Test of the hypothesis that 2 factors are sufficient.

The degrees of freedom for the null model are  15  and the objective function was  1.92606 with Chi Square of  3509.599
The degrees of freedom for the model are 4  and the objective function was  0.02188 

The root mean square of the residuals (RMSR) is  0.01679 
The df corrected root mean square of the residuals is  0.03252 

The harmonic number of observations is  1717 with the empirical chi square  14.52399  with prob <  0.0057975 
The total number of observations was  1826  with Likelihood Chi Square =  39.83821  with prob <  4.675e-08 

Tucker Lewis Index of factoring reliability =  0.961514
RMSEA index =  0.070156  and the 90 % confidence intervals are  0.051285 0.090609
BIC =  9.79868
Fit based upon off diagonal values = 0.99797
Measures of factor score adequacy             
                                                   PA1     PA2
Correlation of scores with factors             0.93300 0.82613
Multiple R square of scores with factors       0.87049 0.68249
Minimum correlation of possible factor scores  0.74097 0.36498

11.3 関数オプション

関数 目的
cor(data, use="complete.obs", method="p") 相関係数の算出
eigen(result_cor) 固有値の算出
factanal(na.omit(data), factors = 2, rotation = "promax") 因子分析(因子数2、プロマックス回転)
fa(r=data, nfactors=2, rotate="Promax", fm="pa", scores=T) fa関数による因子分析(主因子法、プロマックス回転)