読者です 読者をやめる 読者になる 読者になる

Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

第37回 主成分分析

第37回は主成分分析について書きます。

主成分分析と因子分析はセットで語られることが多く、似たような分析法というイメージが強いのですが、目的が違います。主成分分析は「情報をまとめること」を目的としており、因子分析のように変数の背後にある潜在因子を見つけ出す手法とは異なります。主成分分析は、多くの変数の情報量を失わないように「無相関かつ少数個の合成変数」を作り出す方法なのです。主成分分析ででてくる言葉の解説から始めます。

 

固有値

 主成分分析での固有値は主成分の分散と一致します。

 また、どの程度元のデータの情報をその主成分が持っているかを表します。

・寄与率

 データすべての情報量において、ある固有値が表す情報がどの位の割合を占めているかを表す。

・累積寄与率

 各主成分の寄与率を足していったもの。

 

主成分分析を行う関数はprcomp関数です。

prcomp(x, retx=TRUE, center=TRUE, scale=TRUE)

x:データ

retx:主成分得点を返す(TRUEの場合)

center:主成分得点を中心化する(TRUEの場合)

scale:列ごとに標準化して分散共分散行列を用いて主成分を計算する(TRUEの場合)

 

データは「マンガでわかる統計学(因子分析)」より、ラーメン屋さんのレビューを使わせていただいております。

> noodle <- read.csv("noodle.csv",header=TRUE)

> head(noodle)

    X  men  gu  soup

1  a   2      4     5

2  b   1      5     1

3  c   5      3     4

4  d   2      2     3

・・・

 

> s.men <- scale(noodle$men) #変数を標準化(prcompの引数でscale=TRUEを指定すれば標準化する必要は無い)

> s.gu <- scale(noodle$gu)

> s.soup <- scale(noodle$soup)

> s.noodle <- cbind(s.men,s.gu,s.soup)

> colnames(s.noodle) <- c("men","gu","soup")

> s.noodle.pca <- prcomp(s.noodle[,1:3],retx=TRUE)

> s.noodle.pca

 

Standard deviations:

[1] 1.2541347 0.9022241 0.7830312

 

Rotation:

           PC1         PC2          PC3

[1,] 0.5715110  -0.6044710   0.5549685

[2,] 0.5221161   0.7896069   0.3223595

[3,] 0.6330639  -0.1055260  -0.7668731

 

 

第1主成分z_1=  0.57*men +0.52*gu+ 0.63*soup

第2主成分z_2=-0.60*men +0.79*gu- 0.11*soup

ということがわかる。ここに各変数の値を代入すると、

新たに得られた第1主成分、第2主成分上の座標が求まる。(標準化後の場合は、標準化した値)

 

aのお店は、

第1主成分z_1=  0.57*-0.7 +0.52*0.3+ 0.63*1.4→0.7

第2主成分z_2=-0.60*-0.7 +0.79*0.3- 0.11*1.4→0.5

 

主成分分析後の新たな座標は、(0.7, 0.5)ということになります。

 

以下のコマンドで、主成分得点を算出できます

>s.noodle.pca$x 

> summary(s.noodle.pca)

Importance of components:

                               PC1         PC2       PC3

Standard deviation         1.2541    0.9022   0.7830

Proportion of Variance       0.5243    0.2713   0.2044

Cumulative Proportion       0.5243     0.7956  1.0000

 

 

第一主成分で52%、第二主成分で79%に達している。

第○主成分までを使うかどうかは、スクリープロットや相関係数により主成分を算出した場合、固有値が1以上のものを使うというカイゼル基準がありましたが、最近は「ランダム平行分析」で成分の数を決めることが多くなってきました。私が所属していた分野では。

 

ランダム平行分析とは、用いたデータと同じサイズのランダムデータを多数生成し、ランダムデータの固有値を求め、その平均値と比べ、意味があるのは、第○固有値まであるかを目安とする。その平均値とデータの固有値の推移が交わったところ「以上」のものを採用する。

 

> library(psych)

> fa.parallel(noodle[,2:4],n.iter=10,error.bars=TRUE)

Parallel analysis suggests that the number of factors =  0  and the number of components =  1 

 

f:id:teruaki-sugiura:20150801021453p:plain

 

 

平行分析の結果、第1主成分まで利用すれば良いことがわかりました。しかし、せっかくなので、第2主成分までつかって散布図を書いてみましょう

 

>biplot(s.noodle.pca,xlab="PC1(52%)",ylab="PC2(27%)",xlim=c(-1,1),ylim=c(-1,1))

 

f:id:teruaki-sugiura:20150801021451p:plain

 

5,10のお店は総合的に評価されているお店であることがわかります。より詳しく見ると、5のお店は具が評価されており、3のお店は麺で評価されています。2のお店は総合評価は良くないけれども、具では評価されているようです。

 

第37回は以上でお終い。

広告を非表示にする