본문 바로가기

R/R을 이용한 데이터 처리&분석 실무

선형 회귀-1

반응형

이 장에서는 선형 회귀(Linear Regression)에 대해서 다룬다. 선형 회귀는 종속 변수(또는 반응 변수)를 독립 변수(또는 설명 변수)에 의해 설명하는 모델을 다루는 회귀 분석(Regression Analysis)의 한 종류다. 이 장에서는 lm( ) 함수를 사용한 선형 회귀, 작성된 모델의 평가 및 모델링을 위해 사용할 설명 변수의 선택에 대해 알아본다.

 

 

선형 회귀의 기본 가정

선형 회귀(Linear Regression)는 i번째 관측값을 뜻하는 변수들이 (X_i1, X_i2, …, X_ip, Y_i) 형태로 주어졌을 때 종속 변수 Yi와 p개의 독립 변수 X_i1, X_i2, …, X_ip를 다음과 같은 선형 식으로 표현한다.

 

Y_i = β_0 + (β_1)(X_i1) + (β_2)(X_i2) + ... + (β_p)(X_ip) + ε_i  (식 8-1)

 

식에서 β_0, β_1, β_2, …, β_p는 회귀 모델의 계수며, ε_i는 오차(error)다. 이러한 선형 모델이 유용한 경우는 자동차 제동 거리와 브레이크를 밟기 전의 주행 속도 간의 관계, 아버지의 키와 아들의 키의 관계 등을 들 수 있다.

 

식 8-1로 표현되는 선형 회귀는 일반적으로 다음과 같은 내용을 가정한다.

 

- 종속 변수와 독립 변수들 간에 식 8-1과 같은 선형성이 성립한다.

- 독립 변수 Xij는 정확히 측정된 값으로 확률적으로 변하는 값이 아닌 고정된 값이다.

- 오차 ε_i는 평균이 0, 분산은 σ^2인 정규 분포를 따르며 모든 i에 대해 평균과 분산이 일정하다. 또, 서로 다른 i, j에대해 ε_i, ε_j는 독립이다.

- 독립 변수 간에는 다중 공선성(multicollinarity)이 적어야 한다. 다중 공선성은 회귀 모델에서 변수 간의 상관관계가 커서 한 변수를 다른 변수들의 선형 조합으로 손쉽게 예측할 수 있는 경우를 뜻한다. 다중 공선성이 존재하면 계수 β_0, β_1, β_2, …, β_p의 추정이 어려워진다. 예를 들어, X_i1 = aX_i2 + bX_i3이 성립한다면 선형 회귀 식에서 Xi1 변수의 사용이 무의미해지기 때문이다.

 

더 많은 선형 회귀에 대한 가정은 위키피디아의 선형 회귀 페이지에서 선형 회귀의 가정에 대한 부분을 참고하기 바란다.

 

 

단순 선형 회귀

단순 선형 회귀(Simple Linear Regression)는 종속 변수 Y_i를 하나의 독립 변수 X_i로 설명한다. 두 개 이상의 독립 변수로 설명하는 경우는 중선형 회귀(Multiple Linear Regression)(또는 다중 선형 회귀라고도 함)라 한다. 중선형 회귀에 관해서는 다음 절에서 설명한다.

 

단순 선형 회귀 모델은 다음과 같이 표현된다.

 

Y_i = β_0 + (β_1)(X_i) + ε_i

 

이 식에서 β_0, β_1은 각각 절편과 독립 변수 X_i의 계수며, 이들을 회귀 계수(Regression Coefficient)라 부른다. ε_i는 오차(error)를 나타낸다.

 

이 절에서는 데이터로부터 단순 선형 회귀 모델을 만들고, 작성된 모델을 평가하는 방법에 대해 살펴볼 것이다.

 

 

모델 생성

선형 회귀는 lm() 함수를 사용하여 만들 수 있다.

 

-lm : 선형 회귀를 수행한다.

lm(

   formula,     # 종속 변수 ~ 독립 변수 형태로 지정한 포뮬러

   data          # 포뮬러를 적용할 데이터. 보통 데이터 프레임

)

 

