R을 사용한 다중회귀분석 (Multiple regression in R)

다중회귀분석(multiple regression)이란?

명칭에서 짐작할 수 있듯이 다중회귀분석이란 설명 변수가 두개 이상인 회귀분석을 의미한다.  어떤 요소에 영향을 미치는 원인이 하나 이상이라는 감(?)이 올때 한번 돌려보면 된다.

“다중회귀분석”이라는 이름을 보고 어려울 것 같아 지레 겁먹을 수도 있지만,  본 포스팅을 읽다보면 쉽고 빠르게 다중회귀분석을 실시하고, 결과를 해석하는 방법을 알 수 있을 것이다.

regression and aggression

 

다중회귀분석의 순서

R에서는 lm함수를 사용하여 간단히(?) 다중회귀분석을 실시할 수 있으며, predict 함수를 쓰면 새로운 데이터(설명 변수)를 사용하여 결과 변수를 예측할 수도 있다.

본젹적으로 분석을 실시하기 전에 아래 분석 순서를 기억해 두는 것이 멘탈을 잡는 것에 매우 큰 도움이 된다.

아래는 분석하고 싶은 설명/대상 변수가 머릿속에 있는 경우를 가정한 분석 프로세스이다.

1단계. lm함수를 사용하여 회귀분석 모델을 생성한다.

2단계. 모델이 통계적으로 유의한지 여부를 확인한다.

A. F-test
F-test는 회귀분석 모델 전체에 대해 이것이 통계적으로 의미가 있는지를 결정하기 위해 사용하며, 회귀분석 모델에서 F-Statistic의 p-value의 값이 0.05보다 작은 경우 회귀식 전체는 유의하다고 볼 수 있다.

B. p-value
변수의 p-value는 각 변수가 대상 변수에 유의하게 영향을 미치는 지를 확인하기 위해 사용한다.  역시 0.05보다 작은 경우 각 변수는 유의하게 결과 변수를 설명한다고 불 수 있다.

C. adjusted-r 제곱
모델이 대상 변수의 몇%를 설명하는지 확인한다.

3단계. 필요한 경우 partial F-test를 통해 추가할 새로운 변수가 삭제할 변수는 없는지 확인한다.

4단계.  predict함수를 사용하여 새로운 데이터 셋에 대한 예측값을 구한다.

다중회귀분석, 생각보다 간단하다.
다중회귀분석, 생각보다 간단하다.

R을 사용한 다중회귀분석 예제 (dataset: swiss)

필요한 패키지 및 데이터를 로드한다. 본 예제에서는 R datasets 패키지에 내장되어 있는 Swiss 데이터 셋을 사용한다.

우선 아래 코드를 실행해서 데이터셋 swiss의 변수들을 확인한다.

 

데이터셋 swiss의 Infant.Mortality을 대상으로 분석할 것이므로 아래 코드를 통해 Infant.Mortality가 정규분포를 따르고 있는지를 확인한다.

 

그림1
그림2

아래 Q-Q plot상의 직선에서 점들이 크게 벗어나 있지 않는다면 Infant.Mortality 변수는 정규 분포를 따른다고 볼 수 있다.

 

다음 단계는 회귀 분석을 위한 모델을 만드는 것이다.
swiss 데이터셋의 다른 모든 변수와 Infant.Mortality 간의 관계를 살펴보자.

lm함수를 사용하는 문법은 간단하다.
lm(대상변수~설명변수1+설명변수2, data= 사용할 데이터 셋 명)

lm함수를 사용해서 만든 모델에 summary함수를 적용하면 위와 같은 결과를 얻을 수 있다.

결과 아래쪽의 F-statistic 결과의 p-value를 보면 0.03665로 0.05보다 작아 이 모델은 유의하게 Infant.Fertility를 설명하는 데 사용할 수 있다고 판단 가능하다.
두번째로는 Coefficients 항목인데,  여러 변수들의 p-value를 확인한 결과 Infant.Fertility와 유의한 관계가 있는 변수는 Fertility 하나이다. (p-value = 0.00734)

각 변수가 통계적으로 유의한 경우(=p-value가 0.05보다 작은 경우) p-value 뒤에 * 마크가 붙으며, *의 갯수가 늘어날 수록 통계적으로 유의할 확률이 커진다.

Fertility 변수를 제외한 다른 변수들을 모두 삭제했을 때 모델이 통계적으로 달라지는지를 확인하기 위해 Partial F-test를 해보자.
Partial F-test에는 anova 함수를 사용한다.

Fertility와 Infant.Mortality 두개의 변수만을 사용하여 model_simple 객체를 만든 후,
anova 함수로 두 모델을 비교하면 된다.
결과의 가장 아랫부분을 보면 p-value는 0.4427로 두 모델의 Infant.Mortality에 대한 설명력에는 차이가 없다고 볼 수 있다.

회귀 분석의 중요한 목적 중 하나는 새로운 변수가 주어졌을 때 결과 변수를 예측하는 것이니 만큼, predict함수를 사용하여 새로운 Fertility에 대한 Infant.Mortality를 예측해 보자.

새로운 10개의 Fertility 변수에 대한 예측 값은 fit 컬럼에, 95% 신뢰구간은 lwr/up에서 확인하면 된다. 새로 입력하는 데이터 셋의 변수명은 모델에 사용한 변수명과 동일하게 지정해 주어야 하는 점을 기억하자.

 

주의 – 다중공선성 문제 (Multicollinearity)

회귀 모델의 설명 변수들 사이에 상관관계가 있는 경우가 있는데, 이것을 “다중공선성” 라고 한다.  (고객 만족도를 조사하면서 상품의 내구도와 불량률을 설명 변수로 동시에 포함시키는 경우 등이다.)

다중공선성이 존재할 경우 모델의 정확도가 하락하게 되므로 어떤 두 변수 간에 다중 공선성이 존재할 경우 설명력이 더 적은 변수를 제거하고 모델을 재구성 한다.

다중공선성을 판단하는 방법에는 여러가지가 있지만,
R에서는 vif 함수를 사용해 VIF값을 간단히 구할 수 있으며, 보통 VIF 값이 4가 넘으면 다중공선성이 존재한다고 본다.

아래와 같이 car 패키지의 vif 함수를 사용하여 다중공선성 문제를 판단한다.

 

 

참고 자료

1) Columbia, http://www.stat.columbia.edu/~martin/W2024/R6.pdf
2) Onlunestatbook, http://onlinestatbook.com/2/regression/multiple_regression.html
3) Wikipedia, https://en.wikipedia.org/wiki/Multicollinearity
4) Coursera, regression analysis, Johns Hopkins University
5) R-tutor. http://www.r-tutor.com/elementary-statistics/simple-linear-regression/significance-test-linear-regression