다중 회귀분석
현실에서 결과는 하나의 원인이 아니라 여러 요인이 복합적으로 작용합니다. 다중 회귀분석은 독립변수를 여러 개 사용해 종속변수를 더 정밀하게 예측합니다.
다중 회귀의 기본 구조
y = β₀ + β₁x₁ + β₂x₂ + ... + βₖxₖ + ε
단순 회귀에서 공식 우변에 변수를 더하기만 하면 됩니다. 각 계수 βᵢ는 다른 변수들을 일정하게 유지했을 때 xᵢ가 1 단위 증가할 때의 y 변화량입니다. 이를 "통제된 효과"라고 부릅니다.
lm()으로 다중 회귀 모형 적합하기
# 독립변수를 + 로 연결합니다
model_multi <- lm(mpg ~ wt + hp + cyl, data = mtcars)
summary(model_multi)
Call:
lm(formula = mpg ~ wt + hp + cyl, data = mtcars)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 38.75179 1.78686 21.693 < 2e-16 ***
wt -3.16697 0.74058 -4.276 0.000199 ***
hp -0.01804 0.01188 -1.519 0.140
cyl -0.94162 0.55092 -1.710 0.098 .
---
Residual standard error: 2.512 on 28 degrees of freedom
Multiple R-squared: 0.8431, Adjusted R-squared: 0.8263
F-statistic: 50.17 on 3 and 28 DF, p-value: 2.184e-11
# 결과 해석
# wt: 무게가 1,000 lbs 증가하면 연비가 평균 3.17 mpg 감소 (hp, cyl 통제 후)
# hp: hp 증가의 효과는 유의하지 않음 (p = 0.14)
# cyl: 실린더 수 효과도 p = 0.098로 경계선
# R²이 0.75 → 0.84로 증가: 변수 추가로 설명력이 향상
조정된 R² (Adjusted R²)
변수를 무조건 추가하면 R²은 항상 증가합니다. 의미 없는 변수를 추가해도 마찬가지입니다. 조정된 R²은 변수 수를 페널티로 반영해, 불필요한 변수 추가를 억제합니다.
# Multiple R-squared : 0.8431 (변수 추가만으로 증가)
# Adjusted R-squared : 0.8263 (변수 수 패널티 적용 후)
# 두 값의 차이가 클수록 불필요한 변수가 포함됐을 가능성이 높습니다
# 변수 선택 시에는 Adjusted R²로 모형을 비교합니다
다중공선성(Multicollinearity) 확인
독립변수들 사이에 강한 상관관계가 있으면 계수 추정이 불안정해집니다. 이를 다중공선성 문제라고 합니다. VIF(Variance Inflation Factor)로 진단합니다.
install.packages("car")
library(car)
vif(model_multi)
wt hp cyl
3.224082 2.894373 5.371740
# VIF 해석 기준
# VIF < 5 : 문제없음
# 5 ≤ VIF < 10 : 주의 필요
# VIF ≥ 10 : 다중공선성 심각, 변수 제거 또는 처리 필요
# cyl의 VIF가 5.37로 주의가 필요한 수준
# cyl, disp, hp는 모두 엔진 크기와 관련 → 서로 높은 상관
cor(mtcars[, c("cyl", "disp", "hp")])
변수 선택: step()
어떤 변수 조합이 가장 좋은 모형을 만드는지 자동으로 찾아줍니다. AIC(Akaike Information Criterion)를 기준으로 합니다. AIC가 작을수록 좋은 모형입니다.
# 가능한 모든 변수를 넣은 포화 모형 시작
full_model <- lm(mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb,
data = mtcars)
# 후진 제거법 (Backward elimination)
step_back <- step(full_model, direction = "backward")
summary(step_back)
Start AIC=70.9
mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb
Step: AIC=70.9
mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear
...
Step: AIC=61.31
mpg ~ wt + qsec + am
# 최종 선택 모형: mpg ~ wt + qsec + am
# AIC가 70.9 → 61.3으로 감소 — 3개 변수로도 충분
summary(step_back)
# wt, qsec(1/4 마일 시간), am(변속기 종류)이 선택됨
# 전진 선택법 (Forward selection)
null_model <- lm(mpg ~ 1, data = mtcars) # 독립변수 없는 모형
step_fwd <- step(null_model,
scope = list(lower = null_model, upper = full_model),
direction = "forward")
# 단계적 방법 (Stepwise — 전후 모두 고려)
step_both <- step(full_model, direction = "both")
표준화 계수 (Beta 계수)
독립변수들의 단위가 다를 때 "어떤 변수가 더 중요한가"를 비교하려면 표준화 계수를 사용합니다. 모든 변수를 표준화(평균 0, 표준편차 1)한 후 회귀를 수행합니다.
# 데이터 표준화
mtcars_scaled <- as.data.frame(scale(mtcars))
# 표준화된 데이터로 모형 적합
model_std <- lm(mpg ~ wt + hp + qsec, data = mtcars_scaled)
summary(model_std)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.14e-16 7.80e-02 0.000 1.0000
wt -7.73e-01 1.17e-01 -6.625 4.4e-07 ***
hp -2.53e-01 1.39e-01 -1.827 0.0784 .
qsec 2.91e-01 1.38e-01 2.111 0.0440 *
# 절편은 거의 0 (표준화 결과 정상)
# |Beta| 비교: wt(-0.77) > qsec(0.29) > hp(-0.25)
# wt의 표준화 계수가 가장 크므로 연비에 가장 큰 영향을 미침
범주형 독립변수 다루기
# am 변수: 0=자동변속기, 1=수동변속기
# factor로 변환하면 R이 자동으로 더미 변수 처리
mtcars$am_f <- factor(mtcars$am, labels = c("자동", "수동"))
model_cat <- lm(mpg ~ wt + am_f, data = mtcars)
summary(model_cat)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.3216 3.0546 12.218 5.7e-13 ***
wt -5.3528 0.7882 -6.791 1.9e-07 ***
am_f수동 0.0236 1.5456 0.015 0.988
# am_f수동 : 자동변속기 대비 수동변속기의 연비 차이
# 계수 = 0.024, p = 0.988 → wt를 통제하면 변속기 종류는 유의하지 않음
# 변속기와 연비의 단순 차이는 실제로는 무게 차이로 설명됨
다중 회귀는 단순하지만 강력합니다. 다음 챕터에서는 이 모형이 실제로 믿을 수 있는지 진단하는 방법을 배웁니다.