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

삼성전자 중회귀분석 with R - 심화편

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

multi.csv
0.14MB

이전 포스트(2020/09/02 - [데이터마이닝 with R] - 삼성전자의 중회귀분석 with R)에서 우리는 상당히 만족스럽지 못한 결과치를 얻었다. 그 원인을 다시 한번 반복하면 우선 단위가 너무 천차만별이라는 점, 유의마한 변수를 고려하지 않고 수집한 모든 변수를 독립변수로 사용한 점 등이 있다. 

 

자 그렇다면 이제부터는 단위를 표준화하는 방법에 대해 알아보자. 방법은 여러가지가 있을 수 있다. 예를 들어 변수들의 단위를 표준화하는 방법, 아니면 회귀계수의 단위를 표준화하는 방법(표준화 회귀계수) 혹은 우리가 다루는 자료는 시계열데이터의 형태이므로 로그차분 데이터를 이용하는 방법도 쓸 수 있다. 

 

자 여러가지 방법 중에 우리는 가장 마지막 방법을 이용해보자. 지난 포스트에서 업종별지수 데이터와 삼성전자 주가 데이터를 증권사 API를 이용해서 가져와 봤다. 참고 : 2020/08/28 - [증권사 API] - 이베스트증권 차트TR 만들어보기(VBA 활용 - 주식차트편) 이번에는 그 자료를 이용해서 전부 차분데이터를 만들어서 하나의 자료로 합쳐볼 예정이다. Excel 파일을 새로하나 열어서 업종별 데이터와 삼성전자 데이터를 아래의 그림(첨부파일참고)과 같이 하나로 합쳐보자. 합친 다음에는 각 각의 로그차분을 구한 뒤 다른 이름으로 저장(CSV)을 한다.

R에서 CSV 파일을 읽어들인 다음에 산포도를 그려보자. 그림이 너무 작아서 잘 안보이기는 하지만, 대략적으로 각 변수들은 일정한 상관관계를 가지고 있는 것처럼 보인다. 이건 분명 공선성이 존재할 것이라고 합리적인 의심이 든다. 자 그럼 이제 공선성을 없애기 위해 변수를 하나씩 쳐내보자. 

 

 

회귀방정식을 정의하고 anova 분석을 통해 변수들의 p-value를 확인해보자. 거의 대부분의 변수들이 0.05 이하의 값들이지만 * 3개짜리 변수만 먼저 추려내어 model2를 새롭게 만들어보자.

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

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

#각 항목별 산포도를 그려보면 모두 일정한 상관관계가 있는 것처럼 보인다.
#이렇게 해서는 어떠한 변수가 키플레이어인지 알수가 없다.
library(psych)
describe(mydatat)
pairs.panels(mydatat)

#우선 처음에 전체 데이터를 전부 입력해준다.
model1<-lm(mydatat$삼성전자~.,data=mydatat[,1:22])

#분석을 통해서 유의미한 변수를 추려낸다. (p-value 0.0 미만, * 3개짜리만 담아보자.)
anova(model1)
summary(model1)
#한번 설치했으면 주석처리, car, DAAG 둘다 상관없음.
#install.packages("car")
library(car)
vif(model1)

Analysis of Variance Table

Response: mydatat$삼성전자
            Df   Sum Sq  Mean Sq   F value    Pr(>F)    
코스피지수   1 0.105801 0.105801 5799.9094 < 2.2e-16 ***
코스닥지수   1 0.007882 0.007882  432.0674 < 2.2e-16 ***
자동차       1 0.006134 0.006134  336.2654 < 2.2e-16 ***
반도체       1 0.005910 0.005910  323.9612 < 2.2e-16 ***
바이오       1 0.000110 0.000110    6.0287 0.0144325 *  
은행         1 0.002234 0.002234  122.4844 < 2.2e-16 ***
IT소프트     1 0.000176 0.000176    9.6425 0.0020149 ** 
화학에너지   1 0.006189 0.006189  339.2942 < 2.2e-16 ***
철강         1 0.000074 0.000074    4.0786 0.0439919 *  
음식료       1 0.002115 0.002115  115.9456 < 2.2e-16 ***
미디어통신   1 0.001315 0.001315   72.0620 2.684e-16 ***
건설         1 0.001497 0.001497   82.0562 < 2.2e-16 ***
비은행금융   1 0.002210 0.002210  121.1255 < 2.2e-16 ***
증권         1 0.000226 0.000226   12.3894 0.0004734 ***
조선         1 0.000184 0.000184   10.0821 0.0015945 ** 
전기가스     1 0.000622 0.000622   34.1212 9.618e-09 ***
보험         1 0.000048 0.000048    2.6089 0.1069268    
운송         1 0.000177 0.000177    9.7293 0.0019238 ** 
소비자유통   1 0.000781 0.000781   42.8234 1.555e-10 ***
서비스업     1 0.004888 0.004888  267.9730 < 2.2e-16 ***
섬유의복     1 0.000092 0.000092    5.0337 0.0253195 *  
종이목재     1 0.000010 0.000010    0.5513 0.4581347    
Residuals  475 0.008665 0.000018                        
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

