데이터를 기반으로

정규성 검정(Normality Test)(3) - 통계적 검정(Kolmogorov-smirnov test) 본문

통계/검정

정규성 검정(Normality Test)(3) - 통계적 검정(Kolmogorov-smirnov test)

이노후 2023. 9. 10. 23:23
728x90
반응형

저번 글에 이어서 2번째 통계적 검정법인 'Kolmogorov-smirnov test'에 대해서 정리를 하고자 한다.

(줄여서 KS-Test라고 부르기도 한다.)

 

먼저, 해당 검정법은 정규분포와 해당 변수의 분포를 비교해서 얼마나 차이가 많이 나는지 비교하는 방법으로 진행된다.

 

좀 더 자세하게 말하면 정규분의 누적분포와 검정하고자 하는 변수의 누적분포를 서로 비교하는 방법이다.

 

해당 검정을 진행하기 위한 조건 및 권장 사항에 대해서 확인하면 다음과 같다.

 

1. N은 50개 이상인 경우에 권장한다.

2. 비모수 검정이기에 분포에 대한 가정이 필요없다.

3. 연속형 변수에 적합하다.

 

해당 검정법의 원래 목적은 2변수에 대한 누적분포를 서로 비교하는 것인데, 현시대에 많은 통계 패키지 및 Tool 들이 옵션값이 정규분포를 두어 정규분포와 비교하여 정규성 검정을 가능하게 하는 방식으로 진행되고 있다.

 

바로 코드로 진행을 하면 아래와 같다.

뭔가 이상한 점이 보인다. norm_data와 norm_data_5가 동일한 정규분포인데, p-value 값을 보면 norm_data는 0.9 로 나오고, norm_data_5는 0.0 의 값이 나오는 것을 볼 수 있다.

 

둘 다 정규분포인데 어떤 것만 norm_data 는 정규성을 만족하고 norm_data_5 는 정규성을 만족하지 않는 것이다.

 

왜 동일한 정규 분포인데 이렇게 다른 결과 값이 나오는 지 이해가 안되는 상황이었다.

 

우선 이곳 저곳 레퍼런스들을 찾아보았다.

 

첫 번째로 우리가 위 코드에서 사용했던 함수인 scipy.stats.kstest 의 documentation 을 직접 찾아보았다.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html

 

scipy.stats.kstest — SciPy v1.11.2 Manual

If array_like, it should be a 1-D array of observations of random variables, and the two-sample test is performed (and rvs must be array_like). If a callable, that callable is used to calculate the cdf. If a string, it should be the name of a distribution

docs.scipy.org

cdf 인자 값에 대해서 보면 텍스트로 지정한 경우 일치하는 분포를 비교한다는 설명이 나와있다.

 

우리는 'norm' 옵션을 지정해주었기에 위 파란 글씨로 되어 있는 하이퍼링크로 연결된 scipy.stats 를 클릭해보았다.

 

직접 검색 해보면 정규 연속 확률 변수에 의거한 즉, 정규 분포를 의미하는 듯 하다.

 

뭔가 합리적인 의심은 정규 분포가 아닌 표준 정규 분포로 비교하는 듯한 느낌을 받았다.

 

하여 직접 소스코드 내부를 뜯어서 살펴보기로 했다.

 

 

해당 경로의 파일들을 직접 확인해본 결과 'stats.kstest' 함수는  '_stats_py.py' 파일에서 실행되는 것을 알 수 있었다.

( 일부러 옵션 값에 이상한 값을 넣은 뒤 에러가 뜨게 만들어 직접 함수가 호출하는 경로를 탐색해서 알아본 결과다.)

 

Indeed, the p-value is lower than our threshold of 0.05, so we reject the null hypothesis in favor of the default "two-sided" alternative: the data are *not* distributed according to the standard normal.

When testing random variates from the standard normal distribution, we expect the data to be consistent with the null hypothesis most of the time.

 

위 글귀는 주석처리되어 있던 부분 중 한 부분인데 "the standard normal"을 비교한다는 말이 보였다. 하지만, 해당 부분이 명확하게 표준 정규 분포를 사용하고 있다고 말하는 것으로 보인다.

 

그래서, 직접 테스트를 해보았다.

 

위는 min-max 스케일링을 진행했고, 아래는 z-score 정규화를 진행해보았다.

 

결론은 위 결과와 같이 정규화된 데이터에만 정규성을 만족하는 값을 뱉어내는 것을 확인할 수 있었다.

 

이전에 seaborn 내재 데이터인 mpg 데이터셋의 acceleration 컬럼이다.

해당 분포를 보면 정규분포스럽지만 그냥 kstest 함수를 돌리면 p-value가 0.0이 나온다.

 

이것을 위 코드처럼 정규화헤서 진행하면 0.24의 값을 보여주며 정규성을 만족하는 것을 볼 수 있다.

 

혹시, 해당 정규화가 모든 부분에 정규성을 만족한다고 말하는 건지 확인해보자.

 

 

역시 안되는 것은 안되는 것이다.

 

이로써 kstest 함수는 꼭 정규화를 진행하고 테스트해야하는 것을 알 수 있게되었다.

(수 많은 블로그 및 많은 레퍼런스들이 그냥 사용하고 있는 것을 보고 충격받았다...)

 

결론!!

kstest 에 cdf 옵션에 'norm' 으로 설정하면 정규분포가 아닌 표준 정규 분포와의 누적 분포를 비교하기에, 오류가 발생할 수 있으니 이점을 유의하자!!

728x90
반응형