iBetter Books
수정

회귀 모형 진단

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번 관측값이 확인되었으나, 
#  해당 관측값 포함/제외 모형의 계수가 크게 다르지 않아
#  분석에 모두 포함하였다."

모형 진단은 귀찮지만 건너뛸 수 없는 단계입니다. 가정이 충족된 모형의 결과만이 신뢰할 수 있습니다.