RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (60) N
    • Study Note (25) N
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (14) N
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)
    • 맛집 (0)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/통계

회귀모형의 진단: 잔차, 레버리지, 그리고 쿡의 거리

2025. 12. 15. 15:17

회귀분석을 통해 $R^2$가 높고 P-value가 유의한 모델을 만들었다고 끝이 아닙니다.

"과연 이 모델은 데이터를 올바르게 설명하고 있는가?", "결과를 왜곡하는 특이한 환자(Outlier)는 없는가?"를 확인해야 합니다.

오늘은 선형회귀의 4가지 전제조건을 확인하는 잔차 분석과, 모델을 뒤흔드는 영향력 있는 데이터를 찾아내는 레버리지 및 쿡의 거리에 대해 알아보겠습니다.

 

1. 잔차(Residual)와 선형회귀의 4대 전제조건

잔차($e$)는 실제값($Y$)과 예측값($\hat{Y}$)의 차이입니다. ($e = Y - \hat{Y}$)

좋은 회귀모델이라면 잔차는 특정한 패턴 없이 무작위 잡음(White Noise)처럼 보여야 합니다.

잔차 분석으로 확인해야 할 4가지 (LINH)

  1. 선형성 (Linearity): 종속변수와 독립변수 간에 선형 관계가 성립해야 합니다.
    • 진단: 잔차도(Residual Plot)에서 0을 중심으로 위아래 골고루 퍼져 있어야 합니다. (U자형 등의 패턴이 보이면 안 됨)
  2. 독립성 (Independence): 데이터끼리 서로 영향을 주지 않아야 합니다. (시계열 데이터에서 중요)
    • 진단: Durbin-Watson 통계량 확인.
  3. 정상성/정규성 (Normality): 잔차의 분포가 정규분포를 따라야 합니다.
    • 진단: Q-Q Plot이 45도 직선 위에 있어야 합니다.
  4. 등분산성 (Homoscedasticity): 예측값의 크기와 상관없이 잔차의 퍼짐 정도(분산)가 일정해야 합니다.
    • 진단: 잔차도에서 오른쪽으로 갈수록 나팔 모양으로 퍼지면 안 됩니다.

2. 영향력 분석: 레버리지(Leverage)와 쿡의 거리

데이터 중에는 혼자 튀어서 회귀선을 자기 쪽으로 확 끌어당기는 녀석들이 있습니다. 이를 찾아내는 지표입니다.

1) 레버리지 (Leverage, $H_{ii}$)

  • 정의: 설명변수($X$)의 관점에서 데이터가 중심에서 얼마나 멀리 떨어져 있는가?
  • 의미: $X$값이 특이한 데이터(예: 소아과 데이터에 섞인 80세 노인)를 찾습니다.
  • 기준: 평균 레버리지($p/n$)보다 2~3배 크면 "레버리지가 크다(High Leverage)"고 봅니다.

2) 쿡의 거리 (Cook's Distance)

  • 정의: 잔차(Y의 특이성)와 레버리지(X의 특이성)를 동시에 고려한 지표입니다.
  • 의미: "이 데이터를 지웠을 때 회귀식이 얼마나 많이 바뀌는가?"를 나타냅니다.
  • 해석: 쿡의 거리가 큰 데이터는 모델을 왜곡할 가능성이 높으므로 제거하거나 별도로 분석해야 합니다.

3. 실전 코드 (Python & R)

의료 데이터 시나리오: BMI(X)가 혈당(Y)에 미치는 영향을 분석하는데, BMI가 비정상적으로 높은 환자가 섞여 있는 상황을 가정합니다.

Python (statsmodels)

Python에서는 statsmodels가 진단 시각화에 최적화되어 있습니다.

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
from statsmodels.graphics.gofplots import ProbPlot

# 1. 가상 데이터 생성 (정상 데이터 + 특이값 1개 추가)
bmi = np.array([20, 22, 24, 25, 26, 28, 30, 60]) # 60은 극단적인 BMI (High Leverage)
sugar = np.array([80, 85, 90, 95, 100, 110, 115, 200]) # 200은 높은 혈당

# 상수항 추가 및 모델 적합
X = sm.add_constant(bmi)
model = sm.OLS(sugar, X).fit()

# 2. 잔차 및 레버리지 계산
residuals = model.resid
model_norm_residuals = model.get_influence().resid_studentized_internal
model_leverage = model.get_influence().hat_matrix_diag
model_cooks = model.get_influence().cooks_distance[0]

# 3. 시각화: Influence Plot (레버리지 vs 잔차)
# 원의 크기가 쿡의 거리(영향력)를 의미합니다.
fig, ax = plt.subplots(figsize=(10, 6))
sm.graphics.influence_plot(model, ax=ax, criterion="cooks")
plt.title("Influence Plot (Leverage vs Residuals)")
plt.show()

# 4. 시각화: QQ Plot (정규성 확인)
QQ = ProbPlot(model_norm_residuals)
plot_lm_2 = QQ.qqplot(line='45', alpha=0.5, color='#4C72B0', lw=1)
plt.title("Normal Q-Q Plot")
plt.show()

 

코드 설명:

  • influence_plot: X축은 레버리지, Y축은 잔차, 원의 크기는 쿡의 거리입니다. 오른쪽 위(높은 레버리지+큰 잔차)에 큰 원이 있다면 그 데이터는 모델을 왜곡하고 있는 것입니다.
  • qqplot: 점들이 빨간 실선에 딱 붙어 있어야 잔차가 정규분포를 따른다고 볼 수 있습니다.

R Code (plot 함수 하나로 끝)

R은 lm() 모델 객체를 plot()에 넣기만 하면 진단 그래프 4종 세트를 자동으로 그려줍니다. (이것이 R의 강력함입니다!)

# 1. 데이터 생성
bmi <- c(20, 22, 24, 25, 26, 28, 30, 60) # 60은 이상치
sugar <- c(80, 85, 90, 95, 100, 110, 115, 200)
df <- data.frame(bmi, sugar)

# 2. 선형회귀 모델 적합
model <- lm(sugar ~ bmi, data=df)

# 3. 모형 진단 시각화 (4개 그래프 한 번에 보기)
par(mfrow=c(2,2)) # 화면을 2x2로 분할
plot(model)
par(mfrow=c(1,1)) # 화면 분할 초기화

 

 

1. Residuals vs Fitted (선형성 확인)

  • 목적: 데이터가 선형적인 관계를 가지는지 확인합니다.
  • 해석 방법:
    • 이상적: 빨간 실선이 0을 기준으로 수평에 가까워야 합니다. 잔차들이 0 주변에 무작위로 퍼져 있어야 합니다.
    • 문제 상황: 빨간 실선이 U자형이나 S자형으로 휘어지면 데이터가 비선형(곡선) 관계일 수 있습니다.
  • 결과 분석:
    • 그래프를 보면 잔차들이 0을 기준으로 위아래로 퍼져 있긴 하지만, 빨간 실선이 다소 꺾여 있습니다.
    • 데이터 포인트 6, 7번이 위쪽으로, 3번이 아래쪽으로 튀어 있어 패턴에 영향을 주고 있습니다. 하지만 데이터 수가 적어(8개) 완벽한 무작위성을 기대하기는 어렵습니다. 전체적인 경향은 선형성을 크게 위배하지 않는 것으로 보입니다.

2. Normal Q-Q (정규성 확인)

  • 목적: 잔차(오차)가 정규분포를 따르는지 확인합니다.
  • 해석 방법:
    • 이상적: 점들이 45도 점선 위에 나란히 놓여 있어야 합니다.
    • 문제 상황: 점들이 직선에서 크게 벗어나거나 휘어지면 정규성이 깨진 것입니다.
  • 결과 분석:
    • 대부분의 점들이 점선 근처에 잘 붙어 있습니다.
    • 오른쪽 끝(6번)과 왼쪽 끝(8번)이 약간 벗어나 있지만, 이 정도면 정규성 가정은 만족한다고 볼 수 있습니다.

3. Scale-Location (등분산성 확인)

  • 목적: 잔차의 분산이 일정한지 확인합니다.
  • 해석 방법:
    • 이상적: 빨간 실선이 수평에 가깝고, 점들이 좌우로 고르게 퍼져 있어야 합니다.
    • 문제 상황: 빨간 실선이 기울어지거나, 점들이 나팔 모양(점점 퍼지거나 모이는 형태)이면 등분산성이 깨진 것입니다.
  • 결과 분석:
    • 빨간 실선이 오른쪽으로 갈수록 약간 올라가는 경향이 있습니다. 이는 예측값이 커질수록 오차의 변동폭도 약간 커질 수 있음을 시사합니다.
    • 하지만 데이터가 적어서 나타나는 현상일 수 있으며, 심각한 수준(뚜렷한 나팔 모양)은 아닙니다.

4. Residuals vs Leverage (영향력 확인)

  • 목적: 모델에 과도한 영향을 주는 '영향점(Influential Point)'이나 '이상치(Outlier)'를 찾습니다.
  • 해석 방법:
    • Cook's Distance (쿡의 거리): 빨간 점선으로 표시됩니다. (보통 0.5 또는 1 기준)
    • 이상적: 모든 점이 빨간 점선 안쪽에 있어야 합니다.
    • 문제 상황: 점선 바깥으로 나가는 점이 있다면, 그 데이터 하나가 회귀선을 마음대로 휘두르고 있다는 뜻입니다. (제거 고려 대상)
  • 결과 분석:
    • 8번 데이터가 오른쪽 아래 구석에 치우쳐 있습니다. 레버리지(X축) 값이 크고 잔차도 큽니다.
    • 빨간 점선(Cook's distance) 근처에 있거나 벗어나려는 경향을 보이므로, 8번 데이터는 영향점일 가능성이 높습니다. 이 데이터를 빼고 분석하면 결과가 더 좋아질 수도 있습니다.

결론

  1. 잔차 분석: 모델의 가정이 깨지지 않았는지(정규성, 등분산성 등) 확인하는 건강검진 과정입니다.
  2. 레버리지 & 쿡의 거리: 내 모델을 망치는 '빌런(Villain)' 데이터를 찾아내는 도구입니다.
  3. 대처법: 진단 결과 이상치(Outlier)나 영향점(Influential Point)이 발견되면, 데이터 입력 오류인지 확인하거나 해당 데이터를 제외하고 다시 분석해보는 민감도 분석(Sensitivity Analysis)을 수행해야 합니다.

'Study Note > 통계' 카테고리의 다른 글

직선을 넘어 곡선으로, 그리고 모델의 성적표 AIC  (0) 2025.12.15
회귀분석의 확장: 과적합 방지와 데이터 특성에 맞는 모델링  (0) 2025.12.15
선형회귀모형의 진단과 선별 (T검정, F검정, AIC, VIF)  (0) 2025.12.15
[의료 통계] 내 BMI가 1 오르면 혈압은 얼마나 오를까? (Python vs R 선형회귀 완벽 비교)  (0) 2025.12.12
선형회귀 Part 2: 최소자승법(OLS)과 더미변수 완벽 정리  (0) 2025.12.12
    'Study Note/통계' 카테고리의 다른 글
    • 직선을 넘어 곡선으로, 그리고 모델의 성적표 AIC
    • 회귀분석의 확장: 과적합 방지와 데이터 특성에 맞는 모델링
    • 선형회귀모형의 진단과 선별 (T검정, F검정, AIC, VIF)
    • [의료 통계] 내 BMI가 1 오르면 혈압은 얼마나 오를까? (Python vs R 선형회귀 완벽 비교)
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바