본문 바로가기
공부/통계학

비모수 검정 : Mann-Witney U-test (만 - 위트니 U 검정, python)

by signature95 2022. 1. 11.
728x90
반응형

비모수 데이터에 대해 T-test와 비슷하게 사용할 수 있는 검정 방식으로 Mann-Witney U-test가 있다.

 

import pandas as pd

# 깃허브에 업로드된 데이터 불러오기 (보스턴 집값 데이터)
data = pd.read_csv("https://raw.githubusercontent.com/signature95/tistory/main/dataset/boston.csv")
data

출력 결과

	CRIM	ZN	INDUS	CHAS	NOX	RM	AGE	DIS	RAD	TAX	PTRATIO	B	LSTAT	MEDV	CAT. MEDV
0	0.00632	18.0	2.31	0	0.538	6.575	65.2	4.0900	1	296	15.3	396.90	4.98	24.0	0
1	0.02731	0.0	7.07	0	0.469	6.421	78.9	4.9671	2	242	17.8	396.90	9.14	21.6	0
2	0.02729	0.0	7.07	0	0.469	7.185	61.1	4.9671	2	242	17.8	392.83	4.03	34.7	1
3	0.03237	0.0	2.18	0	0.458	6.998	45.8	6.0622	3	222	18.7	394.63	2.94	33.4	1
4	0.06905	0.0	2.18	0	0.458	7.147	54.2	6.0622	3	222	18.7	396.90	5.33	36.2	1
...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...
501	0.06263	0.0	11.93	0	0.573	6.593	69.1	2.4786	1	273	21.0	391.99	9.67	22.4	0
502	0.04527	0.0	11.93	0	0.573	6.120	76.7	2.2875	1	273	21.0	396.90	9.08	20.6	0
503	0.06076	0.0	11.93	0	0.573	6.976	91.0	2.1675	1	273	21.0	396.90	5.64	23.9	0
504	0.10959	0.0	11.93	0	0.573	6.794	89.3	2.3889	1	273	21.0	393.45	6.48	22.0	0
505	0.04741	0.0	11.93	0	0.573	6.030	80.8	2.5050	1	273	21.0	396.90	7.88	11.9	0

여기서 CAT.MEDV는 본인 소유의 집 중앙값이 30000을 넘는지 아닌지에 대해 1(넘는경우),0(아닌경우)로 나뉘는 더미 변수이다.

그러므로 이번에는 비싼집과 저렴한 집의 TAX의 차이에 대해 한번 알아보도록 한다.

 

# 라이브러리 호출
from matplotlib import rc
import matplotlib.pyplot as plt
import seaborn as sns

rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

# 데이터
expensive = data[data['CAT. MEDV']==1]['TAX']
cheap = data[data['CAT. MEDV']==0]['TAX']

# 시각화
ax = sns.distplot(expensive, label=f"expensive 데이터의 재산세율 (분산 :{np.round(expensive.std(),3)})")
ax = sns.distplot(cheap, label=f"cheap 데이터의 재산세율 (분산 :{np.round(cheap.std(),3)})")
ax.lines[1].set_linestyle('--')
plt.legend(bbox_to_anchor=(1.0, .2))
plt.show()

출력 결과

 

정규성 검정

from scipy.stats import shapiro

# 정규성을 따른다는 귀무가설 기각
for i in [expensive, cheap]:
    print(shapiro(i))
    
>>>

ShapiroResult(statistic=0.7636128664016724, pvalue=2.6404572972538176e-10)
ShapiroResult(statistic=0.8148890733718872, pvalue=1.1400228041858011e-21)

정규성을 충족하지 못하기 때문에 비모수 검정을 통해 평균 차이를 확인한다.

from scipy.stats import mannwhitneyu

# 비모수 데이터에 대해 M-W U-test 진행
mannwhitneyu(expensive, cheap)

>>>

# 중앙값이 동일하다는 귀무가설 기각
MannwhitneyuResult(statistic=9278.0, pvalue=3.2554207741279565e-12)

마찬가지로 mann - witney U 검정에서도 단측과 양측검정을 수행할 수 있다.

 

(참고)

다음은 scipy의 stats 매서드 내 mannwitneyu에 대한 내용이다.

alternative : {'two-sided', 'less', 'greater'}, optional
    Defines the alternative hypothesis. Default is 'two-sided'. Let *F(u)* and *G(u)* be the cumulative distribution functions of the distributions underlying x and y, respectively. Then the following alternative hypotheses are available:
  • 'two-sided': the distributions are not equal, i.e. *F(u) ≠ G(u)* for at least one *u*.
  • 'less': the distribution underlying x is stochastically less than the distribution underlying y, i.e. *F(u) > G(u)* for all *u*.
  • 'greater': the distribution underlying x is stochastically greater than the distribution underlying y, i.e. *F(u) < G(u)* for all *u*.
728x90

댓글