多重共線性を解決するVIF(分散膨張因子):回帰分析における対処方法

回帰分析では、独立変数同士が相関していると多重共線性が発生します。これにより、各予測子が従属変数に与える固有の影響を特定することが難しくなります。その結果、標準誤差が過大になり、係数の有意性に影響を与えます。

分散膨張係数(VIF)は、多重共線性を検出するための優れたツールであり、単純なペアワイズ相関を超えた洞察を提供します。このチュートリアルでは、VIFの動作方法、計算方法、解釈方法、および高いVIF値を見つけた場合の対処方法について説明します。これらの手順は、データプロフェッショナルやデータサイエンティストがモデルの安定性を向上させるのに役立ちます。

今、VIFは重要な診断ツールであり、学ぶ価値があるものですが、それはPythonの機械学習サイエンティストキャリアトラックで開発する広範なスキルセットのごく一部に過ぎませんので、今すぐ登録してください。

Variance Inflation Factor(VIF)とは何ですか?

統計学者カスバート・ダニエルによって開発されたVIFは、回帰分析において広く使用される診断ツールで、回帰係数の安定性と解釈可能性に影響を与えることが知られている多重共線性を検出します。より技術的には、VIFは予測因子間の相関によって回帰係数の分散がどの程度膨張しているかを定量化することで機能します。

これらはすべて重要です。なぜなら、これらの相関が各予測因子のターゲット変数に対する独自の影響を特定することを難しくし、モデルの推定値を信頼性が低くするからです。また、正しいストーリーを伝えるために、VIFは常にモデル内の各予測因子について計算される必要があるとも言っておきたいです。

分散膨張因子の公式

予測因子XのVIFは以下のように計算されます:

ここで:

  • R2は、X​が他のすべての予測因子に対して回帰されたときに得られる決定係数です。

ステップバイステップの計算

VIFを求めるのは3ステップのプロセスです。最初のステップは、各予測因子について他のすべての予測因子に対して別々の線形回帰モデルを適合させることです。2番目のステップは、各モデルのR2値を取得することです。最終ステップは、上記の式を使用してVIFを計算することです。

VIF値の解釈

以下は、VIF値を解釈して多重共線性のレベルを理解する方法です:

  • VIF = 1: これは多重共線性がないことを示します。予測子は他の予測子と相関がないため、標準誤差を膨らませたりモデルの安定性に影響を与えることはありません。
  • VIFが1から5の間: これは適度な多重共線性を示します。他の予測子とある程度相関がありますが、通常は深刻ではありません。ただし、他のVIF値が高い場合には、これらの予測子に注意を払い、多重共線性が問題にならないかどうかを確認する価値があります。
  • VIF > 5: 高い多重共線性が存在しています。予測変数の標準誤差が著しく膨張する可能性があり、その係数が信頼性を欠く可能性があります。多重共線性を減らすために、相関のある予測変数を削除したり組み合わせたりするなどの手段を検討してください。
  • VIF > 10: これは深刻な多重共線性を示しています。予測変数の標準誤差が非常に膨張し、その係数の推定値が不安定である可能性が高いです。通常、予測変数を削除したり正則化技術を使用したりするなどの是正措置が必要です。

例えば、予測変数のVIFが10である場合、その予測変数の係数の分散が多重共線性がない場合の10倍であることを示しています。

VIFが回帰分析における多重共線性を説明する方法

多重共線性は標準誤差を増加させ、個々の予測子の有意性を評価するのが難しくなります。これは、共線変数が類似した情報を持っており、特定の個々の効果をアウトカム変数に分離するのが難しいためです。

多重共線性はモデルの予測能力に必ずしも影響を及ぼしませんが、係数の信頼性と明瞭さを低下させます。特に、各予測子の個々の影響を理解したい場合に問題が生じます。

分散膨張係数(VIF)は、多重共線性を特定するための正確な診断指標として機能します。VIFは相関に関する一般的な観察とは異なり、VIFは各変数に対するすべての予測子の組み合わせ効果を分離し、ペアワイズの相関からは明らかにならない相互作用を強調します。

PythonとRにおける分散膨張係数

これを実行可能にするために、PythonとRの両方でユニークなデータセットを使用した例を進めていきましょう。自動パッケージを使用してVIFを計算し、直感を構築するためにVIFの式を使用します。良い練習をするために、2つの変数間に非常に高いペアワイズ相関がないにもかかわらず、1つの変数のVIF値が高いことがわかるデータセットをわざと作成しました – そのため、これは説得力のある例だと思います。使用するデータセットの概要から始めましょう。使用するデータセットの概要:

データセット概要:

この架空のデータセットは、小売大手の1,000店舗で実施された調査の結果を表しています。各店舗の顧客に、負の経験を示す-5から+5のスケールで、彼らのショッピング体験のさまざまな側面を評価するように求められました。各店舗での顧客評価の平均値は、4つの主要なパラメーターにわたって取られました:

  • Ambience:店舗の環境に対する顧客の認識、清潔さ、レイアウト、照明、全体的な雰囲気など。

  • Customer_service:店舗スタッフによるサービスの評価、親切さ、フレンドリーさ、顧客のニーズへの対応など。

  • オファー:顧客に提供される店舗のプロモーションオファー、割引、お得な情報の評価。

  • Product_range:店舗で利用可能な製品の種類と品質を評価します。

