바로 앞에서 본 예제를 수정하지 않은 상태에서 선형 회귀 분석을 시행해 보겠습니다. 우선 가격과 캐럿의 선형 관계를 알아보고 잔차도를 그려 그 모양을 확인해 보겠습니다. 그리고 영향력 관측치를 찾기 위해 influence.measures 및 olsrr 패키지를 사용해서 관측치를 알아 보겠습니다.
set.seed(3311)
diamonds1<-sample 50="" diamonds="" nrow="" span="">-sample>
D1<-diamonds diamonds1="" span="">-diamonds>
D1
model=lm(price~carat, data=D1)
summary(model)
par(mfrow=c(2,2))
plot(model)
influence.measures(model)
require("olsrr")
ols_cooksd_barplot(model)
ols_dfbetas_panel(model)
ols_dffits_plot(model)
이 코드를 그대로 옮겨서 시행해보면
> model=lm(price~carat, data=D1)
> summary(model)
Call:
lm(formula = price ~ carat, data = D1)
Residuals:
Min 1Q Median 3Q Max
-5110.3 -1185.0 -17.3 856.3 4602.7
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2349.1 462.1 -5.083 6.06e-06 ***
carat 7733.0 470.2 16.446 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1717 on 48 degrees of freedom
Multiple R-squared: 0.8493, Adjusted R-squared: 0.8461
F-statistic: 270.5 on 1 and 48 DF, p-value: < 2.2e-16
> par(mfrow=c(2,2))
> plot(model)
>
> influence.measures(model)
Influence measures of
lm(formula = price ~ carat, data = D1) :
dfb.1_ dfb.cart dffit cov.r cook.d hat inf
1 -0.01136 0.00568 -0.0137 1.069 9.52e-05 0.0242
2 -0.04067 0.02261 -0.0466 1.067 1.11e-03 0.0261
3 -0.00509 -0.00716 -0.0224 1.066 2.57e-04 0.0223
4 0.08590 -0.06194 0.0885 1.077 3.98e-03 0.0392
5 -0.05859 -0.02074 -0.1466 1.020 1.07e-02 0.0204
6 -0.00487 -0.00172 -0.0122 1.064 7.57e-05 0.0204
7 -0.24540 0.55505 0.7032 0.781 2.13e-01 0.0531 *
8 0.02762 -0.00752 0.0411 1.061 8.60e-04 0.0207
9 0.07435 -0.16590 -0.2090 1.068 2.20e-02 0.0541
10 0.01078 -0.00694 0.0116 1.076 6.86e-05 0.0312
11 0.00770 -0.07330 -0.1273 1.052 8.18e-03 0.0299
12 0.02672 0.12250 0.2777 0.944 3.70e-02 0.0248
13 0.11158 -0.08165 0.1144 1.073 6.64e-03 0.0408
14 -0.06709 0.28012 0.4298 0.878 8.50e-02 0.0348
15 0.00228 -0.01825 -0.0311 1.074 4.94e-04 0.0305
16 -0.03069 0.01079 -0.0423 1.062 9.13e-04 0.0214
17 -0.05320 -0.06605 -0.2184 0.976 2.33e-02 0.0220
18 -0.28925 0.46826 0.5123 1.097 1.29e-01 0.1216 *
19 0.09478 -0.20873 -0.2616 1.051 3.41e-02 0.0551
20 0.07190 -0.05299 0.0736 1.082 2.76e-03 0.0416
21 -0.43346 0.63206 0.6625 1.258 2.17e-01 0.2227 *
22 -0.05447 -0.01928 -0.1362 1.025 9.30e-03 0.0204
23 0.08582 -0.06281 0.0880 1.079 3.94e-03 0.0408
24 -0.25038 0.39912 0.4337 1.138 9.36e-02 0.1305 *
25 -0.12572 0.03692 -0.1832 0.997 1.66e-02 0.0208
26 0.27862 -0.63019 -0.7984 0.714 2.62e-01 0.0531 *
27 0.10608 -0.07763 0.1088 1.075 6.01e-03 0.0408
28 0.01806 0.12898 0.2753 0.950 3.65e-02 0.0256
29 -0.04622 0.01540 -0.0649 1.057 2.14e-03 0.0212
30 -0.00941 -0.04313 -0.0978 1.053 4.84e-03 0.0248
31 0.13347 -0.10220 0.1352 1.077 9.26e-03 0.0467
32 0.10482 -0.07615 0.1077 1.074 5.89e-03 0.0400
33 0.01157 0.01629 0.0511 1.062 1.33e-03 0.0223
34 -0.02908 0.01586 -0.0336 1.069 5.77e-04 0.0257
35 0.11303 -0.08330 0.1157 1.074 6.79e-03 0.0416
36 0.01412 -0.00799 0.0161 1.071 1.32e-04 0.0266
37 0.08864 -0.06533 0.0907 1.080 4.18e-03 0.0416
38 -0.02792 0.01818 -0.0299 1.076 4.55e-04 0.0318
39 -0.01795 0.01207 -0.0190 1.079 1.84e-04 0.0336
40 0.01318 -0.15685 -0.2775 0.967 3.73e-02 0.0294
41 0.03740 -0.14783 -0.2239 1.021 2.49e-02 0.0354
42 0.05347 -0.03856 0.0551 1.082 1.55e-03 0.0392
43 0.03530 -0.02485 0.0367 1.081 6.86e-04 0.0370
44 -0.04697 0.02231 -0.0578 1.062 1.70e-03 0.0235
45 -0.04600 -0.01352 -0.1103 1.039 6.13e-03 0.0203
46 0.05891 -0.04248 0.0607 1.081 1.88e-03 0.0392
47 0.08562 -0.06310 0.0876 1.080 3.90e-03 0.0416
48 -0.08710 0.00777 -0.1534 1.014 1.17e-02 0.0201
49 0.13562 -0.10445 0.1372 1.078 9.54e-03 0.0476
50 -0.02788 -0.03925 -0.1230 1.037 7.62e-03 0.0223
>
만약 위의 그림이 잘 보이지 않으면 클릭하면 원본을 볼 수 있습니다. 아무튼 이 결과를 보면 의외로 21번 관측치가 아니라 26번 관측치가 더 모델에서 벗어나는 것으로 보입니다. 하지만 26번 관측치 자체는 평범해 보입니다.
D1[26,c(1:7)]
# A tibble: 1 x 7
carat cut color clarity depth table price
1 1.50 Premium G I1 60.4 55.0 4140
아마도 이런 일이 일어난 이유는 이 관측치가 비슷한 크기에 비해 가격이 낮기 때문일 것입니다. 그런데 이상치 처리에서 26번이 잡히지 않은 이유는 선형 회귀 모델에서는 가격과 캐럿 (크기)의 관계를 보기 때문이고 이상치 검출은 단지 정규 분포에서 얼마나 벗어났는지를 보기 때문입니다. 이 둘이 서로 다를 수 있다는 점을 염두에 둘 필요가 있습니다. 아무튼 26번 관측치를 제거하면 어떻게 될까요. 알기 위해서 D2 라는 새로운 데이터 셋을 만들겠습니다.
그런데 데이터 프레임에서 특정 값을 제거하고 싶다면 어떻게 해야 할까요. 단 하나의 값을 제거하기 위해 subset을 사용할 필요는 없습니다. 그냥 아래처럼 하면 됩니다.
D2<-d1 span="">-d1>
만약 두 개 이상의 값을 제거하고 싶다면 c() 를 사용하면 됩니다.
D2<-d1 c="" span="">-d1>
여기서는 하나만 제거하고 진행해 보겠습니다.
model=lm(price~carat, data=D2)
summary(model)
par(mfrow=c(2,2))
plot(model)
influence.measures(model)
require("olsrr")
ols_cooksd_barplot(model)
ols_dfbetas_panel(model)
ols_dffits_plot(model)
위의 코드를 입력합니다.
> model=lm(price~carat, data=D2)
> summary(model)
Call:
lm(formula = price ~ carat, data = D2)
Residuals:
Min 1Q Median 3Q Max
-2858.1 -1221.9 106.1 925.4 4316.4
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2465.9 420.5 -5.865 4.31e-07 ***
carat 8001.7 433.7 18.448 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1557 on 47 degrees of freedom
Multiple R-squared: 0.8787, Adjusted R-squared: 0.8761
F-statistic: 340.3 on 1 and 47 DF, p-value: < 2.2e-16
>
> par(mfrow=c(2,2))
> plot(model)
>
> influence.measures(model)
Influence measures of
lm(formula = price ~ carat, data = D2) :
dfb.1_ dfb.cart dffit cov.r cook.d hat inf
1 -0.01613 0.00780 -0.0196 1.069 1.96e-04 0.0243
2 -0.04739 0.02571 -0.0548 1.067 1.53e-03 0.0262
3 -0.00834 -0.01392 -0.0406 1.065 8.40e-04 0.0231
4 0.09825 -0.07022 0.1014 1.075 5.22e-03 0.0392
5 -0.06707 -0.02973 -0.1770 1.002 1.55e-02 0.0210
6 -0.00972 -0.00431 -0.0257 1.065 3.36e-04 0.0210
7 -0.27033 0.60309 0.7564 0.756 2.42e-01 0.0560 *
8 0.02487 -0.00602 0.0378 1.063 7.31e-04 0.0209
9 0.10421 -0.22950 -0.2863 1.045 4.07e-02 0.0571
10 0.01140 -0.00723 0.0123 1.077 7.72e-05 0.0312
11 0.01300 -0.10007 -0.1688 1.038 1.43e-02 0.0315
12 0.02263 0.13650 0.2952 0.934 4.16e-02 0.0260
13 0.12745 -0.09251 0.1308 1.070 8.67e-03 0.0408
14 -0.07820 0.30590 0.4596 0.863 9.63e-02 0.0366 *
15 0.00535 -0.03604 -0.0598 1.073 1.82e-03 0.0321
16 -0.03824 0.01250 -0.0537 1.061 1.47e-03 0.0216
17 -0.05857 -0.08606 -0.2633 0.943 3.33e-02 0.0228
18 -0.26655 0.43110 0.4702 1.122 1.09e-01 0.1280 *
19 0.12903 -0.28065 -0.3484 1.019 5.95e-02 0.0582
20 0.08406 -0.06146 0.0861 1.081 3.77e-03 0.0416
21 -0.34804 0.50808 0.5318 1.309 1.42e-01 0.2336 *
22 -0.06264 -0.02776 -0.1653 1.010 1.36e-02 0.0210
23 0.09900 -0.07186 0.1016 1.077 5.25e-03 0.0408
24 -0.21603 0.34417 0.3730 1.165 6.97e-02 0.1373 *
25 -0.14235 0.03770 -0.2120 0.976 2.20e-02 0.0211
26 0.12138 -0.08810 0.1246 1.071 7.87e-03 0.0408
27 0.01358 0.14263 0.2917 0.942 4.07e-02 0.0268
28 -0.05521 0.01695 -0.0790 1.054 3.17e-03 0.0214
29 -0.00991 -0.05978 -0.1293 1.043 8.43e-03 0.0260
30 0.15493 -0.11789 0.1570 1.072 1.25e-02 0.0468
31 0.11956 -0.08612 0.1230 1.071 7.67e-03 0.0400
32 0.00866 0.01445 0.0421 1.065 9.04e-04 0.0231
33 -0.03487 0.01853 -0.0407 1.069 8.43e-04 0.0258
34 0.12949 -0.09469 0.1326 1.070 8.91e-03 0.0416
35 0.01283 -0.00710 0.0147 1.072 1.10e-04 0.0266
36 0.10254 -0.07498 0.1050 1.077 5.60e-03 0.0416
37 -0.03083 0.01980 -0.0331 1.077 5.59e-04 0.0318
38 -0.01899 0.01261 -0.0201 1.080 2.07e-04 0.0336
39 0.02200 -0.19933 -0.3423 0.924 5.54e-02 0.0309
40 0.05171 -0.19270 -0.2861 0.991 4.00e-02 0.0374
41 0.06248 -0.04466 0.0645 1.082 2.12e-03 0.0392
42 0.04131 -0.02879 0.0430 1.082 9.43e-04 0.0370
43 -0.05534 0.02530 -0.0688 1.060 2.41e-03 0.0236
44 -0.05375 -0.02022 -0.1356 1.027 9.22e-03 0.0209
45 0.06848 -0.04894 0.0706 1.081 2.54e-03 0.0392
46 0.09921 -0.07254 0.1016 1.078 5.25e-03 0.0416
47 -0.09953 0.00447 -0.1810 0.996 1.62e-02 0.0204
48 0.15782 -0.12082 0.1598 1.072 1.29e-02 0.0477
49 -0.03174 -0.05299 -0.1544 1.023 1.19e-02 0.0231
>
여기서는 간략하게 잔차도만 보겠습니다. 이렇게 보니 어느 정도 모델이 맞는 것 같고 7, 14번 같은 일부 값을 추가로 제거하면 얼추 적당한 선형 회귀식이 완성될 것 같습니다. 7,14번은 이상치로 의심되었던 값이기도 합니다. 하지만 이상치에 해당하는 값을 미리 제거하고 영향력 관측치로 생각되는 값을 제거해 나가다보면 오히려 더 큰 오류를 야기할 수 있습니다.
본래 앞서 봤듯이 다이아몬드의 캐럿과 가격은 선형관계가 성립되지 않습니다. 다이아몬드의 크기가 커질 수록 가격은 급격히 상승할 뿐 아니라 컷팅이나 채도, 색 같은 다른 중요한 요소가 가격에 큰 영향을 미치기 때문입니다. 그런데 이와 같은 사실을 무시하고 단지 이상치나 영향력 관측치로 보고 모델에 맞지 않는 값을 제거하다 보면 본래 있을 수 없던 선형 비례 관계가 성립될 수 있습니다. 다시 말해 데이터를 잘못 해석할 수 있는 것이죠.
모델에 맞지 않는 관측값이 있다면 가능성은 두 가지입니다. 첫 번째는 모델이 잘못된 것이고 두 번째는 관측값이 맞지 않는 것입니다. 우리는 후자의 가능성을 생각하기 쉽지만 사실은 모델이 맞지 않을 가능성도 높습니다. 이 경우 무리한 관측값 제거를 시도하기 보다는 방법을 바꿔서 데이터를 분석하는 것이 맞습니다.
물론 관측값이 분명히 잘못된 경우라면 당연히 제거해야 할 것이고 (예를 들어 몸무게 800kg은 80.0kg의 오류일 가능성이 클 것입니다. 1710cm도 마찬가지겠죠) 이를 알아보는 데 요긴한 방법이 이상치 검출이라는 점은 분명합니다.
댓글
댓글 쓰기