분산분석 :: 통계 - mindscale
Skip to content

분산분석

분산분석

두 집단의 평균을 비교할 때는 t 검정을 쓰고, 3개 이상의 집단의 평균을 비교할 때는 분산 분석(Analysis of Variance, ANOVA)을 합니다. 두 집단의 경우에 분산분석을 해도 되는데, 그때는 t 검정과 결과가 똑같습니다.

분산 분석의 논리는 앞서 소개한 에타 제곱과 연결이 됩니다. 에타 제곱은 두 가지 방식으로 분산을 구합니다. 하나는 집단 차이에 의한 분산이고, 또 하나는 전체 분산이죠. 이 둘의 비율이 커질 수록 평균이 크게 다르다는 뜻입니다. 즉, 우리가 분산을 분석해보면 평균의 차이를 알 수가 있습니다.

분산분석도 분산을 두 가지 방식으로 구합니다. 하나는 집단 차이에 의한 분산이고, 또 하나는 집단 내의 분산입니다. 둘의 비율을 F라고 합니다. 이 F의 확률 분포를 이용해서 가설 검정을 할 수있습니다.

분산분석의 가설은 다음과 같습니다.

  • 귀무가설: 모든 집단의 평균이 같다
  • 대립가설: 어떤 집단의 평균이 다르다

p < 유의수준이면 귀무가설을 기각하고, 대립가설을 채택하게 됩니다. 이때 대립가설을 자세히 보시면 "어떤 집단의 평균이 다르다"입니다. 집단이 A, B, C가 있으면 A와 B가 다른지 B와 C가 다른지는 분산 분석으로 알 수 없습니다. 따라서, 이것은 사후 검정으로 확인하게 됩니다.

graph TD A[Levene의 등분산성 검정] A -->|p < 유의수준| C["이분산"] A -->|"p ≥ 유의수준"| B["등분산"] B --> 분산분석 C --> 분산분석 분산분석 -->|"p < 유의수준"| D["집단 간의 평균 차이가 통계적으로 유의"] 분산분석 -->|"p ≥ 유의수준"| E["결론을 유보"] D --> 사후검정

분산 분석은 집단별로 분산이 같을 때(등분산)와 집단 별로 분산이 다를 때(이분산) 계산 방법이 달라집니다. 그래서 먼저 등분산성 검정을 합니다.

등분산성 검정

pg.homoscedasticity(dv='price', group='model', data=df)
car::leveneTest(price ~ model, df)

등분산성 검정의 귀무가설은 "집단 별로 분산이 동일하다"입니다. p > 0.05이어서 귀무가설을 기각하지 못하면, 등분산이라고 가정하고 진행합니다. p < 0.05로 귀무가설을 기각하면 이분산을 가정하고 진행합니다.

# 분산 분석(등분산일 경우)
pg.anova(dv='price', between='model', data=df)

# 분산 분석(이분산일 경우)
pg.welch_anova(dv='price', between='model', data=df)
# 분산 분석(등분산일 경우)
oneway.test(price ~ model, df, var.equal=T)

# 분산 분석(이분산일 경우)
oneway.test(price ~ model, df, df, var.equal=F)

3집단 이상 비교

hr = pd.read_excel('hr.xlsx')
pg.homoscedasticity(dv= 'rating', group='job_level', data=hr)
pg.welch_anova(dv='rating', between='job_level', data=hr)

사후 검정

사후 검정(post-hoc test)은 간단합니다. 그냥 두 집단 씩 짝지어서 비교를 하는 것입니다. 즉, 집단이 A, B, C, D 4개가 있으면 다음과 같이 6번 비교를 하면 됩니다.

  • A - B
  • A - C
  • A - D
  • B - C
  • B - D
  • C - D

이것을 다중 비교(multiple comparison)라고 합니다. 집단이 늘어날 수록 비교 회수가 늘어납니다. 집단이 $k$개이면, 비교는 $k(k-1)/2$번을 해야 합니다. 집단이 10개만 되더라도 무려 45번을 비교를 해야 합니다.

이렇게 비교를 많이 하면 어떤 문제가 있느냐, 비교를 4번을 한다고 해봅시다. 모든 집단의 모평균이 같은 경우 4번 모두 1종 오류를 피할 확률은, 유의수준 5%일 때 $0.95^4 \sim 0.81$ 밖에 안됩니다. 즉 19%의 확률로 적어도 한 번의 1종 오류를 범하게 됩니다. 개별 비교와 다르게, 사후 검정 전체에서는 굉장히 높은 오류를 범하게 되는 것입니다. 이 오류율을 FWER(Family-Wise Error Rate)라고 합니다.

집단의 수가 늘어나면, 비교는 제곱으로 늘어납니다. FWER은 비교를 거듭제곱하는 속도로 늘어납니다. 결과적으로 집단의 수가 조금만 많아져도 FWER은 급증하게 됩니다. 집단의 수가 14개면, FWER은 99%에 달합니다. 이게 무슨 말이냐하면, 똑같은 맹물 14종을 사람들에게 먹이는 실험을 하면, 유의수준 5%로 이 실험을 분석했을 때 거의 확실하게(99%) 그중에 어떤 맹물인가는 다른 맹물보다 건강에 더 좋다는 엉터리 결과가 나온다는 뜻입니다.

따라서 다중비교에서 올바른 결과를 얻기 위해서는 FWER을 일정 수준 이하로 통제할 필요가 있습니다. 보통은 5% 아래로 통제합니다. 이를 위해서는 개별 비교의 유의수준을 5%보다 훨씬 낮게 잡아야 합니다.

얼마나 낮게 잡아야 하는지는 어려운 문제이기 때문에 여러 가지 계산 방법이 있습니다. 여기서는 등분산의 경우 Tuckey HSD, 이분산의 경우 Games-Howell 방식을 사용하겠습니다.

Warning

사후 검정은 반드시 분산 분석에서 귀무가설을 기각한 경우(p < 유의수준)에만 실시합니다.

# 사후 검정: 등분산일 경우
pg.pairwise_tukey(dv='rating', between='job_level', data=hr)

# 사후 검정: 이분산일 경우
pg.pairwise_gameshowell(dv='rating', between='job_level', data=hr)
install.packages('rstatix')

# 사후 검정: 등분산일 경우
rstatix::tukey_hsd(hr, rating ~ job_level)

# 사후 검정: 이분산일 경우
rstatix::games_howell_test(hr, rating ~ job_level)

Question

안전도 데이터에서 wheels에 따라 risk에 차이가 있는지 분산 분석을 실시해보십시오(유의수준 5%). 어떤 결론을 내릴 수 있습니까?

  • 집단 간에 통계적으로 유의한 차이가 있다
  • 집단 간에 통계적으로 유의한 차이가 없다

어떤 집단 간 사이에 통계적으로 유의한 평균차이가 있습니까?

  • 4wd - fwd
  • 4wd - rwd
  • fwd - rwd

Question

인구총조사 데이터에서 race에 따라 education_num에 차이가 있는지 분산 분석을 실시해보십시오(유의수준 5%). 어떤 결론을 내릴 수 있습니까?

  • 집단 간에 통계적으로 유의한 차이가 있다
  • 집단 간에 통계적으로 유의한 차이가 없다

위의 사후 검정에서 Amer-Indian-Eskimo 집단과 통계적으로 유의한 차이가 있는 집단을 아래에서 골라보세요.

  • Asian-Pac-Islander
  • Black
  • Other