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





Posted by '김용환'
,