Python で vif を計算する方法
回帰分析における多重共線性は、2 つ以上の説明変数が相互に高度に相関しており、回帰モデル内で固有または独立した情報を提供しない場合に発生します。
変数間の相関度が十分に高い場合、回帰モデルのフィッティングと解釈の際に問題が発生する可能性があります。
多重共線性を検出する 1 つの方法は、分散膨張係数 (VIF)として知られる指標を使用することです。これは、回帰モデル内の説明変数間の相関と相関の強さを測定します。
このチュートリアルでは、Python で VIF を計算する方法を説明します。
例: Python で VIF を計算する
この例では、10 人のバスケットボール選手の属性を記述するデータセットを使用します。
import numpy as np import pandas as pd #create dataset df = pd.DataFrame({'rating': [90, 85, 82, 88, 94, 90, 76, 75, 87, 86], 'points': [25, 20, 14, 16, 27, 20, 12, 15, 14, 19], 'assists': [5, 7, 7, 8, 5, 7, 6, 9, 9, 5], 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10, 10, 7]}) #view dataset df rating points assists rebounds 0 90 25 5 11 1 85 20 7 8 2 82 14 7 10 3 88 16 8 6 4 94 27 5 6 5 90 20 7 9 6 76 12 6 6 7 75 15 9 10 8 87 14 9 10 9 86 19 5 7
スコアを応答変数として、ポイント、アシスト、リバウンドを説明変数として使用して重線形回帰モデルを近似したいとします。
モデル内の各説明変数の VIF を計算するには、statsmodels ライブラリのvariance_inflation_factor() 関数を使用できます。
from patsy import damatrices from statsmodels.stats.outliers_influence import variance_inflation_factor #find design matrix for linear regression model using 'rating' as response variable y, X = dmatrices('rating ~ points+assists+rebounds', data=df, return_type='dataframe') #calculate VIF for each explanatory variable vivid = pd.DataFrame() vive['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] vivid['variable'] = X.columns #view VIF for each explanatory variable lively Variable VIF 0 101.258171 Intercept 1 1.763977 points 2 1.959104 assists 3 1.175030 rebounds
各説明変数の VIF 値を観察できます。
- ポイント: 1.76
- アシスト: 1.96
- リバウンド: 1.18
注:この値は関係ないため、テンプレート内の「Intercept」の VIF は無視してください。
VIF 値の解釈方法
VIF 値は 1 から始まり、上限はありません。 VIF を解釈するための一般的なルールは次のとおりです。
- 値 1 は、モデル内の特定の説明変数と他の説明変数の間に相関関係がないことを示します。
- 1 ~ 5 の値は、特定の説明変数とモデル内の他の説明変数の間に中程度の相関関係があることを示しますが、多くの場合、特別な注意を必要とするほど深刻ではありません。
- 5 より大きい値は、モデル内の特定の説明変数と他の説明変数の間に重大な相関関係がある可能性があることを示します。この場合、回帰結果の係数推定値と p 値は信頼できない可能性があります。
回帰モデルの説明変数の VIF 値はそれぞれ 1 に近いため、この例では多重共線性は問題になりません。