科学の箱

科学・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

ジニ係数(再掲)

ジニ係数について修正した。とりあえずコード。 revenue<-read.csv(file=”data.csv”, head=TRUE) revenue$TotalRevenues_n < …

no image

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

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

no image

一対比較法によるリーグ戦の分析

一対比較法を利用すると2者の比較から全体の重要度や実力を数字で表現できる。 一対比較法を使った分析の手順は以下のようにすすめる。 データを取得する。 一対比較法のデータは複数の項目から2者を選び比較し …

no image

Rでのラインの表示

Rでラインを引くために関数がいくつか用意されている。 abline() 画像全体に線を引く segments() 始点と終点を指定してその間に線を引く points() “点” …

no image

Rによるやさしい統計学/5-統計的検定-1

5章で学ぶこと 5章では検定方法について紹介している。以下の方法について検定対象と検定する条件を理解する。 Z検定 t検定 無相関検定 独立性の検定 また検定の手順についてもまとめている。 検定方法 …

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

side bar top



アーカイブ

カテゴリー