Statistics

[STAT 101] ANOVA 검정과 다중 검정의 문제

thebuck104 2024. 8. 13. 17:23

분산분석 Analysis of Variance, ANOVA Test

데이터가 서로 다른 세 개 이상의 모집단으로부터 추출된 경우에 사용하는 분석으로, 

각 집단의 평균을 비교하는 분석인데 통계적 유의성을 검증할 때 분산을 이용해서 분산분석이라 일컫는다.

 

분산분석 사용의 이유

3개 이상의 집단에서 1:1 분석을 하지 못하는 이유는 다음과 같다.

먼저, A, B, C 세 집단이 있을 때,

A:B, A:C, B:C를 각각 비교하고, A>B, B>C이면 A>B>C이지 않나?

라는 의문이 들 수 있다.

 

하지만 유의수준의 차원에서 이를 봤을 때, 표본을 모집단으로 확장했을 때

A>B이지 않을 5%의 확률이 존재하고, 마찬가지로 B>C이지 않을 확률 또한 5% 존재한다.

그러므로, A>B>C가 틀릴 확률은 단순히 생각해도 5%를 뛰어 넘기에, 0.05의 합의점에서 탈락할 수 있다.

 

분산분석의 의미

표본데이터를 집단별로 나누었을 때, 총분산은 집단내 분산과 집단끼리의 분산으로 나뉘어지므로,

 

총분산 = 집단내 분산 + 집단간 분산

 

이라는 수식을 토대로 집단간 분산 값이 크면, 집단간 평균에 차이가 있을 가능성이 커지게 된다는 결론에 도달한다.

 

위 집단들과 아래 집단들을 보자면,

표본그룹이 많이 겹치게 됨에 따라

상대적으로 집단내 분산이 커지고, 집단간 분산이 작아졌다. 

이렇듯, 집단내 분산이 상대적으로 크면 두 집단의 평균이 모집단에서도 차이를 보일지 모르기에,

두 집단의 평균은 같다는 가설을 기각하기 힘들어진다.

 

 

이를 여러 집단을 통해 보면 다음과 같아지는데,

보라색 집단의 집단간 분산이

다른 두 집단의 집단간 분산보다 많이 크기 때문에,

보라색 집단이 다른 두 집단과 멀리 떨어져 있어서,

보라색 집단의 평균이 다른 두 집단과 많이 다를수 있다는 결론을 내릴 수 있다.

 

이 때,

1) 집단내 분산: 각 집단을 구성하는 개별 데이터간에 변동성의 평균

2) 집단간 분산: 각 집단끼리의 평균의 차이, 즉 변동성의 평균

이 된다.

 

이 때 다시,

F = 집단 분산 / 집단 분산

 

이라고 할 수 있는데, 

예를들어 집단간 분산이 2이고 집단내 분산이 10이라면

집단이 다르다는 이유의 분산 2가 집단내에서 우연히 발생할 수 있는 분산인 10보다 작기 때문에,

집단이 달라서 발생한 분산이라기보단, 유연히 발생할 수 있는 분산의 범위 내에 있고,

두 집단이 다르다는 원인이나 근거가 되기 힘들다.

 

반대로 집단간 분산이 10이고 집단내 분산이 2라면,

집단이 다르다는 이유의 분산 10이 우연히 발생할 수 있는 분산인 2보다 5배나 큰 수치이기에,

두 집단은 우연을 넘어 집단이 다르기 때문에 발생한 분산이 섞여있다는 말이된다.

그러므로 두 집단의 차이/변동성에 의애 집단이 나뉘었다고 볼 수 있다.

 

F값의 유의성

위에서 나온 F값은 F 분포를 따른다고 알려져 있다.

이때 F 값은 위에서 말했듯이, 같은 모집단에서 나온 두 표본 집단의 분산의 비율을 뜻하고

자유도에 따라 그 모양이 달라지는데, 두 집단의 비율이기 때문에 

n과 m 두개의 자유도를 필요로 한다.

 

다시 말해, 동일한 모집단에서 추출된 두 표본 집단의 분산 비는 F분포를 따라야 하며,

더 구체적으로는 두 집단의 평균이 같은지 아닌지를 볼 수 있는 것이다.

 

 

이를 달리 말하면, 서로 다른 모집단에서 추출한 표본의 분산비를 본다면

두 개, 혹은 세 개 이상의 모집단의 평균이 같은지도 볼 수 있는 것이다.

 

ANOVA 분석을 예시로,

세 모집단의 평균이 동일하다면 (귀무가설) 

집단간의 평균차이는 없고, 따라서 집단간 분산 값이 작을 것이다.

그러므로 F값은 1보다 작게 되고, 1보다 크게 되더라도 아주 작은 숫자일 것이고,

이러한 값들은 F 분포상에서 발생할 확률이 아주 크다.

 

