4 主成分分析と因子分析1

0)使われるコンテクスト
1)主成分分析と因子分析の考え方
2)Rによる主成分分析
3)Rによる因子分析



0)使われるコンテクスト

・変数の集約。
 多くの変数があるとき、類似した振る舞いをする変数をまとめる。
・相関のない変数の抽出。
 変数間に相関があるとき、相関のない新しい変数を見つけることができれば回帰分析の時に有用。

回帰分析の例
#まずは普通に回帰分析
#log(nofdl)を従属変数、上の変数群(行列aに格納)を従属変数とした回帰分析
result<-lm(log(ossdata$nofdl)~ossdata$nrelease+ossdata$npcntb+ossdata$ncntb+ossdata$nmsgfr+ossdata$npml+ossdata$nmsgml+ossdata$npfrq+ossdata$nmsgfrq+ossdata$npbug+ossdata$nmsgbug)

summary(
result)

#Coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 5.621e+00 2.932e-01 19.173 < 2e-16 ***
#ossdata$nrelease 6.976e-02 1.432e-02 4.871 5.17e-06 ***
#ossdata$npcntb 1.259e-01 5.614e-02 2.242 0.0276 *
#ossdata$ncntb 5.847e-05 1.018e-04 0.574 0.5673
#ossdata$nmsgfr 1.438e-03 1.837e-03 0.783 0.4359
#ossdata$npml 1.575e-02 8.052e-03 1.956 0.0538 .
#ossdata$nmsgml -7.186e-04 5.449e-04 -1.319 0.1909
#ossdata$npfrq 2.554e-01 1.845e-01 1.384 0.1700
#ossdata$nmsgfrq -2.780e-02 4.972e-02 -0.559 0.5775
#ossdata$npbug 2.375e-02 2.981e-02 0.797 0.4279
#ossdata$nmsgbug -1.007e-02 7.799e-03 -1.291 0.2002
#Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

#Residual standard error: 1.601 on 84 degrees of freedom
#Multiple R-Squared: 0.5008, Adjusted R-squared: 0.4413
#F-statistic: 8.426 on 10 and 84 DF, p-value: 2.405e-09

#npmlとnmsgmlの係数、npfrq、nmsgfrqの係数などをどう解釈?

#参考)多重共線性の判定のため条件数を算出
#説明変数間の相関行列を作成し、その固有値を計算。
cr<-cor(a)
cr
ev<-eigen(cr)
ev

#条件数の計算
cn<-sqrt(abs(max(ev$values)/min(ev$values)))
cn



1)主成分分析と因子分析の考え方

 相関の高い変数群がある場合、これらをどう考えるか?
a<-data.frame(ossdata$nrelease,ossdata$npcntb,ossdata$ncntb,ossdata$nmsgfr,ossdata$npml,ossdata$nmsgml,ossdata$npfrq,ossdata$nmsgfrq,ossdata$npbug,ossdata$nmsgbug)

cor(a)
ossdata.nrelease ossdata.npcntb ossdata.ncntb ossdata.nmsgfr ossdata.npml
ossdata.nrelease 1.00000000 0.01493146 0.02276606 0.154460299 0.1389913
ossdata.npcntb 0.01493146 1.00000000 0.86591054 0.064719054 0.5438346
ossdata.ncntb 0.02276606 0.86591054 1.00000000 0.108622709 0.5606790
ossdata.nmsgfr 0.15446030 0.06471905 0.10862271 1.000000000 0.1924539
ossdata.npml 0.13899125 0.54383464 0.56067905 0.192453949 1.0000000
ossdata.nmsgml 0.04690382 0.60804159 0.64350831 0.184122232 0.8358384
ossdata.npfrq 0.03018828 0.43607385 0.41840919 0.136345152 0.1978897
ossdata.nmsgfrq -0.01492542 0.26010178 0.23981700 0.141329648 0.1629656
ossdata.npbug 0.02401811 0.66451509 0.75262715 0.008867001 0.2541092
ossdata.nmsgbug 0.01626299 0.69161505 0.77812176 0.017850449 0.2418050
ossdata.nmsgml ossdata.npfrq ossdata.nmsgfrq ossdata.npbug ossdata.nmsgbug
ossdata.nrelease 0.04690382 0.03018828 -0.01492542 0.024018112 0.01626299
ossdata.npcntb 0.60804159 0.43607385 0.26010178 0.664515093 0.69161505
ossdata.ncntb 0.64350831 0.41840919 0.23981700 0.752627154 0.77812176
ossdata.nmsgfr 0.18412223 0.13634515 0.14132965 0.008867001 0.01785045
ossdata.npml 0.83583843 0.19788975 0.16296564 0.254109155 0.24180496
ossdata.nmsgml 1.00000000 0.01083356 -0.01337628 0.184729259 0.20711604
ossdata.npfrq 0.01083356 1.00000000 0.88403139 0.608049508 0.60976489
ossdata.nmsgfrq -0.01337628 0.88403139 1.00000000 0.316033985 0.32462168
ossdata.npbug 0.18472926 0.60804951 0.31603399 1.000000000 0.98272002
ossdata.nmsgbug 0.20711604 0.60976489 0.32462168 0.982720019 1.00000000