위의 과정을 완료하고 난 뒤에는 아주 높은 확률로 모든 변수가 유의미하다는 결과가 나왔다. 과연 그럴까? 변수들의 계수에 대한 유의성은 좋다고 나왔지만 vif 분석에서 코스피지수에 대한 값이 10이 초과되어 분석되었다. 어떻게 해야할까? 그렇다. 과감히 버려준다.


#유의미한 변수들만 추려서 다시 모델을 설정해준다.
model2<-lm(mydatat$삼성전자 ~ 
             mydatat$코스닥지수 + mydatat$코스피지수 + mydatat$자동차+
             mydatat$반도체 + mydatat$은행 + mydatat$화학에너지 +
             mydatat$음식료 + mydatat$미디어통신 + mydatat$건설 +
             mydatat$비은행금융 + mydatat$증권 + mydatat$전기가스 +
             mydatat$소비자유통 + mydatat$서비스업 ,data=mydatat)

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

Analysis of Variance Table

Response: mydatat$삼성전자
                    Df   Sum Sq  Mean Sq  F value    Pr(>F)    
mydatat$코스닥지수   1 0.050298 0.050298 1871.658 < 2.2e-16 ***
mydatat$코스피지수   1 0.063385 0.063385 2358.636 < 2.2e-16 ***
mydatat$자동차       1 0.006134 0.006134  228.258 < 2.2e-16 ***
mydatat$반도체       1 0.005910 0.005910  219.906 < 2.2e-16 ***
mydatat$은행         1 0.002025 0.002025   75.335 < 2.2e-16 ***
mydatat$화학에너지   1 0.005106 0.005106  190.020 < 2.2e-16 ***
mydatat$음식료       1 0.001946 0.001946   72.420 < 2.2e-16 ***
mydatat$미디어통신   1 0.000583 0.000583   21.695 4.137e-06 ***
mydatat$건설         1 0.001015 0.001015   37.753 1.681e-09 ***
mydatat$비은행금융   1 0.002695 0.002695  100.285 < 2.2e-16 ***
mydatat$증권         1 0.000347 0.000347   12.900 0.0003621 ***
mydatat$전기가스     1 0.000512 0.000512   19.069 1.543e-05 ***
mydatat$소비자유통   1 0.000612 0.000612   22.766 2.427e-06 ***
mydatat$서비스업     1 0.003793 0.003793  141.145 < 2.2e-16 ***
Residuals          483 0.012980 0.000027                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

#vif 분석결과
mydatat$코스닥지수 mydatat$코스피지수     mydatat$자동차     mydatat$반도체       mydatat$은행 mydatat$화학에너지     mydatat$음식료 
          6.449168          21.003927           2.737220           4.875880           7.391261           5.007498           2.596263 
mydatat$미디어통신       mydatat$건설 mydatat$비은행금융       mydatat$증권   mydatat$전기가스 mydatat$소비자유통   mydatat$서비스업 
          2.604253           4.774948          20.705510           5.662867           1.561987           5.776684           3.241471 
          

그렇다. 코스피지수를 버리고 나니 또 변수의 계수에 관한 유의성이 변동되었다. 산넘어 산이다. 그렇지만 포기하지 말고 끝까지 가보자. 자 다시 아래의 표를 보고 코스닥, 자동차, 반도체, 증권, 소비자유통을 제외하고 모델을 새롭게 만들어보자. 

#코스피 지수의 vif 값이 21로 10보다 큰 값으로 도출되었다. -> 제외
model3<-lm(mydatat$삼성전자 ~ 
             mydatat$코스닥지수 + mydatat$자동차+
             mydatat$반도체 + mydatat$은행 + mydatat$화학에너지 +
             mydatat$음식료 + mydatat$미디어통신 + mydatat$건설 +
             mydatat$비은행금융 + mydatat$증권 + mydatat$전기가스 +
             mydatat$소비자유통 + mydatat$서비스업 ,data=mydatat)

