다중공선성 해결: 회귀 분석에서 분산 팽창 요인 (VIF)

회귀 분석에서 다중 공선성은 독립 변수가 서로 상관 관계가 있는 경우 발생합니다. 이는 각 예측 변수가 종속 변수에 미치는 독특한 영향을 결정하기 어렵게 만듭니다. 결과적으로 표준 오차가 과대되어 계수의 유의성에 영향을 미칩니다.

분산 팽창 요인(VIF)은 다중 공선성을 감지하는 데 유용한 도구로, 단순한 쌍별 상관 관계를 넘어 추가 정보를 제공합니다. 이 자습서에서는 VIF의 작동 방식, 계산 및 해석 방법, 그리고 높은 VIF 값을 발견했을 때 해야 할 일에 대해 설명합니다. 이러한 단계는 데이터 전문가 및 데이터 과학자로서 모델의 안정성을 향상시키는 데 도움이 될 것입니다.

지금 VIF가 중요한 진단 도구이며 학습 가치가 높지만, 파이썬에서 머신 러닝 과학자 경력 트랙에서 개발할 넓은 기술 세트 중 일부에 불과하므로 오늘 등록하세요.

VIF(Variance Inflation Factor)란 무엇인가요?

통계학자 컷버트 다니엘이 개발한 VIF는 회귀 분석에서 널리 사용되는 진단 도구로, 회귀 계수의 안정성과 해석 가능성에 영향을 미치는 다중공선성을 감지하는 데 사용됩니다. 보다 기술적으로 VIF는 예측 변수들 간의 상관 관계로 인해 회귀 계수의 분산이 얼마나 팽창되는지를 측정함으로써 작동합니다.

이 모든 것은 이러한 상관 관계로 각 예측 변수의 고유한 영향을 목표 변수에서 분리하기 어렵게 만들어 모델 추정치를 덜 신뢰할 수 있게 합니다. 또한, 올바른 이야기를 전하려면 VIF는 모델의 각 예측 변수에 대해 항상 계산되어야 합니다.

분산 팽창 요인 공식

예측 변수 X의 VIF는 다음과 같이 계산됩니다:

어디서:

  • R2은 다른 모든 예측 변수에 대해 X를 회귀한 결과로 얻은 결정 계수입니다.

단계별 계산

VIF를 찾는 과정은 세 단계로 이루어집니다. 첫 번째 단계는 각 예측 변수에 대해 다른 모든 예측 변수에 대한 개별 선형 회귀 모델을 적합시키는 것입니다. 두 번째 단계는 각 모델에 대한 R2 값을 얻는 것입니다. 마지막 단계는 위의 공식을 사용하여 VIF를 계산하는 것입니다.

VIF 값 해석

VIF 값 해석 방법은 다중공선성 수준을 이해하는 데 도움이 됩니다:

  • VIF = 1: 이는 다중공선성이 없음을 나타냅니다. 예측변수가 다른 예측변수와 상관관계가 없으므로 표준 오차를 부풀리지 않고 모델의 안정성에 영향을 미치지 않습니다.
  • VIF가 1에서 5 사이: 이는 중간 정도의 다중공선성을 나타냅니다. 다른 예측변수와 약간의 상관관계가 있지만 일반적으로 심각하지는 않습니다. 그러나 특히 다른 VIF 값이 높은 경우에는 이러한 예측변수를 주의 깊게 살펴보는 것이 좋습니다.
  • VIF > 5: 고 다중공선성이 존재합니다. 예측변수의 표준오차가 현저히 팽창될 수 있으며, 이는 해당 계수를 덜 신뢰할 수 있게 만들 수 있습니다. 상관된 예측변수를 제거하거나 결합하는 등의 조치를 취하는 것이 좋습니다.
  • VIF > 10: 이것은 심각한 다중공선성을 나타냅니다. 예측변수의 표준오차가 매우 팽창되며, 계수 추정치가 안정적이지 않을 수 있습니다. 일반적으로 예측변수를 제거하거나 정규화 기술을 사용하는 등의 수정 조치가 필요합니다.

예를 들어, 예측변수의 VIF가 10이라면, 다중공선성이 없을 때보다 해당 예측변수의 계수의 분산이 10배 크다는 것을 나타냅니다.

VIF가 회귀분석에서 다중공선성을 설명하는 방법