・モデル
 以下では、p個の(観測される)変数があるとする。:xi (i=1〜p)2

・主成分分析の考え方
 相関が高い変数をまとめて新しい変数(総合指標)を作ってしまおう。

z1=l11 x1+l12 x2+......+l1p xp
z2=l21 x1+l22 x2+......+l2p xp
....

zp=lp1 x1+lp2 x2+......+lpp xp

 zi:i番目の主成分 (i=1〜p)
 lij:j番目の主成分についてのi番目の変数の重み 

→主成分の数は変数の数と同じp個

・因子分析の考え方。
 相関が高い変数というのは、同じ潜在変数(因子)から影響をうけているからだ。
 →観測されているデータの背後にある潜在変数(因子f)をみつけよう。

  潜在変数の例
    知能、都市化の程度、消費への関与、消費への知識、などなど

x1=l11 f1+l12 f2+......+l1m fm+e1
x2=l21 f1+l22 f2+......+l1m fm+e2
....

xp=lp1 f1+lp2 f2+......+l1m fm+ep

 m:因子の数
 fi:i番目の因子(i=1〜m)
 lij:因子負荷量 factor loading:変数と因子との共分散(変数が基準化されている場合には相関)を示す。
 ei:i番目の変数独自の因子

 → 因子分析:xはすべての変数について共通の因子 fiおよび、各変数独自の因子eiによって説明される。
  p > m とならないと意味がない。→観測される変数よりも少ない数の潜在変数(因子)が見いだされる。


図表 主成分分析と因子分析の比較

 

主成分分析

因子分析

目的

 変数を総合化することが目的。  潜在変数(因子)を見いだすことが目的。
共通する特徴 変数の数よりも少ない数の主成分が見いだされる。

主成分は直交(異なる主成分の間の相関は0)。



右に同じ。

右に同じ。
変数の数よりも少ない数の因子が見いだされる。

因子は直交(異なる因子の間の相関は0)。
 ただし、直交しない因子を見いだす方法もある。

 統計的な検定の枠組みにのっていないので因子数の決定には恣意性が残る。
 類似した変数をたくさんいれると、それらだけで因子が構成される。
定式化 単なる数学的モデル 統計的なモデル
特殊因子 なし あり
回転 なし あり
→これによって解釈しやすくなる。
主成分、因子数の決定方法 (1)固有値の大きさ1より大きいもののみ。
(2)固有値の大きさが急に小さくなるところまで。
(3)累積寄与率がある程度の大きさ(例80%)になるまで。
(1)〜(3)は左に同じ。
(4)(マーケティングや社会学などの)理論によってあらかじめ決められた数。


(2)主成分分析・因子分析の手順

理論、仮説の検討
    ↓
 変数の選択   理論、仮説に妥当な変数をバランスよく入れる(類似した変数をたくさん入れると、それらが集まった主成分が見いだされる)。
    ↓
 予備分析   各変数の正規性、はずれ値などをチェック
    ↓
 変数の標準化   変数の単位が異なる場合は平均0、分散1に標準化。
    ↓
 主成分数(因子数)の決定   寄与率(固有値、スクリープロット)などをみながら用いる主成・因子の数を決定。
               (標準化した場合)もとの変数一つが持っている情報は1/変数の数。もとの変数1つよりも情報を多く持っている主成分、因子を使うという観点からは寄与率が1/変数よりも大きい(固有値が1より大)となるものまでを選ぶ。
    ↓
 (因子分析のみ)回転による座標変換   解釈しやすいように座標変換する。因子の相関が0を保持したまま回転する、バリマックス回転というのがよく使われる。
    ↓
 主成分・因子の解釈    負荷量の大きさをみながら各主成分・因子の意味を解釈する。
    ↓
 (できれば)  サンプルを分割しても同じ結果が得られるかを確認しておくとよい。
    ↓
 (必要ならば) 主成分・因子得点の算出    
    ↓
 (必要ならば) 主成分・因子得点を用いた回帰分析など。   


