잔차분석
회귀분석 결과를 바탕으로 다양한 잔차 분석을 실시한다.
실습 준비
실습을 위해 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번 자료를 제거하고 다시 분석을 시도해볼 수 있다.