1. [회귀분석] 회귀분석 실습(1) - Statsmodel분석/데이터 스케일링(Python) : ysyblog.tistory.com/119
이번 포스팅은 파이썬으로 잔차분석을 하는 방법들을 소개하겠습니다. 이번 포스팅은 위 포스팅에 이어 진행됩니다.
잔차분석
- 잔차분석은 회귀모형에 대한 가정(정규성, 등분산성, 독립성)을 충족하는지에 대한 검정, 이상치가 개입하는지에 대한 검정을 하는 절차
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')
잔차의 정규성
- 잔차가 정규분포를 따른다는 가정을 한다.
- Q-Q Plot로 확인할 수 있다.
- 잔차가 정규분포를 띄면 Q-Q Plot에서 점들이 점선을 따라 배치되어 있어야 한다.
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')
- 잔차의 정규성은 샤피로 검정으로 확인할 수 있다.
scipy.stats.shapiro(residual) # ShapiroResult(statistic=0.9450905919075012, pvalue=0.02152460627257824)
- 위 분석에서 두 번째 값이 p값이다. p값이 0.02이므로 유의수준 5%에서 잔차의 정규성이 위반되었다고 판단한다.
잔차의 등분산성
- 회귀모형을 통햬 예측된 값이 어떻든지, 모든 값들에 대하여 잔차의 분산이 동일하다는 가정
- 아래 그래프는 예측값(X축)에 따라 잔차가 어떻게 달라지는지 보여줌
- 빨간색 실선이 수평선에 가까울수록 등분산성이 있다는 것이다.
import numpy as np
sns.regplot(fitted, np.sqrt(np.abs(sr)), lowess=True, line_kws={'color': 'red'})
잔차의 독립성
- Result.summary의 Durbin-Watson(더빈왓슨, DW검정)으로 확인한다.
- DW검정은 잔차의 독립성을 확인할 수 있는 수치이다. 0이면 잔차들이 양의 자기상관을 갖고, 2이면 자기상관이 없는 독립성을 갖고, 4이면 잔차들이 음의 자기상관을 갖는다고 해석한다.
- 보통 1.5 ~ 2.5사이이면 독립으로 판단하고 회귀모형이 적합하다는 것을 의미한다. DW검정값이 0 또는 4에 가깝다는 것은 잔차들이 자기상관을 가지고 있다는 의미이고, 이는 t값, F값, R제곱을 실제보다 증가시켜 실제로 유의미하지 않은 결과를 유의미한 결과로 왜곡하게 된다.
- 위 회귀분석에서 더빈왓슨검정의 값이 1.676이므로 독립성이 있다고 판단할 수 있다.
극단값
- Cook's distance는 극단값을 나타내는 지표이다.
- 48번, 22번, 38번 자료가 특히 예측에서 많이 벗어남을 알 수 있다.
from statsmodels.stats.outliers_influence import OLSInfluence
cd, _ = OLSInfluence(res).cooks_distance
cd.sort_values(ascending=False).head()
728x90
반응형
'Data Analysis & ML > 회귀분석' 카테고리의 다른 글
[회귀분석] 회귀분석 실습(4) - 다중공선성 (Python) (4) | 2023.07.23 |
---|---|
[회귀분석] 회귀분석 실습(3) - 변수선택법 (R) (1) | 2023.07.23 |
[회귀분석] 회귀분석 실습(1) - OLS 회귀분석 결과 해석 및 범주형 변수 처리 (Statsmodel) (3) | 2023.07.23 |
[회귀분석] 로지스틱 회귀분석(2) - 로지스틱 회귀식과 회귀계수 추정(최대 우도 추정법(MLE)) (2) | 2023.01.24 |
[회귀분석] 로지스틱 회귀분석(1) - 오즈와 로짓 (0) | 2023.01.24 |