Programing/R- programming

R을 이용한 기본 Linear regression 선형회귀

sosal 2015. 3. 25. 22:27
반응형


/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

 

 

- '선형회귀' 란 무엇인가?

- 데이터 준비
- 선형 회기모델로 최적선 구하기

- 선형회귀 결과해석 및 단순 예측

- 분산분석

- 신뢰구간과 예측

 

 

 


- '선형회귀' 란 무엇인가?

 - (X1, X2, …, Xn)을 n차원의 확률 변수로 하여 조건부 기댓값

 -  하나의 설명 변수에 기반한 경우에는 단순선형회귀, 둘 이상의 복수의 설명 변수에 기반한 경우에는 다중선형회귀라고 한다.

[네이버 지식백과] 선형 회귀 분석 [linear regression]



단순 선형회귀를 기준으로 y = ax + b 라는 회귀 함수 (회귀 곡선) 를 구하여

독립변수(x)에 따른 종속변수(y)값을 예측하는 모델링이라고 할 수 있겠습니다.


간단하게 '나이에 따른 평균 키' 를 예로 들면


키 = a*나이 + b 가 되며,

독립변수는 나이, 그리고 종속변수는 키가 되겠습니다.


결국 나이에 따라 평균키가 결정되므로, 

나이는 독립변수, 키는 종속변수라고 할 수 있겠습니다.

 


 

- 데이터 준비


나이에 따른 평균 키

나이(month)   

평균 키 (cm)    

18 76.1
19 77
20 78.1
21 78.2
22 78.8
23 79.7
24 79.9
25 81.1
26 81.2
27 81.8
28 82.8
29 83.5


나이에 따른 평균 키의 데이터를 가지고, 선형 회기분석 (Linear regression)을 통해

선형회귀모델 (Linear regression model)을 만들어 보도록 하겠습니다.


> age=18:29

> age

 [1] 18 19 20 21 22 23 24 25 26 27 28 29

> height=c(76.1, 77, 78.1, 78.2, 78.8, 79.7, 79.9, 81.1, 81.2, 81.8, 82.8, 83.5)


나이에 따른 키를 plot() 함수를 이용하여, 나이에 따른 키의 scatterplot을 그려서 살펴봅시다.

> plot(x=age, y=height)



- 선형 회기모델로 최적선 구하기

얼추 age와 height는 선형관계라는것이 짐작이 갑니다.
나이가 증가할수록 평균키가 대략적으로 증가하는 모습을 보입니다.
실제로 하나의 직선으로 모든 점들을 연결할수는 없겠지만,
이 데이터들을 가장 잘 설명할 수 있는, 점들과 가장 가까운 하나의 직선을 상상해보실 수 있겠죠?

 

좋은 선형회기 모델이란것은 예측값과 실제 값의 차이를 뜻하는 Residual error가 작은 모델

 


Best Fit or the Least Squares Regression Line을 구하고 그려보면 되겠습니다.


> res=lm(height~age)

> abline(res)


linear model 함수(lm)를 이용하여 최적선 (Line of Best Fit)을 구하고, abline()을 이용하여

plot에 직선을 추가한 모습입니다.


lm 함수는 regression을 위한 데이터를 받는 input parameter 뿐 만 아니라, 다양한 parameter가 존재합니다.

lm(formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE,
    singular.ok = TRUE, contrasts = NULL, offset, ...)

자세한 사항은 
> ?lm
command를 이용하여 도움말을 보거나, https://stat.ethz.ch/R-manual/R-devel/library/stats/html/lm.html 에서 확인하실 수 있습니다.


 

선형회기 모델(y = ax + b) 에서 최적의 a와 b를 구하기 위해 정규 최소 제곱으로 알려진 추정 기법을 사용합니다.

 

 

위의 그림과 같이 선형회기식에서 예측되는 y값과 실제 y값의 차이는 error residual 이라고 하는데,

이를 최소로 하는것이 바로 정규 최소제곱의 목적입니다.

 

 

실제 y값과 예측된 y값의 차이로 error residual = e를 정의한다.

 

 

다음의 방정식을 최소화 하는 방식으로 선형회귀계수가 정의된다.

 

 

 

 


- 선형회귀 결과해석 및 단순 예측


> res

