728x90
다중공선성이란?
다중공선성이란 독립변수들간에 강한 상관관계가 존재하는 경우를 말합니다. 다중공선성이 존재하면 회귀분석의 전제조건을 위반하게 됩니다. (서로 독립인 변수들로 구성되어 있다.) 다중공선성이 존재하면 상관관계가 높지만 상관관계가 높다고 해서 반드시 다중공선성이 존재하는 것은 아닙니다.
다중공선성을 판단하는 기준은?
- 분산 팽창 인수(VIF, Variance Inflation Factor)
- 보통 10이상일때 심각한 다중공선성이 존재한다고 판단을 합니다.(5 이상이면 다중공선성 존재 가능성이 있음)
다중공선성을 해결하는 방법은??
1. (변수선택법) 다중공선성에 영향을 주는 변수들을 제거한다.
- 다중공선성에 영향을 주는 변수들 중에서 종속변수와 상관관계가 낮은 변수들을 제거한다.
- 제거를 했을때 결정계수가 유지되는 변수를 제거한다.
2. 주성분 분석 이용(변수 추출법)
- 서로 독립인 새로운 변수들을 생성한다.(주의, 범주형 데이터 사용 불가)
3. 다른 모형 선택
- (Ridge regression)
실습
data <- Boston
# 범주형 변수 제거
lm_vif <- lm(medv~., data = data[,-4])
vif(lm_vif)
> vif(lm_vif)
crim zn indus nox rm age dis rad tax
1.787705 2.298257 3.949246 4.388775 1.931865 3.092832 3.954961 7.397844 8.876233
ptratio black lstat
1.783302 1.344971 2.931101
vif를 봤을때 rad, tax 변수가 다중공선성이 있다고 판단을 하였습니다.
> summary(lm_vif)
Call:
lm(formula = medv ~ ., data = data[, -4])
Residuals:
Min 1Q Median 3Q Max
-13.3968 -2.8103 -0.6455 1.9141 26.3755
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 36.891960 5.146516 7.168 2.79e-12 ***
crim -0.113139 0.033113 -3.417 0.000686 ***
zn 0.047052 0.013847 3.398 0.000734 ***
indus 0.040311 0.061707 0.653 0.513889
nox -17.366999 3.851224 -4.509 8.13e-06 ***
rm 3.850492 0.421402 9.137 < 2e-16 ***
age 0.002784 0.013309 0.209 0.834407
dis -1.485374 0.201187 -7.383 6.64e-13 ***
rad 0.328311 0.066542 4.934 1.10e-06 ***
tax -0.013756 0.003766 -3.653 0.000287 ***
ptratio -0.990958 0.131399 -7.542 2.25e-13 ***
black 0.009741 0.002706 3.600 0.000351 ***
lstat -0.534158 0.051072 -10.459 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.787 on 493 degrees of freedom
Multiple R-squared: 0.7355, Adjusted R-squared: 0.7291
F-statistic: 114.3 on 12 and 493 DF, p-value: < 2.2e-16
모형은 유의하다는 결과가 나오고 모형의 설명력은 약 0.74%입니다.
# 상관관계 분석
library(PerformanceAnalytics)
chart.Correlation(data[,-4])
상관분석결과 rad 변수와 tax 변수는 상관계수가 0.91로 아주 강한 상관관계를 가지고 있습니다. 따라서 둘중 종속변수와 상관관계가 낮은 rad 변수를 제거하기로 결정하였습니다.
# rad 변수 제거
lm_result <- lm(medv~., data=data[,c(-4,-9)])
> vif(lm_result)
crim zn indus nox rm age dis tax ptratio
1.663648 2.272992 3.660714 4.294324 1.880883 3.077311 3.953729 3.403205 1.725085
black lstat
1.338875 2.928554
다중공선성이 사라진것을 확인하였습니다.
> summary(lm_result)
Call:
lm(formula = medv ~ ., data = data[, c(-4, -9)])
Residuals:
Min 1Q Median 3Q Max
-13.3315 -2.8771 -0.6792 1.6858 27.4744
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.970e+01 5.051e+00 5.879 7.59e-09 ***
crim -7.010e-02 3.269e-02 -2.144 0.032482 *
zn 3.989e-02 1.409e-02 2.831 0.004835 **
indus -4.198e-02 6.080e-02 -0.691 0.490195
nox -1.458e+01 3.899e+00 -3.740 0.000206 ***
rm 4.188e+00 4.255e-01 9.843 < 2e-16 ***
age -1.868e-03 1.359e-02 -0.137 0.890696
dis -1.503e+00 2.059e-01 -7.301 1.15e-12 ***
tax 8.334e-04 2.386e-03 0.349 0.727038
ptratio -8.738e-01 1.323e-01 -6.607 1.02e-10 ***
black 8.843e-03 2.763e-03 3.200 0.001461 **
lstat -5.267e-01 5.224e-02 -10.083 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.899 on 494 degrees of freedom
Multiple R-squared: 0.7225, Adjusted R-squared: 0.7163
F-statistic: 116.9 on 11 and 494 DF, p-value: < 2.2e-16
하지만 모형설명력은 약간 떨어지는 결과가 나왔지만 크게 상관은 없다고 생각을 합니다.
'Statistics' 카테고리의 다른 글
좋은 선형 회귀 모델이란?? (0) | 2021.09.04 |
---|---|
분산 공식 이해하기 (0) | 2021.05.13 |
중심 경향(central tendency) (0) | 2021.03.30 |
통계에서 말하는 로버스트하다? (0) | 2021.02.08 |
회귀 분석 - 변수 선택과 모형 선택 (0) | 2020.10.29 |