회귀 모형 진단
R² 값이 높고 p-value가 유의하다고 해서 모형이 완벽한 것은 아닙니다. 선형 회귀는 몇 가지 가정을 전제로 하며, 이 가정들이 깨지면 계수 추정과 p-value 자체가 신뢰할 수 없게 됩니다. 모형을 진단하는 것은 분석의 마무리가 아니라 중간 검증 단계입니다.
선형 회귀의 주요 가정
# 1. 선형성(Linearity) : y와 x의 관계가 선형이어야 합니다
# 2. 독립성(Independence) : 잔차들이 서로 독립이어야 합니다
# 3. 등분산성(Homoscedasticity): 모든 x 범위에서 잔차의 분산이 일정해야 합니다
# 4. 정규성(Normality) : 잔차가 정규분포를 따라야 합니다
plot(model)로 한번에 진단하기
R은 모형 객체에 plot()을 적용하면 4개의 진단 그래프를 자동으로 그려줍니다.
model <- lm(mpg ~ wt + hp, data = mtcars)
# 4개 진단 그래프를 2×2로 배치
par(mfrow = c(2, 2))
plot(model)
par(mfrow = c(1, 1)) # 원래 설정으로 복원
각 그래프가 무엇을 보여주는지 하나씩 살펴봅니다.
그래프 1: Residuals vs Fitted (선형성 + 등분산성)
# plot(model, which = 1)
plot(model, which = 1)
x축은 예측값(fitted values), y축은 잔차(residuals)입니다.
좋은 모형이라면 잔차가 0 주변에 무작위로 흩어져야 합니다. 빨간 추세선이 수평에 가까워야 합니다.
# 문제 패턴
# U자 또는 역U자 → 선형성 가정 위반 (비선형 관계)
# 나팔 모양 (분산 증가) → 등분산성 위반
# 무작위 산포 → 가정 충족
그래프 2: Normal Q-Q (정규성)
# plot(model, which = 2)
plot(model, which = 2)
표준화된 잔차를 정규분포 이론값과 비교합니다. 대각선 위에 점들이 일직선으로 놓이면 정규성을 만족합니다.
# 점들이 대각선에서 크게 벗어나면 → 정규성 가정 위반
# 특히 양 끝(꼬리 부분)의 이탈이 중요
# 수치로 검정
shapiro.test(residuals(model))
# W = 0.94, p-value = 0.08
# p > 0.05 → 정규성 가정 기각하지 못함 (정규성 OK)
그래프 3: Scale-Location (등분산성)
# plot(model, which = 3)
plot(model, which = 3)
x축은 예측값, y축은 표준화 잔차의 제곱근입니다. 빨간 추세선이 수평이고 점들이 고르게 분포하면 등분산성을 만족합니다.
# 추세선이 오른쪽으로 올라가면 → 이분산성 (heteroscedasticity)
# 이분산성이 있으면 표준오차와 p-value가 편향됩니다
# 수치 검정: Breusch-Pagan 검정
install.packages("lmtest")
library(lmtest)
bptest(model)
# BP = 2.68, df = 2, p-value = 0.26
# p > 0.05 → 등분산성 가정 충족
그래프 4: Residuals vs Leverage (이상치 + 영향점)
# plot(model, which = 4 또는 5)
plot(model, which = 5)
레버리지(leverage)는 해당 관측값이 독립변수 공간에서 얼마나 극단적인 위치에 있는지를 나타냅니다. Cook's Distance는 그 관측값을 제외했을 때 계수가 얼마나 변하는지를 측정합니다.
# Cook's Distance 직접 확인
cooks_d <- cooks.distance(model)
plot(cooks_d, type = "h", main = "Cook's Distance")
abline(h = 4 / nrow(mtcars), col = "red", lty = 2)
# 기준선 4/n 이상인 관측값이 영향점
# 영향점 식별
influential <- which(cooks_d > 4 / nrow(mtcars))
influential
# Toyota Corolla, Fiat 128 등이 나타날 수 있음
# 해당 차량 확인
mtcars[influential, ]
# plot(model, which = 4) — Cook's Distance 막대그래프
plot(model, which = 4)
자기상관 검정: Durbin-Watson
시계열 데이터나 그룹화된 데이터에서 잔차가 순서대로 상관될 수 있습니다(자기상관). 회귀의 독립성 가정을 위반합니다.
# Durbin-Watson 검정
# H₀: 잔차 간 자기상관이 없다
library(lmtest)
dwtest(model)
Durbin-Watson test
data: model
DW = 1.9461, p-value = 0.4291
alternative hypothesis: true autocorrelation is greater than 0
# DW 통계량 해석
# 약 2 : 자기상관 없음 (이상적)
# 0~2 : 양의 자기상관 가능성
# 2~4 : 음의 자기상관 가능성
# p > 0.05 → 자기상관 없음 (가정 충족)
영향점 제거 후 모형 비교
# 영향점을 제거한 모형
model_clean <- lm(mpg ~ wt + hp,
data = mtcars[-influential, ])
# 두 모형 계수 비교
rbind(
원모형 = coef(model),
영향점제거 = coef(model_clean)
)
# 계수가 크게 달라졌다면 해당 관측값이 모형에 큰 영향을 미친 것
# 무조건 제거하기보다는 이유를 파악하는 것이 먼저입니다
# 실제 측정 오류인지, 특수한 케이스인지 확인해야 합니다
진단 결과 종합 보고서
# 자동화된 진단: performance 패키지
install.packages("performance")
library(performance)
# 모형 진단 요약
check_model(model)
# 정규성 검정
check_normality(model)
# 이분산성 검정
check_heteroscedasticity(model)
# 다중공선성 확인
check_collinearity(model)
# 이상치 확인
check_outliers(model)
# 진단 결과를 논문에 보고하는 방법
# "잔차의 정규성 검정 결과 Shapiro-Wilk W = 0.94, p = .08로
# 정규성 가정을 충족하였다. Durbin-Watson 통계량은 1.95로
# 잔차의 독립성이 확인되었다. Cook's D > 4/n을 기준으로
# 영향점을 확인한 결과 XX번 관측값이 확인되었으나,
# 해당 관측값 포함/제외 모형의 계수가 크게 다르지 않아
# 분석에 모두 포함하였다."
모형 진단은 귀찮지만 건너뛸 수 없는 단계입니다. 가정이 충족된 모형의 결과만이 신뢰할 수 있습니다.