→どちらを使うかは目的や好みの問題でもある。
 経済学者は主成分分析を好み(経済学の場合、所得、生産などは1つの変数で測定できる。)、社会学者、マーケティング学者などは因子分析を好む(測定できない概念を取り扱い、それを複数の変数で測定する)。


2)Rによる主成分分析

princomp(データセット,scores=TRUE)  主成分分析を行う。
注)
1.多変量解析ライブラリmvaに入っているので、使う前には
library(mva)
を実行する。

2.変数間の単位が異なる場合には、scaleコマンドで変数を平均0、分散1に正規化しておく。

3.実行後のオブジェクトには下記が含まれる。
"sdev" "loadings" "center" "scale" "n.obs" "scores" "call"
特に重要なのは
loadings 主成分の重み
scores 主成分得点 
scores=TRUEを指定すると計算される。



図表 主成分分析の例

#下記の変数群について適用する
a<-data.frame(ossdata$nrelease,ossdata$npcntb,ossdata$ncntb,ossdata$nmsgfr,ossdata$npml,ossdata$nmsgml,ossdata$npfrq,ossdata$nmsgfrq,ossdata$npbug,ossdata$nmsgbug)

#ライブラリmvaをロード
library(mva)


#これらの変数は単位が異なるので正規化しておく。
sa<-scale(a)
#みてみると平均は0、分散は1になっている(対角項が各変数の分散)
summary(sa)
var(sa)

#これに対して主成分分析を適用
res<-princomp(sa,scores=TRUE)
#結果には次の変数が格納される
names(res)
#[1] "sdev" "loadings" "center" "scale" "n.obs" "scores" "call"
#重要なのは
#sdev主成分の標準偏差
#loadings主成分の負荷量行列
#scores 主成分得点

summary(res)
#10変数を投入したので主成分も10個
#Importance of components:
# Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
#Standard deviation 2.1087618 1.3677456 1.1316591 0.98527420 0.87435655
#Proportion of Variance 0.4494184 0.1890629 0.1294276 0.09810925 0.07726323
#各主成分の寄与率 第一主成分でもとのデータがもっていた情報の44.9%を説明している。
#10変数を用いたので、寄与率1/10=10%となる主成分まで用いることにする。
#Cumulative Proportion 0.4494184 0.6384813 0.7679089 0.86601818 0.94328141
#累積寄与率(すべてを加えると1になる)。3つの主成分で76.8%の情報を説明している。

# Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
#Standard deviation 0.53321388 0.37098855 0.278421104 0.217818917 0.119593284
#Proportion of Variance 0.02873417 0.01390967 0.007834297 0.004794982 0.001445471
#Cumulative Proportion 0.97201558 0.98592525 0.993759548 0.998554529 1.000000000
#Cumulative Proportion 0.5708827 0.7816813 0.9234503 0.96513715 0.98695982 0.99788766 1.000000000

res$loadings
#主成分の負荷量  正規化した変数を分析したので、主成分と各変数との相関係数
#必要ならばこれをみて各主成分の意味を解釈。
#
Loadings:
# Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
#ossdata.nrelease -0.105 -0.384 0.826 0.379 0.103
#ossdata.npcntb -0.414 -0.136 0.140 0.647 -0.591 -0.135
#ossdata.ncntb -0.432 -0.143 0.159 0.245 0.506 -0.573 0.337
#ossdata.nmsgfr -0.113 -0.608 -0.778
#ossdata.npml -0.290 -0.436 -0.214 -0.186 0.266 -0.547 -0.379 -0.352
#ossdata.nmsgml -0.270 -0.544 -0.207 0.108 0.414 0.624
#ossdata.npfrq -0.322 0.439 -0.280 -0.134 0.157 -0.115 0.306 0.689
#ossdata.nmsgfrq -0.231 0.418 -0.428 -0.325 0.279 0.135 0.235 -0.172 -0.549
#ossdata.npbug -0.398 0.209 0.250 0.241 -0.164 -0.361 -0.196 -0.687
#ossdata.nmsgbug -0.404 0.203 0.252 0.230 -0.178 -0.244 0.155 -0.214 0.717

# Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
#SS loadings 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
#Proportion Var 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
#Cumulative Var 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0


#主成分得点
res$scores
#10個の主成分得点が計算される
# Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
# 1 0.39878395 0.383116893 0.36112900 -0.112895977 0.069125970 0.146756962 -0.230204568 0.308960318 0.1393349311 -0.0619912874
# 2 -0.89470915 -1.781157125 0.67699743 -0.938406560 0.220198917 0.618175175 -0.062263788 0.328660519 -0.0623110092 -0.1084819420
# 3 1.08020908 -0.001725995 0.56290827 -0.271078120 -0.087244170 -0.046444641 0.060240471 0.129614914 -0.0562544388 0.0041213940
# 4 1.11391741 -0.109168157 -0.47193261 2.096030795 0.921583317 -0.042276561 0.323277142 0.145503030 -0.1257509557 -0.0082194435
# 5 1.19513084 0.125414329 0.54091780 -0.153107565 -0.066290765 -0.179931686 0.068870633 0.103198792 -0.0700061170 -0.0150869658
# 6 -0.02538119 -1.513141818 -1.19507693 2.556969756 1.653321732 -0.237133032 0.217605046 0.007291689 -0.1059899805 0.0782742501
# 7 -0.14945112 1.298053753 -0.04015774 -0.604390324 0.312431879 -0.013572865 -0.084346528 0.433239235 0.3844644744 -0.0004638445


# 91 0.84230255 -0.123327094 0.46824642 0.071608221 0.099243385 0.129684455 -0.120482807 0.078035751 -0.0994671663 -0.0205473457
# 92 0.71498305 -0.162981628 0.62312561 -0.221383030 -0.019419979 0.243636522 -0.164148761 -0.114416914 -0.0150806979 0.0061921170
# 93 1.17300661 0.167036289 0.68660543 -0.416836199 -0.204515312 -0.222163977 0.066423295 0.094300396 -0.0671102947 0.0240801484
# 94 0.97506274 0.035126966 0.20416780 -0.351209519 -0.879581785 -0.238764648 0.078626897 -0.018866622 -0.0534043499 0.0070285293
# 95 -2.42926153 3.047065074 -2.35031322 -2.505799832 1.795899816 0.617135127 -0.176805705 0.040380054 -0.3589952921 0.0930651642

#主成分間の相関は(ほぼ)0
cor(res$scores)
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
Comp.1 1.000000e+00 -2.353875e-17 1.194760e-16 1.467155e-16 -3.987502e-16 -1.765234e-16 7.151624e-16 -4.238943e-16 -8.686119e-16 -4.957140e-17
Comp.2 -2.353875e-17 1.000000e+00 -1.671944e-15 -1.803983e-17 -4.536290e-16 2.329733e-16 -9.421396e-16 4.010110e-16 1.666159e-15 4.977131e-16
Comp.3 1.194760e-16 -1.671944e-15 1.000000e+00 5.068101e-16 -1.209724e-16 3.595076e-16 -3.578022e-16 3.985041e-17 -1.889052e-15 -2.267807e-15
Comp.4 1.467155e-16 -1.803983e-17 5.068101e-16 1.000000e+00 -5.782764e-18 -2.456837e-17 -1.399372e-16 -4.712454e-16 -1.253985e-15 -1.572171e-15
Comp.5 -3.987502e-16 -4.536290e-16 -1.209724e-16 -5.782764e-18 1.000000e+00 4.947264e-16 -5.285547e-17 1.282873e-15 4.447389e-16 7.061995e-16
Comp.6 -1.765234e-16 2.329733e-16 3.595076e-16 -2.456837e-17 4.947264e-16 1.000000e+00 -5.018290e-16 -4.060354e-16 2.722560e-15 1.354999e-15
Comp.7 7.151624e-16 -9.421396e-16 -3.578022e-16 -1.399372e-16 -5.285547e-17 -5.018290e-16 1.000000e+00 4.237081e-15 3.258864e-15 4.526177e-15
Comp.8 -4.238943e-16 4.010110e-16 3.985041e-17 -4.712454e-16 1.282873e-15 -4.060354e-16 4.237081e-15 1.000000e+00 -5.411119e-15 -6.410338e-15
Comp.9 -8.686119e-16 1.666159e-15 -1.889052e-15 -1.253985e-15 4.447389e-16 2.722560e-15 3.258864e-15 -5.411119e-15 1.000000e+00 9.962742e-15
Comp.10 -4.957140e-17 4.977131e-16 -2.267807e-15 -1.572171e-15 7.061995e-16 1.354999e-15 4.526177e-15 -6.410338e-15 9.962742e-15 1.000000e+00

