先日主成分分析で因子負荷量と第一第二主成分をプロットするbiplot関数を作ったのですが、これを回帰に応用してみようと思います。
使用するデータはボストン住宅価格のデータセットです。
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def biplot_spv(df, y):
for col in df.columns:
df[col] = (df[col] - df[col].mean()) / df[col].std()
model = PCA()
model.fit(df)
df_pc = model.transform(df)
com = model.components_
evr = model.explained_variance_ratio_
fac = []
for i in range(len(evr)):
fac.append(np.sqrt(model.explained_variance_ratio_)[i] * model.components_[i])
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax2.scatter(df_pc[:, 0], df_pc[:, 1], cmap="brg", c=y)
ax3 = ax1.twiny()
ylim = [abs(max(fac[1])), abs(min(fac[1]))]
xlim = [abs(max(fac[0])), abs(min(fac[0]))]
for i in range(len(df.columns)):
ax3.plot([0, fac[0][i]], [0, fac[1][i]], color="#FF0000")
ax3.text(fac[0][i], fac[1][i], df.columns[i])
ax3.set_xlim(-max(xlim), max(xlim))
ax3.set_ylim(-max(ylim), max(ylim))
plt.show()
import pandas as pd
df = pd.read_csv("boston.csv")
y = df["PRICE"]
x = df.drop("PRICE", axis=1)
biplot_spv(x, y=y)
青が低く赤が中間で緑が高い値となっています。
その上で見てみると因子負荷量がどれも案外無視できない値になっていてトイデータって意外と因子負荷量が強いんですね。