파이썬) 비모수적 검정 방법들 (+부호검정, 순위합검정, 부호순위합검정)
통계적 검정에서 모집단의 모수에 대한 검정은 모수적 검정 방법과 비모수적 검정 방법(non-parametric test)이 있다. 모수적 검정방법은 모집단의 분포에 대해 가정을 하고 검정을 한다. 반면, 비모수적 검정 방법은 자료가 추출된 모집단의 분포에 대해 아무런 제약을 가하지 않고 검정을 실시한다. 비모수적 검정방법의 가설은 비교하고자 하는 그룹들이 '분포의 형태가 동일한지' 또는 '분포의 형태가 동일하지 않은지'와 같이 분포의 형태에 대해 설정한다.
비모수적 검정 방법은 다음과 같은 경우에 사용한다.
- 관측된 자료가 특정분포를 따른다고 가정할 수 없는 경우.
- 관측된 자료의 수가 30개 미만으로 적은 경우.
- 자료가 개체간의 서열관계를 나타내는 경우.
비모수적 검정방법은 관측값의 절대적인 크기에 의존하지 않는 관측값들의 순위나 두 관측값 차이의 부호 등을 이용해 검정한다. 비모수적 검정방법으로는 부호검정(sign test), 윌콕슨의 순위합검정(rank sum test), 윌콕슨의 부호순위합검정(Wilcoxon signed rank test), 만-위트니의 U검정, 런검정(run test), 스피어만의 순위상관계수가 있다.
부호검정(sign test)이란?
부호검정은 두 표본들의 분포가 동일한지 여부를 검정하는 비모수적 검정방법이다. 부호검정은 +혹은 - 부호가 나올 확률 p를 0.5로 갖는 이항 부호검정(Binominal sign test)라고도 불린다. 이 검정 방법은 관측치의 플러스와 마이너스 부호의 방향에 기반하며, 관측치의 수치에 기반하지 않는다.
부호검정의 가정은 다음과 같다.
- 데이터의 분포는 정규분포를 따를 필요가 없다.
- 서로 다른 모집단이나 동일한 모집단으로부터 나온 2개의 표본이 필요하다.
- 2개의 표본이 동일한 모집단에서 나왔다면, 'before-after' sample과 같이 짝 지어진 샘플이어야 한다.
이 검정 방법은 짝 지어진 관찰치들끼리 비교하여 위(+)인지 아래(-)인지만 검증하고 그 쌍의 차이를 측정하지는 않기 때문에 약한 검정 방법으로 본다. 반면, 이 방법은 최소한의 가정만을 사용하기 때문에 모수적 가정이 잘못되어 생기는 오류의 가능성이 적고, 부호에 기초한 방법이기 때문에 이상치에 민감하지 않다는 장점도 있다.
하나의 샘플로 부호검정을 하는 경우, 귀무가설은 "두 집단의 분포는 차이가 없다 (동일하다)"이다. 이 검정방법은 one sample t-test의 대안법(alternative)이다. 모집단의 중위수(평균 또는 중앙값)와 표본의 관측치를 서로 빼서 나온 값이 양수이면 (+), 음수이면 (-)로 부호를 계산한다.
짝 지어진 샘플로 부호검정을 하는 경우, 귀무가설은 "두 집단의 분포는 차이가 없다 (동일하다)" 이다. 이 검정방법은 independent two sample t-test 혹은 paired t-test의 대안법이다. 짝 지어진 샘플들의 값을 빼서 나온 값이 양수이면 (+), 음수이면 (-)로 부호를 계산한다.
부호검정의 과정은 다음과 같다.
- 주어진 분포에 대해 플러스(+)와 마이너스(-) 부호를 계산한다. 계산한 값이 0인 경우는 0으로 입력한다.
- 0으로 입력한 경우는 제외하고, 전체 부호들의 개수를 n으로 적는다. 성공횟수를 x, 성공확률을 p로 놓는다. 부호검정의 경우 p는 0.5이다. 즉, 성공확률과 실패확률이 동일하다.
- 검정하고자 하는 대립가설을 설정한다.
- 모집단과 표본집단의 분포는 차이가 있다 (H1 :M ≠ M0)
- 표본 집단의 중위값이 더 작다 (H1 : M > M0)
- 표본 집단의 중위값이 더 크다 (H1 : M < M0)
- p값을 구하고, 유의수준과 비교해서 귀무가설을 채택할 것인지 대립가설을 채택할 것인지를 판단한다. 일반적으로 유의수준은 5% 혹은 1%로 정한다.
부호검정 예제
파이썬의 numpy, pandas, math 라이브러리를 사용해서 부호검정 예제를 진행해 보았다. set1은 휴가 전의 생산성을 나열한 리스트이고, set2는 휴가 후의 생산성을 나열한 리스트이다. 두 리스트는 전후 관계로 짝지어진 데이터이다. numpy를 사용하여 두 리스트를 array로 만들고, 부호를 계산했다.
부호를 계산한 결과와 데이터를 pandas의 DataFrame 함수를 사용해 데이터프레임으로 정리하였다. 데이터프레임에 head함수를 사용하면 지정한 개수만큼의 행들을 확인할 수 있다. 여기서 (+)의 개수를 x로 놓고, 0을 제외한 (+)와 (-)의 개수의 합을 n으로 놓는다.
파이썬 math 라이브러리에는 팩토리얼(factorial)을 계산할 수 있는 함수가 있다. 팩토리얼 함수를 활용해서 해당 조건일 때의 p-value를 계산할 수 있다. 일반적으로 n이 30 이하이면 이항분포표를 기준으로 검정하고, 30 초과이면 근사 정규분포로 검정한다.
오른쪽 검정 기준으로 (+)가 12이상일 때의 p-value는 0.252로 유의수준 0.05의 기각역 안으로 들어오지 못 했다. 이에 따라 대립가설을 기각하고 귀무가설을 채택한다. 결론은 "휴가 후의 생산량이 휴가 전보다 더 크지 않다"이다.
윌콕슨 순위합검정(Wilcoxon rank sum test)이란?
윌콕슨 순위합검정 역시 모집단의 분포를 모르는 경우, 시행하는 비모수적 검정방법이다. 이 검정방법은 독립적인 두 표본으로 검정하며, 두 표본의 모집단의 중앙값이 동일한지를 검정한다. 이에 따라 귀무가설은 "두 표본의 중앙값은 차이가 없다"이고, 대립가설은 "두 표본의 중앙값은 차이가 있다"이다. 이 검정은 만-위트니 U검정(Mann-Whitney U-test)와 일치하며, independent two sample t-test의 대안법이다.
계산은 두 표본의 결과를 오름차순으로 정렬하고 순위를 부여 한다. 순위 부여 시 결과가 같으면 해당 순위의 평균값을 동일하게 적용한다. 그리고 표본의 순위들을 각각 합한다. 이 표본들의 순위합과 표본들의 개수를 사용하여 검정통계량을 계산하고 p-value를 확인하여 어떤 가설을 채택할 것인지 판단한다.
파이썬의 scipy 모듈이 ranksums와 mannwhitneyu함수를 제공하고 있어 검정 통계량과 p-value를 간단하게 얻을 수 있다. (from scipy.stats import ranksums, mannwhitneyu)
부호순위합검정(Wilcoxon signed-rank test)이란?
이 검정방법은 짝지어진 두 표본으로 검정하며, 두 표본의 중앙값이 동일한지를 검정한다. 이에 따라 귀무가설은 "두 표본의 중앙값은 차이가 없다"이고, 대립가설은 "두 표본의 중앙값은 차이가 있다"이다. 이 검정은 paired t-test의 대안법이다.
계산은 두 표본들의 값의 차이의 부호와 절대값을 계산한다. 부호검정 때와 마찬가지로, 값이 0인 경우는 제외하고 샘플 사이즈를 정의한다. 순위합검정 때와 마찬가지로, 두 표본들을 합치고 표본들의 값의 차이의 절대값을 오름차순으로 배열한 후 순위를 부여한다. (+) 부호인 것들의 순위합, (-) 부호인 것들의 순위합, 표본들의 개수를 사용하여 검정통계량을 계산하고 p-value를 확인하여 어떤 가설을 채택할 것인지 판단한다.
파이썬의 scipy 모듈이 wilcoxon함수를 제공하고 있어 검정 통계량과 p-value를 간단하게 얻을 수 있다. (from scipy.stats import wilcoxon)
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
[참고문헌]
윤종식, ADsP 데이터 분석 준전문가 (부산: (주)데이터에듀, 2021), 296
"Sign Test." Complete Dissertation by Statistics solutions. https://www.statisticssolutions.com/free-resources/directory-of-statistical-analyses/sign-test/
"Sign Test: Step by Step Calculation." Statistics How To. https://www.statisticshowto.com/sign-test/
"scipy.stats.ranksums." Scipy.org. https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ranksums.html?highlight=rank%20sums#scipy.stats.ranksums
"scipy.stats.wilcoxon." Scipy.org. https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html?highlight=sign%20rank