본문 바로가기
인과관계분석

중회귀분석의 변수선정 with R

by 다빈치스탁 2020. 9. 8.
728x90
반응형

지난번 포스트(2020/09/07 - [데이터마이닝 with R] - 삼성전자 중회귀분석 with R - 심화편)에서처럼 중회귀분석의 최적변수를 선정하기 위해 진행한 방법에 대해 엄밀히 따지자면 backward 방식이라고 볼 수 있다. 다만 지난 번처럼 변수의 유의성과 vif값을 통해서 임의로 진행하는 것은 상당히 효율적이지만 직관적 추론에 근거한 방식이라고 볼 수가 있다. 따라서 지난번에는 가정하기를 모델의 설명력이 다소 떨어지더라도(즉, 정보의 손실을 어느 정도 감수하더라도) 공선성만 줄일 수 있다면 과감하게 버렸다. 그러나 R function 중에는 이렇게 용감하지만 무식하게 변수들을 날려버릴 것을 염려하여 AIC에 기반한 stepwise 분석기법을 제공하고 있다. 자 이번 포스트에서는 forward, backward 방식의 스텝분석을 진행해 볼 건데 그 전에 AIC란? 무엇인가에 대해 간략히 짚고 넘어가자.

 

우선 사전적 의미로는 위키의 힘을 좀 빌려보자. 아래와 같다. 살벌하다. 안그래도 어려운데 영어로 되어 있다. 해석과 이해가 자유로운 분들은 아래의 링크를 잘 참고하시길 바라며 무슨말인지 모르겠다 하시는 분들을 위해 가장 핵심인 한줄만 해석하면 "모델에 의해 손실 된 정보의 양을 추정 할 때 AIC는 모델의 적합도와 모델의 단순성 사이의 균형을 다룹니다 . 즉, AIC는 과대 적합의 위험과 과소 적합 위험을 모두 처리합니다." 라고 볼 수 있다.

 

즉, 변수가 아주 많아서 발생가능한 과적합과 변수가 너무 적어서 발생할 수 있는 과소적합 사이의 균형점을 찾아주는 통계지표라고 볼 수 있다. R 에서 제공하는 단계분석에서는 이 AIC 값을 최소로 하는 모델을 찾아낸다. 자 이제 실전으로 들어가보자.

참고 : Akaike information criterion

From Wikipedia, the free encyclopedia

Jump to navigationJump to search

The Akaike information criterion (AIC) is an estimator of in-sample prediction error and thereby relative quality of statistical models for a given set of data.[1] In-sample prediction error is the expected error in predicting the resampled response to a training sample. Given a collection of models for the data, AIC estimates the quality of each model, relative to each of the other models. Thus, AIC provides a means for model selection. If out-of-sample prediction error is expected to differ from in-sample prediction error, cross-validation is a better estimate of model quality[2].

AIC is founded on information theory. When a statistical model is used to represent the process that generated the data, the representation will almost never be exact; so some information will be lost by using the model to represent the process. AIC estimates the relative amount of information lost by a given model: the less information a model loses, the higher the quality of that model.

In estimating the amount of information lost by a model, AIC deals with the trade-off between the goodness of fit of the model and the simplicity of the model. In other words, AIC deals with both the risk of overfitting and the risk of underfitting.

The Akaike information criterion is named after the Japanese statistician Hirotugu Akaike, who formulated it. It now forms the basis of a paradigm for the foundations of statistics; as well, it is widely used for statistical inference.

 

자 첨부된 엑셀파일을 적절한 경로에 저장한뒤 아래의 코드를 실행해보자. 

#작업경로를 지정하는 명령어
setwd("")

#데이터 끌어오기(중회귀자료, 다수의 독립변수와 하나의 종속변수)
mydatat<-read.csv("multi.csv",
                  header=TRUE, na.strings = "")
mydatat
str(mydatat)

#우선 처음에 전체 데이터를 전부 입력해준다.
model1<-lm(mydatat$삼성전자~.,data=mydatat[,1:22])
#독립변수를 하나씩 제거해가면서 AIC가 최소가 되는 모델을 찾아본다.
model1<-step(model1,direction = "backward", trace=T)

anova(model1)
summary(model1)
library(car)
vif(model1)

위의 코드에서 direction = 'backward' 라고 지정한 것처럼 후진분석법이다. 우선 그럴싸한 변수들을 한번에 다 집어넣고 하나씩 제거해나가는 방식이다. step 함수를 호출하면 아래와 같이 각 단계별로 무슨 변수가 제거되었으며 그로 인한 AIC값이 어떻게 줄어드는지 확인할 수 있다. 우선 모든 독립변수를 고려한 최초모형에서 AIC 지표는 -5411.62로 분석이 되었고 그 다음 증권을 삭제할 경우 -5413, 보험을 삭제할 경우, 그리고 마지막으로 종이목재를 삭제할 경우 AIC값을 최소로 한다고 판단하여 최종모델을 도출하고 있다.  

 

