[업무 지식]/Statistics
[Mann-Whitney U] 비모수 검정
에디터 윤슬
2024. 12. 10. 20:25
Shapiro-Wilk 정규성 확인
# t-검정 가정
#1. 종속변수는 연속형이고 정규분포를 따라야 함 -> shapiro-Wilk로 확인 / Q-Q플롯으로 시각적 확인
#2. 등분산성 검정 -> Levene 검정
#3. 독립성이어야 함 -> 남성, 여성 표본 추출로 해결
# {'Male': 0, 'Female': 1}
map_target = stat_df['Gender'].unique()
mapping = {value: idx for idx, value in enumerate(map_target)}
stat_df['Gender'] = stat_df['Gender'].map(mapping)
# shapiro-Wilk 정규성 확인
print('귀무가설:', '''
데이터가 정규분포에서 추출되었다''')
print('대립가설:', '''
데이터가 정규분포에서 추출되지 않았다\n''')
from scipy.stats import shapiro
male_rating = stat_df[stat_df['Gender'] == 0]['Review Rating']
female_rating = stat_df[stat_df['Gender'] == 1]['Review Rating']
shapiro_male = shapiro(male_rating)
shapiro_female = shapiro(female_rating)
print(f"male: statistic={shapiro_male.statistic}, p-value={shapiro_male.pvalue}")
print(f"female: statistic={shapiro_female.statistic}, p-value={shapiro_female.pvalue}")
if shapiro_male.pvalue > 0.05 and shapiro_female.pvalue > 0.05:
print("두 그룹 모두 정규성을 만족합니다.")
else:
print("정규성을 만족하지 않는 그룹이 있습니다.")
귀무가설:
데이터가 정규분포에서 추출되었다
대립가설:
데이터가 정규분포에서 추출되지 않았다
male: statistic=0.9555222262872358, p-value=1.0195406783816911e-27
female: statistic=0.9552682713863568, p-value=4.418824732029895e-19
정규성을 만족하지 않는 그룹이 있습니다.
- 정규성 시각화
# 정규성 확인 시각화
from scipy.stats import probplot
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
probplot(male_rating, dist = 'norm', rvalue=True, plot=ax[0])
ax[0].set_title('Male rating_Probplot for Normal Distribution')
probplot(female_rating, dist = 'norm', rvalue=True, plot=ax[1])
ax[1].set_title('Female rating_Probplot for Normal Distribution')
plt.tight_layout()
plt.show()
Levene 등분산성 검정
# Levene 등분산성 검정
from scipy.stats import levene
print('귀무가설:', '''
등분산성을 만족합니다''')
print('대립가설:', '''
등분산성을 만족하지 않습니다\n''')
statistic, pvalue = levene(male_rating, female_rating, center='trimmed', proportiontocut=0.05)
print(f'levene statistic: {statistic}')
print(f'p-value: {pvalue}')
if pvalue > 0.05:
print('\n귀무가설 채택: 등분산성을 만족합니다')
else:
print('대립가설 채택: 등분산성을 만족하지 않습니다')
귀무가설:
동일한 분산을 가진 모집단에서 나왔다
대립가설:
적어도 하나의 샘플이 다른 분산을 가진 모집단에서 나왔다
levene statistic: 0.26425307064731174
p-value: 0.6072455396866485
귀무가설 채택: 등분산성을 만족합니다
Mann-Whitney U Test 검정
# 등분산성은 만족하나, 정규성은 만족하지 않는다.
# shapiro 검정을 통해 정규성을 만족하지 않는 구간이 있음을 확인
# 비모수 검정 Mann-Whitney U Test 진행
print('귀무가설:', '''
두 샘플의 분포가 동일하다''')
print('대립가설:', '''
남성의 평점이 여성의 평점보다 작다\n''')
from scipy.stats import mannwhitneyu
statistic, pvalue = mannwhitneyu(male_rating, female_rating, alternative = 'less', method = 'auto')
print(f'mann-whitney statistic: {statistic}')
print(f'p-value: {pvalue}')
if pvalue > 0.05:
print('귀무가설 채택: 두 샘플의 분포는 동일합니다')
else:
print('대립가설 채택: 두 샘플의 분포는 다릅니다')
귀무가설:
두 샘플의 분포가 동일하다
대립가설:
남성의 평점이 여성의 평점보다 작다
mann-whitney statistic: 1671805.5
p-value: 0.6975635571918202
귀무가설 채택: 두 샘플의 분포는 동일합니다
시각화
# 시각화로 확인
plt.figure(figsize=(12, 6))
sns.histplot(male_rating, color="blue", label="Male", kde=True)
sns.histplot(female_rating, color="orange", label="Female", kde=True)
plt.legend()
plt.title("Histogram of Ratings by Gender")
plt.show()