Call:

lm(formula = height ~ age)


Coefficients:

(Intercept)          age  

     64.928        0.635  


lm() 함수로 나온 결과는 다음과 같이 해석할 수 있습니다.

intercept (y 절편) : 64.928

age (독립변수의 기울기): 0.635


키 = 0.635 * 나이 + 64.928 

height = 0.635*age + 64.928



따라서, 위의 데이터를 이용해서 구해진 선형회귀 식은 위와 같고,

age 변수에 태어난지 몇달 되었는지에 대한 값을 넣어주면, 평균적인 키를 예측하실 수 있을 것입니다.


따라서 태어난 직후 24개월 된 아이의 키는

height = 0.635*age + 64.928 = 0.635*24 + 64.928 = 80.168cm로 예측할 수 있겠습니다.

 

 

> summary(res)

Call:
lm(formula = height ~ age)

Residuals:
     Min       1Q   Median       3Q      Max
-0.27238 -0.24248 -0.02762  0.16014  0.47238

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  64.9283     0.5084  127.71  < 2e-16 ***
age           0.6350     0.0214   29.66 4.43e-11 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.256 on 10 degrees of freedom
Multiple R-squared:  0.9888,    Adjusted R-squared:  0.9876
F-statistic:   880 on 1 and 10 DF,  p-value: 4.428e-11

 

이 선형회귀 모델은 유의하느냐? 에 대한 답은 F-통계량의 p-value를 이용해서 확인하실 수 있습니다.

이는 summary(res)를 통해 알 수 있으며 마지막 부분의 p-value가 4.428e-11로 0.05보다 매우 작으면 유의하다고 할 수 있습니다.

일반적으로 모형이 x%로 유의하려면 F-통계량의 p-value가 1-x%보다 작아야합니다.

 

 

- 분산분석

단순히 24개월 된 아이의 키가 '몇 cm' 인지 바로 예측 할 수 있지만, 사실 하나의 값으로 나타낼 이유가 전혀 없습니다.

왜냐하면 대부분의 통계값들이 그렇듯, 하나의 독립변수(x)에 의해 나타날 수 있는 종속변수(y)는 다양할 수 있기 때문입니다.

 

따라서 회귀를 이용하여 특정 독립변수에서의 종속변수 값을 얘기할 때는,

몇 % 확률도 a~b 사이에 존재할 것이다. 라고 이야기합니다.

 

anova 함수를 이용한다면 선형회귀 모델의 분산분석표를 쉽게 구할 수 있습니다.

 

 

> res_anova = anova(res)
> res_anova

Analysis of Variance Table

Response: height
          Df Sum Sq Mean Sq F value    Pr(>F)
age        1 57.655  57.655  879.99 4.428e-11 ***
Residuals 10  0.655   0.066
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

분산분석표를 보면 종속변수 age가 유의하다는 것을 알 수 있습니다.

 

 

 

- 신뢰구간과 예측

 

> summary(res)

....

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  64.9283     0.5084  127.71  < 2e-16 ***
age           0.6350     0.0214   29.66 4.43e-11 ***
...

 

> confint.default(res)      #confint(res, level=0.95)
                 2.5 %     97.5 %
(Intercept) 63.9318559 65.9247874
age          0.5930125  0.6769176

 

confint 함수는 신뢰구간(confidence interval)을 계산해주는 함수입니다.

 

confint로 부터 나온 age의 구 구간 차를 2로 나누면 0.04195255이란 값을 구할 수 있습니다.

이 값은 1.96 * 0.0214 = 0.041944로 직접 구한것과 비슷하죠?

 

summary(res)에 나오는 결과를 이용하여 직접 계산해 볼 수도 있습니다.

 - 0.635 ± 1.96 * 0.0214 = (0.593056, .676944)

 

선형회귀 모델에서는 독립변수의 모든 범위에 대해서 같은 분포를 가진다고 가정하기 때문에

신뢰구간은 다음과 같이 공식화 할 수 있습니다.

 

height = 0.635*age + 64.928 ± 0.04195255

 

따라서 24개월된 아이의 크기는 95% 신뢰구간으로

 

80.168 ± 0.04195255, 즉
(80.12605, 80.20995) 범위를 가진다고 예측할 수 있습니다.