이 장에서는 선형 회귀(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을 이용한 데이터 처리&분석 실무 中