主成分分析

所要時間

280分

学ぶコト

・主成分分析の概要
・主成分分析をPythonで実装

主成分分析の実装に挑戦!

それでは実際に主成分分析の実装に挑戦してみましょう!

まずは必要なライブラリをインポートしていきましょう!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler

ここでは、ワインのデータを扱っていきます。

# データセット読み込み
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df

それぞれのカラムの意味は以下です。

alcohol – アルコール含有量
malic_acid – リンゴ酸
ash – 灰分
alcalinity_of_ash – 灰分のアルカリ度
magnesium – マグネシウム含量
total_phenols – 総フェノール量
flavanoids – フラボノイド量
nonflavanoid_phenols – 非フラボノイドフェノール量
proanthocyanins – プロアントシアニジン量
color_intensity – 色の濃さ
hue – 色調
od280/od315_of_diluted_wines – 希釈ワインのOD比
proline – プロリン(アミノ酸)

ワインの色んな成分量がカラムになっているのがわかりますね。合計で13個ものカラムが存在します。

主成分分析をする前にカラムの数値のオーダーが違うので標準化してオーダーを合わせておいてあげましょう!

scaler = StandardScaler()
df = scaler.fit_transform(df)
df = pd.DataFrame(df)
display(df)

標準化をしたことによって、数値が平均0・標準偏差1に変換されていることが分かります。

それでは、このワインのデータを使って主成分分析を実装していきましょう!

# 主成分分析実装
pca = PCA()
pca_data = pca.fit(df)
pca_data = pca.transform(df)

たった3行で主成分分析が実装できました。

これによって元データが主成分分析によって変換されることになります。

どんな数値が返ってきているのか見てみましょう!

display(pd.DataFrame(pca_data))

同じ行列数で、元データとは違う値が返ってきています。

これが主成分得点と呼ばれ、変換された後の値です。

イメージ的には様々な説明変数がギュッと主成分得点と呼ばれる変数に圧縮された状態になっているのです。

そしてそれらを左側から第1主成分(カラム0)・第2主成分(カラム1)・・・と呼びます。

第1主成分の値をヒストグラムで見てみましょう!

plt.figure(figsize=(10,6))
plt.hist(pca_data[:,0])
plt.xlabel("PCA1")
plt.show()

各変数の特徴をギュッと集めた主成分分析が0を中心にマイナス方向とプラス方向に広がっており、サンプルによってばらつきがあるのが分かります。

では、この第1主成分だけでどのくらいデータの特徴を捉えることができているのでしょうか?

それを調べるためには、寄与率という指標を使います。

以下のように記述してあげましょう!

pd.DataFrame(pca.explained_variance_ratio_ * 100)

pca.explained_variance_ratio_は今回の主成分分析のそれぞれの主成分軸の寄与率を表していて、足し上げると100%になるようになっています。

これを見ると第4主成分までで70%以上の寄与率があることが分かります。

これは、13個あった説明変数が、たった4つの変数で70%以上も説明できるよ、ということです!

さらに、各主成分がそれぞれのカラムとどんな関係にあるのかを主成分負荷量という指標で見ていきましょう!

以下のようにコードを書いてください。

# 主成分負荷量(loadings)を計算
loadings = pca.components_.T * np.sqrt(pca.explained_variance_)

# DataFrameで表示
df_loadings = pd.DataFrame(loadings, 
                           index=wine.feature_names, 
                           columns=[f'PC{i+1}' for i in range(len(wine.feature_names))])
print("主成分負荷量(Principal Component Loadings):")
print(df_loadings.round(3))

少々難しいのですが、loadings = pca.components_.T * np.sqrt(pca.explained_variance_)の部分で主成分負荷量というものを計算しており、それぞれの主成分(第1主成分、第2主成分・・・)の値が元々のカラムとどんな関係にあるかを確認することができるのです!

主成分得点や主成分負荷量の計算はこういうものだと覚えてしまいましょう。大事なのは主成分分析をする意味やどんなアウトプットが得られるかを知っておくことです。丸暗記する必要はないので必要な時に調べて実行できるようになっておいてください。

結果は以下のようになるはず。

第1主成分を見ると、以下のカラムに強い正の関係が見られます。

・total_phenols – 総フェノール量
・flavanoids – フラボノイド量
・od280/od315_of_diluted_wines – 希釈ワインのOD比

赤ワインにはポリフェノールが多い!というのを何となく聞いたことがある人も多いと思いますが、まさにこの総フェノール量というのはポリフェノールを示しています。

そしてフラボノイドもポリフェノールの一種のようで、渋みや色味に影響を与える成分のようです。

希釈ワインのOD比は専門的すぎて分かりづらいのですが、高い方がフェノール類をよく含んでいて渋みがあるようです。

よってこの第1主成分は、色が濃く渋みが強く長期熟成に向いた高品質な赤ワインであるか否かを表しているといえます。

もっと端的に言えば、赤ワインか白ワインかの分類になっているとも言えますね。

このようにして主成分分析で複雑な成分カラムをシンプルな変数に集約して説明できることが分かりました!

動画で学んだように、主成分分析は回帰分析の前手の次元圧縮にも使われますし、データの構造を読み取り解釈するためにも使われます。

主成分分析を理解して使えるようになっておきましょう!