LoginSignup
0
1

主成分分析の因子負荷量を可視化してみた

Last updated at Posted at 2024-06-23

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()

image.png

因子負荷量の計算

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

image.png

因子負荷量のプロット

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()

参考元とは正負が逆になっていますが因子負荷量の解釈はこのようになります。
Untitled.png

両軸

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()

Untitled.png

第一主成分の値が高いほど体育以外が高く、第二主成分の値が高いほど体育が高い。
というのが直感的に分かるモノになったのではないかと思います。
また2軸だと左軸が因子負荷量で右軸が主成分分析変換後(PC2)で横軸が主成分分析変換後のPC1の値です。下軸が主成分分析変換後(PC1)で上軸が因子負荷量の第一主成分です。

参考文献

主成分分析 | 統計科学研究所
https://statistics.co.jp/reference/software_R/statR_9_principal.pdf

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1