#主成分の平均は(ほぼ)0
summary(res$scores)
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6
Min. :-1.430e+01 Min. :-9.183e+00 Min. :-3.709e+00 Min. :-2.562e+00 Min. :-4.62970 Min. :-1.955e+00
1st Qu.:-1.498e-01 1st Qu.:-2.996e-01 1st Qu.:-2.279e-01 1st Qu.:-4.108e-01 1st Qu.:-0.20223 1st Qu.:-2.379e-01
Median : 6.111e-01 Median :-2.713e-02 Median : 3.838e-01 Median :-2.459e-01 Median :-0.01942 Median : 2.708e-03
Mean : 5.610e-17 Mean :-8.414e-17 Mean : 2.805e-17 Mean : 3.272e-17 Mean : 0.00000 Mean :-2.337e-17
3rd Qu.: 9.606e-01 3rd Qu.: 2.302e-01 3rd Qu.: 6.007e-01 3rd Qu.: 3.080e-01 3rd Qu.: 0.24398 3rd Qu.: 2.490e-01
Max. : 1.304e+00 Max. : 4.793e+00 Max. : 4.175e+00 Max. : 4.236e+00 Max. : 1.79853 Max. : 1.551e+00
Comp.7 Comp.8 Comp.9 Comp.10
Min. :-9.933e-01 Min. :-1.299e+00 Min. :-9.617e-01 Min. :-5.158e-01
1st Qu.:-1.564e-01 1st Qu.:-8.388e-02 1st Qu.:-8.269e-02 1st Qu.:-4.145e-02
Median : 6.642e-02 Median : 5.372e-02 Median :-2.687e-02 Median :-4.638e-04
Mean :-6.135e-18 Mean :-9.714e-18 Mean : 8.531e-17 Mean :-1.402e-17
3rd Qu.: 1.835e-01 3rd Qu.: 1.291e-01 3rd Qu.: 9.371e-02 3rd Qu.: 2.076e-02
Max. : 9.798e-01 Max. : 7.548e-01 Max. : 5.706e-01 Max. : 6.654e-01




 これを用いて回帰分析。相関0なので多重共線性の恐れはない。

図表 主成分を用いた回帰分析




#0)で行った回帰分析
result<-lm(log(ossdata$nofdl)~ossdata$nrelease+ossdata$npcntb+ossdata$ncntb+ossdata$nmsgfr+ossdata$npml+ossdata$nmsgml+ossdata$npfrq+ossdata$nmsgfrq+ossdata$npbug+ossdata$nmsgbug)

summary(
result)

#これについてについて、上で求めた1から3番目の主成分を用いて回帰分析
res2<-lm(log(ossdata$nofdl)~res$scores[,1]+res$scores[,2]+res$scores[,3])
summary(res2)

#Coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 7.5157 0.1807 41.589 < 2e-16 ***
#res$scores[, 1] -0.4942 0.0857 -5.766 1.1e-07 ***
#res$scores[, 2] -0.1082 0.1321 -0.819 0.414848
#res$scores[, 3] -0.5979 0.1597 -3.744 0.000317 ***
#---
#Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

#Residual standard error: 1.761 on 91 degrees of freedom
#Multiple R-Squared: 0.345, Adjusted R-squared: 0.3234
#F-statistic: 15.98 on 3 and 91 DF, p-value: 1.997e-08