Start:  AIC=-5411.62
mydatat$삼성전자 ~ 코스피지수 + 코스닥지수 + 자동차 + 반도체 + 
    바이오 + 은행 + IT소프트 + 화학에너지 + 철강 + 음식료 + 미디어통신 + 
    건설 + 비은행금융 + 증권 + 조선 + 전기가스 + 보험 + 운송 + 
    소비자유통 + 서비스업 + 섬유의복 + 종이목재

             Df Sum of Sq      RSS     AIC
- 증권        1 0.0000073 0.008672 -5413.2
- 보험        1 0.0000076 0.008672 -5413.2
- 종이목재    1 0.0000101 0.008675 -5413.0
<none>                    0.008665 -5411.6
- 은행        1 0.0000475 0.008712 -5410.9
- 섬유의복    1 0.0000859 0.008751 -5408.7
- 반도체      1 0.0001100 0.008775 -5407.3
- 철강        1 0.0001373 0.008802 -5405.8
- 코스닥지수  1 0.0002445 0.008909 -5399.8
- IT소프트    1 0.0002616 0.008927 -5398.8
- 조선        1 0.0002790 0.008944 -5397.8
- 음식료      1 0.0003158 0.008981 -5395.8
- 운송        1 0.0003191 0.008984 -5395.6
- 미디어통신  1 0.0003371 0.009002 -5394.6
- 건설        1 0.0005947 0.009260 -5380.6
- 소비자유통  1 0.0007457 0.009411 -5372.5
- 전기가스    1 0.0008100 0.009475 -5369.1
- 비은행금융  1 0.0009985 0.009663 -5359.3
- 화학에너지  1 0.0036801 0.012345 -5237.3
- 바이오      1 0.0037975 0.012462 -5232.6
- 자동차      1 0.0039315 0.012596 -5227.3
- 서비스업    1 0.0049493 0.013614 -5188.6
- 코스피지수  1 0.0266023 0.035267 -4714.6

Step:  AIC=-5413.2
mydatat$삼성전자 ~ 코스피지수 + 코스닥지수 + 자동차 + 반도체 + 
    바이오 + 은행 + IT소프트 + 화학에너지 + 철강 + 음식료 + 미디어통신 + 
    건설 + 비은행금융 + 조선 + 전기가스 + 보험 + 운송 + 소비자유통 + 
    서비스업 + 섬유의복 + 종이목재

             Df Sum of Sq      RSS     AIC
- 보험        1 0.0000034 0.008676 -5415.0
- 종이목재    1 0.0000096 0.008682 -5414.6
<none>                    0.008672 -5413.2
- 은행        1 0.0000402 0.008712 -5412.9
- 섬유의복    1 0.0000873 0.008759 -5410.2
- 반도체      1 0.0001145 0.008787 -5408.7
- 철강        1 0.0001312 0.008803 -5407.7
- 코스닥지수  1 0.0002542 0.008926 -5400.8
- IT소프트    1 0.0002643 0.008936 -5400.3
- 조선        1 0.0002838 0.008956 -5399.2
- 운송        1 0.0003201 0.008992 -5397.2
- 음식료      1 0.0003250 0.008997 -5396.9
- 미디어통신  1 0.0003401 0.009012 -5396.0
- 건설        1 0.0005893 0.009262 -5382.5
- 소비자유통  1 0.0007779 0.009450 -5372.4
- 전기가스    1 0.0008360 0.009508 -5369.4
- 비은행금융  1 0.0013931 0.010065 -5341.0
- 화학에너지  1 0.0037517 0.012424 -5236.2
- 바이오      1 0.0038816 0.012554 -5231.0
- 자동차      1 0.0039242 0.012596 -5229.3
- 서비스업    1 0.0050133 0.013686 -5188.0
- 코스피지수  1 0.0273672 0.036039 -4705.8

Step:  AIC=-5415
mydatat$삼성전자 ~ 코스피지수 + 코스닥지수 + 자동차 + 반도체 + 
    바이오 + 은행 + IT소프트 + 화학에너지 + 철강 + 음식료 + 미디어통신 + 
    건설 + 비은행금융 + 조선 + 전기가스 + 운송 + 소비자유통 + 
    서비스업 + 섬유의복 + 종이목재

             Df Sum of Sq      RSS     AIC
- 종이목재    1 0.0000102 0.008686 -5416.4
<none>                    0.008676 -5415.0
- 은행        1 0.0000368 0.008712 -5414.9
- 섬유의복    1 0.0000875 0.008763 -5412.0
- 반도체      1 0.0001137 0.008789 -5410.5
- 철강        1 0.0001314 0.008807 -5409.5
- 코스닥지수  1 0.0002531 0.008929 -5402.7
- IT소프트    1 0.0002826 0.008958 -5401.0
- 조선        1 0.0002878 0.008963 -5400.8
- 운송        1 0.0003174 0.008993 -5399.1
- 음식료      1 0.0003263 0.009002 -5398.6
- 미디어통신  1 0.0003377 0.009013 -5398.0
- 건설        1 0.0005868 0.009262 -5384.4
- 소비자유통  1 0.0008018 0.009477 -5373.0
- 전기가스    1 0.0008366 0.009512 -5371.2
- 비은행금융  1 0.0018751 0.010551 -5319.6
- 화학에너지  1 0.0037989 0.012475 -5236.1
- 바이오      1 0.0038974 0.012573 -5232.2
- 자동차      1 0.0039575 0.012633 -5229.9
- 서비스업    1 0.0050103 0.013686 -5190.0
- 코스피지수  1 0.0276084 0.036284 -4704.4

Step:  AIC=-5416.42
mydatat$삼성전자 ~ 코스피지수 + 코스닥지수 + 자동차 + 반도체 + 
    바이오 + 은행 + IT소프트 + 화학에너지 + 철강 + 음식료 + 미디어통신 + 
    건설 + 비은행금융 + 조선 + 전기가스 + 운송 + 소비자유통 + 
    서비스업 + 섬유의복

             Df Sum of Sq      RSS     AIC
<none>                    0.008686 -5416.4
- 은행        1 0.0000378 0.008724 -5416.3
- 섬유의복    1 0.0000935 0.008779 -5413.1
- 반도체      1 0.0001084 0.008794 -5412.2
- 철강        1 0.0001321 0.008818 -5410.9
- 코스닥지수  1 0.0002483 0.008934 -5404.4
- IT소프트    1 0.0002818 0.008968 -5402.5
- 조선        1 0.0002837 0.008970 -5402.4
- 운송        1 0.0003273 0.009013 -5400.0
- 미디어통신  1 0.0003408 0.009027 -5399.2
- 음식료      1 0.0003431 0.009029 -5399.1
- 건설        1 0.0006013 0.009287 -5385.1
- 소비자유통  1 0.0007942 0.009480 -5374.8
- 전기가스    1 0.0008393 0.009525 -5372.5
- 비은행금융  1 0.0018804 0.010566 -5320.8
- 화학에너지  1 0.0037923 0.012478 -5238.0
- 자동차      1 0.0039473 0.012633 -5231.9
- 바이오      1 0.0039874 0.012673 -5230.3
- 서비스업    1 0.0050289 0.013715 -5190.9
- 코스피지수  1 0.0276102 0.036296 -4706.3

> summary(model1)

Call:
lm(formula = mydatat$삼성전자 ~ 코스피지수 + 코스닥지수 + 자동차 + 
    반도체 + 바이오 + 은행 + IT소프트 + 화학에너지 + 철강 + 음식료 + 
    미디어통신 + 건설 + 비은행금융 + 조선 + 전기가스 + 운송 + 
    소비자유통 + 서비스업 + 섬유의복, data = mydatat[, 1:22])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0170489 -0.0026850 -0.0000352  0.0026905  0.0138548 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.0000358  0.0001940   0.185 0.853672    
코스피지수   3.7650749  0.0965896  38.980  < 2e-16 ***
코스닥지수   0.1682481  0.0455176   3.696 0.000244 ***
자동차      -0.2552904  0.0173211 -14.739  < 2e-16 ***
반도체      -0.0611739  0.0250492  -2.442 0.014962 *  
바이오      -0.3074394  0.0207543 -14.813  < 2e-16 ***
은행         0.0381239  0.0264158   1.443 0.149613    
IT소프트    -0.1600574  0.0406415  -3.938 9.43e-05 ***
화학에너지  -0.3159906  0.0218733 -14.446  < 2e-16 ***
철강        -0.0621868  0.0230650  -2.696 0.007262 ** 
음식료      -0.1010346  0.0232504  -4.345 1.70e-05 ***
미디어통신  -0.1043322  0.0240900  -4.331 1.81e-05 ***
건설        -0.1373957  0.0238850  -5.752 1.57e-08 ***
비은행금융  -0.4909233  0.0482596 -10.173  < 2e-16 ***
조선        -0.0812132  0.0205522  -3.952 8.94e-05 ***
전기가스    -0.0956907  0.0140804  -6.796 3.21e-11 ***
운송        -0.0521668  0.0122914  -4.244 2.64e-05 ***
소비자유통  -0.2057261  0.0311176  -6.611 1.02e-10 ***
서비스업    -0.4142045  0.0248982 -16.636  < 2e-16 ***
섬유의복    -0.0415029  0.0182981  -2.268 0.023765 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.004263 on 478 degrees of freedom
Multiple R-squared:  0.9448,	Adjusted R-squared:  0.9426 
F-statistic: 430.6 on 19 and 478 DF,  p-value: < 2.2e-16