目標変数であるPerformanceは、各店舗の総合的なパフォーマンスを測定します。ただし、VIFの観点からは関連性がありません。 データセットはこちらからダウンロードできます。

Pythonにおける分散インフレーションファクター

Pythonパッケージを使用してVIF値を計算する方法から始めます。最初のステップは、データセットと必要なライブラリを読み込むことです。

from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant datacamp_retail_data = pd.read_csv(' vif_data.csv') datacamp_retail_data.head()

上記のコードはデータを読み込み、最初の5つのレコードを表示します。

次のステップとして、ペアワイズ相関をチェックするために相関行列を実行できます。

以下のコードは、4つの列を選択し、それらを新しいDataFrameに格納します。 correl_dataと呼ばれるDataFrameに保存されます。次に、.corr() 関数を使用してペアワイズ相関行列を計算します。結果は、選択した各列の相関係数を示すテーブルであるcorr_matrixオブジェクトに保存されます。

その行列は、Seabornのheatmap() 関数を使用して可視化され、各相関係数がカラーコードされたセルとして表示されます。ここで青は負の相関、赤は正の相関を表し、coolwarm カラーマップに基づいています。

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # ペアワイズ相関行列を計算する corr_matrix = correl_data.corr() # 相関行列を可視化する plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

出力:

  変数間の相関。著者による画像

プロットは、correl_data内の変数間の関係の視覚的要約を提供します。相関値は-1から1の範囲で、1に近い値は強い正の相関を示し、-1に近い値は強い負の相関を示し、0の周りの値は相関がないことを示唆します。変数間に強いペアワイズ相関はないことが明らかであり、相関値が0.6未満であるものは一つもありません。

次のステップは、予測変数のVIF値を計算することです。以下のコードは、データセット内の各予測変数の値を計算して、多重共線性をチェックします。

まず、ターゲット列 Performance を除去し、切片を追加して X を定義します。次に、予測変数の名前とそのVIF値を格納するDataFrame datacamp_vif_data を作成します。ループを使用して、variance_inflation_factor() 関数で各予測変数のVIFを計算し、高いVIFは多重共線性の存在を示します。

# 予測変数を定義 X = datacamp_retail_data.drop(columns=['Performance']) # モデルに定数を追加(切片) X = add_constant(X) # 各特徴量のVIFを計算 datacamp_vif_data = pd.DataFrame() datacamp_vif_data['Feature'] = X.columns datacamp_vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(datacamp_vif_data)

出力:

VIF値を表示する出力。著者による画像

この出力は、データセット内の各予測変数のVIF値を示しており、多重共線性のレベルを示しています。 const 行は切片項を表し、VIFが1に近いため、多重共線性がないことを意味します。 予測変数の中で、Product_range が最も高いVIF(5.94)を持っており、修正措置が必要であることを示しています。 他のすべての予測変数のVIF値は3未満であり、低い多重共線性を示しています。

VIF計算の手動アプローチ

もう1つのアプローチは、各独立変数を他の予測変数に対して回帰させて値を個別に計算することです。

機能の中で、それを従属変数(y)とし、残りの機能を独立変数(X)として設定します。 次に、線形回帰モデルが適合して、yをXを使用して予測し、モデルのR二乗値を使用して、初期セクションで議論した式を使用してVIFを計算します。

その後、各特徴と対応するVIF値が辞書(vif_manual)に保存され、表示のためにDataFrame(vif_manual_df)に変換されます。

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Manual VIF Calculation vif_manual = {} for feature in retail_data.columns: # Define the target variable (current feature) and predictors (all other features) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Fit the linear regression model model = LinearRegression().fit(X, y) # Calculate R-squared r_squared = model.score(X, y) # Calculate VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Convert the dictionary to a DataFrame for better display vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 Output:

出力はVIF値を示しています。著者による画像

出力には、各特徴量とそのVIF値が表示され、多重共線性の問題を特定するのに役立ちます。結果は明らかに上記で得たものと同じであり、その解釈も同様であることがわかります。つまり、Product_range変数が多重共線性を示しているということです。

Rでの分散膨張係数

このセクションでは、Rプログラミング言語を使用する開発者を特に対象として、Pythonセクションでの分散膨張係数の演習を繰り返します。データセットと必要なライブラリを読み込むことから始めます。

library(tidyverse) library(car) library(corrplot) data <- read.csv('vif_data.csv') str(data)

出力:

次のステップは、ペアワイズ相関行列を計算し、ヒートマップで可視化することです。 cor() 関数と corrplot 関数がこのタスクを達成するのに役立ちます。

