본 post는 국가생명연구자원정보센터(KOBIC) 주관 인사이트마이닝 이부일 CEO의 Wilcoxons Rank Sum Test with python을 정리한 내용입니다.
Intro
Python을 이용하여 Wilcoxons Rank Sum Test with python 수행과정을 알아봅니다.
언제 사용하는가?
Wilcoxons Rank Sum Test with python은 두 개의 독립적인 모집단의 평균이 같은지, 다른지, 같지 않은지를 분석하는 방법입니다. 두 개이 모집단 중에서 하나의 모집단이라도 정규성 가정이 깨졌을 때, 또는 모집단의 분포에 대한 가정을 할 수 없을 때 사용합니다.
가설 세우기
- 귀무가설 (Null Hypothesis, H0)
- 성별(F, M)에 따라 혈압에 차이가 없습니다.
- 대립가설 (Alternative Hypothesis, H1 or HA)
- 성별(F, M)에 따라 혈압에 차이가 있습니다.
- 성별(F, M)에 따라 혈압에 차이가 있습니다.
Wilcoxons Rank Sum Test
- 1단계: 정규성 검정(Normality Test)
- 귀무가설: 정규분포를 따릅니다.
- 대립가설: 정규분포를 따르지 않습니다.
- n < 5,000: Shapiro-Wilk Normality Test
- n >= 5,000: Anderson-Darling Normality Test
- 2단계: Wilcoxons Rank Sum Test
- 혈압을 기준으로 오름차순으로 정렬합니다.
- 정렬된 혈압에 순위(rank)를 매깁니다. 참고로 동점이 있는 경우에는 평균 순위를 사용합니다.
- 성별로 순위의 합계를 구한 뒤 차이가 있는지 비교합니다.
실습
- 가설 설정
- 귀무가설: 성별(F, M)에 따라 혈압에 차이가 없습니다.
- 대립가설: 성별(F, M)에 따라 혈압에 차이가 있습니다.
데이터 로딩
https://www.edwith.org/python-data-analysis-2023/lecture/1475046
- 분석 1단계: 정규성 검정(Normality Test)
- 귀무가설: 정규분포를 따릅니다.
- 대립가설: 정규분포를 따르지 않습니다.
- n < 5,000 : Shapito-Wilk Normality Test (shapiro(data.variable))
- n >= 5,000 : Anderson-Darling Normality Test (anderson(data.variable))
- shapiro normality test 결과 female의 유의확률(p-value)가 0.337로 정규성 가정을 만족하고, male의 유의확률(p-value)가 0.003으로 정규성 가정을 만족하지 못합니다.
정규성 검정
https://www.edwith.org/python-data-analysis-2023/lecture/1475046
- 분석 2단계: Wilcoxon’s rank sum test
- 귀무가설: 성별(F, M)에 따라 혈압에 차이가 없습니다.
- 대립가설: 성별(F, M)에 따라 혈압에 차이가 있습니다.
Wilcoxon’s rank sum test
https://www.edwith.org/python-data-analysis-2023/lecture/1475046
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
import scipy.stats as stats
health = pd.read_excel(
io = '04health.xlsx',
sheet_name = 0
)
print(health)
# Analysis I: Normality Test
# n < 5,000 -> Shapiro-Wilk Normality Test
# female
female_normality = stats.shapiro(health.loc[health['gender'] == 'F', 'hypertension'])
print(female_normality)
# male
male_normality = stats.shapiro(health.loc[health['gender'] == 'M', 'hypertension'])
print(male_normality)
# Analysis II: Wilcoxon's rank sum test
stats.wilcoxon(
health.loc[health['gender'] == 'F', 'hypertension'],
health.loc[health['gender'] == 'M', 'hypertension'],
alternative = 'two-sided'
)
# 유의확률(0.212) > 유의수준(0.05)이므로 귀무가설을 기각하지 못합니다. 즉, 성별(F, M)에 따라 혈압에 통계적으로 유의한 차이가 없습니다.
Take Home Message
Wilcoxon’s rank sum test 이론을 학습하고 Google colab에서 실습해 보았습니다.