科学の箱

科学・IT・登山の話題

R

因子分析

投稿日:

因子分析とは

因子分析では複雑な現象を単純な要因で理解するための手法。集められた個別のデータは結果である目的変数とその目的変数の原因である説明変数に分かれる。目的変数を観察できた結果とし、目的変数に影響を与えている見えない説明変数を見つけるのが因子分析である。

目的変数が複雑であっても因子分析により説明変数が単純化されるのでデータの取り回しが楽になる。

各目的変数は共通因子Fとそれぞれの変数に特定である独自因子からなりたつとする。このとき共通因子Fの各目的変数に対する影響の大きさを因子負荷量で表す。

X = a * F + Ex

国語、数学、英語、社会、理科の点数を文系・理系因子で説明するのは因子分析の例である。また人の性格を血液型で説明する方法もある。

因子分析の手順

因子分析は下記の手順で進められる

  • データの前処理および因子分析可能性(相関係数)
  • パラメータの計算(因子数)
  • 因子分析の実行
  • 検証
  • バリマックス展開

1因子モデルの分析

Rで提供されているirisを使って1因子モデルの分析をしてみる。

正規分布を検証する

ヒストグラムとボックスプロットを使ってデータに偏りがないかを検証する。

hist(unlist(iris[1]))

hist

データはおおむね真ん中に集まりはじに行くほど少なくなっている。

ボックスプロットで外れ値を見てみる。

boxplot

上記からも大きな外れ値はない。よって正規分布と仮定できる。

すべての変数について検証をする。

相関を検証する

まず因子分析が有効であるかを相関係数から見てみる。

+ > cor(iris[1:4])           
         Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000>

Sepal.LengthはPetal.LenghtとPetal.Widthと強い相関がある。Sepal.Widthは相関が弱いので一因子モデル+独自因子としてのSepal.Widthが可能と予測できる。

plot_iris

散布図からも相関があることが見て取れる。

因子数を計算する

因子数は固有値の折れ線グラフから推定できる。因子分析では相関行列における固有値が1以上の要素について因子としてとりあつかう。

相関行列を作成する

> corx <- cor(iris[1:4])

固有値を取得する

> eigen(corx)$values
[1] 2.91849782 0.91403047 0.14675688 0.02071484

2因子目が0.91でありわずかに1には足りない。よってirisの因子分析は1因子もしくは2因子と言える。因子数は説明変数の数を超えることはない。因子分析はモデルを単純にするために用いるのであり、説明変数の数を超える因子分析は意味がない。

寄与率を計算する

> eigen(corx)$values / sum(eigen(corx)$values)
[1] 0.729624454 0.228507618 0.036689219 0.005178709

スクリー図を作成する

> plot(eigen(corx)$values, xlim=c(1,4), ylim=c(0,3), lab=c(4,3,0))
scree

今回は一因子を採用する。

因子分析を実行

Rでは因子分析をfactanal()を用いる。

> iris.fact <- factanal(iris[1:4], factors=1)
> iris.fact

Call:
factanal(x = iris[1:4], factors = 1)

Uniquenesses:
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       0.240        0.822        0.005        0.069 

Loadings:
             Factor1
Sepal.Length  0.872 
Sepal.Width  -0.422 
Petal.Length  0.998 
Petal.Width   0.965 

               Factor1
SS loadings      2.864
Proportion Var   0.716

Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 85.51 on 2 degrees of freedom.
The p-value is 2.7e-19

uniqunessは各変数に対する独自性を示す。ここではSepal.Widthの独自性が強く、因子1では説明できないことがわかる。

Loadingsは因子負荷量を示す。ここから因子1の式は以下のようになる。

Factor1 = 0.872 x Sepal.Length – 0.422 x Sepal.Width + 0.998 x Petal.Length + 0.965 x Petal.Width

因子負荷量を図に示す。

> barplot(iris.fact$loadings[1:4])

fact_barplot

共通性はLoading ^ 2で計算できる。共通性により、因子が説明する各変数の変動割合がわかる。

> (iris.fact$loadings[1:4])^2
[1] 0.7597716 0.1781358 0.9950964 0.9306666

Sepal.Width以外は因子1により良く説明されていることがわかる。

