R言語では簡単に主成分分析を可視化しやすいのですが、主成分分析では段階を踏まないといけません。
ライブラリのインポート
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
データの読み込み
9科目の成績データを読み込みます。
このデータです
df = pd.read_csv("seiseki.csv")
df.head()
因子負荷量の計算
pcacol = []
fac = []
for col in df.columns:
df[col] = (df[col] - df[col].mean()) / df[col].std()
for i in range(len(df.columns)):
pcacol.append("PC%d"%(i+1))
model = PCA()
model.fit(df)
df_pca = pd.DataFrame(model.transform(df))
df_pca.columns = pcacol
for i in range(len(pcacol)):
print(pcacol[i], np.cumsum(model.explained_variance_ratio_)[i])
fac.append(np.sqrt(model.explained_variance_ratio_)[i] * model.components_[i])
df_fac = pd.DataFrame(fac)
df_fac.columns = df.columns
df_fac.index = pcacol
df_fac
因子負荷量のプロット
for col in df_fac.columns:
arrow = [df_fac.loc["PC1", col], [df_fac.loc["PC2", col]]]
plt.plot([0, arrow[0]], [0, arrow[1][0]])
plt.text(arrow[0], arrow[1][0], col)
plt.show()
参考元とは正負が逆になっていますが因子負荷量の解釈はこのようになります。
両軸
fit, ax1 = plt.subplots()
for col in df_fac.columns:
arrow = [df_fac.loc["PC1", col], [df_fac.loc["PC2", col]]]
ax2 = ax1.twinx()
ax2.scatter(df_pca["PC1"], df_pca["PC2"])
ax1.set_ylim(-0.325, 0.325)
ax3 = ax1.twiny()
for col in df_fac.columns:
arrow = [df_fac.loc["PC1", col], [df_fac.loc["PC2", col]]]
ax3.plot([0, arrow[0]], [0, arrow[1][0]])
ax3.text(arrow[0], arrow[1][0], col)
ax3.set_xlim(-0.325, 0.325)
plt.show()
第一主成分の値が高いほど体育以外が高く、第二主成分の値が高いほど体育が高い。
というのが直感的に分かるモノになったのではないかと思います。
また2軸だと左軸が因子負荷量で右軸が主成分分析変換後(PC2)で横軸が主成分分析変換後のPC1の値です。下軸が主成分分析変換後(PC1)で上軸が因子負荷量の第一主成分です。
参考文献
主成分分析 | 統計科学研究所
https://statistics.co.jp/reference/software_R/statR_9_principal.pdf