앞에서 다뤘던 무작위 표본 추출 방식을 통해서 다시 단순 선형 회귀 분석을 진행해 보겠습니다. 샘플 수를 줄여서 분석해보는 것은 종종 데이터의 특성을 이해하는 데 도움을 줄 수 있습니다. 앞서 설명한 방법을 이용해서 적당한 숫자의 표본을 추출해 보겠습니다.
library("ggplot2")
set.seed(3311)
diamonds1<-sample 25="" diamonds="" nrow="" span="">-sample>
D1<-diamonds diamonds1="" span="">-diamonds>
D1
summary(D1)
시드값을 준 이유는 같은 결과를 재현하기 위한 것입니다. 일단 정규 분포를 만족시키는 25개의 표본을 뽑아 봤습니다. 이제 정규성 검증 및 선형성이 있는지를 알기 위해 추가로 코드를 작성해 보겠습니다. 이번에도 비교할 것은 캐럿과 가격의 관계입니다.
x=D1$carat
shapiro.test(x)
par(mfrow=c(1,1))
plot(D1$carat, D1$price)
> x=D1$carat
> shapiro.test(x)
Shapiro-Wilk normality test
data: x
W = 0.93155, p-value = 0.09436
대략적으로 정규성도 만족하고 선형성도 지닌 표본으로 보입니다. 그러면 회귀 모형을 만들고 잔차를 검증해 보겠습니다.
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
-2677.3 -1647.1 -17.6 1050.5 3913.6
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3026.9 732.1 -4.135 0.000402 ***
carat 8644.2 625.4 13.822 1.25e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1773 on 23 degrees of freedom
Multiple R-squared: 0.8925, Adjusted R-squared: 0.8879
F-statistic: 191 on 1 and 23 DF, p-value: 1.254e-12
>
> 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.00236 0.00155 -0.00259 1.166 3.50e-06 0.0624
2 -0.04469 0.03072 -0.04791 1.169 1.20e-03 0.0679
3 -0.02899 0.00141 -0.05731 1.130 1.71e-03 0.0400
4 0.21556 -0.16964 0.21908 1.168 2.46e-02 0.0999
5 -0.14636 0.04455 -0.22608 1.028 2.54e-02 0.0416
6 -0.02253 0.00686 -0.03481 1.138 6.33e-04 0.0416
7 -0.13162 0.44231 0.68800 0.700 1.91e-01 0.0682 *
8 0.05238 -0.02843 0.06350 1.143 2.10e-03 0.0500
9 0.07043 -0.22762 -0.34980 1.017 5.95e-02 0.0694
10 0.06221 -0.04597 0.06462 1.184 2.18e-03 0.0810
11 -0.04129 -0.06016 -0.20297 1.055 2.07e-02 0.0439
12 0.11910 0.03622 0.31333 0.932 4.64e-02 0.0405
13 0.26414 -0.20970 0.26780 1.153 3.65e-02 0.1034
14 0.03570 0.17985 0.43713 0.836 8.52e-02 0.0482
15 -0.01659 -0.02753 -0.08834 1.126 4.05e-03 0.0443
16 -0.05179 0.03006 -0.06060 1.147 1.91e-03 0.0531
17 -0.16941 0.01375 -0.32515 0.916 4.96e-02 0.0401
18 -0.14188 0.23914 0.27658 1.252 3.93e-02 0.1585
19 0.08789 -0.27394 -0.41611 0.966 8.20e-02 0.0706
20 0.19966 -0.15918 0.20220 1.184 2.10e-02 0.1052
21 -0.07855 0.11449 0.12287 1.565 7.88e-03 0.3037 *
22 -0.13663 0.04159 -0.21105 1.041 2.22e-02 0.0416
23 0.22048 -0.17504 0.22354 1.172 2.56e-02 0.1034
24 -0.08753 0.14419 0.16475 1.303 1.41e-02 0.1709 *
25 -0.23761 0.13132 -0.28534 1.007 3.98e-02 0.0507
>
그럭저럭 아슬아슬하게 분포가 맞춰지는 것 같지만, 7번째 관측치가 너무 모델에서 벗어난 것으로 보입니다. 어떤 값인지 확인해 보겠습니다.
> D1[7,]
# A tibble: 1 x 10
carat cut color clarity depth table price x y z
1 1.50 Good F VS2 63.6 55.0 13853 7.27 7.22 4.61
Y=8644.2X -3026.9 라는 회귀 공식에 넣어보면 9940이라는 값이 나와 실제값인 13853달러와 제법 큰 차이가 있습니다. 따라서 이 값을 이상치로 제거해보고 싶습니다. 방법은 간단합니다. model1<-lm carat="" data="D1[-7,])의" model1="" nbsp="" price="" span="">-lm>
model1<-lm carat="" data="D1[-7,])</span" price="">-lm>
summary(model1)
par(mfrow=c(2,2))
plot(model1)
influence.measures(model1)
ols_cooksd_barplot(model1)
ols_dfbetas_panel(model1)
ols_dffits_plot(model1)
> model1<-lm carat="" data="D1[-7,])</span" price="">-lm>
> summary(model1)
Call:
lm(formula = price ~ carat, data = D1[-7, ])
Residuals:
Min 1Q Median 3Q Max
-2515.3 -1481.0 -55.9 1042.7 3408.0
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2940.3 658.9 -4.462 0.000195 ***
carat 8395.5 570.6 14.714 7.23e-13 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1594 on 22 degrees of freedom
Multiple R-squared: 0.9078, Adjusted R-squared: 0.9036
F-statistic: 216.5 on 1 and 22 DF, p-value: 7.228e-13
> par(mfrow=c(2,2))
> plot(model1)
> influence.measures(model1)
Influence measures of
lm(formula = price ~ carat, data = D1[-7, ]) :
dfb.1_ dfb.cart dffit cov.r cook.d hat inf
1 0.00666 -0.004252 0.00735 1.171 2.83e-05 0.0626
2 -0.04148 0.027848 -0.04470 1.175 1.05e-03 0.0681
3 -0.02112 -0.000445 -0.04355 1.140 9.91e-04 0.0417
4 0.23900 -0.185663 0.24317 1.160 3.02e-02 0.0999
5 -0.14895 0.038588 -0.23685 1.021 2.77e-02 0.0428
6 -0.01306 0.003382 -0.02076 1.146 2.26e-04 0.0428
7 0.06942 -0.035864 0.08532 1.141 3.79e-03 0.0506
8 0.07277 -0.232613 -0.35054 1.030 6.00e-02 0.0745
9 0.07363 -0.053440 0.07668 1.187 3.07e-03 0.0810
10 -0.03750 -0.065974 -0.20312 1.064 2.08e-02 0.0466
11 0.14130 0.058601 0.39371 0.843 6.96e-02 0.0426
12 0.29234 -0.229241 0.29668 1.140 4.45e-02 0.1034
13 0.03724 0.246035 0.56503 0.706 1.31e-01 0.0514 *
14 -0.01209 -0.024245 -0.07141 1.141 2.66e-03 0.0471
15 -0.04609 0.025669 -0.05454 1.154 1.55e-03 0.0535
16 -0.17490 0.002555 -0.34969 0.891 5.65e-02 0.0417
17 -0.23072 0.393195 0.45310 1.202 1.03e-01 0.1687
18 0.09255 -0.285954 -0.42627 0.972 8.61e-02 0.0758
19 0.21952 -0.172920 0.22251 1.179 2.54e-02 0.1052
20 -0.26482 0.390157 0.41827 1.560 9.01e-02 0.3207 *
21 -0.13820 0.035803 -0.21975 1.037 2.41e-02 0.0428
22 0.24338 -0.190854 0.24700 1.165 3.12e-02 0.1034
23 -0.17378 0.289486 0.32972 1.281 5.57e-02 0.1818 *
24 -0.25196 0.132844 -0.30659 0.987 4.55e-02 0.0513
회귀 계수는 비슷하지만 모델은 훨씬 안전성 있게 되었습니다. 이런식으로 회귀 모델을 진단하고 최적의 값을 찾을 수 있지만, 조심해야 하는 부분이 있습니다.
앞서 예제에서 살펴보았듯이 사실 이 데이터는 일차 선형 관계가 아닙니다. 그런데 소수의 샘플을 뽑은 결과 마치 Y=aX+b의 관계로 나타낼 수 있는 것처럼 결과가 나왔습니다. 즉 표본의 숫자가 적으면 본래 데이터를 왜곡할 수 있다는 것입니다. 두 번째는 영향력 관측치를 제거하는 방법입니다. 이는 회귀 계수를 더 좋게 만들 수 있지만, 이런식으로 데이터를 삭제하게 될 경우 사실은 없는 연관성도 만들 수 있습니다.
종종 이런 영향력이 큰 관측치나 이상치가 데이터를 잘못 입력해 그런 경우가 있습니다. 예를 들어 1800달러 대신에 18000를 실수로 입력했거나 반대로 0.2캐럿을 2캐럿으로 입력한 경우들입니다. 이 경우 데이터를 다시 확인하고 수정하면 되지만, 쉽게 판단이 어려운 경우도 있을 것입니다. 아무튼 데이터 확인이 결정적인 답을 제시하는 경우도 있기 때문에 반드시 본래 데이터를 확인해야 합니다.
실험 연구에 있어서는 종종 실험이 크게 잘못되어 이상치가 생기는 경우가 있는데, 이 경우 적절한 근거를 지니고 데이터를 이상치로 판정하고 분석에 넣지 않아야 합니다. 이 내용에 대해서는 "R을 이용한 이상치 검출과 처리' 같은 전문 서적을 보고 판단하면 좋을 것 같습니다.
댓글
댓글 쓰기