728x90
Multicollinearity and Prediction¶
오늘은 다중공선성과 예측력이 관련이 있는지 알아보고자 한다. 일반적으로 다중공선성은 회귀계수의 불확실성을 증폭시키는 문제가 있다고 알려져있다. 하지만, 예측력과는 크게 상관이 없다고 필자는 학부 회귀분석 시간에 배운바가 있다. 이것이 정말 사실일지 한번 실험적으로 확인해보고자 한다.
실험 셋팅은 이전 게시글인 "다중공선성과 신뢰구간, 1종오류, 2종오류" 편과 동일하게 하였다.
In [17]:
#install.packages("mvtnorm")
set.seed(1)
library(mvtnorm)
In [18]:
cov<-matrix(c(1,0.9,0,0.9,1,0,0,0,1),byrow=TRUE,nrow=3)
cov
| 1.0 | 0.9 | 0 |
| 0.9 | 1.0 | 0 |
| 0.0 | 0.0 | 1 |
In [19]:
n<-200
df<-rmvnorm(n,mean=c(0,0,0),sigma=cov)
df<-as.data.frame(df)
colnames(df)<-c("x1","x2","x3")
head(df)
| x1 | x2 | x3 |
|---|---|---|
| -0.43327367 | -0.1770985 | -0.8356286 |
| 1.52670527 | 1.1264327 | -0.8204684 |
| 0.80512239 | 0.8844626 | 0.5757814 |
| 0.54412911 | 1.1187686 | 0.3898432 |
| -1.70258904 | -2.2064851 | 1.1249309 |
| -0.04667144 | -0.0375820 | 0.9438362 |
위 x1과 x2의 상관계수는 0.9, x1과 x3 그리고 x2와 x3 간의 상관계수는 0인 셋팅
In [20]:
eps<-rnorm(200)
In [21]:
df$y <- df$x1 + 2*df$x2 + 3*df$x3 + eps
In [22]:
head(df)
| x1 | x2 | x3 | y |
|---|---|---|---|
| -0.43327367 | -0.1770985 | -0.8356286 | -3.635423 |
| 1.52670527 | 1.1264327 | -0.8204684 | 2.820590 |
| 0.80512239 | 0.8844626 | 0.5757814 | 4.829699 |
| 0.54412911 | 1.1187686 | 0.3898432 | 4.493387 |
| -1.70258904 | -2.2064851 | 1.1249309 | -2.877440 |
| -0.04667144 | -0.0375820 | 0.9438362 | 1.572939 |
$y=x_1+2x_2+3x_3+\epsilon$, $\epsilon$~$N(0,1)$ 으로 생성된 데이터셋
이 데이터셋의 산점도는 아래와 같다.
In [23]:
plot(df)
분석에 앞서서 예측력을 객관적으로 확인하기 위해 데이터셋을 Train set 과 Test set으로 분할한다.
In [24]:
train <- df[1:100,]
test <- df[101:200,]
In [26]:
head(test)
| x1 | x2 | x3 | y | |
|---|---|---|---|---|
| 101 | 0.2010163 | -0.4127729 | 1.97133739 | 4.5819143 |
| 102 | 0.5534399 | 1.1978417 | 1.51221269 | 9.4573334 |
| 103 | 0.3715428 | 0.5246777 | -1.02454848 | -1.7427460 |
| 104 | 0.8279393 | 1.0558149 | 0.09907849 | 3.2227874 |
| 105 | -0.7330759 | -0.7968416 | -0.03592242 | -3.5579832 |
| 106 | 0.6488844 | 0.1577396 | -0.12101011 | -0.7427969 |
Train set 회귀분석 결과는 아래와 같다.
In [27]:
fit<-lm(y~x1+x2+x3,data=train)
summary(fit)
Call:
lm(formula = y ~ x1 + x2 + x3, data = train)
Residuals:
Min 1Q Median 3Q Max
-2.82680 -0.81280 -0.01502 0.65318 2.77972
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.2204 0.1099 -2.005 0.0477 *
x1 1.0394 0.2363 4.398 2.83e-05 ***
x2 2.1647 0.2601 8.323 5.86e-13 ***
x3 3.0831 0.1223 25.211 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.078 on 96 degrees of freedom
Multiple R-squared: 0.9339, Adjusted R-squared: 0.9318
F-statistic: 451.9 on 3 and 96 DF, p-value: < 2.2e-16
In [28]:
#install.packages("car")
library(car)
vif(fit)
- x1
- 4.9104598810532
- x2
- 4.91072491681053
- x3
- 1.00068270296558
Test set에 대한 예측값을 저장한 뒤, 실제값과 비교해본다.
In [30]:
pred <- predict(fit,test)
mean((test$y-pred)^2) #MSE
1.29725089595443
좀 더 일반적인 MSE 성능지표를 얻기 위해서 위 작업을 1000번 반복하여보자.
In [31]:
cov<-matrix(c(1,0.9,0,0.9,1,0,0,0,1),byrow=TRUE,nrow=3)
mse_li <- c()
for(i in 1:1000){
n<-200
df<-rmvnorm(n,mean=c(0,0,0),sigma=cov)
df<-as.data.frame(df)
colnames(df)<-c("x1","x2","x3")
eps<-rnorm(200)
df$y <- df$x1 + 2*df$x2 + 3*df$x3 + eps
train <- df[1:100,]
test <- df[101:200,]
fit<-lm(y~x1+x2+x3,data=train)
pred <- predict(fit,test)
mse <- mean((test$y-pred)^2)
mse_li<-c(mse_li,mse)
}
In [35]:
mean(mse_li)
1.04577269510301
In [36]:
sd(mse_li)
0.152869409956763
이제 다중공선성을 극대화하기위해 변수간 correlation을 0.99로 설정하여 진행해보자.
In [37]:
cov<-matrix(c(1,0.99,0.99,0.99,1,0.99,0.99,0.99,1),byrow=TRUE,nrow=3)
mse_li2 <- c()
for(i in 1:1000){
n<-200
df<-rmvnorm(n,mean=c(0,0,0),sigma=cov)
df<-as.data.frame(df)
colnames(df)<-c("x1","x2","x3")
eps<-rnorm(200)
df$y <- df$x1 + 2*df$x2 + 3*df$x3 + eps
train <- df[1:100,]
test <- df[101:200,]
fit<-lm(y~x1+x2+x3,data=train)
pred <- predict(fit,test)
mse <- mean((test$y-pred)^2)
mse_li2<-c(mse_li2,mse)
}
In [40]:
mean(mse_li2)
1.05298293057874
In [41]:
sd(mse_li2)
0.153425430583426
In [44]:
par(mfrow=c(1,2))
boxplot(mse_li,main="다중공선성X")
boxplot(mse_li2,main="다중공선성O")
다중공선성의 유무에 따라서 MSE의 변화가 거의 없음을 확인할 수 있었다.
추후에는 비선형함수에서 머신러닝을 사용하였을때에도 이와같은 현상이 동일하게 나타나는지 한번 실험해봐야겠다.
'데이터 사이언스 > Statistics' 카테고리의 다른 글
| [통계학] 시계열 분석에서 stationary란 ? (0) | 2023.02.13 |
|---|---|
| [통계] 통계학 관련 자격증 (0) | 2022.09.16 |
| 베이지안 시계열 모형 prophet (in Python) (1) | 2022.08.11 |
| 다중공선성과 신뢰구간, 1종오류, 2종오류 (0) | 2022.08.05 |
| 영화 "더플랜" 을 통해 배우는 통계검증의 심각한 오류 (0) | 2022.07.26 |