Hatena::ブログ(Diary)

ほくそ笑む このページをアンテナに追加 RSSフィード Twitter

2012-01-06

主成分分析が簡単にできるサイトを作った

あけましておめでとうございます。

本年もよろしくお願いいたします。

主成分分析

さて、昨年の終わりごろから、私は仕事で主成分分析を行っています。

主成分分析というのは、多次元のデータを情報量をなるべく落とさずに低次元に要約する手法のことです。

主成分分析は統計言語 R で簡単にできます。

例として iris データで実行してみましょう。

data(iris)
data <- iris[1:4]
prcomp.obj <- prcomp(data, scale=TRUE) # 主成分分析

pc1 <- prcomp.obj$x[,1] # 第一主成分得点
pc2 <- prcomp.obj$x[,2] # 第二主成分得点

label <- as.factor(iris[,5]) # 分類ラベル
percent <- summary(prcomp.obj)$importance[3,2] * 100 # 累積寄与率

plot(pc1, pc2, col = label, main = paste(percent, "%"))

f:id:hoxo_m:20120104144742p:image

iris データは、Sepal.Length, Sepal.Width, Petal.Length, Petal.Width の4つの変数を持つ4次元データですが、これを2次元に要約し、2次元平面上にプロットしています。

分類ラベルとして5列目(Species)を使用し、setosa, versicolor, virginica の3種を色分けして表示しています。

それぞれの種がクラスタを形成しているのが見てとれると思います。

このように次元が多くてグラフの描けないようなデータに対して2次元など低次元に要約し、可視化できるのが主成分分析の効能です。

また、累積寄与率が 95.813% であることから、次元を減らしたことによる情報量の損失が 4.2% 程度であることがわかります。

仕事めんどくさい

私が今やっている仕事では、この主成分分析を大量に行わなければなりません。

大量のデータを渡され、そのデータひとつひとつに対して主成分分析を行います。

一つのデータには、また大量の分類ラベルがあり、それぞれに対してクラスタが形成されているか、何か傾向が出ているかを確認しなければなりません。

上記 iris データのようにきれいにクラスタ化されればいいですが、大半はそうはなりません。

というか、ぜんぜんクラスタが形成されないので、データの前処理方法を変えて、また一から主成分分析のやり直しを行ったりしています。

これを R プログラムをちまちま変えながらやっているのですが、はっきりいって、めんどくさいです。

もっと簡単にできる方法はないのでしょうか?


というわけで、また作っちゃいました。

簡単に主成分分析ができるページ

f:id:hoxo_m:20120104163550p:image

簡単にできるシリーズ第二弾です。*1

使い方はいたって簡単

  1. 主成分分析したいデータを Excel からコピーして、このサイトのテキスト欄(左側)に貼り付ける。
  2. 右側に入力データが表形式で表示されるので、ここで入力を確認し、OKなら「Execute PCA」ボタンをクリックする。

これだけで主成分分析ができちゃいます。

使用例

試しに左上の「Show Demo」ボタンを押してください。

iris データがテキスト欄に入力されます。

f:id:hoxo_m:20120104164115p:image

右側でピンク色になっている列は分類用のラベルとして認識されたという意味です。

このラベル以外の列が変数として認識され、主成分分析の対象となります。

「Execute PCA」ボタンを押すと主成分分析が実行され、グラフが表示されます。

f:id:hoxo_m:20120104165121p:image

一番左の棒グラフは Scree Graph といって、各主成分が持つ情報量の大きさを示しています。

主成分は、情報量の多い方から第一主成分(PC1)、第二主成分(PC2)、第三主成分(PC3)…という風に呼ばれます。

Scree Graph から、第何主成分までが情報量を多く持つかを確認することができます。

残りの3つのグラフは、それぞれ、第一主成分vs第二主成分、第一主成分vs第三主成分、第二主成分vs第三主成分をプロットしたものです。

これらの図を見てクラスターが形成されているかどうかを見れば良いというわけです。


ちなみに、分類ラベルが数値データの場合、グラフプロットをグラデーションで表現することもできます。

ちょっとやってみましょう。iris データに対する Label Column を「1-2」に変更し、Sepal.Length をラベルにして、残りの3変数に対して主成分分析を行います。

f:id:hoxo_m:20120105182931p:image

こんな感じになります。

第一主成分vs第二主成分のグラフを見ると、左下が低くて右上にいくほど上昇している傾向が見てとれます。


また、結果のダウンロード機能も付いています。

「Download PCA Result」で主成分分析の結果(負荷量など)が見れます。

「Download Graph Data」で Excel 用のグラフデータも取得でき、グラフの挿入で同じ図が描けます。*2

f:id:hoxo_m:20120105184020p:image

以上が 簡単に主成分分析ができるページ の簡単な説明です。

ぜひぜひ使ってみてください。


例のごとく、データを Web 上に上げたくないという方は、ローカルサーバへの配備も可能です。個別にご相談ください。

バグを見つけた場合もご一報いただけるとありがたいです。

連絡先:f:id:hoxo_m:20111109140111p:image

以上です。

*1:第一弾 http://d.hatena.ne.jp/hoxo_m/20111109/p1

*2:グラデーションには対応してません

sasasasa 2012/01/07 11:25 LDAのほうが良い。

OguriOguri 2012/03/08 13:02 ちょっと質問させてください。最近Bioinformaticsを勉強し始めているんですが、主成分分析についてどうも他の分野とデータの扱いかたが違うんで混乱しています。
例えば、「1人あたり約14万個所のDNA塩基多型を用いて日本人の集団構造を解明」というニュースがありましたが(http://www.riken.jp/r-world/info/release/press/2008/080926/detail.html)、サンプル数Nは7000人で得られるパラメータM(変数)は14万個です。
で、解析は、個人間の分散が最大になるように、つまりサンプルを変数にして主成分分析(NxNのマトリックス)をしています。勘違いでなければ普通の手法と逆ですよね。普通は変数のマトリックスM xMについて主成分分析をして結果の解釈もそれにそったものです。で、サンプルを変数にした場合の結果の解釈がよくわからないです。変数の縮約じゃないことは確かでしょうが、分かりますでしょうか。数学的な意味について記載されたものも見たこともないんです。

OguriOguri 2012/03/10 07:07 Iris のデータを使ってRでやってみると次のようになります。
> data(iris)
> X <- iris[1:4]
>XT <-t(X) 行と列を入れ替えます。行(一個体)が変数として解析されます。
> result2 <- prcomp(XT)
> scores =result$rotation
> label <- as.factor(iris[,5])
> library (rgl)
> plot3d(scores[,1], scores[,2], scores[,3], col=label)
これでもきれいに分類されるのがわかります。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証