t-검정은 데이터가 정규분포를 따를 때 샘플 수가 적고, 모분산을 모르는 상황(표본분산은 모분산과 차이가 있으므로 샘플 수가 적을 때 z-test를 쓰면 오차가 발생한다)에서 1) 데이터의 평균이 특정 값과 다른지 (one sample t-test), 2) 두 그룹의 데이터의 평균이 서로 다른지 (two sample t-test) 등을 검정할 때 사용할 수 있다. 이를 R 코드와 함께 알아보도록 하겠다.
참고로 n<30일 때, 샘플 수가 작다고 일반적으로 생각한다. 한편, n이 굉장히 작더라도 t-test를 수행할 수 있다 (ex. 각 그룹 당 샘플 두 개씩). 하지만 그렇게 했을 경우, p-value가 높게 나오기 쉬우며, test power가 작게 된다 [참조].
One sample t-test
One sample t-test는 데이터의 평균이 어떤 값과 같은지, 다른지 등을 검정할 때 사용한다. 두 그룹에서 각각의 요소가 서로 연관되어 있는 paired data를 다루는 특별한 경우(Paired t-test)도 두 그룹의 차를 새로운 데이터로 생각하면 one sample t-test로 다룰 수 있다. 예를 들어, 각 사람마다 특정 식단 전후 혈당 수치 데이터가 있을 때, 후 데이터에서 전 데이터를 빼서 전후 차이 데이터를 이용해서 one sample t-test를 돌릴 수 있다.
T-test를 돌리기 전, 먼저 데이터가 정규성을 따르는지 검정해야 한다. 이는 확률변수 X가 정규분포를 따를 때, 자유도가 n-1인 t 분포를 따르는 확률변수 T가 정의되기 때문이다. 참고로 우리는 T의 분포를 알기 때문에 검정통계량 t를 계산하고, t가 T의 분포에서 어디에 위치하는지 파악함으로써 가설을 검정하고자 한다.
대부분의 cross-sectional study의 variables는 정규성을 따른다고 가정하고 넘어가도 좋다. 하지만 실제로 따르는지 여부를 테스트해 볼 수 있다. 데이터를 생성하고 Shpiro-Wilks test를 통해 정규성을 검정하였다. 위 테스트는 null hypothesis가 정규분포를 따른다는 것으로 아래 데이터에서는 p-value가 0.01보다 크기 때문에 유의수준 1%에서 정규분포를 따르지 않는다는 증거가 되지 못한다. 즉, 정규성을 가정할 수 있다.
One sample t-test는 간단하게 진행할 수 있다. 여기에서 검정통계량 t=13.336, 자유도는 n-1=8, p-value는 <0.01로 나왔다. 즉, 모평균이 0이라는 귀무가설을 가정했을 때, 계산한 검정통계량이 나올 수 있는 확률이 굉장히 희박하므로, 유의수준 1%에서 귀무가설을 기각할 수 있다. 즉, 유의수준 1%에서 데이터의 모평균이 0이 아니라는 강력한 증거가 된다. 95% 신뢰구간 및 데이터의 평균도 확인할 수 있다.
R 코드를 통해 위 데이터를 직접 계산할 수 있다.
> mean(data) # 표본평균
> sum((data-mean(data))**2)/(n-1) # 표본분산
> var(data) # 표본분산
> sqrt(var(data)) # 표본표준편차
> sd(data) # 표본표준편차
> a = qt(p=0.975, df=8, lower.tail=TRUE) # P(-2.3060<T<2.3060)=0.95
> a
2.30600413520417
> pt(q=a, df=8, lower.tail = TRUE)
0.975
> c(mean(data)-2.306*sd(data)/sqrt(n), mean(data)+2.306*sd(data)/sqrt(n) # 95% 신뢰구간
> t=mean(data)/(sd(data)/sqrt(n)) # 검정통계량
> pt(q=t, df=8,lower.tail=FALSE)*2 # p-value
Two sample t-test
Two sample t-test를 돌리기 전에 두 그룹이 paired되어있는지 여부를 주의해야 한다. Paired data라면 두 그룹의 차이에 대하여 one sample t-test를 돌려야 한다.
Two sample t-test에서도 one sample t-test와 마찬가지로 정규성을 따르는지 검정을 해야한다.
또 one sample t-test과 다르게 추가적으로 두 분포의 등분산 여부를 검정해야한다. 이는 등분산인지, 아닌지에 따라 추정량의 분포가 달라지기 때문이다 (하지만 검정을 여러 번 하게 되어 false positive가 커지는 문제가 생길 수 있어서 최근 흐름에서는 표본 크기가 비슷할 때는 등분산이라고 생각하여 t-test를 진행하고, 그렇지 않다면 Welch's t-test를 하는 편이다).
등분산 여부는 F-검정을 통해 알아볼 수 있다. p-value가 0.8323이 나왔으므로 등분산이라는 귀무가설을 기각하지 못한다. 즉, 아래의 데이터에 대해서는 등분산을 가정할 수 있다.
참고로 F-검정은 등분산이라는 귀무가설 참이라는 가정 하에 아래의 분포를 이용하여 검정한다. 즉, 검정통계량 f를 두 샘플의 표본표준편차로부터 구한 후 이 값이 분포의 어디에 위치하는지 파악한다.
R 코드로 위 데이터를 직접 확인해볼 수 있다.
f=var(data1)/var(data2) # 검정통계량
pf(q=f, df1=8, df2=8, lower.tail = FALSE)*2 # p-value
Two sample t-test도 간단하게 진행할 수 있다. 이때 위 예제에서는 등분산을 가정하였기 때문에 val.equal=TRUE로 하였다. 여기에서 검정통계량 t=-10.926, 자유도는 n1+n2-2=16, p-value는 <0.01로 나왔다. 즉, 두 모평균의 차가 0이라는 귀무가설을 가정했을 때, 계산한 검정통계량이 나올 수 있는 확률이 굉장히 희박하므로, 유의수준 1%에서 귀무가설을 기각할 수 있다. 즉, 유의수준 1%에서 두 모평균이 서로 다르다는 강력한 증거가 된다. 95% 신뢰구간 및 데이터의 평균도 확인할 수 있다.
마찬가지로 R 코드를 통해 위 데이터를 직접 계산할 수 있다.
> sp = ((n1-1)*var(data1)+(n2-1)*var(data2))/(n1+n2-2) # 합동표본분산
> a = qt(p=0.975, df=16, lower.tail=TRUE) # P(-2.1199<T<2.1199)=0.95
> a
2.11990529922125
> pt(q=a, df=16, lower.tail = TRUE)
0.975
> diff = mean(data1)-mean(data2)
> dis = a*sqrt(sp)*sqrt(1/n1+1/n2)
> c(diff-dis, diff+dis) # 95% 신뢰구간
> t=(diff-0)/(sqrt(sp)*sqrt(1/n1+1/n2)) # 검정통계량
> pt(q=t, df=16, lower.tail=FALSE)*2 # p-value
Reference
- urosie.tistory.com/107
- ko.wikipedia.org/wiki/%EC%8A%A4%ED%8A%9C%EB%8D%98%ED%8A%B8_t_%EB%B6%84%ED%8F%AC
'Statistics' 카테고리의 다른 글
[통계 기초] 신뢰 구간과 가설 검정, 유의 확률 (Confidence interval, Hypothesis testing, P-value) (0) | 2021.04.19 |
---|---|
[통계 기초] 평균 제곱 오차 (Mean square error, MSE) (0) | 2021.04.19 |
[통계 기초] 헷갈리는 용어 정리: 확률, 확률 변수, 확률 함수 (0) | 2021.04.14 |
[통계학] Multiple Testing Correction의 필요성과 방법 (0) | 2021.03.24 |
[통계학] 특정 상황 별 적용 가능한 통계 기법 정리 (생명과학 실험, 생물정보학) (2) | 2021.02.15 |