다중공선성은 표준 오차를 증가시켜 개별 예측 변수의 유의성을 평가하기 어렵게 만듭니다. 이는 공선 변수가 유사한 정보를 운반하여 결과 변수에 대한 특정 개별 효과를 구분하기 어렵게 만드는 것입니다.

다중공선성은 모형의 예측 능력을 반드시 해치지는 않지만 계수의 신뢰성과 명확성을 감소시킵니다. 특히 각 예측 변수의 개별 영향을 이해하고 싶을 때 이는 특히 문제가 됩니다.

분산 팽창 요인(VIF)은 다중공선성을 식별하는 정확한 진단 지표로 작용합니다. 상관 관계에 관한 일반적인 관찰과 달리 VIF는 각 변수에 대한 모든 예측 변수의 결합 효과를 분리하여 쌍별 상관 관계에서 명백하지 않은 상호 작용을 강조합니다.

Python 및 R에서의 분산 팽창 요인

이를 실행 가능하게 만들기 위해 Python과 R을 사용하여 고유한 데이터셋을 활용한 예제를 살펴보겠습니다. 자동화된 패키지를 사용하여 VIF를 계산하고 직관을 쌓기 위해 VIF 공식을 사용할 것입니다. 좋은 실습을 위해 두 변수 간에 매우 높은 페어와이즈 상관관계가 없음에도 불구하고 하나의 변수에 대해 높은 VIF 값을 발견할 수 있는 데이터셋을 일부러 만들었습니다 – 그래서 흥미로운 예제라고 생각합니다. 사용할 데이터셋의 개요부터 시작해보겠습니다.데이터셋 개요:

데이터셋 개요:

이 가상의 데이터셋은 소매 거대 기업의 1,000개 매장에서 실시된 조사 결과를 나타냅니다. 각 매장의 고객들은 쇼핑 경험의 다양한 측면에 대해 -5에서 +5까지의 척도로 등급을 매겼는데, 여기서 -5는 매우 부정적인 경험을 나타내고, +5는 매우 긍정적인 경험을 나타냅니다. 각 매장에서 고객 평가의 평균이 네 가지 주요 매개변수를 통해 산출되었습니다:

  • 분위기: 매장의 환경에 대한 고객 인식, 청결도, 배치, 조명 및 전반적인 분위기 등.

  • 고객 서비스: 매장 직원이 제공하는 서비스에 대한 평가, 친절함, 우호성 및 고객 요구에 대한 대응력을 포함함.

  • 제공: 고객에게 제공되는 상점의 프로모션 제공, 할인 및 거래에 대한 평가입니다.

  • Product_range: 상점에서 제공되는 제품의 다양성과 품질을 평가합니다.

각 상점의 전반적인 성능을 측정하는 대상 변수 Performance이 있습니다. 그러나 VIF 관점에서는 관련이 없습니다. 데이터셋을 여기에서 다운로드할 수 있습니다.

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()

위의 코드는 데이터를 로드하고 처음 다섯 개의 레코드를 표시할 것입니다.

다음 단계로 짝별 상관 관계를 확인하기 위해 상관 행렬을 실행할 수 있습니다.

아래 코드는 네 개의 열을 선택하고 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를 생성합니다. 루프를 사용하여 각 예측 변수에 대한 VIF를 계산하며, 높은 VIF는 다중공선성의 존재를 나타냅니다.variance_inflation_factor() 함수를 사용하여 각 예측 변수의 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 미만으로 낮은 다중공선성을 나타냅니다.

다중공선성 계산에 대한 수동 접근

다른 방법은 각 독립 변수를 다른 예측 변수에 대해 회귀하여 값을 개별적으로 계산하는 것입니다.

retail_data의 각 피처에 대해 작동 방식은 해당 피처를 종속 변수(y)로 설정하고 나머지 피처를 독립 변수(X)로 설정합니다. 그런 다음 선형 회귀 모델을 적합하여 y를 X를 사용하여 예측하고, 모델의 R-제곱 값은 VIF를 계산하기 위해 사용됩니다. 초기 섹션에서 논의한 공식을 사용하여 VIF를 계산합니다.

그런 다음 각 기능과 해당 VIF 값이 사전 (vif_manual)에 저장되고, 이후 표시를 위해 DataFrame (vif_manual_df)로 변환됩니다.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # 수동 VIF 계산 vif_manual = {} for feature in retail_data.columns: # 대상 변수(현재 기능) 및 예측 변수(다른 모든 기능) 정의 y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # 선형 회귀 모델 적합 model = LinearRegression().fit(X, y) # R-제곱 계산 r_squared = model.score(X, y) # VIF 계산 vif = 1 / (1 - r_squared) vif_manual[feature] = vif # 더 나은 표시를 위해 사전을 DataFrame으로 변환 vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 출력:

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 변수만 VIF 값이 5보다 크다는 것을 볼 수 있습니다. 이는 높은 다중공선성을 시사하며 수정 조치가 필요합니다.