anova(model3)
summary(model3)
vif(model3)

Analysis of Variance Table

Response: mydatat$삼성전자
                    Df   Sum Sq  Mean Sq  F value    Pr(>F)    
mydatat$코스닥지수   1 0.050298 0.050298 436.2716 < 2.2e-16 ***
mydatat$자동차       1 0.008015 0.008015  69.5233 7.897e-16 ***
mydatat$반도체       1 0.032981 0.032981 286.0650 < 2.2e-16 ***
mydatat$은행         1 0.004689 0.004689  40.6695 4.215e-10 ***
mydatat$화학에너지   1 0.000248 0.000248   2.1533   0.14292    
mydatat$음식료       1 0.000327 0.000327   2.8338   0.09295 .  
mydatat$미디어통신   1 0.000027 0.000027   0.2302   0.63158    
mydatat$건설         1 0.000260 0.000260   2.2595   0.13345    
mydatat$비은행금융   1 0.000141 0.000141   1.2243   0.26907    
mydatat$증권         1 0.002029 0.002029  17.5952 3.251e-05 ***
mydatat$전기가스     1 0.000275 0.000275   2.3852   0.12314    
mydatat$소비자유통   1 0.001832 0.001832  15.8940 7.733e-05 ***
mydatat$서비스업     1 0.000418 0.000418   3.6230   0.05758 .  
Residuals          484 0.055801 0.000115                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

자, 드디어 원하는 결과가 나왔다. 모든 변수가 유의미하고 vif 값은 10미만으로 도출되었다. summary의 요약을 살펴보면 수정된 R 스퀘어 값이 67%정도로 처음보다 많이 줄었지만 이건 변수의 제거에 따른 정보손실의 결과로 봐야한다. 물론 공선성을 줄여서 얻는 효과가 정보손실보다 훨씬 크기 때문에 오히려 줄어도 상관이 없다.

#코스피 지수를 제외한 이후 유의미한 변수의 갯수가 변경되었다.
model4<-lm(mydatat$삼성전자 ~ 
             mydatat$코스닥지수 + mydatat$자동차+
             mydatat$반도체 + mydatat$은행 + 
             mydatat$증권 + 
             mydatat$소비자유통 ,data=mydatat)

#분석결과 모든 불피요한 변수는 사라지고 코스닥, 반도체, 은행, 증권, 소비자유통이 남았다.
#변수의 유의미성, 그리고 vif 지수도 모두 만족하는 것으로 결론이 발생하여 최종모델로 선정.
anova(model4)
summary(model4)
vif(model4)

Analysis of Variance Table

Response: mydatat$삼성전자
                    Df   Sum Sq  Mean Sq  F value    Pr(>F)    
mydatat$코스닥지수   1 0.050298 0.050298 426.7302 < 2.2e-16 ***
mydatat$자동차       1 0.008015 0.008015  68.0028 1.506e-15 ***
mydatat$반도체       1 0.032981 0.032981 279.8086 < 2.2e-16 ***
mydatat$은행         1 0.004689 0.004689  39.7800 6.346e-10 ***
mydatat$증권         1 0.002372 0.002372  20.1257 9.041e-06 ***
mydatat$소비자유통   1 0.001112 0.001112   9.4334  0.002249 ** 
Residuals          491 0.057873 0.000118                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

> vif(model4)
mydatat$코스닥지수     mydatat$자동차     mydatat$반도체       mydatat$은행       mydatat$증권 mydatat$소비자유통 
          4.082486           2.553255           3.245517           2.651816           3.542005           4.106007 

 

위에서 수행단 단계를 AIC(아카이케정보기준)방식으로 Backward, Forward , stepwise 등을 통해서 간단히 수행할 수 있는 방법 혹은 우도추정방식을 이용해서 최적변수를 추정하는 방법도 있다.  어라? 괜히 노가다 했네. 너무 억울해하지 말고 하나씩 알아나가 보자. 기타 방식들에 대해서는 다음 포스트에서 다루어 보자.

 

자 사실 위의 중회귀분석을 통해서 얻은 예측치는 미래를 예측하는 방법으로는 크게 의미가 없다. 왜냐? 코스피지수, 반도체, 증권 업종은 삼성전자와 같이 움직인다. 즉 서로 동행하기 때문에 독립변수들의 움직임으로 예측할 필요없이 그냥 삼성전자 주가를 보면 된다. 그렇다면 왜 이런 쓸데없는 짓을 하냐고??

 

