다중공선성
- 독립 변수X는 종속변수 Y하고만 상관 관계가 있어야 하며, 독립 변수 X들끼리 상관 관계가 있어서는 안된다.
- 독립 변수간 상관 관계를 보이는 것을 다중공선성(Multicollinearity)이라고 한다.
- 다중공선성이 있으면 부정확한 회귀 결과가 도출될 수 있다.
다중공선성 확인 및 해결방법 포스팅
다중공선성 확인방법
- 회귀모델에 다중공선성이 있는지 알아내는 방법은 두가지가 있다.
1. 산점도 그래프(Scatter plot Matrix)
from sklearn.datasets import load_boston
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
boston = load\_boston()
dfX = pd.DataFrame(boston.data, columns=boston.feature\_names)
dfy = pd.DataFrame(boston.target, columns=\["MEDV"\])
df = pd.concat(\[dfX, dfy\], axis=1)
cmap = sns.light\_palette("black", as\_cmap=True)
sns.heatmap(dfX.corr(), annot=True, fmt='3.1f', cmap=cmap)
plt.show()
cf) 참고로 OLS Regression Results에서도 다중공선성 여부를 확인할 수 있다.
- Cond. No.를 확인한다.
- 다중공선성이 있으면 하단부분에 "[2] The condition number is large, 1.51e+04. This might indicate that there are strong multicollinearity or other numerical problems" 라고 뜬다.
model1 = sm.OLS.from\_formula("MEDV ~ " + "+".join(boston.feature\_names), data=df)
result1 = model1.fit()
print(result1.summary())
2. VIF(Variance Inflation Factors, 분산팽창요인)
- 보통 VIF가 10이 넘으면 다중공선성이 있다고 판단한다.
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(dfX.values, i) for i in range(dfX.shape[1])]
vif["features"] = dfX.columns
vif = vif.sort_values("VIF Factor").reset_index(drop=True)
vif
- CHAS, CRIM, ZN을 제외한 모든 변수의 VIF가 10을 넘는 것을 확인할 수 있다.
다중공선성 해결방법
1. 정규화(regularized) 방법 사용
- 회귀분석에서 정규화가 필요한 이유 중 하나이다.
- 독립변수들읠 정규화 한 이후 회귀분석을 실시한 후 VIF를 확인해보겠다.
from patsy import dmatrix
dfX0 = pd.DataFrame(boston.data, columns=boston.feature\_names)
formula = "scale(CRIM) + scale(ZN) + scale(INDUS) + scale(NOX) + scale(RM) + scale(AGE) +scale(RAD) + scale(TAX) + scale(B) + scale(LSTAT)+C(CHAS)"
dfX = dmatrix(formula, dfX0, return\_type="dataframe")
dfy = pd.DataFrame(boston.target, columns=\["MEDV"\])
# 다중공선성 확인
from statsmodels.stats.outliers\_influence import variance\_inflation\_factor
vif = pd.DataFrame()
vif\["VIF Factor"\] = \[variance\_inflation\_factor(dfX.values, i) for i in range(dfX.shape\[1\])\]
vif\["features"\] = dfX.columns
vif = vif.sort\_values("VIF Factor").reset\_index(drop=True)
vif
- 모든 변수의 VIF가 10이하로 줄어들었다.
- OLS Regression Results에서도 확인할 수 있다.
2. 의존적인 변수를 삭제(변수선택법 등 활용)
- 변수선택법을 활용하여 설명력 높은 변수만 선택하여 분석할 수 있다.
- 아래 링크에서 변수선택법 사용을 확인할 수 있다.
- 위의 정규화된 것에서 VIF가 높은 RAD, TAX를 삭제하면 다중공선성을 더 낮출 수 있다.
cols = ["Intercept", "C(CHAS)[T.1.0]", "scale(B)", "scale(CRIM)","scale(LSTAT)","scale(RM)",
"scale(ZN)", "scale(AGE)", "scale(NOX)"]
model_boston2 = sm.OLS(np.log(dfy), dfX[cols])
result_boston2 = model_boston2.fit()
print(result_boston2.summary())
3. PCA(principal component analysis) 방법으로 의존적인 성분 삭제
- PCA를 활용하는 것은 아래 포스팅에 설명하였습니다.
728x90
반응형
'Data Analysis & ML > 회귀분석' 카테고리의 다른 글
[회귀분석] 단순선형회귀분석(Linear Regression)(11) - 회귀직선의 오차 (0) | 2024.03.27 |
---|---|
[회귀분석] 단순선형회귀분석(Linear Regression)(10) - 회귀효과 / 회귀오류 (1) | 2024.03.27 |
[회귀분석] 회귀분석 실습(3) - 변수선택법 (R) (1) | 2023.07.23 |
[회귀분석] 회귀분석 실습(2) - 잔차분석 (Python) (0) | 2023.07.23 |
[회귀분석] 회귀분석 실습(1) - OLS 회귀분석 결과 해석 및 범주형 변수 처리 (Statsmodel) (3) | 2023.07.23 |