사후분석 :: Python 기초 통계 - mindscale
Skip to content

사후분석

사후분석(post hoc)

  • ANOVA 검증 결과 유의미하다는 결론을 얻었을 때, 구체적으로 어떤 수준(들)에서 평균 차이가 나는지를 검증하는 방법
  • 연구자의 사전 가설(아이디어)없이 ANOVA를 시행한 경우, 탐색적으로 평균 차이가 나는 수준(집단)을 살펴보기 위해 시행하는 방법
  • 조합 가능한 모든 쌍에 대해 비교를 하므로 과잉검증으로 인한 FWER 증가

FWER

  • Familywise Error Rate: 여러 개의 가설 검정을 할 때 적어도 하나의 가설에서 1종 오류가 발생할 가능성
  • 가설검정을 많이 할 수록 FWER은 증가
    • 유의수준 5%에서 가설 검정을 1번 할 때, 1종 오류가 발생하지 않을 확률은 95%. FWER = 100% - 95% = 5%
    • 가설검정을 2번했을 때, 2번 모두 1종 오류가 발생하지 않을 확률은 95% $\times$ 95% = 90.25%. FWER = 9.75%
    • 가설검정을 3번했을 때, 3번 모두 1종 오류가 발생하지 않을 확률은 95% $\times$ 95% $\times$ 95% = 85.74%. FWER = 14.26%

대표적인 사후분석 방법

유의수준을 보정하여 FWER을 0.05로 고정시킴

  • 피셔의 LSD
  • 봉페로니 교정
  • 투키의 HSD
  • 셰페의 방법

피셔의 LSD는 실제로 보정을 하지 않는 방법이므로 쓰지 않는다. 셰페의 방법은 반대로 지나치게 보수적이어서 잘 쓰지 않는다. 여기서는 널리 쓰이는 봉페로니 교정과 투키의 HSD를 소개한다.

예제 데이터를 연다:

import pandas as pd

df = pd.read_csv('PlantGrowth.csv')

사후분석을 위한 준비를 한다:

from statsmodels.sandbox.stats.multicomp import MultiComparison
import scipy.stats

comp = MultiComparison(df.weight, df.group)

봉페로니 교정

  • Bonferroni correction
  • 모든 집단을 짝지어 t-test
  • 짝지어 비교를 3번 하면, p값을 3배
  • FWER이 중간 정도
result = comp.allpairtest(scipy.stats.ttest_ind, method='bonf')
result[0]
Test Multiple Comparison ttest_ind FWER=0.05 method=bonf alphacSidak=0.02, alphacBonf=0.017
group1 group2 stat pval pval_corr reject
ctrl trt1 1.1913 0.249 0.7471 False
ctrl trt2 -2.134 0.0469 0.1406 False
trt1 trt2 -3.0101 0.0075 0.0226 True

trt1 수준과 trt2 수준 간의 평균 차이만 유의미함 (p < 0.05)

투키의 HSD

  • Tuckey's Honestly Significant Difference = "진정으로 유의미한 차이"
  • FWER이 중간 정도
from statsmodels.stats.multicomp import pairwise_tukeyhsd

hsd = pairwise_tukeyhsd(df['weight'], df['group'], alpha=0.05)
hsd.summary()
Multiple Comparison of Means - Tukey HSD, FWER=0.05
group1 group2 meandiff p-adj lower upper reject
ctrl trt1 -0.371 0.3921 -1.0621 0.3201 False
ctrl trt2 0.494 0.198 -0.1971 1.1851 False
trt1 trt2 0.865 0.012 0.1739 1.5561 True

trt1 수준과 trt2 수준 간의 평균 차이만 유의미함 (p < 0.05)