# 目的の列を削除する predictors_data <- data[, !(names(data) %in% "Performance")] # 相関行列を計算する correlation_matrix <- cor(predictors_data) # 相関ヒートマップをプロットする # 必要なライブラリを読み込む library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # ggplot2でヒートマップをプロットする ggplot(data = melted_corr_matrix, aes(x = Var1, y = Var2, fill = value)) + geom_tile(color = "white") + scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1, 1), space = "Lab", name="Correlation") + theme_minimal() + # クリーンな見た目のためのミニマルテーマ theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # 軸ラベルを削除する geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

出力:

変数間の相関。画像作成者による

相関ヒートマップからは、変数間に強いペアワイズ相関が見られず、相関値が0.6を超えるものもないことが明らかです。次に、VIF値を計算して、何か警戒すべきことがあるか見てみましょう。以下のコード行がその作業を行います。

# 回帰モデルを適合させる model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # VIFを計算する vif(model)

出力:

出力から、予測変数の中で、Product_range変数だけが5より大きいVIF値を持っており、これは高い多重共線性を示しており、修正措置が必要であることを示しています。

VIF計算の手動アプローチ

VIF計算の別のアプローチは、各変数を他の予測変数に対して回帰させてVIF値を個別に計算することです。

以下のコードを用いて、各予測変数ごとにVIF値を計算するアプローチを示します。ここでは、sapply()関数を使用し、各予測変数を他の予測変数と独立変数として持つ線形回帰モデルの従属変数として設定します。

各モデルからのR二乗値は、その式を用いてVIF値を計算するために使用されます。最終的に、結果であるvif_valuesは、各予測変数のVIFを表示し、多重共線性の問題を特定するのに役立ちます。

# 各予測変数のVIFの手動計算 predictors <- c("Ambience", "Customer_service", "Offers", "Product_range") vif_values <- sapply(predictors, function(pred) { formula <- as.formula(paste(pred, "~ .")) model <- lm(formula, data = data[, predictors]) 1 / (1 - summary(model)$r.squared) }) print(vif_values)

出力:

同じ結果が得られ、VIF値が5を超える高い変数Product_rangeへの介入が必要であることが明らかになります。

VIF対相関行列およびその他の方法

多重共線性を検出するための一般的な方法を振り返ると、以下のようになります:

  • 高いVIF値:高いVIF値は多重共線性の明確な指標です。これらの値が一定の閾値を超えると、予測変数が他の予測変数と強く関連していることを示し、モデルの安定性、信頼性、性能に影響を与える可能性があります。
  • 相関行列:相関行列を調べることで、予測変数間のペアごとの相関を見ることができます。高いペアごとの相関は、特定の予測変数間の多重共線性を示唆します。ただし、この方法は2つの変数の間の直線的な関係のみを検出し、複数の変数間のより複雑な相互作用に関わる多重共線性を見落とす可能性があります。
  • 係数の変化:モデルから他の変数を追加または削除する際に、予測子の係数が大幅に変化する場合、これは多重共線性の兆候となります。このような変動は、特定の予測子が共通の情報を共有している可能性を示し、各変数の独自の影響を特定することが難しくなります。

これらすべての方法の中で、VIFは特に役立ちます。なぜなら、VIFは、ペアごとの相関が低い場合でも多重共線性を検出できるからです。これは、VIFをより包括的なツールにします。

高いVIF値に対処する追加のアイデア

高い多重共線性を示すVIF値があり、変数を単に削除したくない場合、多重共線性を緩和するために他のより高度な戦略がいくつかあります:

  1. 特徴選択: 高い相関を持つ予測変数の1つを削除し、VIFを再計算してモデルを単純化し、安定性を向上させるかどうかを確認します。
  2. 主成分分析(PCA): PCAを使用して予測変数を相関のない少数のコンポーネントに結合します。これにより、元の変数が新しい、独立した、相関のないものに変換され、データの変動の大部分を捉えます。これにより、多重共線性に対処し、貴重な情報を失うことなく改善されます。
  3. 正則化テクニック:モデルにペナルティ項を追加するリッジ回帰やラッソ回帰を適用します。これらのテクニックは、相関する変数の影響を縮小させることで多重共線性を減少させ、モデルをより安定かつ信頼性の高いものにします。

結論

VIFの使用方法を知っていることは、多重共線性を特定して修正するための鍵となり、回帰モデルの精度と明瞭さを向上させます。定期的にVIF値をチェックし、必要に応じて修正措置を実施することで、データ専門家やアナリストが信頼できるモデルを構築するのに役立ちます。このアプローチにより、各予測子の効果が明確になり、モデルから信頼性の高い結論を導きやすくなり、その結果に基づいてより良い決定を行うことができます。Pythonにおける機械学習サイエンティストのキャリアトラックでは、モデルの構築方法や使用方法を本当に理解するために取り組んでみてください。さらに、プログラムの修了は履歴書に良い印象を与えます。

さらなる学習のためには、DataCampブログやチュートリアルセクションから以下のリソースを探索することを検討してください。

Source:
https://www.datacamp.com/tutorial/variance-inflation-factor