곰곰히 한번 생각해보자. 독립변수들이 삼성전자 주가와 서로 동행하는 것들이 아니라 선행하여 움직이는 것들이라면? 그때에는 이야기가 달라진다. 주식하는 사람들 사이에서 한 때 유행했던 이야기는 "밤새 안녕하십니까?" 이다. 무슨 뜻인고 하니 밤새 미국시장은 안녕한가는 말이다. ㅎㅎㅎ

 

다우지수, 나스닥지수는 밤새 변동이 일어났다. 그 외에도 원자재나 환율 등도 밤새 이미 가격변동이 일어났다. 그러면 이러한 변수들을 독립변수로 가지는 삼성전자의 주가는 아직 시작도 안했으니 한 번 예측해볼만한 거 아닌가 한다.

 

#####################################소스코드전문#########################################

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

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

#각 항목별 산포도를 그려보면 모두 일정한 상관관계가 있는 것처럼 보인다.
#이렇게 해서는 어떠한 변수가 키플레이어인지 알수가 없다.
library(psych)
describe(mydatat)
pairs.panels(mydatat)

#우선 처음에 전체 데이터를 전부 입력해준다.
model1<-lm(mydatat$삼성전자~.,data=mydatat[,1:22])

#분석을 통해서 유의미한 변수를 추려낸다. (p-value 0.0 미만, * 3개짜리만 담아보자.)
anova(model1)
summary(model1)

#한번 설치했으면 주석처리, car, DAAG 둘다 상관없음.
#install.packages("car")
library(car)
vif(model1)

#유의미한 변수들만 추려서 다시 모델을 설정해준다.
model2<-lm(mydatat$삼성전자 ~ 
             mydatat$코스닥지수 + mydatat$코스피지수 + mydatat$자동차+
             mydatat$반도체 + mydatat$은행 + mydatat$화학에너지 +
             mydatat$음식료 + mydatat$미디어통신 + mydatat$건설 +
             mydatat$비은행금융 + mydatat$증권 + mydatat$전기가스 +
             mydatat$소비자유통 + mydatat$서비스업 ,data=mydatat)

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

#코스피 지수의 vif 값이 21로 10보다 큰 값으로 도출되었다. -> 제외
model3<-lm(mydatat$삼성전자 ~ 
             mydatat$코스닥지수 + mydatat$자동차+
             mydatat$반도체 + mydatat$은행 + mydatat$화학에너지 +
             mydatat$음식료 + mydatat$미디어통신 + mydatat$건설 +
             mydatat$비은행금융 + mydatat$증권 + mydatat$전기가스 +
             mydatat$소비자유통 + mydatat$서비스업 ,data=mydatat)

anova(model3)
summary(model3)
vif(model3)

#코스피 지수를 제외한 이후 유의미한 변수의 갯수가 변경되었다.
model4<-lm(mydatat$삼성전자 ~ 
             mydatat$코스닥지수 + mydatat$자동차+
             mydatat$반도체 + mydatat$은행 + 
             mydatat$증권 + 
             mydatat$소비자유통 ,data=mydatat)

#분석결과 모든 불피요한 변수는 사라지고 코스닥, 반도체, 은행, 증권, 소비자유통이 남았다.
#변수의 유의미성, 그리고 vif 지수도 모두 만족하는 것으로 결론이 발생하여 최종모델로 선정.
anova(model4)
summary(model4)
vif(model4)


#위에서 수행단 단계를 AIC(아카이케정보기준)방식으로 Backward, Forward Stepwise 방법
#혹은 우도추정방식을 이용해서 최적변수를 추정하는 방법도 있다. 
#위의 방식들에 대해서는 심화편에서 다루어보도록 하자.

#install.packages("lmtest")
#model5 로 추정된 다중회귀식은 독립변수들 사이의 자기상관성이 없는 것으로 분석됨
#차분데이터를 이용하여 자료를 안정화했기 때문에 나타나는 결과로 판단할 수 있음.
library(lmtest)
dwtest(model4)

nx=data.frame(mydatat$코스닥지수,mydatat$자동차,mydatat$반도체,mydatat$은행,mydatat$증권,mydatat$소비자유통)
pre=predict(model4,nx,interval="prediction")
pre

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

'인과관계분석' 카테고리의 다른 글

주성분분석(PCA) with R  (0) 2020.09.09
중회귀분석의 변수선정 with R  (0) 2020.09.08
삼성전자의 중회귀분석 with R  (0) 2020.09.02
코스피지수의 회귀분석 with R  (0) 2020.09.02
R 통계분석  (0) 2020.09.01

댓글