#参考)3つの主成分でもとの変数の情報(変動)の76.8%を説明していた。よって、(修正)R2はもとの変数を用いたモノよりも低くなる。
#すべての主成分を用いたときの(修正)R2は、生の変数で回帰したときのものと同じになる。
res3<-lm(log(ossdata$nofdl)~res$scores+res$scores+res$scores)
summary(res3)
#Coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 7.51574 0.16422 45.767 < 2e-16 ***
#res$scoresComp.1 -0.49416 0.07787 -6.346 1.07e-08 ***
#res$scoresComp.2 -0.10823 0.12007 -0.901 0.36994
#res$scoresComp.3 -0.59789 0.14511 -4.120 8.83e-05 ***
#res$scoresComp.4 0.55035 0.16667 3.302 0.00141 **
#res$scoresComp.5 0.46578 0.18782 2.480 0.01514 *
#res$scoresComp.6 0.24475 0.30798 0.795 0.42902
#res$scoresComp.7 -1.03338 0.44265 -2.335 0.02196 *
#res$scoresComp.8 -0.55060 0.58982 -0.934 0.35324
#res$scoresComp.9 0.82072 0.75392 1.089 0.27945
#res$scoresComp.10 -1.38053 1.37314 -1.005 0.31760
#---
#Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 1.601 on 84 degrees of freedom
Multiple R-Squared: 0.5008, Adjusted R-squared: 0.4413
F-statistic: 8.426 on 10 and 84 DF, p-value: 2.405e-09



参考)結果データセットに含まれる
sdev=各主成分の標準偏差それぞれを2乗したものは分析した変数の相関行列の固有値に等しい。また主成分の負荷量は相関行列の固有ベクトルに等しい。

res$sdev
#出力されるのは各主成分の標準偏差
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
2.1087618 1.3677456 1.1316591 0.9852742 0.8743565 0.5332139 0.3709885 0.2784211 0.2178189 0.1195933
10 variables and 95 observations.

#2乗(行列1*行列2 とすると各要素を掛けた行列を作成する) 
res$sdev*res$sdev

cr<-cor(sa)
ev<-eigen(cr)
ev

$values
[1] 4.49418359 1.89062940 1.29427627 0.98109253 0.77263234 0.28734170
[7] 0.13909668 0.07834297 0.04794982 0.01445471

$vectors
ossdata.nmsgbug ossdata.npbug ossdata.nmsgfrq
ossdata.nrelease 0.02957197 -0.1048562 0.38449896
ossdata.npcntb 0.41369177 -0.1358796 -0.14043682
ossdata.ncntb 0.43152651 -0.1430610 -0.15912317
ossdata.nmsgfr 0.07756477 -0.1125054 0.60774052
ossdata.npml 0.28966653 -0.4355478 0.21442493
ossdata.nmsgml 0.27034692 -0.5439875 0.06904691
ossdata.npfrq 0.32203324 0.4385472 0.27957605
ossdata.nmsgfrq 0.23091539 0.4177147 0.42766336
ossdata.npbug 0.39797487 0.2087901 -0.25005115
ossdata.nmsgbug 0.40416299 0.2034485 -0.25187199
ossdata.npfrq ossdata.nmsgml ossdata.npml ossdata.nmsgfr
ossdata.nrelease -0.82601000 0.37913413 -0.10287721 -0.05314712
ossdata.npcntb 0.01753186 0.00725614 -0.64705097 0.59136159
ossdata.ncntb -0.03995705 -0.08847983 -0.24489885 -0.50625933
ossdata.nmsgfr -0.05814508 -0.77757850 -0.01550944 0.05410972
ossdata.npml 0.18636606 0.26625361 0.54743296 0.37877326
ossdata.nmsgml 0.20686905 0.10780565 -0.02574199 -0.41443159
ossdata.npfrq 0.13369518 0.15718707 0.04686790 0.11461312
ossdata.nmsgfrq 0.32517311 0.27934527 -0.13541867 -0.23450045
ossdata.npbug -0.24137061 -0.16414565 0.36070150 0.03703304
ossdata.nmsgbug -0.23026912 -0.17762112 0.24400708 -0.05932697
ossdata.ncntb ossdata.npcntb ossdata.nrelease
ossdata.nrelease -0.01896101 0.02185657 -0.003233981
ossdata.npcntb -0.05788029 0.13479523 -0.020247875
ossdata.ncntb 0.57264548 -0.33712149 -0.026931433
ossdata.nmsgfr 0.01353093 0.02447586 -0.004237083
ossdata.npml 0.35207735 -0.01292700 0.086674522
ossdata.nmsgml -0.62376544 0.07817823 -0.064765050
ossdata.npfrq -0.30560183 -0.68880157 0.007291558
ossdata.nmsgfrq 0.17211702 0.54949389 -0.025075664
ossdata.npbug -0.08923610 0.19621712 -0.687278902
ossdata.nmsgbug -0.15544391 0.21431595 0.717004240