因子寄与はSS Loadingsで示されていて、2.864.ここから計算される寄与率はProportion Varの0.716となっている。これは全変数に対する因子1の影響を示す。共通性は各変数に対する影響であるので区別する。

適合度の検証はカイ二乗分布を利用する。p-value = 2.7e-19となり有意であることがわかる。

因子得点について考察

考察

因子1は萼片の長さ、花弁の大きさおよび長さにより説明されているので花全体のボリュームといえる。

2因子モデルの分析

次に2因子モデルの分析をしてみる。データとしてはRで提供されているattitudeを利用する。

> data(attitude)
> head(attitude)
  rating complaints privileges learning raises critical advance
1     43         51         30       39     61       92      45
2     63         64         51       54     63       73      47
3     71         70         68       69     76       86      48
4     61         63         45       47     54       84      35
5     81         78         56       66     71       83      47
6     43         55         49       44     54       49      34

データの検討は省略する。一因子分析で実施したのと同じ検討(正規分布、相関)をすること。

因子分析を実行する。

> attitude.fact <- factanal(attitude, factors=2)
> attitude.fact

Call:
factanal(x = attitude, factors = 2)

Uniquenesses:
    rating complaints privileges   learning     raises   critical    advance 
     0.210      0.132      0.641      0.396      0.318      0.897      0.037 

Loadings:
           Factor1 Factor2
rating     0.882   0.111  
complaints 0.914   0.180  
privileges 0.505   0.323  
learning   0.587   0.509  
raises     0.613   0.554  
critical   0.152   0.283  
advance            0.980  

               Factor1 Factor2
SS loadings      2.614   1.756
Proportion Var   0.373   0.251
Cumulative Var   0.373   0.624

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 5.47 on 8 degrees of freedom.
The p-value is 0.706 
>

結果の見方は同じであるが、LoadingsにCumulative Varが追加されている。これは蓄積寄与率であり、Factor1だと37%であるが、Factor1とFactor2の組み合わせにより62%まで寄与していることがわかる。

Factor1および2について因子負荷量を比べてみる。

> barplot(attitude.fact$loadings[1:6])
> barplot(attitude.fact$loadings[7:12])

factor1_bar factor2_bar

因子1はrating, complaintsなど相手側からの評価について寄与しているので、これは評価度と名付けた。因子2はcriticalとadvanceといった自己顕示欲につながる項目に高い寄与が見られたので、攻撃度と名付けた。

因子空間にプロットしてみる。

> plot(attitude.fact$loadings[,1:2], pch=20, col="red", xlim=c(-1,1), ylim=c(-1,1))
> text(attitude.fact$loadings[,1:2], colnames(attitude))
> abline(v=0)
> abline(h=0)

factor_plot

learning, privileges, raisesには別の因子あるいは独自の因子が働いていることがわかる。

メタ情報

inarticle



メタ情報

inarticle



-R
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Rでのランダムデータ作成 – 上級編 (改)

Rでのランダムデータ作成 – 上級編にコメントをいただいたので調べてみた。結果を対比するためにプロットも入れた。 まずデータフレームを使う方法が以下である。 lm1 <- lm(galton$c …

no image

回帰分析

回帰分析の手順 データを取得する。 回帰分析をする意味があるかを検討する 回帰分析のモデルを検討する 回帰分析をする 回帰分析の結果について考察する 回帰分析のメモ 回帰分析では目的変数を説明できる変 …

no image

Rでのランダムデータ作成 – 上級編

平均が異なるランダムデータを作成する > x <- rnorm(12, mean=rep(1:3,each=4), sd=0.2) > y <- rnorm(12, mean= …

no image

Rで集計をする

バイナリ ifelse()を利用する ファクタ factor()を利用する カテゴリ集計 cut()関数を利用する クロス集計 Rではクロス集計表を簡単に作れる。クロス集計表はtable()を利用する …

no image

factorと数値型の変換

ジニ係数にファクターと数値変換についてコメントをいただいたので調べてみた。 その結果以下の3つのことがわかった。 read.csvで桁区切り文字つきの値を読み込むとfactorになる。 区切り文字つき …

2014年1月
« 12月   2月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

side bar top



アーカイブ

カテゴリー