다른 모든 분야와 마찬가지로 회귀 분석을 비롯한 통계 분석은 역시 실제로 해봐야 실력이 늘어나는 것 같습니다. 전문가라고 할 수 있을 정도로 실력이 늘려면 상당한 시간과 노력이 필요하는 것 역시 다른 분야와 비슷합니다. 실제 분석을 시도해보면 생각했던 것과는 다른 결과에 당황스럽기도 하고 결과 해석 역시 어려울 뿐 아니라 맞게 분석한 것인지도 확신이 서지 않을때가 많습니다.
공부하는 과정에서 만나게 되는 예제 데이터는 실제 데이터를 기반으로 충분히 수정한 것이라 큰 문제가 없는 경우가 많지만, 실제 데이터는 그렇지 않기 때문에 로우 데이터부터 분석을 시도하면 많은 여러움이 있을 것입니다. 그래서 여기서는 선형 회귀 분석의 예제로 잘 사용되지 않는 예제를 이용해 보겠습니다. 앞서 소개한 바 있는 다이아몬드 데이터죠. 5만개 이상의 다이아몬드의 컷팅, 색, 크기 (캐럿)와 가격의 리스트를 만든 것입니다.
쉽게 생각해서 큰 다이아몬드는 더 비쌀 것입니다. 따라서 다이아몬드의 캐럿과 가격은 비례 관계에 있을 것이라는 추정을 내릴 수 있습니다. 사실 큰 다이아몬드가 더 비싸다는 걸 알고 싶어 하는 사람은 별로 없을 것입니다. 당연한 이야기니까요. 하지만 예제로는 삼을 수 있겠죠. 다이아몬드 데이터를 불러내 가격과 캐럿의 관계를 선형 회귀 모델에 넣어 보겠습니다.
> library("ggplot2")
> summary(diamonds)
carat cut color clarity depth table price x y z
Min. :0.2000 Fair : 1610 D: 6775 SI1 :13065 Min. :43.00 Min. :43.00 Min. : 326 Min. : 0.000 Min. : 0.000 Min. : 0.000
1st Qu.:0.4000 Good : 4906 E: 9797 VS2 :12258 1st Qu.:61.00 1st Qu.:56.00 1st Qu.: 950 1st Qu.: 4.710 1st Qu.: 4.720 1st Qu.: 2.910
Median :0.7000 Very Good:12082 F: 9542 SI2 : 9194 Median :61.80 Median :57.00 Median : 2401 Median : 5.700 Median : 5.710 Median : 3.530
Mean :0.7979 Premium :13791 G:11292 VS1 : 8171 Mean :61.75 Mean :57.46 Mean : 3933 Mean : 5.731 Mean : 5.735 Mean : 3.539
3rd Qu.:1.0400 Ideal :21551 H: 8304 VVS2 : 5066 3rd Qu.:62.50 3rd Qu.:59.00 3rd Qu.: 5324 3rd Qu.: 6.540 3rd Qu.: 6.540 3rd Qu.: 4.040
Max. :5.0100 I: 5422 VVS1 : 3655 Max. :79.00 Max. :95.00 Max. :18823 Max. :10.740 Max. :58.900 Max. :31.800
J: 2808 (Other): 2531
> model=lm(price~carat, data=diamonds)
> summary(model)
Call:
lm(formula = price ~ carat, data = diamonds)
Residuals:
Min 1Q Median 3Q Max
-18585.3 -804.8 -18.9 537.4 12731.7
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2256.36 13.06 -172.8 <2e-16 span="">2e-16>
carat 7756.43 14.07 551.4 <2e-16 span="">2e-16>
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1549 on 53938 degrees of freedom
Multiple R-squared: 0.8493, Adjusted R-squared: 0.8493
F-statistic: 3.041e+05 on 1 and 53938 DF, p-value: < 2.2e-16
여기서는 데이터가 별도의 데이터 프레임 형태로 존재하기 때문에 lm 함수에 넣기 위해서는 data=diamonds를 지정해 줘야 정확한 값을 얻을 수 있습니다. 실제 분석할 때 주의해야 하는 점입니다. 일단 여기서 독립변수는 다이아몬드 캐럿 carat 이 될 것입니다. 종속변수는 가격이죠.
결과를 보니 상당히 큰 연관성이 있어 <2e-16 0.8493="" 1="" 7756="" djusted="" nbsp="" r-squared="" span="">2e-16>
그런데 정말 맞는 추정일까요? 여기서 잔차 분석을 해보겠습니다. 앞서 언급했듯이 plot(model) 함수를 이용해서 잔차도를 그려볼 수 있습니다. 참고로 앞서 소개한 다른 잔차 분석 방법은 솔직히 이렇게 관측값이 많을 때는 현실적으로 사용이 어렵습니다.
par(mfrow=c(2,2))
plot(model)
이 그래프는 컴퓨터 사양에 따라서 시간이 좀 걸릴 수 있습니다. 관측값이 많기 때문입니다. 아무튼 잔차도가 한 눈에 봐도 이상합니다. 어디가 이상할까요? 앞서 포스트에서 설명했듯이 잔차의 분포는 한 곳으로 몰리지 않고 균등하게 분포해야 합니다. 그런데 이 잔차도(잔차 도표)는 한 쪽으로 크게 쏠려 있어 모델에서 추정한 회귀 모델이 잘못되었을 가능성을 시사합니다. 다시 말해 등분산 가정을 위반했다는 이야기입니다. 이렇게 잔차의 분포를 보는 도표가 왼쪽 위에 첫번째 도표입니다. 앞서 설명드린 바 있죠.
normal QQ 그래프 역시 직선과 크게 어긋나 있습니다. 이는 정규 분포라는 가정을 위반한 것입니다. 그래도 쿡의 거리는 크게 벗어나지 않은 듯 하지만, 사실 이미 모델 자체가 믿을 수 없는 상황이라 큰 의미가 없습니다. 쿡의 거리가 벗어나보이지 않는 건 사실 표본의 숫자가 많기 때문이고 모델의 신뢰성과는 상관이 없습니다. 따라서 회귀 계수 추정은 잘못된 것입니다.
분명 다이아몬드가 커질 수록 비싸진다는 가정에는 문제가 없는 것 같고 자료 해석에도 문제가 없는 것 같은데 왜 이럴까요? 이유는 간단합니다. 1차 방정식의 형태로 선형 비례를 하지 않기 때문이죠. 실제로 데이터를 분석하다보면 이런 문제를 비롯해서 온갖 문제에 부딪히게 됩니다. 어떻게 해결하는 것이 좋을지 다음 시간에 이야기해보겠습니다.
댓글
댓글 쓰기