データ・サイエンティストは可視化の夢を見るか?

Does Data Scientist Dream of Visualization?

併読してみる ——主成分分析——

前掲書を読み進めています。

Data Science from Scratch: First Principles with Python

Data Science from Scratch: First Principles with Python


『主成分分析』の章まで読みました。主要なコードを抜き書きするとこんな感じになります。

def first_principal_component(X):
    guess = [1 for _ in X[0]]
    unscaled_maximizer = maximize_batch(
        partial(directional_variance, X),
        partial(directional_variance_gradient, X),
        guess)
    return direction(unscaled_maximizer)


def principal_component_analysis(X, num_components):
    components = []
    for _ in range(num_components):
        component = first_principal_component(X)
        components.append(component)
        X = remove_projection(X, component)
    return components


コードを写経するとある程度、アルゴリズムの流れは分かります。
ですが、それを具体的にどう使うかなどは、かんたんな例題がひとつしかないこともありちょっと曖昧です。
そこで類書を引っ張り出してきました。同志社大の金明哲教授の教科書です。
併読してみることによって理解を深めよう、という狙いです。

Rによるデータサイエンス-データ解析の基礎から最新手法まで

Rによるデータサイエンス-データ解析の基礎から最新手法まで


此の本はもともと雑誌連載の原稿だったそうで、その原稿は先生の JIN'S PAGE で公開されています。ただしお気づきのとおり、こちらは R です。当方では Jupyter を導入したので、ほとんど一元的に管理できます。


同書に拠ると【主成分分析】とは……。

主成分分析(PCA: Principal Component Analysis)は、多くの変数により記述された量的データの変数間の相関を排除し、できるだけ少ない情報の損失で少数個の無相関である合成変数に縮約して、分析を行う手法である。主成分分析の手法はホテリング(Hotelling)によって1993年頃に提案された。

主成分分析は、変数が多いとき情報の損失を最小限に押さえながら、少ない合成変数に縮約する方法であるため、元のデータ構造が100%再現できないことと、再現されているのは元の変数、または個体間の相対的な関係に過ぎないことを強調しておきたい。


此処で、『丘本(おかもと)円周データ』という人工データを題材にケース・スタディーしています。詳しい解説は本書に譲りますが、
f:id:renpoo:20160830130614j:plain
という、円周上に配置された点列と円弧上の基準点の距離関係(5 次元)を、主成分分析によって 2 次元(累積寄与率によって決められる)にまで縮約する、といったケースです。 以下は上記の図から算出された、点 A,B,C,D,E から円周上の点への距離の配列です。

> okamoto

A	B	C	D	E
50	57	74	94	112
57	50	57	74	94
74	57	50	57	74
94	74	57	50	57
112	94	74	57	50
128	112	94	74	57
140	128	112	94	74
147	140	128	112	94
150	147	140	128	112
147	150	147	140	128
140	147	150	147	140
128	140	147	150	147
112	128	140	147	150
94	112	128	140	147
74	94	112	128	140
57	74	94	112	128


これを次のように prcomp() で主成分分析に掛けてみます。

> oka.pc<-prcomp(okamoto)


此の結果、次のグラフのような相対関係が導き出されます。
f:id:renpoo:20160830131457p:plain


スゴいですね、5 × 16 次元の距離データから、元々の定義の図にあった点列の相対関係が 2 次元に縮約されたかたちで再現されたのです(ミラー・イメージにはなっていますが相対関係は維持されています)。十分に少ない次元になったのでグラフに描き出すことが可能になりました。


此の計算によって、もともとの点列(ナンバリングされている方)はどうなったのか、主成分得点(個体のデータ構造に関する情報を縮約したもの)から第 1,第 2 主成分を使って散布図を描くことで確認してみましょう。
f:id:renpoo:20160830132410p:plain

多少の歪みはありますが、見事に元々の関係が再構成されました。


では、ここまでの経緯を踏まえたうえで、此の主成分分析を予測に使うことはできるでしょうか?
今度は 1 番〜 10 番までの点列だけを使って(訓練データセットとして) prcomp() で学習してみた結果、次のようなグラフが得られます。
f:id:renpoo:20160830133012p:plain

此の学習の成果が予測に役立つのかどうか実際に 11 番〜 16 番の点列を(試験データセットとして)入力してテストしてみます。
f:id:renpoo:20160830133113p:plain

ちゃんと元々の相対関係を再構成するかのように予測が出てきました。


最後にまとめとして。

関数prcompの結果については、主成分と主成分得点を同一の画面上で散布図を作成するbiplot関数を用いることができる

とのことなので、実際に biplot() でグラフを描画してみます。
f:id:renpoo:20160830133431p:plain


成る程、固有ヴェクトル計算のアルゴリズムのおかげで、基準点に対するラベリングはたまたま逆順になっていますが、きちんと元々の構造(それも距離データの配列に過ぎなかったものを)2 次元に縮約してプロットできました。2 次元になりましたから、かんたんにグラフ描画できるようになった訳です。

主成分分析で行う分析は、変数間、個体間の絶対的関係ではなく、相対的関係であるため、分析には問題がない。


参考として:
『統計科学研究所』の記事「主成分分析」にもリンクを張っておきます。同様の内容を概念図多数でさらに深く扱っています。