Data Analysis & ML/회귀분석

[회귀분석] 회귀분석 실습(4) - 다중공선성 (Python)

YSY^ 2023. 7. 23. 21:43

다중공선성

  • 독립 변수X는 종속변수 Y하고만 상관 관계가 있어야 하며, 독립 변수 X들끼리 상관 관계가 있어서는 안된다.
  • 독립 변수간 상관 관계를 보이는 것을 다중공선성(Multicollinearity)이라고 한다.
  • 다중공선성이 있으면 부정확한 회귀 결과가 도출될 수 있다.

다중공선성 확인 및 해결방법 포스팅

ysyblog.tistory.com/171

 

[회귀분석] 다중회귀분석(2) - 다중공선성(다중공선성 검정 및 해결)

1. [회귀분석] 단순선형회귀분석(Linear Regression)(1) - 단순선형회귀분석과 가정 :ysyblog.tistory.com/157 2. [회귀분석] 단순선형회귀분석(Linear Regression)(2) - 선형회귀분석과 비용함수 :ysyblog.tistor..

ysyblog.tistory.com

 

다중공선성 확인방법

  • 회귀모델에 다중공선성이 있는지 알아내는 방법은 두가지가 있다.

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. 의존적인 변수를 삭제(변수선택법 등 활용)

  • 변수선택법을 활용하여 설명력 높은 변수만 선택하여 분석할 수 있다.
  • 아래 링크에서 변수선택법 사용을 확인할 수 있다.

ysyblog.tistory.com/121

 

[통계분석] 회귀분석(변수선택법) (ADP실기 준비)

변수선택법 변수선택법은 최적의 회귀방정식 선택에 도움을 주는 방법론이다 변수선택법에는 전진선택법, 후진제거법, 단계선택법이 있다. 파이썬에서는 OLS결과를 보면서 수작업으로 변수를

ysyblog.tistory.com

  • 위의 정규화된 것에서 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를 활용하는 것은 아래 포스팅에 설명하였습니다.

ysyblog.tistory.com/123

 

[통계분석] PCA(주성분분석) (ADP실기 준비)

주성분분석 고차원의 데이터를 저차원의 데이터로 환원시키는 기법 데이터를 어떤 기준을 바탕으로 변환을 하고, 그 변환으로 인해 '주성분'이 추출된다. 따라서 추출된 주성분은 원래 가지고

ysyblog.tistory.com

728x90
반응형