ANOVA 이후 사후 분석

Python으로 배우는 실험 설계

James Chapman

Curriculum Manager, DataCamp

사후 검정을 사용하는 시점

 

  • 유의미한 ANOVA 결과 이후
  • 집단 간 쌍별 차이 탐색

파란색 무대 커튼이 만화풍 손에 의해 걷히며, A·B·C·D로 표시된 네 개의 색깔 원이 선으로 연결된 네트워크가 드러납니다. 일부 연결에는 유의미한 차이를 나타내는 별표가, 나머지에는 비유의미 표시가 있습니다. 이 그림은 ANOVA가 전체 효과를 감지한 후 사후 검정이 어떤 집단 간에 차이가 있는지 밝혀주는 과정을 상징합니다.

Python으로 배우는 실험 설계

주요 사후 분석 방법

 

  • Tukey의 HSD (Honest Significant Difference)
    • 다중 비교에 강건함
    • 모든 집단 간 비교에 최적
  • Bonferroni 교정
    • 제1종 오류를 통제하기 위해 p값 조정
    • 특정 비교에 최적

John Tukey

Carlo Emilio Bonferroni

1 https://www.amphilsoc.org/item-detail/photograph-john-wilder-tukey 2 https://en.wikipedia.org/wiki/Carlo_Emilio_Bonferroni
Python으로 배우는 실험 설계

데이터셋: 마케팅 광고 캠페인

ad_campaigns
              Ad_Campaign  Click_Through_Rate
1300    Seasonal Discount        2.1659547732
1661          New Arrival        2.9409657365
2762       Loyalty Reward        3.2476777154
571     Seasonal Discount        3.3382186561
775     Seasonal Discount        1.7148876401
Python으로 배우는 실험 설계

피벗 테이블을 활용한 데이터 정리

pivot_table = ad_campaigns.pivot_table(values='Click_Through_Rate',
                                       index='Ad_Campaign',
                                       aggfunc="mean")
print(pivot_table)
                   Click_Through_Rate
Ad_Campaign                          
Loyalty Reward               2.792716
New Arrival                  3.013843
Seasonal Discount            2.518917
Python으로 배우는 실험 설계

ANOVA 수행

from scipy.stats import f_oneway
campaign_types = ['Seasonal Discount', 'New Arrival', 'Loyalty Reward']

groups = [ad_campaigns[ad_campaigns['Ad_Campaign'] == campaign]['Click_Through_Rate'] for campaign in campaign_types]
f_stat, p_val = f_oneway(*groups) print(p_val)
4.484124496940693e-134
Python으로 배우는 실험 설계

Tukey의 HSD 검정

from statsmodels.stats.multicomp import pairwise_tukeyhsd

tukey_results = pairwise_tukeyhsd(ad_campaigns['Click_Through_Rate'],
ad_campaigns['Ad_Campaign'],
alpha=0.05)
print(tukey_results)
         Multiple Comparison of Means - Tukey HSD, FWER=0.05          
===========================================================================
        group1             group2  meandiff  p-adj   lower    upper  reject
<hr />---------------------------------------------------------------------
Loyalty Reward        New Arrival    0.2211   0.0    0.176   0.2663    True
Loyalty Reward  Seasonal Discount   -0.2738   0.0  -0.3189  -0.2287    True
   New Arrival  Seasonal Discount   -0.4949   0.0  -0.5401  -0.4498    True
<hr />---------------------------------------------------------------------
Python으로 배우는 실험 설계

Bonferroni 교정 준비

from scipy.stats import ttest_ind
from statsmodels.sandbox.stats.multicomp import multipletests

p_values = []
comparisons = [('Seasonal Discount', 'New Arrival'), ('Seasonal Discount', 'Loyalty Reward'), ('New Arrival', 'Loyalty Reward')]
for comp in comparisons: group1 = ad_campaigns[ad_campaigns['Ad_Campaign'] == comp[0]]['Click_Through_Rate'] group2 = ad_campaigns[ad_campaigns['Ad_Campaign'] == comp[1]]['Click_Through_Rate']
t_stat, p_val = ttest_ind(group1, group2)
p_values.append(p_val)
Python으로 배우는 실험 설계

Bonferroni 교정 수행

p_adjusted = multipletests(p_values, alpha=0.05, method='bonferroni')

print(f"Adjusted P-values: {p_adjusted[1]}")
Adjusted P-values: [5.33634403e-133 2.17627991e-043 5.62590083e-029]
Python으로 배우는 실험 설계

연습해 봅시다!

Python으로 배우는 실험 설계

Preparing Video For Download...