앞서 예제에서의 문제점은 사실 데이터의 분포와 상관성을 잘 확인하지 않은데 있습니다. 앞서 이야기했듯이 다이아몬드의 가격은 크기에 단순히 일차 방정식으로 비례하는 것이 아니라 적어도 제곱 관계로 증가한다고 할 수 있습니다.
library("ggplot2")
plot(price~carat, data=diamonds)
한 가지 더 주의해야 할 점은 대부분 다이아몬드가 1캐럿 이하라는 사실입니다. 그리고 3캐럿 이상 다이아몬드는 매우 드문 존재입니다.
windows(width = 12, height = 10)
hist(diamonds$carat, col="red", main="Distribution of diamonds (Carat)", xlab=expression(Carat), breaks=50)
데이터 분석 전에는 이렇게 데이터의 분포와 특징을 잘 이해해야 합니다. 앞서 그려본 여러 그래프는 쓸데없는 시간 낭비가 아니라 데이터의 구조를 파악하기 위한 것이라고 할 수 있습니다. 물론 그래프 이외에 데이터가 어떻게 되어 있는지 알기 위해서 테이블 형태로 보는 것도 중요합니다.
> head(diamonds)
carat cut color clarity depth table price x y z
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
4 0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
캐럿의 경우 0.01 단위로 표기되어 있으나 가장 위의 그래프에서 보듯이 사실은 특정 값에 몰린 분포를 하고 있어 마치 누가 옆으로 쓸어 담은 것 같은 분포를 하고 있습니다. 따라서 사실은 Y=aX^2+b 의 형태와도 좀 맞지 않을 가능성이 있습니다. 아무튼 그래도 그래프의 양상이 2차 방정식을 떠올리게 만들므로 이 모델을 넣어 보겠습니다. 참고로 이렇게 이차 방정식 이상의 회귀식이 나오는 경우 다항회귀(polynomial regression)이라고 합니다. 방법은 좀 독특한데 I(변수^n)의 회귀변수를 하나 더 추가하는 것입니다. 이 경우 I(carat^2)을 추가합니다.
model=lm(price~carat+I(carat^2), data=diamonds)
summary(model)
par(mfrow=c(2,2))
plot(model)
> model=lm(price~carat+I(carat^2), data=diamonds)
> summary(model)
Call:
lm(formula = price ~ carat + I(carat^2), data = diamonds)
Residuals:
Min 1Q Median 3Q Max
-26350.0 -724.2 -35.9 445.8 12881.1
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1832.58 21.69 -84.5 <2e-16 span="">2e-16>
carat 6677.03 46.40 143.9 <2e-16 span="">2e-16>
I(carat^2) 507.91 20.82 24.4 <2e-16 span="">2e-16>
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1540 on 53937 degrees of freedom
Multiple R-squared: 0.851, Adjusted R-squared: 0.851
F-statistic: 1.54e+05 on 2 and 53937 DF, p-value: < 2.2e-16
제곱식의 경우에도 유의한 값이 나오지만, 잔차도는 여전히 가정들을 위반해서 사실상 큰 의미가 없는 결과가 나왔습니다. model=lm(price~I(carat^2), data=diamonds) 하는 식으로 2차식만 있는 모델이나 혹은 3차식 변수를 추가할 수 있으나 해보면 알겠지만, 더 기괴한 잔차도를 얻게 될 것입니다. 결국 다항회귀도 문제를 해결할 수 있는 좋은 방법은 아닌 셈입니다.
여기에는 몇 가지 이유가 있습니다. 독립변수가 정규 분포에서 매우 크게 벗어난 특성을 지녔거나 선형 비례 관계를 크게 위반한 경우 등이 그것입니다. 이 경우 여러 가지 형태의 변수 변환이 도움이 될 수 있습니다. 물론 가격을 설명하는 요소가 캐럿만이 아닌 것도 이유입니다.
아마 이런 괴상한 예제는 다른 통계 관련 서적이나 혹은 강좌에서 보지 못하셨을 것으로 생각합니다. 보통은 다 잘 되는 예제를 들고나와 설명하니까요. 그러나 현실은 잘 안되는 경우가 더 흔합니다. 본래 현실은 시궁창이니까요. 그래서 여기서는 본래 안될 것 같은 데이터를 기반으로 왜 안되는지를 좀 더 살펴보겠습니다.
댓글
댓글 쓰기