主成分分析と因子分析との比較    (SD法による庭景観写真の評価) |
SD法による庭景観写真評価実験から得られたデータに,主成分分析と因子分析を
適用してみた.どちらも2つの成分を抽出が適当であると考えられた.
抽出した成分の手法による違いは,
因子負荷量
間の違いに現れるが,よく似ていた.
主成分分析と因子分析とには違いがあるのかないのか,といった疑問がよくでてくる.
どちらも結果として変量の線形結合を生成するのだから違いはないのではないようにもみえる.
結論からいうと,両者は「似ているが違う」.
データは「対象」×「変量」という行列の形をしているが,「対象」と「変量」の
どちらにより興味をもつかで適用する手法が異なるのである.
主成分分析は,「対象」のもつ変動を少数の次元で説明することを目的としている.
つまり,「対象」の実現値を
できるだけ少数の変数で近似することが目的である.
この結果,主成分分析は分散共分散行列の対角成分に対する
少数の次元での説明力(累積寄与率)を最大にしている.
これに対し,因子分析は「変量」の構造をモデル化し,データがそのモデルに適合しているか
といったことに関心がある.因子分析の目的は,なるべく
少数のパラメータで,分散共分散行列全体をできるだけ正確に再現するように変量間の関係を
構造化することにある.
|
      | ||||||||||||||||||||
  |
両者の違いを数値的にみてみよう.分散や相関のうち抽出した主成分や因子により説明される
割合を表す「累積寄与率」を主成分分析と因子分析で比較したのが左の表である.
1から3までのどの因子数においても,主成分分析の方が対象のもつ変動をより多く説明している.
一方,相関行列をどの程度近似するかという観点からみてみよう.
主成分分析から得られた2次元の固有値と固有ベクトルから生成される
相関行列
は,
λ1γ1γ1' + λ2γ2γ2'
となる.また,因子分析のバリマックス解から得られた因子負荷量行列 F から生成される
相関行列
は,FF' となる.
もとの
相関行列
の対角成分以外の要素との差の2乗和を計算すると,上の表のように
因子分析の方が小さくなった.このように,
因子分析による解の方が相関行列の対角成分以外の要素をよく近似していることがわかる.
gardenjp <- read.csv("gardenjp2.csv", row.names="garden") | # データ読み込み |
gjp <- as.matrix(gardenjp) | # |
cor(gjp) | # 変量間相関 |
pairs(gjp) | # 変量間散布図 |
gjp.prin.out <- prcomp(scale(gjp)) | |
summary(gjp.prin.out) | #累積寄与率 |
biplot(gjp.prin.out) | #固有ベクトルと主成分スコアの同時散布図 |
gjp.fact2.out <- factanal(gjp, factors=2) | #バリマックス |
factanal(gjp, factors=2, rotation="promax")   | #プロマックス |
ld <- gjp.fact2.out$loadings | |
sum(diag(t(ld) %*% ld))/sum(diag(cor(gjp))) | #累積寄与率 |
cor.mat <- cor(gjp) | #データ相関行列 |
diag(cor.mat) <- 0 | #対角成分0化 |
fcor.mat <- ld %*% t(ld) | #因子負荷行列による相関行列の再構成 |
diag(fcor.mat) <- 0 | #対角成分0 |
sum((cor.mat-fcor.mat)^2) | #行列要素差の2乗和 |
g.mat <- gjp.prin.out$rotation[,1:2] | #固有ベクトル |
sd <- gjp.prin.out$sdev[1:2] | #固有値の平方根 |
pcor.mat <- g.mat %*% diag(sd^2) %*% t(g.mat) | #スペクトル合成による再構成 |
diag(pcor.mat) <- 0 | #対角成分0 |
sum((cor.mat-pcor.mat)^2) | #行列要素差の2乗和 |
章目次 | 前へ | もどる | 次へ |