logo

[basic-stat-python] 잔차분석

회귀분석 결과를 바탕으로 다양한 잔차 분석을 실시한다.

 

실습 준비

실습을 위해 cars.csv를 다운로드 받아 열고, 회귀분석을 한다.

import pandas as pd
from statsmodels.formula.api import ols

df = pd.read_csv('cars.csv')
res = ols('dist ~ speed', data=df).fit()
 

모형의 선형성

  • 예측값(fitted)과 잔차(residual)의 비교
  • 모든 예측값에서 잔차가 비슷하게 있어야 함(가운데 점선)
  • 빨간 실선은 잔차의 추세를 나타냄
  • 빨간 실선이 점선에서 크게 벗어난다면 예측값에 따라 잔차가 크게 달라진다는 것
import matplotlib.pyplot as plt
import seaborn as sns
fitted = res.predict(df)
residual = df['dist'] - fitted
sns.regplot(fitted, residual, lowess=True, line_kws={'color': 'red'})
plt.plot([fitted.min(), fitted.max()], [0, 0], '--', color='grey')
[<matplotlib.lines.Line2D at 0x2b23d82bc88>]
 

잔차의 정규성

  • 잔차가 정규분포를 따른다는 가정
  • Q-Q 플롯으로 확인할 수 있음
  • 잔차가 정규분포를 띄면 Q-Q 플롯에서 점들이 점선을 따라 배치되어 있어야 함
import scipy.stats
sr = scipy.stats.zscore(residual)
(x, y), _ = scipy.stats.probplot(sr)
sns.scatterplot(x, y)
plt.plot([-3, 3], [-3, 3], '--', color='grey')
[<matplotlib.lines.Line2D at 0x2b23d9e2bc8>]

잔차의 정규성은 샤피로 검정으로 확인할 수 있다. 아래 분석에서 두 번째 값이 p값이다. p값이 0.02이므로 유의수준 5%에서 잔차의 정규성이 위반되었다고 판단한다.

scipy.stats.shapiro(residual)
(0.9450905919075012, 0.02152460627257824)
 

잔차의 등분산성

  • 회귀모형을 통햬 예측된 값이 크던 작던, 모든 값들에 대하여 잔차의 분산이 동일하다는 가정
  • 아래 그래프는 예측값(가로축)에 따라 잔차가 어떻게 달라지는지 보여줌
  • 빨간색 실선이 수평선을 그리는 것이 이상적
import numpy as np
sns.regplot(fitted, np.sqrt(np.abs(sr)), lowess=True, line_kws={'color': 'red'})
<matplotlib.axes._subplots.AxesSubplot at 0x2b23dc1f6c8>
 

극단값

  • Cook's distance는 극단값을 나타내는 지표
  • 48번, 22번, 38번 자료가 특히 예측에서 많이 벗어남을 알 수 있음
from statsmodels.stats.outliers_influence import OLSInfluence
cd, _ = OLSInfluence(res).cooks_distance
cd.sort_values(ascending=False).head()
48    0.340396
22    0.085552
38    0.068053
44    0.053176
34    0.052576
dtype: float64
 

잔차의 독립성

  • 회귀분석에서 잔차는 정규성, 등분상성 그리고 독립성을 가지는 것으로 가정
  • 자료 수집 과정에서 무작위 표집(random sampling)을 하였다면, 잔차의 독립성은 만족하는 것으로 봄
  • 시계열 자료나 종단연구 자료처럼, 연구 설계 자체가 독립성을 담보할 수 없는 경우에는 더빈-왓슨 검정(Durbin-Watson test) 등을 실시
 

잔차 분석 결과를 바탕으로 대응

  • 잔차 분석 결과에 따라 다양한 방식의 대응이 가능
    • 극단값을 제거
    • 독립변수를 추가
    • 종속변수를 수학적으로 변환

위의 예에서는 48번 자료가 극단값으로 보이고 이 때문에 잔차의 정규성이 위배되는 것으로 추측된다. 따라서 48번 자료를 제거하고 다시 분석을 시도해볼 수 있다.

Previous
다중공선성