プロットは、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つを削除し、VIFを再計算してモデルを単純化し、安定性を向上させるかどうかを確認します。
- 主成分分析(PCA): PCAを使用して予測変数を相関のない少数のコンポーネントに結合します。これにより、元の変数が新しい、独立した、相関のないものに変換され、データの変動の大部分を捉えます。これにより、多重共線性に対処し、貴重な情報を失うことなく改善されます。
- 正則化テクニック:モデルにペナルティ項を追加するリッジ回帰やラッソ回帰を適用します。これらのテクニックは、相関する変数の影響を縮小させることで多重共線性を減少させ、モデルをより安定かつ信頼性の高いものにします。
結論
VIFの使用方法を知っていることは、多重共線性を特定して修正するための鍵となり、回帰モデルの精度と明瞭さを向上させます。定期的にVIF値をチェックし、必要に応じて修正措置を実施することで、データ専門家やアナリストが信頼できるモデルを構築するのに役立ちます。このアプローチにより、各予測子の効果が明確になり、モデルから信頼性の高い結論を導きやすくなり、その結果に基づいてより良い決定を行うことができます。Pythonにおける機械学習サイエンティストのキャリアトラックでは、モデルの構築方法や使用方法を本当に理解するために取り組んでみてください。さらに、プログラムの修了は履歴書に良い印象を与えます。
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor