Cute Hello Kitty 3
본문 바로가기
Data/머신러닝

회귀 모델 성능 평가: Breusch-Pagan 검정, Durbin-Watson 검정, ANOVA

by 민 채 2025. 4. 14.
 
 
 

 

회귀모델을 만들고 나면, 단순히 R²만 보고 끝내면 안 됩니다.

모델이 통계적 가정을 얼마나 잘 만족하는지, 그리고 더 나은 모델이 있는지 비교해봐야 합니다.

 

  • 잔차의 등분산성 검정: Breusch-Pagan 검정
  • 잔차의 자기상관 검정: Durbin-Watson 검정
  • 종속변수가 추가된 모델이 더 좋은지 검정: ANOVA 모델 비교

 

실습 준비: iris 데이터 불러오기

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False

iris_raw = load_iris()
iris = pd.DataFrame(iris_raw.data, columns=iris_raw.feature_names)
iris.columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']
iris['species'] = iris_raw.target

 

모델 1: Petal_Length ~ Petal_Width + Sepal_Width

model1 = smf.ols("Petal_Length ~ Petal_Width + Sepal_Width", data=iris).fit()
print(model1.summary())

 

  • petal_length: 꽃잎의 길이
  • petal_width: 꽃잎의 넓이
  • sepal_width: 꽃받침의 넓이

꽃잎의 길이가 꽃잎의 넓이, 꽃받침의 넓이로 얼마나 설명될 수 있는지 모델을 생성했습니다.


모델 2: 여기에 Sepal_Length까지 추가

model2 = smf.ols("Petal_Length ~ Petal_Width + Sepal_Width + Sepal_Length", data=iris).fit()
print(model2.summary())

모델 1에서 꽃받침의 길이까지 추가를 해주었습니다.

 

1. Breusch-Pagan 검정: 등분산성 확인

등분산성(Homoscedasticity)이란?

회귀모형의 기본 가정 중 하나는 오차(잔차)의 분산이 일정해야 한다는 것입니다. 이를 등분산성(homoscedasticity)이라고 부릅니다. 반대로, 오차의 분산이 일정하지 않고 특정 변수나 값에 따라 달라진다면 이분산성(heteroscedasticity)이라 합니다.


Breusch–Pagan 검정의 아이디어

“잔차가 등분산이라는 것은 잔차의 크기를 독립변수들로 설명할 수 없다는 뜻이다.”

  1. 회귀 모델을 적합시킨 후, 오차(잔차)를 구합니다.
  2. 잔차 제곱값을 새로운 종속변수로 삼아, 원래의 독립변수들과 회귀분석을 한 번 더 수행합니다.
  3. 만약 이 회귀식의 설명력이 크다면 (즉, 독립변수들이 잔차의 크기를 설명할 수 있다면), 이는 이분산성이 있다는 증거가 됩니다.

즉, 잔차의 크기를 예측할 수 있다면, 우리는 등분산성을 의심해야 합니다.


파이썬 코드

from statsmodels.stats.diagnostic import het_breuschpagan

bp_test = het_breuschpagan(model2.resid, model2.model.exog)
labels = ['LM Statistic', 'LM-Test p-value', 'F-Statistic', 'F-Test p-value']
for name, value in zip(labels, bp_test):
    print(f"{name}: {value:.4f}")

 

출력 결과

LM Statistic: 6.0391
LM-Test p-value: 0.1097
F-Statistic: 2.0416
F-Test p-value: 0.1106

 

LM Statistic 6.0391 LM (Lagrange Multiplier) 검정통계량
LM-Test p-value 0.1097 LM 검정의 유의확률
F-Statistic 2.0416 F-통계량 (회귀 기반 접근)
F-Test p-value 0.1106 F 검정의 유의확률

 

  • 📌 귀무가설 (H₀): 잔차는 등분산이다.
    📌 대립가설 (H₁): 잔차는 이분산이다.
  • p-value: 0.1106 (11.06%) 는 일반적으로 사용하는 유의수준 0.05 (5%)보다 큽니다.
  • 즉, 귀무가설을 기각할 수 없습니다.
  • 따라서, 이 모델은 등분산성 가정을 위배하지 않습니다.

2. Durbin-Watson 검정: 잔차의 자기상관 확인

 

자기상관이란?

회귀모델을 만들면, 우리는 잔차(오차)가 아래 조건을 만족하길 원합니다.

  • 독립적으로 발생해야 한다.
  • 즉, 이전 오차와 지금 오차가 서로 영향을 주면 안 된다.

그런데 현실에서는 시간, 순서, 위치 등에 따라 잔차들이 서로 비슷한 경향을 가지는 경우가 있습니다.


예시: 시간순으로 정렬된 데이터

Day 1: 예측보다 2만큼 작음 → 잔차 +2  
Day 2: 예측보다 1.9만큼 작음 → 잔차 +1.9  
Day 3: 예측보다 2.1만큼 작음 → 잔차 +2.1

→ 계속 양수 방향으로 잔차가 유지된다면?
오차가 랜덤하지 않다자기상관이 존재할 수 있음


예시: 잔차의 패턴 확인하기

  • 잔차가 특정 구간에서 왼쪽으로 몰려있는 것을 볼 수 있습니다.
  • 또한, 일정한 리듬처럼 위아래를 반복하는 것을 볼 수 있습니다. (시계열 효과 의심가능)

 

Durbin-Watson 검정이란?

Durbin-Watson(DW) 검정은 회귀분석의 잔차들이 자기상관을 가지는지를 검정하는 통계적 방법입니다.

$$ DW = \frac{\sum_{t=2}^{n} (e_t - e_{t-1})^2}{\sum_{t=1}^{n} e_t^2} $$

  • $e_t$: 시점 $t$의 잔차
  • 분자는 이전 오차와의 차이 → 변화가 작을수록 자기상관이 강하다는 의미

 

 

파이썬 코드

from statsmodels.stats.stattools import durbin_watson

dw_stat = durbin_watson(model2.resid)
print(f"Durbin-Watson: {dw_stat:.4f}")

 

출력 결과

Durbin-Watson: 1.7830

 

결과 해석

DW 값 범위 해석
≈ 2 자기상관 없음
< 1.5 양의 자기상관 의심
> 2.5 음의 자기상관 의심

3. 모델 비교 (ANOVA)

ANOVA 란?

ANOVA는 Analysis of Variance, 즉 분산분석이란 뜻입니다. 이름은 “분산”이지만 실제로는 평균 차이를 검정하는 기법입니다.


왜 "평균"을 검정하는데 "분산"을 본다고 할까?

✔️ 여러 집단 간 평균 차이를 검정할 때, 각 집단의 평균값 차이(집단 간 변동)과 각 집단 내부의 변동(집단 내 분산)을 비교해서 판단해.

이걸 직관적으로 표현하면:

집단 간 분산이 크고, 집단 내 분산이 작다면 → 평균이 다르다고 판단할 수 있음!

$$ F = \frac{\text{집단 간 분산 (MSB)}}{\text{집단 내 분산 (MSW)}} = \frac{SSB / (k - 1)}{SSW / (n - k)} $$

  • MSB: Mean Square Between
  • MSW: Mean Square Within

F가 클수록 → 집단 간 차이가 크다 → 평균 차이 유의함!

 

회귀분석에서의 ANOVA

위에서 배운 ANOVA 개념을 회귀모델 비교에 적용해봅시다. 우리는, model1 과 model2를 비교하고 싶습니다.

model1 단순한 모델 (변수 적음)
model2 변수 더 추가한 모델

→ 추가된 변수로 인해 SSR(잔차 제곱합)이 얼마나 줄었는지를 보고, 그 차이가 유의미한지를 F검정으로 판단합니다.

 

파이썬 코드

anova_result = sm.stats.anova_lm(model1, model2)
print(anova_result)

여기서 좌측(model1)에는 단순한 모델을 넣고, 우측에는 변수를 더 추가한 (Full model) 모델을 넣습니다.

 

출력 결과:

   df_resid        ssr  df_diff    ss_diff           F        Pr(>F)
0     147.0  30.754971      0.0        NaN         NaN           NaN
1     146.0  14.852948      1.0  15.902023  156.312092  7.656980e-25
  • ssr (잔차 제곱합) : 30.75 -> 14.85 로 잔차 감소
  • ss_diff (SSR의 감소량) : 15.902 만큼 잔차가 줄었다는 뜻입니다.
  • F (F 통계량) : 매우 큼
  • P-value : 거의 0 에 가까움

F값이 클수록 회귀모델이 잘 작동한다는 뜻입니다. (설명력이 높다.)

반대로, F값이 작으면 모델이 설명력이 부족하다는 뜻입니다.


F값이 크면 더 좋은 모델인가?

"Full model의 F값이 더 높으면 무조건 좋은 건가?"
그리고 "그 안의 변수 중 일부가 설명력이 낮으면 어떡하지?"

대부분의 경우에는 F값이 크면 더 좋은 모델이 맞습니다.
F값은 전체 모델의 설명력을 보여주는 지표이기 때문에, 전체적으로 봤을 때 종속변수의 변동을 잘 설명하고 있다는 뜻이 됩니다.

 

그런데, Full model 내부의 일부 독립변수가 설명력이 낮다(= p-value가 높다)면?

모델 전체: F = 45.3 (p < 0.001) → 유의미

하지만 개별 변수 중에서:

- X1: p = 0.001 ✅
- X2: p = 0.74 ❌ (설명력 낮음)
- X3: p = 0.03 ✅

 

  • 개별적으로 보면, X2는 "무의미한 변수"일 수 있습니다. → 제거 고려해야 할 수도 있음
  • 하지만, 모델 전체 성능에는 긍정적 기여를 할수도 있습니다.
  • 그러므로, 변수 조합을 여러 개 실험해보면서 최적의 모델을 찾는 것이 중요합니다.