선형 회귀의 예로 사용할 cars 데이터를 살펴보자. 이 데이터는 1920년대에 측정한 데이터로 자동차의 주행 속도 speed와 브레이크를 밟았을 때의 제동 거리 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

 

주행 속도와 제동 거리 간에 간단히 다음과 같은 모델을 생각해보자.

 

dist = β_0 + β_1 × speed + ε   (식 8-2)

 

이를 포뮬러로 표시하면 dist ~ speed가 된다. 절편에 해당하는 β_0는 굳이 쓰지 않아도 항상 존재하는 것으로 취급된다.

 

다음은 이 포뮬러를 lm()에 사용한 선형 회귀의 예다.

>(m<-lm(dist ~ speed, cars))

Call:
lm(formula = dist ~ speed, data = cars)

Coefficients:
(Intercept)        speed
    -17.579        3.932

 

수행 결과 dist와 speed 간의 관계는 다음과 같이 구해졌다.

 

dist = −17.759 + 3.932 × speed + ε   (식 8-2)

 

 

 

선형 회귀 결과 추출

lm()으로 구한 모델의 세부 내용을 살펴보기 위한 함수들을 알아보자.

 

회귀 계수: coef(model)

다음은 선형 회귀 모델의 절편이 -17.579095, speed에 대한 기울기가 3.932409임을 보여준다.

>coef(m)
(Intercept)      speed
 -17.579095   3.932409

 

적합된 값: fitted(model)

cars 데이터의 각 speed 값에 대해 모델에 의해 예측된 dist 값은 fitted()로 구할 수 있다. 이 값은 모델이 데이터에 적합fit된 결과이므로 적합된 값(fitted value)라고 부른다. 다음은 cars 데이터의 1~4번째 데이터에 대한 적합된 값들을 보여준다.

>fitted(m)[1:4]
        1           2           3           4
-1.849460 -1.849460  9.947766  9.947766

즉, 이 값은 -17.57095 + 3.932409 × cars$speed에 해당한다.

 

잔차: residuals(model)

식 8-1에서 ε_i는 오차(error)라고 불렀다. 이는 이론적인 값을 부르는 명칭이며, 실제로 선형 회귀 모델을 작성한 다음 모델로부터의 구한 예측값과 실제 값 사이의 차이는 잔차(residual)라고 부른다. 예측값은 hat(Y_i)로 표시하며 데이터로부터 구한 β_0, β_1의 추정값이 각각 hat(beta_0), hat(beta_1) 이라 할 때 hat(Y_i) = hat(beta_0)+hat(beta_1)X_i 다.

 

잔차는 e_i로 표시하며 e_i=Y_i- hat(Y_i) 다.

 

다음은 1~4번째 데이터에 대한 잔차를 구하는 예다.

>residuals(m)[1:4]
       1          2               3               4
3.849460   11.849460   -5.947766   12.052234

 

적합된 값과 잔차의 합은 실제 데이터 값과 같다. 다음은 cars에 적합된 값과 잔차의 합이 cars$dist와 같음을 보여주는 예다.

>fitted(m)[1:4] + residuals(m)[1:4]
1  2  3  4
2 10  4 22

>cars$dist[1:4]
[1]  2 10 4 22

 

회귀 계수의 신뢰 구간: confint(model)

단순 선형 회귀에서 절편과 speed의 기울기는 정규 분포를 따른다. 따라서 t 분포를 사용한 신뢰 구간을 confint(model)을 사용해 구할 수 있다.

>confint(m)
                     2.5 %       97.5 %
(Intercept)  -31.167850    -3.990340
speed          3.096964     4.767853

 

잔차 제곱 합

잔차 제곱 합은 다음과 같이 구한다.

>deviance(m)
[1] 11353.52

 

예측과 신뢰 구간

