VIFによる変数選択

重回帰分析をやっていると、多重共線性(マルチコ)ので変数選択が必要になりますが、評価指標として分散拡大係数:Variance Inflation Factorというものがあるそうで。

numpyで直接計算する。

corr_mat = np.array(df.corr())
inv_corr_mat = np.linalg.inv(corr_mat)
pd.Series(np.diag(inv_corr_mat), index=df.columns)

statsmodelsを使う。

import statsmodels.api as sm

xx = df.drop('目的変数',axis=1)
yy = df['目的変数']

x_add_const = sm.add_constant(xx)
model_sm = sm.OLS(yy, x_add_const).fit()
print(model_sm.summary())

from statsmodels.stats.outliers_influence import variance_inflation_factor as vif

num_cols = model.exog.shape[1]
vifs = [vif(model.exog, i) for i in range(0, num_cols)]

pd.DataFrame(vifs, index=model.exog_names, columns=['VIF'])

参考にしました

pythonのstatsmodelsを使った重回帰分析で溶解度予測:AICによるモデル選択 | 化学の新しいカタチ

Python(StatsModels) で重回帰分析を理解し、分析の精度を上げる方法 | たぬハック

VIF統計量をPythonで計算 | βshort Lab

VIFを利用した減少法による変数選択法in Python | βshort Lab

Pythonを使って変数選択! - 見習いデータサイエンティストの隠れ家

PythonのStatsModelsで重回帰分析 - Qiita