우리는 지금까지 회귀식을 만들기 위해서 최적의 변수조합이 무엇인가에 대해서 쭉 알아봤다. backward, forward, vif 등을 통해서 핵심변수들을 추출해봤고 이외에도 능형회귀, 라쏘회귀 등의 방법(변수선택)도 있다. 자 그렇다면 이렇게 자꾸 변수를 줄여나가는 이유가 뭘까? 그렇다. 앞서 언급한 것처럼 공선성으로 인한 회귀계수를 변동성이 커지고 그에 따라 모델의 신뢰도가 낮아진다는 점이다. 다시 말해 과대적합과 과소적합 사이의 딜레마를 어떻게 효율적으로 해결할 것인가가 가장 큰 관심이라는 점이다.
지금까지는 종속변수(결과변수)를 설명하기에 가장 적합한 변수조합을 찾아내는데 중점을 두었다면 이번에는 n 개의 변수를 n 보다 적은 m개의 상호독립적인 변수로 요약(여기서 요약된 변수는 기존 변수의 선형조합으로 생성)하는 방법인 주성분분석(PCA : Principal Component Analysis, 변수추출)에 대해 알아보자. 분석의 방법은 기존의 회귀분석이 종속변수와의 거리 즉 잔차를 최소화하는 방법을 이용했다면 주성분 분석은 독립변수들과 주성분과의 거리 즉 정보손실량을 최소화하는 방법을 이용하거나 주성분 분산을 최대화하는 방법을 이용한다.
변수선택의 방법은 분석 목적에 부합하는 소수의 독립변수만을 선택하는 것으로 선택된 변수에 대한 해석이 용이하지만 변수간의 상관관계에 대한 고려가 어려운 단점이 있다. 이에 반해 변수추출(주성분분석)의 방법은 독립변수의 변환을 통해 새로운 변수를 추출하는 방법인데 변수간 상관관계를 고려할 수 있지만 추출된 변수에 대한 어려움이 존재한다. 뭐 하나 쉬운게 없다. 하지만 다양한 방법으로 접근하다 보면 우리가 원하는 직관적 추론에 도움이 될 묘안이 떠오를 가능성이 점점 커지게 된다. 짜증내지 말고 천천히 접근해보자.
자 변수의 수를 기하학적 방법에서 접근해보자 아래에서 x1, x2, x3는 우리가 분석하는 코스피지수, 반도체업종, 증권업종이라고 하자. 그리고 z1과 z2는 이들 변수들의 선형결합으로 표현(평면상의 정사영)되어 3차원에서 2차원으로 축소되었다. 다시 z2는 z1의 선형결합으로 표현(직선상의 정사영)하면 우리는 변수가 3개인 3차원에서 변수가 하나인 1차원으로 축소할 수 있다. 다만 이때 변수를 줄이기 위해 정사영을 위한 축을 설정함에 있어 정보의 손실이 "최소화"가 되도록 사영된 데이터의 분산을 "최대화(maximize)"하는 축을 찾아내는 방법이다.
이것을 직관적으로 표현하자면 아래와 같이 요약된다고 보면 된다.
(주성분1)= 1.5 * 반도체업종 +....+ 2.7 * 증권업종
(주성분2)= 5.8 * IT소프트 + .... + 13.2 * 조건업종
.....
(주성분n) .... 단 n < 22.
따라서 총 22개의 업종지수들이 그 보다 훨씬 작은 주성분들로 나뉘게 된다. 자 이렇게 주성분 분석이 이루어지는 수리적 배경으로는 공분산의 성질, 행렬과 기하학, 사영, 고유값과 고유벡터 등에 대해 다루어야 하는데 어렵다. 그 외의 상세한 수리적 유도 과정은 관련서적이나 위키 등을 참고하고(위키백과) 우리는 R 패키지를 이용해 실전분석에 바로 돌입한다. 아래의 추천도서는 주성분 분석의 수리적 유도과정 뿐만 아니라 적절한 샘플코드도 포함하고 있어 원리를 이해하고 실전에 적용하는데 상당히 유용하다.
|
아래의 코드를 보면 독립변수의 데이터를 procomp 함수로 분석을 실시했다. 헷갈리면 안되는 것이 procomp는 주성분 산정의 정보손실을 최소화하는 함수이고 princomp는 주성분의 분산을 최대화하는 함수이다. 아래의 분석에 있어서는 결과적으로 차이가 없지만 경우에 따라서는 다른 결과가 도출될 수 있으니 유의하자. 특히 princomp의 경우 정량적 변수에 대해서만 적용이 가능하다는 점도 잊지 말자.
주성분 분석을 통해 변수의 갯수를 산정하는 것은 누적기여율을 기준(통상 90%)으로 선정하면 크게 무리가 없다. 코스피 지수가 혼자 65% 기여한다고 하니 사실 나머지 업종은 코스피 지수의 일부이기 때문에 틀린말이 아니다. 따라서 summary(pp)의 결과는 매우 신뢰할 수 있어 보인다. 아래의 분석결과 코스피, 코스닥, 반도체,,, 총 22개의 업종지수들의 주성분은 8개로 압축이 되었는데 이렇게 얻어진 주성분 변수들을 독립변수로 하는 삼성전자의 회귀식을 돌려보았다.
그러나 회귀계수의 유의미성(p<0.05)이 만족되지 않는 주성분이 몇 가지 있어 해당 주성분들을 제거한 최종적인 주성분으로 회귀식을 도출해보았다. 그리고 비교를 위해서 backward 방식의 stepwise 회귀분석도 실행한다. 결과적으로 주성분분석으로 인한 회귀모형의 R스퀘어 값은 약 66%, stepwise 회귀분석으로 수행한 모형의 R 스퀘어 값은 약 94%로 도출되었다. 어? stepwise가 더 좋네?? 라고 판단하면 곤란하다. 어떠한 모델링을 구현했을 때 해당 모형의 설명력이 80%를 넘어갔다면 그건 과적합이 아닌가를 매우 심각하게 의심해봐야 한다.
만약 예측을 위한 모델로 활용하기 위해서는 주성분 분석을 이용해 만든 회귀식이 더 적합할 것이라 예상할 수 있지만 모델의 결과를 해석하는데 있어서는 상당한 어려움이 있다. 예를 들어 삼성전자의 중요한 원인변수로 반도체 업종의 지수라는 것은 직관적으로 알 수 있지만 주성분1은 반도체 * 1.5 +....+증권 *0.2 이런식이라면 직관적으로 해석하는데 다소 무리가 있다. 그러나 이러한 분석은 추후 경로분석을 다룰때 상당한 도움이 된다. 상세 내용은 다음 포스트에...
#작업경로를 지정하는 명령어
setwd("")
#데이터 끌어오기(중회귀자료, 다수의 독립변수와 하나의 종속변수)
mydatat<-read.csv("multi.csv",
header=TRUE, na.strings = "")
mydatat
str(mydatat)
#정보손실최소화
pp=prcomp(mydatat[,1:22])
summary(pp)
plot(pp)
#분산최대화
pp2=princomp(mydatat[,1:22])
summary(pp2)
plot(pp2)
# summary(pp)를 통해 주성분 8개만으로도 90% 까지 누적으로 기여를 하고 있으므로 8개만 선택
new_reg<-lm(mydatat$삼성전자~pp$x[,1]+pp$x[,2]+pp$x[,3]+pp$x[,4]+pp$x[,5]+pp$x[,6]+pp$x[,7]+pp$x[,8])
summary(new_reg)
# summary(new_reg)를 통해 주성분 회귀계수의 유의성이 아래의 4개로 분석되었기 때문에 최종적으로 4개의 주성분만 선택
# 이와 같은 이유는 PCA의 한계로도 볼 수 있는데 애초에 분석할 당시 종속변수를 고려하지 않고 독립변수들간 상관관계만
# 고려하였기 때문에 회귀분석을 수행하면 유의미하지 않은 주성분도 포함되어 나올 수 있다.
new_reg2<-lm(mydatat$삼성전자~pp$x[,1]+pp$x[,3]+pp$x[,4]+pp$x[,6])
summary(new_reg2)
#주성분회귀분석과 비교를 위해서 stepwise 방식의 회귀모델을 분석한다.
model_step<-lm(mydatat$삼성전자~.,data=mydatat[,1:22])
#독립변수를 하나씩 제거해가면서 AIC가 최소가 되는 모델을 찾아본다.
model_step<-step(model1,direction = "backward", trace=T)
summary(model_step)
nx=data.frame(data=mydatat[,1:22])
pre=predict(new_reg2,nx,interval="prediction")
pre
#예측과 실제치의 결과를 비교해본다.
#비교의 방법은 fit(예측값)과 실제값의 부호가 같은 경우 정답이라고 인식
#그 다음으로 비교하는 방법은 실제값이 lwr, upr 사이에 들어오는지 비교
testset<-cbind(pre,mydatat$삼성전자)
testset
매일 업데이트 되는 경제분석 자료가 궁금하다면 무료채널 입장!
'인과관계분석' 카테고리의 다른 글
의사결정나무(Decision Tree) with R (0) | 2020.09.10 |
---|---|
요인분석(Factor Analysis) with R (0) | 2020.09.09 |
중회귀분석의 변수선정 with R (0) | 2020.09.08 |
삼성전자 중회귀분석 with R - 심화편 (0) | 2020.09.07 |
삼성전자의 중회귀분석 with R (0) | 2020.09.02 |
댓글