分散拡大係数(VIF)とは|多重共線性の判定基準・R/Pythonでの計算と実務的対処法
分散拡大係数とは — 概要
分散拡大係数(ぶんさんかくだいけいすう、Variance Inflation Factor:VIF)は、重回帰分析における多重共線性(複数の説明変数が互いに高く相関している状態)を定量的に評価するための指標です。VIFは、ある説明変数を他の説明変数で回帰したときの決定係数(R²)に基づき、その説明変数の回帰係数推定量の分散がどれだけ増大しているか(=拡大されているか)を示します。IT・データサイエンスの実務では、特徴量の選択や解釈可能性、推定の安定性を確保するために重要なチェック項目です。
定義と数式
説明変数 j(x_j)に対する分散拡大係数 VIF_j は、次の式で定義されます。
- VIF_j = 1 / (1 − R_j²)
ここで R_j² は x_j を他のすべての説明変数で説明する回帰式(x_j を目的変数、他を説明変数として回帰したとき)の決定係数です。R_j² が 1 に近づく(=完全に説明される)と VIF_j は無限大に発散します。
分散(Var)との関係は次のように書けます(説明変数を中心化した場合の簡略表現):
- Var(β_hat_j) = σ² × VIF_j / S_{jj}
ここで S_{jj} は x_j の分散に相当するスケール因子、σ² は誤差分散です。したがって、VIF は同じデータスケールで比較したときに係数推定量の分散がどれだけ「拡大」されるかの倍率を表します。標準誤差は分散の平方根なので、標準誤差の増加率は sqrt(VIF_j) です。
解釈と目安
- VIF = 1:その説明変数は他の説明変数と無相関で、分散の拡大はない。
- 1 < VIF < 5:軽度の相関があるが、通常は許容される範囲。
- 5 ≦ VIF < 10:注意を要するレベル(変数選択や対処を検討)。
- VIF ≧ 10:多重共線性が深刻であり、推定の不安定性や解釈の困難さが生じる可能性が高い。
ただし、これらは「経験則(rule of thumb)」であり、研究者によって基準が異なります。O’Brien (2007) のように、単純な閾値に頼ることへの注意喚起もあります。実際にはモデルの目的(予測重視か説明重視か)、サンプルサイズ、ドメイン知識に基づき総合的に判断する必要があります。
具体例(簡単な数値例)
例:x1 を x2, x3 で回帰した結果 R_1² = 0.80 だったとする。このとき
- VIF_1 = 1 / (1 − 0.80) = 5
- 分散は 5 倍に拡大、標準誤差は sqrt(5) ≒ 2.236 倍に増加する。
つまり、同じサンプルサイズと誤差分散でも、x1 の係数推定の信頼性は大きく低下します。
計算方法(R・Python の例)
R(carパッケージ)
library(car)
model <- lm(y ~ x1 + x2 + x3, data = df)
vif(model) # 各説明変数のVIFを返す
Python(statsmodels)
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
X = df[['x1','x2','x3']]
X = sm.add_constant(X) # 定数項を含む場合は注意(VIFは定数を除いて計算することが多い)
vif_data = pd.DataFrame()
vif_data['feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)
実務では定数項(定数列)や完全共線になっている列を除外して計算するのが一般的です。car::vif はデフォルトで自動処理しますが、実装ごとの扱いに注意してください。
多重共線性が問題になる理由
- 推定量の分散が大きくなり、p値が大きくなって有意性が失われる可能性がある。
- 係数の符号や大きさがサンプルに敏感になり、解釈が不安定になる。
- 予測性能そのものは必ずしも悪化しない(特に線形予測での相関による打ち消し効果がうまく働く場合あり)。ただし、予測の外挿や解釈は危険になりやすい。
対処法(実務的に使えるアプローチ)
- 変数選択:ドメイン知識に基づき不要な変数を削除する。
- 合成変数の作成:相関の高い複数変数を主成分分析(PCA)や因子分析でまとめる。
- 正則化:リッジ回帰(L2)やLASSO(L1)などのペナルティ法を用いると、係数の分散を抑制できる。特にリッジは多重共線性への対処に有効。
- 標準化・中心化:特に多項式の項(x と x² など)で共線性が問題となる場合、説明変数の中心化(平均を引く)で共線性を低減できる。ただし、中心化だけで完全な多重共線性は解消されない。
- カテゴリ変数の処理:ダミー変数を導入する際、ダミー・トラップ(完全な共線性)に注意し、基準カテゴリを落とす。
- データ増強:サンプルサイズが小さい場合はデータを増やすことで推定の安定化が期待できる(ただし現実的な制約あり)。
限界と注意点
- VIF は線形共線性(線形結合による重なり)しか検知できない。非線形関係や相互作用には直接対応しない。
- VIF はモデルに含めた変数群に依存する。ある変数の VIF が高いのは、その変数が他のどの変数と組み合わせられているか次第で変わる。
- スケール不変性:説明変数のスケーリング(単位変更)は R² を変えないため VIF を変えない。ただし標準化は解釈や正則化時の挙動に影響する。
- 閾値は経験則に過ぎない:VIF > 10 が必ずしも「モデル破綻」を意味するわけではなく、モデル目的とコンテキストで判断する必要がある。
IT/データサイエンス実務での取り扱い方
IT現場やデータサイエンスのパイプラインでは、VIF は特徴量エンジニアリング段階でのスクリーニング項目として有用です。ただし、いくつかの観点で使い分けが必要です。
- 予測モデル(ブラックボックス)を重視する場合:正則化やツリーベースのモデル(ランダムフォレスト、勾配ブースティング)は多重共線性に対して比較的頑健なので、VIF を必ずしも厳しく用いる必要はない。ただし、解釈性を求める場合は対処が必要。
- 説明モデル(因果推論や解釈重視)の場合:VIF によるチェックは必須に近い。高VIFな説明変数が残ると因果的解釈があいまいになる。
- データパイプラインの自動化:特徴量の追加や変化に伴い VIF は変動するため、モデル再学習時に自動診断を組み込むと良い。閾値に達したらアラートや変数除去のワークフローを起動する、など。
- ダミー変数化やワンホットエンコーディング:カテゴリ数が多く相関がある場合、ワンホット化だけで VIF が高くなるケースがある。カテゴリの統合やターゲットエンコーディングなど別手法を検討する。
まとめ(実務上のチェックリスト)
- まず説明変数間の相関行列を確認する。
- VIF を計算し、ルール・オブ・サム(5 や 10)を参考に高VIFの変数を洗い出す。
- ドメイン知識を用い、変数削除・合成・正則化など適切な対処を選択する。
- モデル目的(予測 vs 解釈)に応じて対処の優先度を決める。
- パイプライン化して継続的にモニタリングする。
参考文献
- Variance inflation factor — Wikipedia
- UCLA: What is the Variance Inflation Factor (VIF)?
- NIST/SEMATECH e-Handbook of Statistical Methods — Multicollinearity
- statsmodels: variance_inflation_factor (Python)
- car パッケージ(R)ドキュメント — vif 関数
- O’Brien, R. M. (2007). A Caution Regarding Rules of Thumb for Variance Inflation Factors. Quality & Quantity.(VIF の閾値に関する注意喚起)


