벌써 여기까지 왔네요... 부족한 지식으로 쓴 글이지만 봐주셔서 감사합니다.
오늘은 회귀분석에 대해서 알아보겠습니다.
1. 회귀분석이란?
변수들 사이의 함수적 관걔를 탐색하는 방법입니다.
간단히 설명해서 Y라는 변수를 X1 ~ Xn이라는 n개의 변수들의 선형결합(1차 방정식을 생각하시면 편합니다.)으로 나타내고자 하는거죠.
기본식은 Y=b0+b1*X1+b2*X2+...+bn*Xn+e(오차항) 으로 볼 수 있겠습니다.
2. 단순선형회귀
이해하시기 쉽게 바로 예시를 들어볼까요? 일단 P031.txt라는 데이터를 example1로 불러오겠습니다.
각 변수의 Scatter plot(산점도)을 그려보니 요렇게 나오는군요.
Units가 커질수록 Minutes도 커지는 경향이 있는 것, 보이시나요?
회귀분석은 이런 데이터를 가지고 만약 Unit이 10을 넘어 11이나 12, 그 이상으로 간다면 Minutes가 얼마가 될 지를 예상할 수 있게 해줍니다.
식을 써보도록 하죠.
눈치 빠르신 분들은 알아채셨겠지만 위의 lm이라는 함수가 선형회귀를 만드는 함수입니다.
regression<- regression이라는 이름으로
lm() 선형회귀를 해볼건데
lm(Minutes ~ Units Units라는 변수로 Minutes를 설명하고 싶다( Units가 x, Minutes 가 y가 됩니다.)
,data=example1) 데이터는 example1에서 따온거다.
라는 뜻입니다. 그리고 밑의 summary는 그래서 한번 니 결과를 읊어봐라... 라는 뜻입니다.
결과창을 보시면
Call:
lm(formula = Minutes ~ Units, data = example1)
Residuals: #Residual(잔차)는 실제 Y값에서 우리가 예상한 Y값을 뺀 결과입니다. 이 잔차가 작으면 작을수록 좋은 모형이 되지요.
Min 1Q Median 3Q Max
-9.2318 -3.3415 -0.7143 4.7769 7.8033
Coefficients: #여기가 가장 주목해야 할 부분입니다. Units옆에 15.509, Intercept옆에 4.162라고 써있죠? 즉 Minutes(Y)는 15.509*Minutes(X)+4.162
라는 식으로 설명될 수 있다는 뜻입니다.
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.162 3.355 1.24 0.239
Units 15.509 0.505 30.71 8.92e-13 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.392 on 12 degrees of freedom
Multiple R-squared: 0.9874, Adjusted R-squared: 0.9864 # Multiple R-Squared는 cor(X,Y)의 제곱을 뜻합니다.
F-statistic: 943.2 on 1 and 12 DF, p-value: 8.916e-13
**자세한 설명은 전공을 들으셔야 하지만 가장 기본적으로 회귀분석에서 봐야할 것은 cor(X,Y)의 값입니다. Multiful R-Squared를 보면 알 수 있는데 이 값이 높으면 높을수록 이 직선이 Y값을 잘 설명하는 직선이며 분석이 잘 되었다는 뜻입니다. 물론 여러가지 고려해야 할 사항들이 더 있지만 그건 뒤에 계속 하겠습니다.
3. 다중회귀
이번엔 변수들이 여러개일 때를 고려해보겠습니다.
앞서 썼던 P060.txt 파일을 가져와보겠습니다.
Y X1 X2 X3 X4 X5 X6
43 51 30 39 61 92 45
63 64 51 54 63 73 47
71 70 68 69 76 86 48
61 63 45 47 54 84 35
81 78 56 66 71 83 47
43 55 49 44 54 49 34
58 67 42 56 66 68 35
71 75 50 55 70 66 41
72 82 72 67 71 83 31
67 61 45 47 62 80 41
64 53 53 58 58 67 34
67 60 47 39 59 74 41
69 62 57 42 55 63 25
68 83 83 45 59 77 35
77 77 54 72 79 77 46
81 90 50 72 60 54 36
74 85 64 69 79 79 63
65 60 65 75 55 80 60
65 70 46 57 75 85 46
50 58 68 54 64 78 52
50 40 33 34 43 64 33
64 61 52 62 66 80 41
53 66 52 50 63 80 37
40 37 42 58 50 57 49
63 54 42 48 66 75 33
66 77 66 63 88 76 72
78 75 58 74 80 78 49
48 57 44 45 51 83 38
85 85 71 71 77 74 55
82 82 39 59 64 78 39
요렇게 생겼습니다.
example2로 불러왔습니다. 자 그럼 시작할까요
위의 코드에서 보시면 선형회귀와는 다른 것을 보실 수 있습니다. 바로 X1+X2+... 부분인데요. 설명하는데 필요한 변수들이 많을 경우 +로 이어줍니다.
위의 식은 Y를 설명하는데 있어서 X1과 X2,...X6까지 싹 이용해서 설명하고싶다는 뜻입니다.
결과를 분석해보면
Call:
lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6, data = example2)
Residuals: #아까도 보셨지만 잔차입니다.
Min 1Q Median 3Q Max
-10.9418 -4.3555 0.3158 5.5425 11.5990
Coefficients: #여기도 보시면 아시겠지만 X1~x6까지의 결과값이죠
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.78708 11.58926 0.931 0.361634
X1 0.61319 0.16098 3.809 0.000903 ***
X2 -0.07305 0.13572 -0.538 0.595594
X3 0.32033 0.16852 1.901 0.069925 .
X4 0.08173 0.22148 0.369 0.715480
X5 0.03838 0.14700 0.261 0.796334
X6 -0.21706 0.17821 -1.218 0.235577
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.068 on 23 degrees of freedom
Multiple R-squared: 0.7326, Adjusted R-squared: 0.6628
F-statistic: 10.5 on 6 and 23 DF, p-value: 1.24e-05
Multiple R-squared가 0.73이 나왔습니다. 생각보다 좀 적죠? 과연 어디에 문제가 있던 것일까요 - 는 4번으로 이어집니다!
4. 모형을 안정화시켜보자.
R-squared가 0.73밖에 나오지 않았다는 것은 생각보다 낮은 숫자지요. 과연 뭐가 문제여서 이렇게 된 것일까요?
는 이걸 분석하기 위해서는 여러분도 저와 같이 전공공부를 하셔야겠지만... 여기서는 편하게 몇가지만 집어내보도록 하겠습니다.
먼저 그 첫번째 각 변수들의 cor값입니다.
각 변수들이 서로 강하게 관련이 있을 수록 값은 이상해지고 제대로 된 분석이 되지 않죠. 예를 들어서 X1과 X2가 0.99의 cor을 보인다면
X1이 변화함에 따라 X2도 자동적으로 변해버리기 때문에 전체 모형을 설명하는데 큰 의미가 없게 됩니다.
밑에 보시면 X1 ~ X6까지 나와있는 행렬이 바로 cor행렬입니다. 각 행과 열이 만나는 곳에 서로의 cor값이 표시가 되고 대각 행렬값은 그래서 항상 1입니다.
이걸 보면 여기서의 문제는 그다지 없는 것 같죠? 그럼 두번째로 넘어갑시다.
각 모형의 t값을 보시면
X1 0.61319 0.16098 3.809 0.000903 ***
X2 -0.07305 0.13572 -0.538 0.595594
X3 0.32033 0.16852 1.901 0.069925 .
X4 0.08173 0.22148 0.369 0.715480
X5 0.03838 0.14700 0.261 0.796334
X6 -0.21706 0.17821 -1.218 0.235577
굵게 표시된 부분입니다만 이 t값들은 t(23,a/2){a는 유의수준)에 비교해보면 X1만이 5%유의 수준을 통과했고 X3이 10%, 나머지는 다 꽝입니다.
음 쉽게 설명하자면 각 값이 0이냐 아니냐를 두고 t검정을 실시하는데 95%확률로 0이 아니다라는 기준을 통과한건 X1뿐이고
90퍼센트 확률로 아니다라는 기준을 통과한건 X3, 나머지는 다 꽝이라는겁니다.
즉 이 데이터는 X1, X3만을 가지고 설명을 하는게 더 옳은 모형일 수도 있다는 것을 보여줍니다.
조금 더 상세한 설명을 드리지 못하는 것을 죄송하게 생각하며...(내일 전공 시험이 3개 ㄷㄷㄷ)
오늘은 여기까지로 하고 내일은 대망의 마지막, 인문학도를 위한 R을 가져오겠습니다.
p.s 공부하고 싶은 분들을 위한 코드
회귀분석을 전공으로 들으신 분들이라면 이해하시는 값들입니다만 R에는 함수가 따로 없어서 제가 만들어봤습니다.
그다지 어렵지 않은 함수이니 마음대로 가져다 쓰세요.
#leverage point<-단 x에는 1열이 1인 행렬(지레값)
leverage<-function(x){
P.t<-solve(t(x) %*% x)
P.x<-x %*% P.t %*% t(x)
leverage.x<-rep(0,length(x[1,]))
for(i in 1:length(x[1,])){
leverage.x[i]<-P.x[i,i]
}
leverage.x
}
#DFITs(x에는 회귀 모형, y에는 1열이 1인 x행렬)
DFITs<-function(x,y){
DFITs.x<-rep(0,length(y[1,]))
for(i in 1:length(y[1,])){
DFITs.x[i]<-rstandard(x)[i]*sqrt(leverage(y)[i]/(1-leverage(y)[i]))
}
DFITs.x
}