> vif(model1)
코스피지수 코스닥지수     자동차     반도체     바이오       은행   IT소프트 화학에너지       철강     음식료 미디어통신       건설 비은행금융 
 47.977677  18.671551   3.082772   7.829060   5.195655   7.048413  13.752078   5.398887   4.809100   2.713808   2.861917   6.023896  16.222166 
      조선   전기가스       운송 소비자유통   서비스업   섬유의복 
  5.249995   1.601350   1.940450   6.423204   3.350117   3.142119 

 

최종결과를 확인해보면 위와 같이 R 스퀘어 값이 94%로 급증한 결과를 보이고 있지만 결과적으로 이 방법도 크게 신뢰할 수 없다. 우선 위의 결과에서 vif 지수를 살펴보면 코스피, 코스닥 지수는 여전히 10 이상의 값을 보이고 있는데 그도 그럴 것이 코스피 지수가 오르면 삼성전자가 상승한다라는 인과관계가 성립하기 위해서는 삼성전자가 오르면 코스피 지수가 상승한다라는 역이 성립하면 안된다. 즉 둘의 관계는 원인이면서 동시에 결과라는 관계가 성립하기 때문에 이건 인과관계라고 표현할 수 없기 때문이다. 그 역이 왜 성립하냐고?? 삼성전자 한 종목의 시가총액은 코스피 지수의 약 30%를 차지하고 있다. 물론 절대적일 수는 없지만 아주 유의미한 영향력을 가지고 있기에 그 역도 충분히 성립할 소지가 있다. 

 

R 혹은 다른 분석툴에서 계량적인 결과가 그러하다고 해서 맹신해서는 좋지 않다는 사례를 보여주기에는 충분하다고 판단이 된다. 아래의 소스전문을 통해 실습을 해보고 backward 가 아닌 forward 방식으로도 한 번씩 실습을 해보자.

 

###################################### 소스 전문 ##########################################

#작업경로를 지정하는 명령어
setwd("")

#데이터 끌어오기(중회귀자료, 다수의 독립변수와 하나의 종속변수)
mydatat<-read.csv("multi.csv",
                  header=TRUE, na.strings = "")
mydatat
str(mydatat)

#우선 처음에 전체 데이터를 전부 입력해준다.
model1<-lm(mydatat$삼성전자~.,data=mydatat[,1:22])
#독립변수를 하나씩 제거해가면서 AIC가 최소가 되는 모델을 찾아본다.
model1<-step(model1,direction = "backward", trace=T)

anova(model1)
summary(model1)
library(car)
vif(model1)

#우선 처음에 아무것도 없이 만들어준다.
model2<-lm(mydatat$삼성전자~0,data=mydatat[,1:22])
#독립변수가 없는 상태에서부터 순차적으로 하나씩 추가해가면서 대입
#AIC가 최소가 되는 모델을 찾아본다.
model2<-step(model2,direction = "forward", 
                scope=(mydatat$삼성전자 ~ 
                         mydatat$코스닥지수 + mydatat$코스피지수 + mydatat$자동차+
                         mydatat$반도체 + mydatat$바이오 + mydatat$은행 + mydatat$IT소프트 + mydatat$화학에너지 +
                         mydatat$철강 + mydatat$음식료 + mydatat$미디어통신 + mydatat$비은행금융 + mydatat$건설 +
                         mydatat$증권 + mydatat$조선 + mydatat$전기가스 + mydatat$보험 + mydatat$운송 +  
                         mydatat$소비자유통 + mydatat$서비스업 + mydatat$섬유의복 + mydatat$종이목재),trace=T)


anova(model2)
summary(model2)
vif(model2)


nx=data.frame(data=mydatat[,1:22])
pre=predict(model2,nx,interval="prediction")
pre

#예측과 실제치의 결과를 비교해본다.
#비교의 방법은 fit(예측값)과 실제값의 부호가 같은 경우 정답이라고 인식
#그 다음으로 비교하는 방법은 실제값이 lwr, upr 사이에 들어오는지 비교 
testset<-cbind(pre,mydatat$삼성전자)
testset

 

multi.csv
0.14MB

 

728x90
반응형

댓글