본문 바로가기
[업무 지식]/Statistics

[Mann-Whitney U] 비모수 검정

by 에디터 윤슬 2024. 12. 10.

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()