R에는 간단히 테스트할 수 있는 예제 data frame(list)가 있다. cars 는 그 중 하나로서, 아주 심플하지만, 테스트하기 좋다.
cars$speed는 차량의 속도를 의미하며, cars$dist는 차를 멈추려고 브레이크를 밟았을 때, 차량이 얼마나 갔는지 기록한 값이다. (당연히 속도가 높다면 더 길이가 나갈 것이다.)
> data(cars)
> head(cars)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
표준 편차는 단순하게 하나의 변수를 설명하는 척도이다. 따라서 단순하게 산술 평균의 분포를 나타낸다. 동일한 단위 기준인 셈이다.
> sd(cars$speed)
[1] 5.287644
> sd(cars$dist)
[1] 25.76938
이것만 가지고 insight을 얻을 수 없는게.. 변수 요인에 따른 기준 값을 찾을 때 쓰는 것이 선형 회기 공식(Linear regression)이다.
cars의 필드 dist와 speed 간의 상관도를 함수로 표현할 수 있다. y = ax + b 이런 느낌으로 만들어주는 선형 회기 공식을 생각할 수 있다.
처음에 설명한 대로.. cars$speed는 차량의 속도를 의미하며, cars$dist는 차를 멈추려고 브레이크를 밟았을 때, 차량이 얼마나 갔는지 기록한 값인데, 이를 간단하게 수학식으로 표현할 수 있다.
R에서는 lm 함수를 이용한다.
> mylm <- lm(dist ~ speed, cars)
> summary(mylm)
Call:
lm(formula = dist ~ speed, data = cars)
Residuals:
Min 1Q Median 3Q Max
-29.069 -9.525 -2.272 9.215 43.201
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -17.5791 6.7584 -2.601 0.0123 *
speed 3.9324 0.4155 9.464 1.49e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 15.38 on 48 degrees of freedom
Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
* 공식은 lm(formula = dist ~ speed, data = cars) 로 표현된다.
Coefficient 값을 살펴보면, (intercept) 값과 speed 값을 이용하면, 다음과 같은 선형 회기 공식을 얻을 수 있다.
cars$dist = -17.5791 + cars$speed * 3.932
coef()를 이용할 수 도 있다.
> coef(mylm)
(Intercept) speed
-17.579095 3.932409
* y = ax + b 라는 선형 회귀 공식이 있다면, a를 기울기, b를 절편이라고 부른다.
이 선형 회기 공식으로 fitted() 함수를 사용하면 앞으로를 예측할 수 있다.
> fitted(mylm)
1 2 3 4 5 6 7
-1.849460 -1.849460 9.947766 9.947766 13.880175 17.812584 21.744993
8 9 10 11 12 13 14
21.744993 21.744993 25.677401 25.677401 29.609810 29.609810 29.609810
15 16 17 18 19 20 21
29.609810 33.542219 33.542219 33.542219 33.542219 37.474628 37.474628
22 23 24 25 26 27 28
37.474628 37.474628 41.407036 41.407036 41.407036 45.339445 45.339445
29 30 31 32 33 34 35
49.271854 49.271854 49.271854 53.204263 53.204263 53.204263 53.204263
36 37 38 39 40 41 42
57.136672 57.136672 57.136672 61.069080 61.069080 61.069080 61.069080
43 44 45 46 47 48 49
61.069080 68.933898 72.866307 76.798715 76.798715 76.798715 76.798715
50
80.731124
그럴싸한데.. 값은 약간 곡선화되어서 딱 선형 회귀 곡선에 맞지 않는다. 그래서 이런 오차를 Residual(잔차 분포)이라 한다.
선형 회귀 공식과 잔차 분포 값을 더하면 original y 값이 나온다고 할 수 있다.
이런 공식이 나온다.
cars$dist = fitted(mylm) + residuals(mylm)
실제 확인하면 정확하게 들어맞는다.
> fitted(mylm) [1:10] + residuals(mylm) [1:10]
1 2 3 4 5 6 7 8 9 10
2 10 4 22 16 10 18 26 34 17
> cars$dist[1:10]
[1] 2 10 4 22 16 10 18 26 34 17
이번에는 정밀도(precision) 관점에서 해보면, RMS(제곱 평균 제곱근) 오차를 확인할 수 있다. https://ko.wikipedia.org/wiki/%ED%8F%89%EA%B7%A0_%EC%A0%9C%EA%B3%B1%EA%B7%BC_%ED%8E%B8%EC%B0%A8
시그마, 잔차 표준 오차, RMS 오차, 제곱 평균 제곱근 오차 라고 한다.
> summary(mylm)$sigma
[1] 15.37959
summary(mylm)의 결과와 비교하면 동일하다.
Residual standard error: 15.38
그 동안 오차와 관련된 정밀도(precision)과 잔차(residuals)를 보았다.
아까 coef()로 살펴본, 수식은 사실상 그냥 숫자이지. 공식 함수는 아니다..
이를 확인해보려면, predict() 함수를 사용한다. 기가 막히게 함수화 되었다.
> coef(mylm)
(Intercept) speed
-17.579095 3.932409
> predict(mylm, newdata=data.frame(speed=10))
1
21.74499
예측 값은 항상 오차가 발생하기 마련인데, 이를 신뢰구간에 들어가는 값인지 아닌지를 interval="confidence" 매개변수를 주어 확인할 수 있다.
> predict(mylm, newdata=data.frame(speed=10),interval="confidence")
fit lwr upr
1 21.74499 15.46192 28.02807
lwr는 신뢰구간의 하한, upr는 신뢰구간의 상한을 의미한다.
돌려 생각하면, 오차항(e)을 추가하는 형태가 될 수 있다.
cars$dist = -17.5791 + cars$speed * 3.932 + e
interval="prediction" 매개변수를 주어 오차항을 확인한다.
predict(mylm, newdata=data.frame(speed=10),interval="prediction")
fit lwr upr
1 21.74499 -9.809601 53.29959
summary로 돌아간다.
> summary(mylm)
Call:
lm(formula = dist ~ speed, data = cars)
Residuals:
Min 1Q Median 3Q Max
-29.069 -9.525 -2.272 9.215 43.201
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -17.5791 6.7584 -2.601 0.0123 *
speed 3.9324 0.4155 9.464 1.49e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 15.38 on 48 degrees of freedom
Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
Pr(>|t|) 는 t 분포*를 사용한 유의성을 알려준다. (t 분포* : 추리통계 분포)
다음은 모델의 결정계수와 F 통계량이다.
Multiple R-squared는 모델의 데이터 분산도를 의미한다.
F-statistic는 모델의 유의성을 의미한다.
그외 전차 제곱의 합의 다음과 같이 구한다.
> deviance(mylm)
[1] 11353.52
> sum((cars$dist - predict(mylm, newdata=cars))^2)
[1] 11353.52
참고로 단순 선형 회귀 공식은 조건에 다라 나눌 수 있다. 즉, 특정 값을 기준으로 바꿔서 선형 회귀 공식을 구간별로 얻을 수 있다.
> yourlm <- lm(dist[dist > 50] ~ speed[dist > 50], cars)
> summary(yourlm)
Call:
lm(formula = dist[dist > 50] ~ speed[dist > 50], data = cars)
Residuals:
Min 1Q Median 3Q Max
-24.672 -10.865 -1.903 11.135 39.135
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 28.245 23.880 1.183 0.2553
speed[dist > 50] 2.192 1.169 1.875 0.0804 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 17.01 on 15 degrees of freedom
Multiple R-squared: 0.1899, Adjusted R-squared: 0.1359
F-statistic: 3.517 on 1 and 15 DF, p-value: 0.08035
anova() 함수를 사용하면 분산분석표를 구할 수 있다.
> anova(mylm)
Analysis of Variance Table
Response: dist
Df Sum Sq Mean Sq F value Pr(>F)
speed 1 21186 21185.5 89.567 1.49e-12 ***
Residuals 48 11354 236.5
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1