VIF統計量をPythonで計算

こんにちは、βshortです。

pythonでvifを計算していきます。

pythonでvifを計算するには、ライブラリを使う方法があります。

vifについては、多重共線性とVIF統計量の求め方にも書いたので合わせて参照ください。

使うデータ

データは、bostonデータを使います。

load_boston()

statsmodelライブラリを使う

statsmodelライブラリを使います。
インポートするものを下に示します。

from statsmodels.stats.outliers_influence import variance_inflation_factor

ソースコード

ソースコードを示していきます。

分割して表示します。

データを用意する

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

#データをインポート
from sklearn.datasets import load_boston

#statsmodelsのvifをインポート
from statsmodels.stats.outliers_influence import variance_inflation_factor


# サンプルデータを用意
dataset = load_boston()

# 標本データを取得
data_x = pd.DataFrame(dataset.data,columns=dataset.feature_names)

# 正解データを取得
data_y = pd.DataFrame(dataset.target,columns=['target'])

statsmodelsでvifを計算する

#vifを計算する
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(data_x.values, i) for i in range(data_x.shape[1])]
vif["features"] = data_x.columns

#vifを計算結果を出力する
print(vif)

#vifをグラフ化する
plt.plot(vif["VIF Factor"])

結果

ライブラリを使わない

こちらは、前回の多重共線性とVIF統計量の求め方と同じ計算方法でvifを計算しました。

vif統計量は、以下の通り78通りあります。

$$\begin{eqnarray}{}_{13} \mathrm{ C }_2 = 78 \end{eqnarray}$$

VIFが10以上になるものであれば、多重共線性が存在している可能性があるので対処しなければならない。

結果は、省略します。

ソースコード

for t in range(data_x.shape[1] - 1):
    s = t
    for i in range(data_x.shape[1] - 1 - s):
        #変数1 変数2 vif の順に表示される
        print(s+1, s + 1 + i + 1, 1 / (1 - np.corrcoef(data_x.iloc[:, s], data_x.iloc[:, s + 1 + i])[1, 0]))

参考

  1. statsmodels.stats.outliers_influence.variance_inflation_factor
  2. 回帰での多重共線性
  3. Variance Inflation Factor (VIF) Explained
  4. 分散拡大係数
  5. 多重共線性とVIF統計量で説明変数間での相関を調べる

参考書