lm( )을 통해 모델을 만들고 나면 새로운 데이터에 대한 예측값은 predict()로 구할 수 있다. predict()는 일반 함수(Generic Function)로 여러 가지 방식으로 모델을 만들었을 때 해당 모델로부터 새로운 데이터에 대한 예측값을 구하는 데 사용할 수 있다. predict()는 인자로 주어진 모델에 따라 내부적으로 predict.glm(), predict.lm(), predict.nls() 등의 함수를 부르게 되는데, 선형 회귀의 경우 predict.lm()이 호출된다. 이러한 predict()의 동작은 6장에서 설명한 plot()과 유사하다.

 

-predict.lm : 선형 모델을 사용한 예측을 수행한다.

predict.lm(

   object,        # 선형 모델

   newdata,     # 예측을 수행할 새로운 데이터

   # 구간의 종류. 기본값은 none이며, 이 경우 신뢰 구간이 계산되지 않는다. interval confidence

   # 주어진 경우 회귀 계수에 대한 신뢰 구간을 고려하여 종속 변수의 신뢰 구간(confidence interval)

   # 찾는다. interval prediction인 경우 회귀 계수의 신뢰 구간과 오차항을 고려한 종속 변수의

   # 예측 구간(prediction interval)을 찾는다.

   interval=c("none", "confidence", "prediction")

)

 

자동차의 주행 속도와 제동 거리에 대한 선형 회귀 모델을 사용해 주행 속도가 3인 경우의 제동 거리를 예측해보자.

>(m<-lm(dist ~ speed, data=cars))
Call:
lm(formula = dist ~ speed, data = cars)

Coefficients:
(Intercept)     speed
    -17.579     3.932

>predict(m, newdata=data.frame(speed=3))
        1
-5.781869

>coef(m)
(Intercept)      speed
 -17.579095   3.932409

>-17.579095 + 3.932409 * 3  # 선형 모델의 회귀 계수를 사용해 직접 계산
[1] -5.781868

 

주행 속도가 3일 경우의 예측을 predict()를 사용해 수행했더니 제동 거리가 -5.781869로 예측되었다. 그리고 이 값은 선형 회귀 모델의 회귀 계수를 사용해 직접 계산한 값과 일치했다.

 

회귀 계수(절편과 기울기)의 신뢰 구간을 고려하기 위해 type=“confidence”를 지정하면 제동 거리의 평균 신뢰 구간을 구할 수 있다. 다음 결과에서 fit은 예측값의 점 추정치, lwr과 upr은 각각 신뢰 구간의 하한과 상한 값을 의미한다.

>predict(m, newdata=data.frame(speed=c(3)), interval="confidence")
        fit           lwr         upr
1 -5.781869 -17.02659   5.462853

 

이 값은 다음 식을 바탕으로 신뢰 구간을 구한 것이다.

 

dist = β_0 + β_1 × speed

 

이 식은 특정 속도를 가진 평균적인 차량의 제동 거리에 해당한다. 평균적인 차량에 대한 추정이므로 식 8-2와 달리 오차항은 고려하지 않는다. 왜냐하면 "선형 회귀의 기본가정" 절에서 설명한 것처럼 오차의 평균은 0으로 가정하기 때문이다.

 

그러나 특정 속도를 가진 차량 한 대가 주어졌을 때 해당 차량에 대해 제동 거리를 생각한다면 오차를 무시할 수 없다. 이 경우 type=“prediction”을 사용해 예측 구간을 구한다.

>predict(m, newdata=data.frame(speed=c(3)), interval="prediction")
        fit          lwr         upr
1 -5.781869  -38.68565   27.12192

 

제동 거리의 점 추정값 fit은 신뢰 구간과 예측 구간 모두 -5.781869로 같은 값이다. 그러나 구간의 하한lwr과 상한upr은 오차항 때문에 type=“confidence”보다 너비가 커진 것을 볼 수 있다.

 

 

 

R을 이용한 데이터 처리&분석 실무 中

반응형

'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글

중선형 회귀  (0) 2020.02.08
선형 회기-2  (0) 2020.02.07
상관 분석  (0) 2020.02.06
분할표  (0) 2020.02.05
표본 추출  (0) 2020.02.05