主成分分析

主成分分析とは多次元のデータを低次元データに縮約する方法のことである。Rで主成分分析を行うパッケージには"princomp"と"prcomp"の2種類が存在するが、"prcomp"の方が圧倒的に使い易い。実際の中身の計算に大きな違いはないが、"prcomp"ならサンプルサイズと変数の数を意識することなく使える。以下のエクセルファイルに示されるような20種類のアミノ酸に対し10項目、すなわち10次元のデータを2次元に縮約する。ここで、エクセルの項目名は列も行にもスペースは入ってはいけない。例えばアンダーバー等を用いて、"Melting point"ではなく"Melting_point"のようにする。もし、スペースが入ると今後の作業 (read.table)でエラーが出る。

主成分分析データ

まず、以下の選択範囲で示すように表全体をコピーする。

主成分分析データ選択

次に、Rコンソール上で以下のように打ち込むことでオブジェクト"data"にデータを格納する。

1|$data=read.table("clipboard",header=T)

次は、主成分分析を実行する。以下のコマンドにて上の"data"を処理し、オブジェクト"pc"に主成分分析の結果が格納される。ここで、"scale=T"は数値のスケールが合っていないときに用いるオプションであり、スケールが統一されている場合は入力する必要はない。スケールが合っていないとは、項目1の単位が"cm"で項目2の単位がgであるとき等のことである。ここでTを指定すると相関行列から、Fを指定すると分散共分散行列から主成分分析が行われる。基本的に分散共分散行列から主成分分析を行うのは限られた場合のみである。

1|$pc=prcomp(data,scale=T)

以上のコマンドにて主成分分析が終了し、"pc"には主成分スコア$x、標準偏差$sdev(固有値の正の平方根)、$rotation(各主成分軸の固有ベクトル)、$center(解析に用いた各項目の値の平均)等が格納される。多次元データを低次元に縮約したいだけなら、これらの項目の中では$xだけを考えれば良い。これに加えて、寄与率、つまり、10次元を2次元に縮約した際にその2次元軸でどれくらい10次元データを説明できるか(カバーできるか)を示す値も取得する。以下の3つのコマンドで、それぞれ、主成分1軸 (PC1) と主成分2軸 (PC2) および寄与率を取得する。

1|$pc$x[,1]
1|$pc$x[,2]
1|$summary(pc)$importance[2,]

最初の2つのコマンドではAからVに対応する20個の数字が得られる。最後のコマンドではPC1からPC10にひとつずつ対応する数値が得られるはずである。これら3つのコマンドにて表示された値をエクセルに貼り付ける。"pc$x[,1]"および"pc$x[,2]"で得られた値にはそれぞれ"PC1"および"PC2"と名前を付けた。また、"summary(pc)$importance[2,]"で得られた値には"contribution"と名前を付けた。

主成分分析結果

これらを散布図および棒グラフにして主成分分析終了である。

主成分分析散布図

散布図では、10次元のデータを2次元に縮約させたときの20種類のアミノ酸の関係が示されている。似た性質のアミノ酸は主成分平面上で近い位置に集まっている様子が見て取れる。例えば、IとL、DとE、RとKなどの似ているアミノ酸同士はそれぞれお互いに近い位置に存在していることがわかる。

主成分分析棒グラフ

最後に、棒グラフでは各主成分軸の全10次元の説明量を示している。今回は、主成分2軸までしか使わなかったので"PC1"と"PC2"の値を合計して、これらの2軸では全情報を67%説明できているということを示している。

このエントリーをはてなブックマークに追加

Site search

ページのトップへ戻る