또한, 모집단이 달라 평균값이 다르고, 집단간 분산값이 커진다면

F값은 커질 것이고, 위의 확률분포에 따르면 그 값은 아주 작아질 것이다.

이런 희박한 확률을 가진 값이 나왔기 때문에,

 

집단간의 평균이 같다는 가정을 기각해야 한다.

 

이를 파이썬으로 수행하면 다음과 같다.

import scipy.stats as stats

F_statistic, pVal = stats.f_oneway(group1, group2, group3)

[output] F=3.7, p=0.04359

 

위의 경우, p-value가 충분히 작게 나왔기 때문에 귀무가설을 기각하고,

각 그룹간 분산이 유의미하게 그룹내 분산보다 크다,

즉 각 그룹간의 평균이 유의미하게 다르다라고 말할 수 있다.

 

다중 검정의 문제

여러 가설을 동시에 검정하는 것을 다중검정이라고 하는데,

 

이 때 동시에 m개의 가설검정을 수행한다는 사실을 고려하지 않으면 (각 검정마다 유의수준을 잘 조절하지 않으면)

1종 오류 (귀무가설이 참인데 기각하는 오류, False Positive) 발생 확률이 증가한다.

 

예컨대, 단일검정에서 p-value가 0.05 보다 작다는 것은, 결과값이 False Positive일 확률이 5%라는 것을 감안하는 것.

이 때, 검정의 수가 m개가 되면 False Positive Rate는 0.05 x m의 확률로 (5m%) 높아지는 것이다.

 

예시로, 검정을 3번을 한다면,

 

3번의 검정 중 어떠한 하나의 가설이라도 잘못된 판단을 내릴 확률이 15%가 되는 것.

 

그러므로, 1종 오류를 줄이기 위해서는 유의수준을 더 엄격하게 할 필요가 있다.

 

이 때, 

다수의 검정을 동시에 수행할 경우 발생하는 1종 오류를

"실험별 오류율 Experiment-wise Error Rate / Family-wise Error Rate"

그 안에 개별 검정에 대한 1종 오류를

"비교별 오류율 Comparison-wise Error Rate / Test-wise Error Rate"

라고 한다.

 

전체 오류율 (1종오류율)을 유지하는 대표적인 방법으로는

1) FWER을 통제하는 방법

2) FDR을 조절하는 방법

가 있다.

 

1) FWER (Family-wise Error Rate)

Type 1 Error Rate는 귀무가설이 참인 상황에서 귀무가설을 기각할 확률을 의미하며,

FWER은 m개의 가설검정을 수행할 때 적어도 한 개의 Type 1 Error를 발생시킬 확률을 의미한다.

 

 

이 때,

V 는 Type 1 Error, 즉 False Positive의 수

S 는 True Positive의 수

U 는 True Negative의 수

W 는 False Negative의 수를 뜻한다.

 

이 때, FWER을 정의 하자면 다음과 같다.

 

FWER은 전체에서 어떠한 가설도 잘못 기각하지 않을 확률을 뺀 것으로,

즉, 1 - 모두 다 잘 기각 시킬 확률 이다.

예를들어, 유의 수준 0.05일 때, 100개의 독립적임 검정을 수행한다면

 

 

이므로, 99.4%의 확률로 적어도 1개의 Type 1 Error가 발생하게 된다.

 

 

이러한 FWER의 통제 방법으로는 다음과 같은 검정들이 있다.

 

A) Bonferroni 검정

해당 검정은 개별 유의 수준을 검정의 수인 m으로 나눠, 유의 수준을 기존의 α 보다 낮추는 방법이다. 

하지만 m값이 높아짐에 따라 개별 검정의 유의수준이 계속해서 작아지기 때문에 귀무가설을 잘 기각시키지 않게 되어

굉장히 보수적이게 되고, True Positive를 잡지 못하게 되어 도리어 Type 2 Error, 즉 False Negative를 발생시킨다.

 

파이썬으로 Bonferroni 검정을 수행하면 다음과 같다.

 

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

# 판다스에서 밸류 값과 (weight) 그룹 값 (각 weight가 어느 그룹에 속해 있는지)
comp = MultiComparison(df.weight, df.group)

result = comp.allpairtest(stat.ttest_ind, method="bonf")

result[0]

 

 

결과에서 볼 수 있듯, AB, AD, BC의 차이수준만 유의하다고 볼 수 있다.

 

B) Tuckey's Honestly Significant Difference, HSD 검정

 

from statsmodels.stats.multicomp import pairwise_tukeyhsd

# 판다스에서 밸류 값과 (weight) 그룹 값 (각 weight가 어느 그룹에 속해 있는지)
hsd = pairwise_tukeyhsd(df['weight'], df['group'], alpha=0.05)

hsd.summary()

 

 

2) FDR False Discovery Rate