#各固有値に対して固有ベクトルは±二つ定義される。符号はちがうが絶対値は同じコトに注意。





3)Rによる因子分析

factanal(データセット,factors=因子数,rotation =回転方法,scores =因子得点の算出方法)  因子分析を行う。
注)
0.最尤法による因子分析を行う(ので因子数を指定する必要がある)。

1.多変量解析ライブラリmvaに入っているので、使う前には
library(mva)
を実行する。

2.変数間の単位が異なる場合には、scaleコマンドで変数を平均0、分散1に正規化しておく。

3.因子数を指定する必要がある。
 事前に主成分分析を行い、固有値の大きさをみることによって決める。
  例 1以上の固有値の数

4. 回転方法は
none
指定しなければ varimax

5.実行後のオブジェクトには下記が含まれる。
"converged" "loadings" "uniquenesses" "correlation" "criteria" "factors" "dof" "method" "n.obs" "call" scores

特に重要なのは
loadings 因子負荷量
scores 因子得点



図表 因子分析の実際

#因子分析
a<-data.frame(ossdata$nrelease,ossdata$npcntb,ossdata$ncntb,ossdata$nmsgfr,ossdata$npml,ossdata$nmsgml,ossdata$npfrq,ossdata$nmsgfrq,ossdata$npbug,ossdata$nmsgbug)
sa<-scale(a)
library(mva)

#因子数についての仮説があるわけではないので、因子数をいろいろ指定して因子分析。因子数を決定する。
#2因子
factanal(sa,factors=2,rotation="none")
#いろいろ出力されるがまずは下記の部分に注目。
#Test of the hypothesis that 2 factors are sufficient.
#The chi square statistic is 223.14 on 26 degrees of freedom.
#The p-value is 3.06e-33
#このp値は、上記のように2因子で十分という帰無仮説を検定した結果。
#これが棄却されなくなるまで因子数を増加。

#3因子
factanal(sa,factors=3,rotation="none")
#Test of the hypothesis that 3 factors are sufficient.
#The chi square statistic is 44.82 on 18 degrees of freedom.
#The p-value is 0.000439

#4因子
factanal(sa,factors=4,rotation="none")
#Test of the hypothesis that 4 factors are sufficient.
#The chi square statistic is 8.49 on 11 degrees of freedom.
#The p-value is 0.669
#因子数4に決定。

#細かく結果を見る。




図表 因子分析の出力

#Uniquenesses:
#独自性
#もとの変数のもっている情報のうち、因子によって説明されていない情報の割合。

#
ossdata.nrelease ossdata.npcntb ossdata.ncntb ossdata.nmsgfr ossdata.npml
# 0.966 0.201 0.054 0.933 0.005
# ossdata.nmsgml ossdata.npfrq ossdata.nmsgfrq ossdata.npbug ossdata.nmsgbug
# 0.124 0.005 0.130 0.005 0.022
#
#Loadings:
#因子負荷量。変数を標準化したので、因子と変数との相関係数。これをみて因子の意味を解釈
#
ossdata.nrelease ossdata.nmsgfrは独自性が高かったことが、ここでも確認できる。
#独自性=1-Σ因子負荷量2

# Factor1 Factor2 Factor3 Factor4
#ossdata.nrelease 0.119 -0.122
#ossdata.npcntb 0.729 0.240 -0.199 0.413
#ossdata.ncntb 0.778 0.242 -0.314 0.428
#ossdata.nmsgfr 0.118 0.144 0.167
#ossdata.npml 0.503 0.858
#ossdata.nmsgml 0.353 0.790 -0.102 0.342
#ossdata.npfrq 0.822 -0.294 0.483
#ossdata.nmsgfrq 0.600 -0.219 0.676
#ossdata.npbug 0.897 -0.197 -0.387
#ossdata.nmsgbug 0.890 -0.205 -0.377

# Factor1 Factor2 Factor3 Factor4
#SS loadings 4.164 1.725 1.166 0.500
#Proportion Var 0.416 0.172 0.117 0.050
#寄与率
#Cumulative Var 0.416 0.589 0.705 0.755
#累積寄与率



図表 回転と因子得点の算出

#因子の意味を解釈しやすくするためにvarimax回転という座標変換を行う。
#さらに因子得点も算出。これらを後で使うのでデータセットに入れる。

