정규성 검증이란?
정규성 검정은 말 그대로 정규 분포를 따르는지를 검정하는 방법입니다. 통계학에 있어서 가장 처음 배우는 분포이자 가장 많이 들으며 가장 많이 사용하는 분포가 정규 분포인 만큼 기초 통게학의 근간을 이룬다고해도 과언이 아닌데요. 그만큼 통계학의 분석방법에 있어서 정규분포를 가정하는 경우가 많습니다.
회귀분석을 예로 들면 대부분이 언급하지 않거나 또는 무시하는 부분이 잔차에대한 정규성 검증입니다. 회귀분석에서 잔차의 검증이 필요한 이유는 모형식을 보면 알 수 있습니다.
모형식에서 오차항에 대한 몇가지 가정이 있습니다.
- 오차항은 서로 독립
- 오차항은 정규분포
- 오차항의 분포는 일정
위의 가정은 모두 검증해야 회귀분석이 의미있다고 보통 이야기 하는데 그 중 오차항의 정규분포의 가정을 만족하는지 확인하기 위해 잔차에 대한 정규성 검증을 수행합니다. 또한 독립변수와 종속변수간의 결합 분포가 정규 분포여야한다는 가정이 있습니다만 독립변수, 종속변수가 모두 정규분포라면 그의 결합 분포 또한 정규분포라 기초통계학에서는 크게 이부분을 다루지 않는것 같습니다.
예제
간단하게 회귀분석을 진행한다고 가정하고 임의의 샘플 데이터를 만들어보겠습니다.
import numpy as np
from matplotlib import pyplot as plt
np.random.seed(1234567)
x = np.random.rand(200)
y = (x * 2) ** 2 + 0.2 * np.random.randn(200)
plt.figure()
plt.scatter(x,y)
plt.show()
위의 코드를 실행하면 아래와 같은 차트를 볼 수 있습니다. 산점도의 점들의 경향을 보면약간 아래쪽으로 휘어진 형태로선형의 관계를 가지는 데이터가 아님을 알 수 있습니다.
그럼 x, y를 하나의 데이터 셋으로 합친 뒤 회귀분석을 수행하겠습니다.
import pandas as pd
import statsmodels.formula.api as sm
from statsmodels.sandbox.regression.predstd import wls_prediction_std
# 하나의 data frame으로 병합
df = pd.concat([pd.DataFrame(x), pd.DataFrame(y)], axis=1)
df.columns=['X','Y']
# 회귀분석 수행
mdl = sm.ols(formula='Y~X', data=df)
# 회귀분석 결과에서 잔차만 추출
resid = mdl.fit().resid
위의 주어진 데이터를 바탕으로 회귀분석을 수행하고 그에 따른 잔차를 얻어냈습니다. 잔차의 정규성 검정 방법을 두가지로 해볼 수 있는데 QQ-Plot을 그려서 일직선상에 존재하는지를 확인할 수 있으며 또는 shapiro 검정을 통해서 확인할 수도 있습니다.
먼저 Q-Q plot을 그려서 정규성을 확인해보겠습니다.
from scipy.stats import probplot
plt.figure()
probplot(resid, plot=plt)
plt.show()
위의 코드를 수행하면 다음의 결과를 얻을 수 있습니다.
직선상에 가지런히 놓이지 않았으나 좀 애매하네요. 다음은 sharpiro 검정을 수행하여 결과를 보겠습니다.
from scipy import stats
stats.shapiro(resid)
수행 결과를 보면 첫번째 값은 검정통계량, 두번째 값은 p-value입니다. sharpiro 검정의 경우 귀무가설이 정규분포를 따른다는 것이라 p-value가 0.05보다 작으므로 귀무가설을 기각, 즉 데이터는 정규성을 만족한다고 볼 수 없습니다. 그외에 Anderson-Darling test 나 Kolmogorov-sSmirnov test 등이 있으며 극단적으로 치우친 경우에는 Boxplot으로도 정규성을 확인할 수 있습니다.
'Data Analysis > Python' 카테고리의 다른 글
[Python] 업무 자동화 - 2 : Python으로 Naver 이메일 보내기 (2) | 2020.07.29 |
---|---|
[Python] 업무자동화 - 1 : Python으로 Naver 이메일 보내기 (0) | 2020.07.17 |
[Python] K-means Clustering (0) | 2020.01.23 |
[Python] 다중 회귀 분석(Multiple Linear Regression) (0) | 2019.05.19 |
Python : Data Handling(수정) (0) | 2015.12.10 |
댓글