import numpy as npimport pandas as pdfrom scipy import statsnp.random.seed(42)# 두 그룹의 연봉 데이터group_a = np.random.normal(4500, 800, 50) # A팀 연봉group_b = np.random.normal(4800, 900, 50) # B팀 연봉# H0: A팀과 B팀의 평균 연봉은 같다# H1: A팀과 B팀의 평균 연봉은 다르다# 독립표본 t-testt_stat, p_value = stats.ttest_ind(group_a, group_b)print(f"t-통계량: {t_stat:.3f}")print(f"p-value: {p_value:.4f}")if p_value < 0.05: print("→ 귀무가설 기각: 두 그룹의 평균 연봉에 유의미한 차이가 있습니다")else: print("→ 귀무가설 기각 실패: 두 그룹의 평균 연봉에 유의미한 차이가 없습니다")# 효과 크기 (Cohen's d)pooled_std = np.sqrt((group_a.std()**2 + group_b.std()**2) / 2)cohens_d = (group_b.mean() - group_a.mean()) / pooled_stdprint(f"Cohen's d: {cohens_d:.3f}")# |d| < 0.2: 작은 효과, 0.2~0.8: 중간 효과, > 0.8: 큰 효과
# 교육 전후 성과 비교before = np.random.normal(70, 10, 30)after = before + np.random.normal(5, 8, 30) # 평균 5점 향상# H0: 교육 전후 성과에 차이가 없다t_stat, p_value = stats.ttest_rel(before, after)print(f"대응표본 t-test p-value: {p_value:.4f}")print(f"평균 변화: {(after - before).mean():.1f}점")
# 세 부서의 성과 점수 비교np.random.seed(42)dev_scores = np.random.normal(78, 10, 40)sales_scores = np.random.normal(72, 12, 40)mkt_scores = np.random.normal(75, 11, 40)# 일원배치 ANOVA# H0: 세 부서의 평균 성과 점수는 같다f_stat, p_value = stats.f_oneway(dev_scores, sales_scores, mkt_scores)print(f"F-통계량: {f_stat:.3f}")print(f"p-value: {p_value:.4f}")if p_value < 0.05: print("→ 적어도 하나의 부서 평균이 다릅니다") # 사후검정 (Tukey HSD)으로 어떤 쌍이 다른지 확인 from scipy.stats import tukey_hsd result = tukey_hsd(dev_scores, sales_scores, mkt_scores) print(result)else: print("→ 세 부서의 평균 성과에 유의미한 차이가 없습니다")
ANOVA는 “차이가 있는지”만 알려줍니다. “어떤 그룹 간에 차이가 있는지”는 사후검정(Tukey HSD, Bonferroni 등)으로 확인해야 합니다.