Translate

2018년 3월 27일 화요일

선형 회귀 분석 (7)




 앞서 예제에서의 문제점은 사실 데이터의 분포와 상관성을 잘 확인하지 않은데 있습니다. 앞서 이야기했듯이 다이아몬드의 가격은 크기에 단순히 일차 방정식으로 비례하는 것이 아니라 적어도 제곱 관계로 증가한다고 할 수 있습니다. 




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="">
carat        6677.03      46.40   143.9   <2e-16 span="">
I(carat^2)    507.91      20.82    24.4   <2e-16 span="">
---
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차식 변수를 추가할 수 있으나 해보면 알겠지만, 더 기괴한 잔차도를 얻게 될 것입니다. 결국 다항회귀도 문제를 해결할 수 있는 좋은 방법은 아닌 셈입니다. 


 여기에는 몇 가지 이유가 있습니다. 독립변수가 정규 분포에서 매우 크게 벗어난 특성을 지녔거나 선형 비례 관계를 크게 위반한 경우 등이 그것입니다. 이 경우 여러 가지 형태의 변수 변환이 도움이 될 수 있습니다. 물론 가격을 설명하는 요소가 캐럿만이 아닌 것도 이유입니다. 


 아마 이런 괴상한 예제는 다른 통계 관련 서적이나 혹은 강좌에서 보지 못하셨을 것으로 생각합니다. 보통은 다 잘 되는 예제를 들고나와 설명하니까요. 그러나 현실은 잘 안되는 경우가 더 흔합니다. 본래 현실은 시궁창이니까요. 그래서 여기서는 본래 안될 것 같은 데이터를 기반으로 왜 안되는지를 좀 더 살펴보겠습니다.  

댓글 없음:

댓글 쓰기