이전 포스트(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
'인과관계분석' 카테고리의 다른 글
주성분분석(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 |
댓글