f<-factanal(sa,factors=4,rotation="varimax",scores="regression")
f
#Uniquenesses:回転しても変わらない
#ossdata.nrelease ossdata.npcntb ossdata.ncntb ossdata.nmsgfr ossdata.npml
# 0.966 0.201 0.054 0.933 0.005
# ossdata.nmsgml ossdata.npfrq ossdata.nmsgfrq ossdata.npbug ossdata.nmsgbug
# 0.124 0.005 0.130 0.005 0.022

#Loadings:回転という座標変換によって因子負荷量にメリハリがでて解釈しやすくなったはず。
# Factor1 Factor2 Factor3 Factor4
#ossdata.nrelease 0.178
#ossdata.npcntb 0.641 0.595 0.172
#ossdata.ncntb 0.745 0.612 0.102
#ossdata.nmsgfr 0.188 0.164
#ossdata.npml 0.157 0.783 0.590
#ossdata.nmsgml 0.160 0.897 0.197
#ossdata.npfrq 0.447 0.888
#ossdata.nmsgfrq 0.145 0.920
#ossdata.npbug 0.974 0.185 0.107
#ossdata.nmsgbug 0.966 0.197

#回転しても変わらない
# Factor1 Factor2 Factor3 Factor4
#SS loadings 3.120 2.192 1.791 0.451
#Proportion Var 0.312 0.219 0.179 0.045
#Cumulative Var 0.312 0.531 0.710 0.755

#Test of the hypothesis that 4 factors are sufficient.
#The chi square statistic is 8.49 on 11 degrees of freedom.
#The p-value is 0.669


f$scores
#には4つの因子得点が格納されている。
# Factor1 Factor2 Factor3 Factor4
# 1 -0.05245361 -0.42487898 0.216393664 -0.164673126
# 2 -0.13808695 1.35033746 -0.439920765 -0.510224178
# 3 -0.20413113 -0.33241228 -0.426046991 -0.191910142
# 4 -0.08789391 -0.58520419 -0.505127710 0.089721488
# 5 -0.15513371 -0.50914781 -0.464514296 -0.005113554
# 6 -0.23071286 0.50372957 -0.516597661 1.049754932
# 7 -0.11483392 -0.50605793 1.346648683 -0.214950600
# 8 -0.63296738 0.88225867 3.235010140 -0.368151176

cor(f$scores)
summary(f$scores)



図表 因子得点による回帰分析

res<-lm(log(ossdata$nofdl)~f$scores)
summary(res)

#Coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 7.5157 0.1892 39.728 < 2e-16 ***
#f$scoresFactor1 0.5248 0.1897 2.767 0.006871 **
#f$scoresFactor2 0.6412 0.1854 3.458 0.000833 ***
#f$scoresFactor3 0.6495 0.1893 3.431 0.000910 ***
#f$scoresFactor4 0.4662 0.1806 2.582 0.011442 *
#---
#Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

#Residual standard error: 1.844 on 90 degrees of freedom
#Multiple R-Squared: 0.2902, Adjusted R-squared: 0.2586
#F-statistic: 9.197 on 4 and 90 DF, p-value: 2.82e-06


#独自性が高い変数についても、そのままもちいることもある。
res<-lm(log(ossdata$nofdl)~f$scores+ossdata$nrelease+ossdata$nmsgfr)
summary(res)

b<-data.frame(f$scores,ossdata$nrelease,ossdata$nmsgfr)
cor(b)



・その他の応用
 変数間の関係をみたり、サンプルの分類などの際に用いる。変数が沢山ある場合、因子や主成分を使うと変数の数が減るので楽になる3

図表 変数間の関係をみてみる

#データセットに含まれる変数すべてを組み合わせて散布図を作成
pairs(a)


pairs(f$scores)



1 ここでの定式化は以下の文献に依っている。
Johnson and Wichern(1992),Applied Multivariate Statistical Analysis 3rd ed.,Prentice Hall: NJ
 回帰分析のモデル、y=βx+β0と同じ形であることに注意。
 ただし、回帰分析の場合、y,xとも観測されるが主成分分析と因子分析についてはxしか観測されないことに注意。

2 ’は転置すること(ベクトルや行列の行と列を入れ替えること)を示す。

3 マーケティングにおける知覚マップを描く方法の一つに、ブランド別に消費者に属性評価させたデータを因子分析し、算出された因子得点をブランド別に平均し、因子をもちいたグラフにプロットする方法がある。