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
'공부 > 통계학' 카테고리의 다른 글
Forward feature selection (전진선택법) python (0) | 2022.01.12 |
---|---|
VIF (분산확장요인, python) (0) | 2022.01.11 |
웰치의 t 검정 : welch's t test (파이썬) (2) | 2022.01.11 |
등분산 검정 (파이썬) (0) | 2022.01.11 |
정규성 검정 (Python) (0) | 2022.01.11 |
댓글