정규성 검정은 통계학에서 중요한 개념 중 하나입니다. 학생분들이 정규성 검정에 대하여 자주 묻는 질문 중 하나가 “정규성 검정을 왜 하는가?“인 것 같아요. 오늘은 정규성 검정은 무엇이고, 왜 하는지, R과 Python에서는 어떻게 수행할 수 있는지 알아보겠습니다.
정규성 검정이란?
정규성 검정은 주어진 표본이 정규 분포를 따르는지를 검정하는 통계적 방법입니다.
정규성 검정을 하는 이유
많은 통계적 기법들은 데이터가 정규 분포를 따른다는 가정 하에 개발되었습니다. 정규성 검정을 하는 이유는 데이터 정규성을 가정한 통계 검정들의 결과가 믿을 수 있는지 없는지를 체크하는 가장 기본적인 체크방법이기 때문입니다.
데이터의 정규성을 가정한 검정 중 가장 대표적인 검정은 t 검정이 있죠. t 검정은 다음의 가정을 만족한다는 전제 하에 고안된 통계 검정 검정 방법입니다.
- 각 표본은 독립이며, 모평균이 \mu이고, 모분산이 \sigma^2인 정규분포를 따른다.
즉, 위의 가정을 만족한다면, t 검정통계량을 계산한 후에 통계량 값이 자유도가 n-1인 t 분포에서 얼마나 관찰하기 힘든 표본인지를 판단한 다음, 너무 보기 힘든 표본이라면 귀무가설을 기각 할 수 있다는 것이죠.
예를들어, t 검정 수행 후, 모평균이 3과 같다는 귀무가설을 기각한다는 통계적 의사결정을 내렸다고 합시다. 위와 같은 t 검정 방법이 잘 작동하기 위해서는 먼저 t 검정에서 가정하고 있는 조건 중 적어도 데이터가 정규분포를 따른다는 가정이 충족이 되었다는 것을 확인해야겠죠? 이 가정을 충족했는지를 검정하기 위해서 다시 새로운 통계적 검정을 수행하게 되는데, 이를 통칭해서 정규성 검정이라고 부릅니다.
정규성 검정의 종류
1 변수 데이터에 대한 정규성 검정으로 사용 가능한 검정들은 종류가 많습니다. 다만, 그 중 가장 대표적인 검정은 다음의 두 검정들입니다.
- 샤피로 윌크 검정 (Shapiro-Wilk test)
- 앤더슨 달링 검정 (Anderson-Darling test)
두 검정은 정규성을 검정하는 다른 여러 검정들 중에 검정력이 가장 높은 두 검정으로 알려져 있습니다.1
샤피로 윌크 검정 (Shapiro-Wilk test)
샤피로 윌크 검정에 대하여 간략히 알아보도록 하겠습니다. 샤피로 윌크 검정은 특히 표본 크기가 작은 경우를 처리하기 위해서 고안된 검정입니다.
샤피로 윌크 검정 귀무가설 vs. 대립가설
샤피로 윌크 검정의 귀무가설과 대립가설은 다음과 같습니다.
- 귀무가설: 데이터가 정규분포를 따른다.
- 대립가설: 데이터가 정규분포를 따르지 않는다.
샤피로 윌크 검정의 검정통계량
샤피로 윌크 검정의 검정통계량 W는 다음과 같이 정의됩니다.
W=\frac{\left(\sum_{i=1}^{n}a_{i}x_{(i)}\right)^{2}}{\sum_{i=1}^{n}(x_{i}-{\overline{x}})^{2}}
W 검정통계량의 다음과 같은 특성들은 알아두면 좋습니다.
- a_i 들은 표본 개수에 따라 미리 정해진 숫자들입니다. a_i들을 찾아볼 수 있는 샤피로 윌크 a_i 표가 존재합니다.
- x_{(i)} 들은 순위 표본을 의미합니다.
- 귀무가설이 참 이면, 이론적으로 1이 나오도록 설계되어 있습니다.
- W 값은 0에서 1사이의 값을 갖습니다.
- W 값이 0과 가까우면 가까울 수록 정규분포와는 다르게 분포되어 있음을 뜻합니다.
샤피로 윌크 검정 통계량의 직관적일 해석은 표본이 정규분포를 따른다는 가정하에서 모분산에 대한 추정을 표본 분산을 통하여 추정한 값 (분모 부분)과 순위 표본을 통해서 추정한 값 (분자 부분) 을 비교한 후 통계적 의사결정을 내린다라고 이해하시면 좋겠습니다.
앤더슨 달링 검정 (Anderson-Darling test)
앤더슨 달링 검정에 대하여 간략히 알아보도록 하겠습니다. 이 검정은 이론적인 누적분포함수와 데이터에서 추정할 수 있는 누적분포함수가 얼마나 비슷한 지 체크하여 통계적인 의사결정을 수행합니다.
앤더슨 달링 검정 귀무가설 vs. 대립가설
앤더슨 달링 검정의 귀무가설과 대립가설은 다음과 같습니다.
- 귀무가설: 데이터가 target 분포를 따른다.
- 대립가설: 데이터가 target 분포를 따르지 않는다.
앞에서 살펴본 샤피로 윌크 검정과 다른 점은 앤더슨 달링 검정은 꼭 데이터가 정규분포를 따르는지만 검정 할 수 있는 검정이 아니라는 점 입니다. 앤더슨 달링 검정의 target 분포를 정규분포로 설정하게 되면 정규성 검정이 되는 것이죠. 이러한 점에서 앤더슨 달링 검정은 샤피로 윌크 검정보다 좀 더 일반적인 검정이 가능합니다.
앤더슨 달링 검정의 검정통계량
앤더슨 달링 검정의 검정통계량 A^2는 다음과 같이 정의됩니다.
\begin{aligned} A^2 = -n - \sum_{i=1}^{n} &\frac{2i-1}{n} \left[\ln(F(Y_i)) \right. \\ &\left. + \ln \left(1-F(Y_{n+1-i})\right)\right] \end{aligned}
앤더슨 달링 검정통계량은 엄청 복잡합니다. 온전히 수식을 이해한다면 좋겠지만, 이번 포스팅에서는 아이디어만 잡고 가도록 하겠습니다. 이 검정통계량이 실제로 측정하고하는 것은 다음과 같은 값입니다.
{\displaystyle A^{2}=n\int _{-\infty }^{\infty }{\frac {(F_{n}(x)-F(x))^{2}}{F(x)\;(1-F(x))}}\,dF(x),}
이 값은 target 분포의 누적확률함수 F(x)와 데이터에서 추정된 경험적 누적분포함수 (Empirical CDF라고 부릅니다. 줄여서 ecdf) F_n(x) 과의 차이가 얼마나 나는지 거리를 측정한다고 생각하면 좋습니다. 즉, 이론적인 함수와 데이터로 추정한 함수 간의 거리가 멀면 멀수록 데이터가 target 분포를 따르지 않는다고 판단하죠. 즉, 귀무가설이 기각됩니다.
또한, 두 함수의 거리를 측정함에 있어서 앤더슨 달링 검정통계량은 꼬리부분에서의 차이를 좀 더 중요하게 생각합니다. 이러한 부분은 검정통계량에서 두 함수의 거리 차이를 측정하는 분자 부분을 분모 부분인 F(x)\left(1-F(x)\right)으로 나눠주는 것으로 알 수 있습니다.
정규성 검정 in R
앞에서 다룬 두 정규성 검정을 R에서는 어떻게 구현할 수 있는지 알아보도록 하겠습니다. 예제 데이터는 다음과 같으며, 검정의 유의수준은 5%로 통일하도록 하겠습니다.
# 예제 데이터
data <- c(5.7, 5.2, 4.8, 6.1, 5.5, 5.0, 5.3, 4.9, 5.6, 5.8)
샤피로 윌크 검정 – R
원래 샤피로 윌크 검정은 표본 크기가 작은 경우를 다루기 위해서 고안된 검정이었습니다. 하지만, 시간이 흐르고 현재 R에서는 표본 크기가 5천까지 샤피로 윌크 검정을 수행할 수 있도록 설정되었습니다. 샤피로 윌크 검정을 R에서 수행하는 방법은 너무 간단합니다. shapiro.test()
함수를 사용하면 됩니다.
# 샤피로-윌크 검정 수행
shapiro.test(data)
>> Shapiro-Wilk normality test
>>
>> data: data
>> W = 0.96967, p-value = 0.8878
위의 결과를 살펴보면 검정통계량 값 0.96967에 대응하는 p-value 값 0.8878이 반환되고, 따라서 유의수준 5%하에서 귀무가설을 기각할 수 없습니다. 즉, 주어진 데이터가 정규성을 만족한다는 판단을 내리게 되는 것이죠.
앤더슨 달링 검정 – R
앤더슨 달링 검정을 R에서 수행하기 위해서는 nortest
라는 패키지를 설치해야합니다. 정규성을 나타내는 normality의 앞 세글자를 딴 패키지라고 기억하시면 좋겠습니다.
install.packages("nortest")
패키지를 로딩하고, 앞에서 입력한 데이터를 ad.test()
함수에 넣으면 끝이 납니다.
library(nortest)
ad.test(data)
>> Anderson-Darling normality test
>>
>> data: data
>> A = 0.16031, p-value = 0.9232
검정 결과를 살펴보면, ad.test()
함수는 앞에서 살펴본 검정통계량 A^2를 A로 표현하고 있습니다. 검정통계량 값 0.16031에 대응하는 p-value는 0.9232로 나왔습니다. 따라서, 유의수준 5%하에서 귀무가설을 기각할 수 없습니다. 즉, 주어진 데이터가 정규성을 만족한다는 판단을 내리게 됩니다.
정규성 검정 in 파이썬
앞에서 다룬 두 정규성 검정을 파이썬에서는 어떻게 구현할 수 있는지 알아보도록 하겠습니다. 예제 데이터는 앞에서와 동일하게 설정합니다. 검정의 유의수준은 5%로 통일하도록 하겠습니다.
# 예제 데이터
data = [5.7, 5.2, 4.8, 6.1, 5.5, 5.0, 5.3, 4.9, 5.6, 5.8]
샤피로 윌크 검정 – 파이썬
샤피로 윌크 검정을 파이썬에서 수행하기 위해서 먼저 SciPy 패키지의 stat 모듈의 shapiro()
함수를 불러옵니다.
from scipy.stats import shapiro
print(shapiro(data))
>> ShapiroResult(statistic=0.9696720242500305, pvalue=0.8877878785133362)
결과를 살펴보면 앞에서 구한 R의 결과와 동일합니다. 검정통계량 값 0.96967에 대응하는 p-value 값 0.8878이 반환되고, 따라서 유의수준 5%하에서 귀무가설을 기각할 수 없습니다. 즉, 주어진 데이터가 정규성을 만족한다는 판단을 내리게 되는 것이죠.
앤더슨 달링 검정 – 파이썬
앤더슨 달링 검정을 파이썬에서 수행하기 위해서는 역시 SciPy 패키지의 stats 모듈에 있는 anderson()
함수를 불러옵니다.
from scipy.stats import anderson
result = anderson(data)
result
>> AndersonResult(statistic=0.1603088360674807,
>> critical_values=array([0.501, 0.57 , 0.684, 0.798, 0.95 ]),
>> significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
anderson() 함수는 p-value를 반환하는 대신, 유의수준에 대응하는 임계값을 제공합니다. 여기서는 5% 유의수준을 가정하고 있으므로, 대응하는 임계값은 0.684 입니다. 검정통계량 값 0.1603이 임계값보다 작으므로 귀무가설을 기각 할 수 없습니다. 즉, 주어진 데이터가 정규성을 만족한다는 판단을 내리게 됩니다.
오늘은 통계학에서 많이 사용되는 정규성 검정이란 무엇인지, 종류와 필요이유 등을 알아보았습니다. 통계와 관련한 지식들과 데이터 분석 꿀팁들과 알고 싶으신 분들은 슬기로운 통계생활 유튜브를 구독해주세요! 더 유용한 포스트로 찾아뵙겠습니다.🙂
- Razali, N. M., & Wah, Y. B. (2011). Power comparisons of shapiro-wilk, kolmogorov-smirnov, lilliefors and anderson-darling tests. Journal of statistical modeling and analytics, 2(1), 21-33. ↩︎