정규성 검정
더 많은 작업
T-검정, 분산분석, 선형 회귀의 잔차 분석처럼 정규성을 가정하는 모수 검정을 쓰기 전에 그 가정이 성립하는지 확인하는 단계이다. 통계량으로 판정하는 검정(Shapiro-Wilk, Kolmogorov-Smirnov, Lilliefors, Anderson-Darling)과 그림으로 판단하는 방법(Q-Q plot, 정규 확률도, 히스토그램)을 함께 쓴다. 검정 결과에 따라 모수 검정을 쓸지 비모수 검정으로 바꿀지 정한다.
- 귀무가설 H0: 데이터는 정규 분포를 따른다.
- 대립가설 H1: 데이터는 정규 분포를 따르지 않는다.
- P-값이 유의수준(보통 0.05)보다 크면 H0를 기각하지 못하므로 정규성 가정을 받아들이고 분석을 진행한다. 일반적인 검정과 달리 "기각하지 못하는 것"이 분석자가 바라는 결과라는 점이 특징이다.
- H0를 기각하지 못했다는 것이 정규 분포임을 증명한 것은 아니다. 표본이 작으면 검정력이 낮아 정규성 이탈을 잡아내지 못할 수 있다.
Shapiro-Wilk 검정은 순서통계량에 가중치를 준 선형결합으로 W 통계량을 만든다. W는 0~1 사이 값이고 작을수록 정규성에서 벗어났다는 증거이다.
여기서 x(i)는 크기순으로 정렬한 i번째 값이고, ai는 정규 분포 순서통계량의 평균·분산·공분산에서 구한 상수이다.
Kolmogorov-Smirnov(K-S) 검정은 경험적 누적분포함수와 이론 누적분포함수 F의 최대 거리를 통계량으로 쓴다.
K-S 검정은 비교할 분포의 모수(평균·분산)가 미리 완전히 정해져 있어야 한다. 표본에서 평균과 분산을 추정해 넣으면 원래 임계값이 맞지 않으므로, 이를 보정한 것이 Lilliefors 검정이다.
Anderson-Darling 검정은 K-S 검정을 고친 것으로, 분포의 꼬리 부분에 더 큰 가중치를 준다. 통계량 A2가 임계값보다 크면 정규성을 기각한다.
Q-Q plot은 표본 분위수를 정규 분포의 이론 분위수에 대해 찍은 그림이다. 점들이 대각선 위에 거의 일직선으로 놓이면 정규성을 따른다고 본다. 양 끝이 직선에서 휘면 꼬리가 두껍거나 얇은 것이고, 한쪽으로 굽으면 왜도가 있는 것이다.
| 방법 | 통계량 | 특징 | R | Python |
|---|---|---|---|---|
| Shapiro-Wilk | W | 정규성 전용 검정. 비교 연구에서 검정력이 좋은 편이다. R은 표본 3~5000개만 받는다 | shapiro.test() |
scipy.stats.shapiro
|
| Kolmogorov-Smirnov | D | 분포 전반에 쓸 수 있으나 모수를 미리 알아야 한다. 분포 가운데에 더 민감하다 | ks.test() |
scipy.stats.kstest
|
| Lilliefors | D | 평균·분산을 표본에서 추정할 때의 K-S 검정 | nortest::lillie.test() |
statsmodels.stats.diagnostic.lilliefors
|
| Anderson-Darling | A2 | 꼬리에 가중치를 준다. 분포마다 임계값이 다르다 | nortest::ad.test() |
scipy.stats.anderson
|
| Q-Q plot | 그림 | 이탈의 모양(꼬리, 치우침)을 보여 준다. 판정은 주관적이다 | qqnorm(), qqline() |
scipy.stats.probplot
|
표본 크기에 따른 선택은 다음처럼 정리할 수 있다.
set.seed(42)
x <- rnorm(40, mean = 50, sd = 10)
shapiro.test(x) # Shapiro-Wilk
ks.test(x, "pnorm", mean = 50, sd = 10) # 모수를 아는 경우의 K-S
library(nortest)
lillie.test(x) # Lilliefors
ad.test(x) # Anderson-Darling
qqnorm(x); qqline(x) # Q-Q plot
import numpy as np
from scipy import stats
from statsmodels.stats.diagnostic import lilliefors
rng = np.random.default_rng(42)
x_norm = rng.normal(loc=50, scale=10, size=40) # 정규분포에서 뽑은 표본
x_skew = rng.exponential(scale=10, size=40) # 오른쪽으로 치우친 표본
for name, x in [("정규", x_norm), ("지수", x_skew)]:
w, p_sw = stats.shapiro(x)
d, p_lf = lilliefors(x, dist="norm")
ad = stats.anderson(x, dist="norm")
print(f"[{name}] Shapiro-Wilk W={w:.4f}, p={p_sw:.4f}")
print(f"[{name}] Lilliefors D={d:.4f}, p={p_lf:.4f}")
print(f"[{name}] Anderson-Darling A2={ad.statistic:.4f}, 5% 임계값={ad.critical_values[2]:.3f}")
실행 결과:
[정규] Shapiro-Wilk W=0.9867, p=0.9109
[정규] Lilliefors D=0.0790, p=0.7589
[정규] Anderson-Darling A2=0.2342, 5% 임계값=0.726
[지수] Shapiro-Wilk W=0.7961, p=0.0000
[지수] Lilliefors D=0.1695, p=0.0054
[지수] Anderson-Darling A2=1.9284, 5% 임계값=0.726
- 정규 표본은 세 검정 모두 p-값이 0.05보다 크고 A2도 5% 임계값보다 작으므로 정규성 가정을 기각하지 않는다. 모수 검정을 쓸 수 있다.
- 지수 분포 표본은 W가 작고 p-값이 0.05보다 작으며, A2가 임계값을 넘으므로 정규성을 기각한다. 변환을 하거나 비모수 검정으로 바꾼다.
- scipy의
anderson은 p-값 대신 유의수준별 임계값을 돌려준다(critical_values의 세 번째 값이 5%). 통계량과 임계값을 비교해 판정한다.
- 정규성 검정의 귀무가설은 "정규 분포를 따른다"이다. p-값이 유의수준보다 커야 정규성을 만족한다고 판단한다.
- K-S 검정은 모수를 아는 분포와 비교하는 검정이고, 모수를 추정해 쓰면 Lilliefors 보정을 쓴다. Anderson-Darling은 꼬리에 민감하다.
- 실기에서는 정규성 검정 결과를 근거로 t-검정·분산분석과 비모수 검정 중 하나를 고르고, 그 근거를 서술하는 흐름이 자주 쓰인다.
- Q-Q plot에서 점이 직선에서 벗어나는 모양으로 왜도와 꼬리 두께를 읽는 법을 익혀 둔다.
- NIST/SEMATECH e-Handbook of Statistical Methods, 7.2.1.3 Anderson-Darling and Shapiro-Wilk tests
- NIST/SEMATECH e-Handbook of Statistical Methods, 1.3.5.16 Kolmogorov-Smirnov Goodness-of-Fit Test
- NIST/SEMATECH e-Handbook of Statistical Methods, 1.3.5.14 Anderson-Darling Test
- NIST/SEMATECH e-Handbook of Statistical Methods, 1.3.3.24 Quantile-Quantile Plot
- Shapiro, S. S.; Wilk, M. B. (1965). An analysis of variance test for normality (complete samples). Biometrika 52(3-4), 591-611
- Lilliefors, H. W. (1967). On the Kolmogorov-Smirnov Test for Normality with Mean and Variance Unknown. JASA 62(318), 399-402
- R Documentation - shapiro.test
- CRAN - nortest reference manual
- SciPy - scipy.stats.shapiro
- statsmodels - lilliefors