플롯은 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 값이 높은 다중공선성을 나타내고 변수를 그냥 제거하고 싶지 않다면, 다중공선성을 완화하기 위한 몇 가지 다른 고급 전략이 있습니다:
- 특성 선택: 상관 관계가 높은 예측 변수 중 하나를 제거하고 VIF를 다시 계산하여 모델을 간소화하고 안정성을 향상시키는지 확인합니다.
- 주성분 분석(PCA): PCA를 사용하여 예측 변수를 상관 관계없이 작은 집합의 주성분으로 결합합니다. 이는 원래 변수를 새로운, 독립적이고 상관 관계가 없는 변수로 변환하여 대부분의 데이터 변동을 포착하여 다중공선성을 해결하고 소중한 정보를 잃지 않도록 도와줍니다.
- 정규화 기술: 모델에 패널티 항을 추가하는 릿지 또는 라쏘 회귀를 적용합니다. 이러한 기술은 상관 변수의 영향을 줄여 다중공선성을 감소시키며, 모델을 더 안정적이고 신뢰할 수 있도록 만들어줍니다.
결론
VIF 사용 방법을 알고 있다면 다중공선성을 식별하고 해결하는 데 중요합니다. 이는 회귀 모델의 정확도와 명확성을 향상시킵니다. VIF 값을 정기적으로 확인하고 필요시 수정 조치를 취함으로써 데이터 전문가와 분석가들이 신뢰할 수 있는 모델을 구축하는 데 도움이 됩니다. 이 접근 방식은 각 예측 변수의 효과가 명확해지도록 보장하여 모델에서 신뢰할 만한 결론을 도출하고 결과에 기반한 더 나은 결정을 내릴 수 있도록 합니다.진짜 모델을 구축하고 사용하는 방법을 정확히 이해하려면 Python에서 머신 러닝 과학자 경력 트랙을 수료하세요. 게다가, 이 프로그램 완료는 이력서에 훌륭한 인상을 줍니다.
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor