다중회귀분석
다중 선형 회귀 모형의 도입 배경
- 현실 세계의 현상은 단 하나의 요인, 즉 단순 선형 회귀만으로 완벽하게 설명하기 어려움
- 여러 독립변수와 종속변수의 관계를 동시에 추정할 필요가 있음
- 예: 선박의 무게를 예측하기 위해 길이, 폭, 속도 등 다양한 제원을 종합적으로 고려
- 종속변수: 선박의 무게
- 독립변수: 길이, 폭, 속도 등
다중 선형 회귀 모형
- 다중 선형 회귀 모형은 단순 선형 회귀를 확장하여 2개 이상의 독립변수를 포함하는 모형
- Y: 종속변수
- X1,X2,…: 독립변수
- β1,β2,…: 각 독립변수에 해당하는 회귀계수, 즉 편회귀계수
- β0: y절편
- ϵ: 오차항
통계적 통제
- 특정 회귀계수 βi는 다른 변수가 일정하다고 가정하여 해석
- 다른 변수가 같을 때 Xi가 1단위 증가하면 예측되는 Y의 평균 변화량
- 관찰 자료의 통계적 통제만으로 인과관계가 성립하지는 않음
- 실험적 통제
- 실제로 다른 변수를 고정
- 통계적 통제
- 일정한 가정 하에 다른 변수가 고정되었을 때의 결과를 추정
파이썬 실습: 다중 선형 회귀 모형 적합
statsmodels의 수식 기반 방식(formula.api) 활용~기호 우측에 여러 독립변수를+기호로 나열하여 다중 회귀식을 구성
from statsmodels.formula.api import ols
import pandas as pd
df_ship = pd.read_excel("ship.xlsx")
ols("weight ~ length + beam", data=df_ship).fit().summary()
- R2:
0.497 - 수정 R2:
0.486 length:-109.6387, p-value0.079beam:1715.6569, p-value< 0.001
speed를 추가한 모형을 적합.
ols("weight ~ length + beam + speed", data=df_ship).fit().summary()
- R2:
0.514 - 수정 R2:
0.499 length:-99.2415, p-value0.108beam:1660.5702, p-value< 0.001speed:-376.4271, p-value0.067- 다른 변수를 통제했을 때
beam만 5% 유의수준에서 유의
독립변수 간 상관관계
df_ship[["length", "beam", "speed", "weight"]].corr()
length와 beam의 상관계수는 0.960654. 두 변수가 비슷한 정보를 포함하여 다중공선성 가능성이 큼.
모델 결과 요약표 주요 항목
- 일반 결정계수(R2)
- 모델 자체의 설명력
- 변수를 추가해도 감소하지 않음
- 모델 간 비교에는 한계가 있음
- 수정된 결정계수(Adjusted R2)
- 변수의 개수가 불필요하게 늘어날 때 그만큼 패널티를 수식에 반영
- 모델 간 비교에 사용
- F-statistic, Prob(F-statistic)
- 모든 기울기가 0이라는 귀무가설 검정
Prob(F-statistic)이 0.05보다 작으면 귀무가설 기각
coef- 각각 투입된 독립변수의 편회귀계수
- 부호를 통해 직관적인 증감 패턴을 분석
P>|t|- 다른 변수를 통제했을 때 개별 회귀계수가 0인지 검정하는 p-value
표준화
- 다중회귀분석에서 독립변수의 단위가 다르면 회귀계수 크기를 비교하기 어려움
- 표준화를 하면 평균은 0, 표준편차는 1이 됨
- 표준화를 통해 변수의 단위를 제거하여 회귀계수의 상대적 크기 비교 가능
scale함수를 이용하여 표준화할 수 있음
model = ols(
"weight ~ scale(length) + scale(beam) + scale(speed)",
data=df_ship,
).fit()
model.summary()
scale(length):-4629.4848scale(beam): 약12210scale(speed):-1471.9580- 절댓값이 가장 큰 표준화 계수는
beam
신규 선박 중량 예측
ship_predict.xlsx: 신규 선박 제원 정보- 모델 학습에 사용한 독립변수(
length,beam,speed)가 포함되어 있어야 함 - 학습된 다중 회귀 모델
model로 신규 데이터의 중량을 예측 - 예측값은 학습 데이터의 관계를 기준으로 계산된 추정치
df_pred = pd.read_excel("ship_predict.xlsx")
df_pred["predicted_weight"] = model.predict(df_pred)
다중공선성
- 다중공선성(Multicollinearity)은 다중 선형 회귀 모델 내부에서 독립변수들끼리 매우 강한 선형 상관관계를 띠는 현상
- 서로 겹치는 정보가 많아 각 회귀계수를 분리하여 추정하기 어려워짐
- 모델의 신뢰성 훼손, 추정치의 분산 팽창 등이 발생할 수 있음
- 심한 경우 회귀계수의 부호가 논리와 정반대로 뒤집히기도 함
- Variance Inflation Factor(VIF)
- 특정 독립변수가 나머지 여러 독립변수들에 의해 어느 정도 설명되는지 측정하는 수치 지표
- 특정 독립변수 Xi를 종속변수로 두고 나머지 X들로 회귀분석했을 때 산출된 Ri2를 이용
- 판단 기준
- VIF가 1에 가까울수록 다중공선성이 없음
- 실무적으로 VIF > 10이면 다중공선성 문제가 심각하다고 평가하고 변수 제외 등 조치를 고려
분산팽창지수 계산
import patsy
from statsmodels.stats.outliers_influence import variance_inflation_factor
design_matrix = patsy.dmatrix(
" ~ length + beam + speed",
df_ship,
return_type="dataframe",
)
pd.DataFrame({
"variable": design_matrix.columns[1:],
"VIF": [
variance_inflation_factor(design_matrix.values, i)
for i in range(1, design_matrix.shape[1])
],
})
| 변수 | VIF |
|---|---|
length |
13.07 |
beam |
13.04 |
speed |
1.01 |
length와 beam의 VIF가 10보다 큼. length를 제외하고 다시 적합.
ols("weight ~ beam + speed", data=df_ship).fit().summary()
- R2:
0.501 - 수정 R2:
0.491 beam:1056.1652, p-value< 0.001speed:-406.5725, p-value0.049
퀴즈
다중 선형 회귀 모형을 사용하는 주된 이유로 가장 적절한 것은?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.