다중공선성 계산을 위한 수동 접근

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)

출력:

우리는 동일한 결과를 얻고 변수 Product_range가 5 이상의 높은 VIF 값으로 개입이 필요함을 명백히 알 수 있습니다.

VIF vs. 상관 행렬 및 다른 방법

요약하면, 다중공선성을 감지하는 인기있는 방법은 다음과 같습니다:

  • VIF 값이 높은 경우: VIF 값이 높다는 것은 다중공선성의 명확한 지표입니다. 이러한 값이 일정 임계값을 초과하면, 해당 예측변수가 다른 예측변수들과 강하게 관련되어 있다는 것을 나타내며, 이는 모델의 안정성, 신뢰성 및 성능에 영향을 줄 수 있습니다.
  • 상관 행렬: 상관 행렬을 통해 예측변수들 간의 쌍별 상관 관계를 확인할 수 있습니다. 높은 쌍별 상관 관계는 해당 특정 예측변수들 간의 다중공선성을 시사합니다. 그러나 이 방법은 두 변수 간의 직접적인 선형 관계만 감지하며, 여러 변수들 간의 더 복잡한 상호작용에 따른 다중공선성을 놓칠 수 있습니다.
  • 계수 변경: 예측 변수의 계수가 모델에서 다른 변수를 추가하거나 제거할 때 상당히 변할 때, 이는 다중공선성의 징후일 수 있습니다. 이러한 변동은 특정 예측 변수들이 공통 정보를 공유하고 있을 수 있음을 나타내며, 각 변수의 고유한 영향을 식별하기 어렵게 만들 수 있습니다.

이러한 방법 중에서 VIF는 특히 유용합니다. 왜냐하면 서로의 상관 관계가 낮을 때라도 다중공선성을 감지할 수 있기 때문입니다. 이는 VIF를 더 포괄적인 도구로 만듭니다.

높은 VIF 값 처리에 대한 추가 아이디어

만약 VIF 값이 높은 다중공선성을 나타내고 변수를 그냥 제거하고 싶지 않다면, 다중공선성을 완화하기 위한 몇 가지 다른 고급 전략이 있습니다:

  1. 특성 선택: 상관 관계가 높은 예측 변수 중 하나를 제거하고 VIF를 다시 계산하여 모델을 간소화하고 안정성을 향상시키는지 확인합니다.
  2. 주성분 분석(PCA): PCA를 사용하여 예측 변수를 상관 관계없이 작은 집합의 주성분으로 결합합니다. 이는 원래 변수를 새로운, 독립적이고 상관 관계가 없는 변수로 변환하여 대부분의 데이터 변동을 포착하여 다중공선성을 해결하고 소중한 정보를 잃지 않도록 도와줍니다.
  3. 정규화 기술: 모델에 패널티 항을 추가하는 릿지 또는 라쏘 회귀를 적용합니다. 이러한 기술은 상관 변수의 영향을 줄여 다중공선성을 감소시키며, 모델을 더 안정적이고 신뢰할 수 있도록 만들어줍니다.

결론

VIF 사용 방법을 알고 있다면 다중공선성을 식별하고 해결하는 데 중요합니다. 이는 회귀 모델의 정확도와 명확성을 향상시킵니다. VIF 값을 정기적으로 확인하고 필요시 수정 조치를 취함으로써 데이터 전문가와 분석가들이 신뢰할 수 있는 모델을 구축하는 데 도움이 됩니다. 이 접근 방식은 각 예측 변수의 효과가 명확해지도록 보장하여 모델에서 신뢰할 만한 결론을 도출하고 결과에 기반한 더 나은 결정을 내릴 수 있도록 합니다.진짜 모델을 구축하고 사용하는 방법을 정확히 이해하려면 Python에서 머신 러닝 과학자 경력 트랙을 수료하세요. 게다가, 이 프로그램 완료는 이력서에 훌륭한 인상을 줍니다.

또한, 추가 학습을 위해 DataCamp 블로그와 튜토리얼 섹션에서 다음 리소스를 탐색해보세요:

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