2012/09/09

文系のための「主成分の選択」

主成分分析の仕組みも理解できた。解釈の仕方も理解できた。
これで、基本的に主成分分析を使うことは出来る。

しかしながら、当初に問題として挙げておいて、まだ整理できていない問題がある。
すなわち、主成分を何番目まで採るべきか?という問題である。
これには、いくつかの方法が存在し、ここでは、4つの方法について整理する。

とりあえずは、これまでのデータを準備する。

library(RCurl)

# Google Spreadsheet からデータをダウンロードする
data <- getURL("https://docs.google.com/spreadsheet/pub?key=0AtOtIs5BjRVhdHo0c0pjb29OTU9aV3BmQUFJUWJQa0E&single=true&gid=0&range=A1%3AK48&output=csv", ssl.verifypeer = FALSE)

# ダウンロードしたデータを読み込む
X <- as.matrix(read.table(textConnection(data), header=TRUE, row.names=1, sep=","))

この結果を主成分分析にかけて、さらに、データの要約を確認する。

X.pca <- prcomp(X)
summary(X.pca)

二行に分かれてしまっているが、とにかく、以下が実行結果。

> X.pca <- prcomp(X)
> summary(X.pca)
Importance of components:
                           PC1     PC2    PC3     PC4     PC5     PC6     PC7
Standard deviation     17.6782 10.0382 8.0996 7.31714 5.32485 4.77568 3.88928
Proportion of Variance  0.5079  0.1638 0.1066 0.08701 0.04608 0.03707 0.02458
Cumulative Proportion   0.5079  0.6717 0.7783 0.86531 0.91139 0.94846 0.97304
                           PC8     PC9    PC10
Standard deviation     2.69582 2.46266 1.80463
Proportion of Variance 0.01181 0.00986 0.00529
Cumulative Proportion  0.98485 0.99471 1.00000

Standard deviation分散Propotion of Variance分散の割合
そして、Cummulative Proportion累積された分散の割合を示す。
特に、最後の累積された分散の割合のことを累積寄与率と呼ぶ。

さて、分散の割合がなぜ、重要であったかを思い出してみる。
たしか、主成分分析のしくみの話でも述べたこと。
つまり、元のデータの説明力を示しているのであった。

主成分の採用基準の1つめの方法というのは、この累積寄与率を見る方法である。
よく見かける方法は、「大体、7割程度の近似で良いのではないか?」というもの。

したがって、この場合には、第3主成分までを採用すると、
累積寄与率が、約78%となり、第3主成分まで判断すれば良いことになる。

しかしながら、この基準の場合、困ったことがある。
非常に、累積寄与率が7割付近で、微妙に推移する場合
その微妙な差で、採用と不採用を決めることができるか、という問題である。

では、二つ目の方法

今度は、スクリープロットというものを用いる。
# スクリープロットを描画する。
screeplot(X.pca, main="Screeplot for Variance")

スクリーとは、「」を意味し、急激な変化が起きている部分までを採用するという方法。
Rでは、screeplot()関数を用いる。それにしても、何とも、愛想の無いプロットである。

この場合は、第1と第2主成分の間第4と第5主成分の間に変化が見える。
したがって、第1主成分のみ、あるいは第4主成分までを採用するということになる。

ふむ。もっと、スッキリとした方法は存在しないのであろうか?
ということで、三つ目の方法

今度は、もう少し、明確な基準。カイゼル基準と呼ぶ。

この方法は、相関係数行列に対応する主成分分析を行い、
分散が「1」以上となるものを採用するというもの。

すでに述べたように、相関係数行列に対応する行列による主成分分析の場合、
主成分得点の分散の平均は「1」となった。

そもそも、標準化した行列による主成分分析であるので、
元の状態では、各変数における値の平均は「0」、分散は「1」である。そして、
主成分分析を行うと、変数間の関係から開放され、分散の合計が再配分される

ここで視点を変えてみると、分散が「1」よりも小さいということは、
元の状態よりも、少ない状況しか反映できていないことを示す
折角なので、先程のスクリープロットと合わせて表示してみる。
# とりあえず、標準化したデータによる主成分分析を行う
X.pca.scale <- prcomp(X, scale=TRUE)

# 一応、分析結果の要約も表示
summary(X.pca.scale)

# スクリープロットを描く
screeplot(X.pca.scale, main="Screeplot for Variance (with scaled data)")

# 分散が「1」となる基準線を弾く。
abline(h=1, lty=2)

要約の結果は以下の通り。

> # 一応、分析結果の要約も表示
> summary(X.pca.scale)
Importance of components:
                          PC1    PC2    PC3    PC4     PC5     PC6     PC7
Standard deviation     1.7355 1.2277 1.1613 1.0490 0.93393 0.79329 0.75419
Proportion of Variance 0.3012 0.1507 0.1348 0.1100 0.08722 0.06293 0.05688
Cumulative Proportion  0.3012 0.4519 0.5868 0.6968 0.78403 0.84696 0.90384
                           PC8     PC9    PC10
Standard deviation     0.68435 0.54333 0.44506
Proportion of Variance 0.04683 0.02952 0.01981
Cumulative Proportion  0.95067 0.98019 1.00000

第5主成分以下は、分散が「1」よりも低いので、第4主成分までが採用となる。
なるほど。この方法は、かなり良い。先程までの方法と比較しても客観的に見える。

では、この方法が最良と言えるかと言うと、ここにも問題がある。
主成分得点の分散は、後ろに行けば行くほど、値が小さくなるのは当たり前
なんとか、この部分の調整をしたい。

ということで、四番目の方法、「平行分析」。「原理上」は、これがベスト

この方法は、元のデータサイズと同じサイズ(対象と変数の数が同じ)の、
人工的な架空の値が入った行列を大量に準備し、そのデータから基準を作る方法。

一般的な方法は、人工的な架空の値には、標準正規乱数というのを用いる。
ここでは、標準正規乱数に関する詳しい話は省略するが、
要するに、誤差が平均「0」分散「1」となるような乱数を発生させる。

このようにして、元のデータと同じサイズの行列の成分を乱数で埋め尽くし
そのようにして作られた行列で、主成分得点の分散を求める

ここで、各々の成分は、乱数なので、主成分分析を1回だけ実行しただけだと、
誤差が影響してしまうので、それを1000回、10000回というように何回も実行する。

そうして、繰り返し計算で得られた主成分得点分散平均値中央値、あるいはIQRと、
本来の分析対象であるデータの主成分得点の分散を比較し、上側に来るものを採用する。
要するに、カイゼル基準の改良版といったところであろうか。

なんとも、複雑そうに見えるが、Rでは、この方法は簡単に実行できる。
とは言え、標準では入っていない。psych() ライブラリを読み込む。
library(psych)
fa.parallel(X)

そして、以下が実行結果。

> fa.parallel(X)
Loading required package: MASS
Parallel analysis suggests that the number of factors =  3  and the number of components =  1

psych()関数fa.parallel()関数を用いると、主成分分析の主成分の採用基準と、
同様に、因子分析因子数の採用基準が表示される。

この図において、✕印の折れ線が主成分分析の場合を示し、
△印の折れ線が因子分析の場合を示している。

赤色の点線は、標準正規乱数による基準の線で、
破線は、別の方法(元のデータの入れ替えの方法)による基準線を示している。

出力結果を見てみると、以下のように書いてある。

「平行分析は因子=3、および主成分=1を提案する」

平行分析は、因子分析にも対応しているため、両方の結果を提案してくれるのだが、
今回は、主成分分析なので主成分について観察する。

さて、今回の場合、結果として主成分は「1」であるとのお告げがあったのだが、
これは平均値を基準にしているので、多少の余裕(IQR程度)を見ても構わない。
そこで、平行分析プロットをもう一度観察してみる。

どうやら、第2主成分はごく僅かに基準線よりも下側に有り、
第3主成分は基準線よりも僅かに上側に来ている。
したがって、微妙ではあるが、第3主成分までは採れそうである。第4主成分以下は不可

さて、最後に重要なこととして、主成分の採用基準というのは、
あくまで、元のデータの説明力に意味があるという前提がある。
一方で、重要な情報が元の情報の多さと一致しているとは限らない

つまり、主成分の分散の大きさに目が行き過ぎるのも問題で、
実は、主成分の後ろの方に重要な意味が潜んでいる場合もある。

したがって、第1主成分第2主成分で上手く説明できない場合には、
寄与率が低くとも、様々な組み合わせを確認することも重要である。

0 件のコメント:

コメントを投稿