IT

파이썬으로 t-검정(T-test) 계산하기

유병혁 2020. 2. 2. 14:50

안녕하세요? 이번 글은 파이썬으로 t-검정(T-test)을 계산하는 방법을 정리해 보겠습니다.


이 글은 Towards Data Science(https://towardsdatascience.com/)에서 어뮬리아 앵클(Amulya Aankul)

님이 공유해 주신 'T-test using Python and Numpy' 제목 글의 내용을 추가적인 설명과 함께 재구성한 것입니다.

T-test using Python and Numpy | https://towardsdatascience.com/inferential-statistics-series-t-test-using-numpy-2718f8f9bf2f


t-검정과 관련해서는, 윤선희 대표님이 공유해주신 '유의성검정과 T-검정' 동영상 내용을 참고하였습니다.

좋은 학습자료를 공유해주신 윤선희 대표님께 감사드립니다.



설문조사를 수행해서 모은 데이터는 모집단 데이터가 아닌 표본 데이터입니다. 표본 데이터는 실제 모집단

데이터에 비하면 아주 작은 양에 불과하기 때문에, 표본 데이터의 정보를 모집단 데이터의 정보로 해석하는

과정에서 확률적인 정보로서 해석에 들어가게 됩니다. 이때 데이터를 얼마나 믿을 수 있는지에 대한 유의성

검정을 거치게 됩니다. t-검정은 두 집단의 평균 차이를 검증하는데 선호되는 분석 방법입니다.


t-검정의 수식은 비교적 간단하지만, t-검정을 이해하기 위해서는 통계학의 기본 개념들이 필요합니다.

Student's t-test | https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test


제가 참고한 어뮬리아 앵클 님의 글은 t-검정 공식 중 일부를 파이썬으로 구현한 것입니다.

제 글 역시 마찬가지입니다. t-검정의 전체적 이해는 반드시 통계학 서적을 참고하시기 바랍니다.


그럼 파이썬으로 t-검정을 계산해 볼까요?! 일단, t-검정 계산에 필요한 파이썬 패키지/모듈을 불러옵니다.


1
2
3
# 패키지/모듈 불러오기
import numpy as np
from scipy import stats
cs


넘파이(NumPy)는 행렬(matrix)이나 다차원 배열(ndarray)을 쉽게 처리할 수 있도록 지원하는 기본 패키지,

사이파이(SciPy)는 수학, 과학, 및 공학을 위한 오픈소스 소프트웨어로, 여기서 스탯스(Stats) 모듈은 통계

함수들(statistical functions)을 제공하고 있습니다.


[1] 넘파이(NumPy) 패키지: https://numpy.org/

[2] 사이파이(SciPy) 패키지: https://www.scipy.org/

[3] 사이파이 스탯스(Stats) 모듈: https://docs.scipy.org/doc/scipy/reference/stats.html


사실 t-검정은 사이파이 스탯스에서 제공하는 함수를 이용해서 쉽게 결과를 얻을 수 있습니다.


예를 들면, 'scipy.stats.ttest_ind'라는 함수를 이용하는 것입니다. 두 개의 독립적인 표본(ndarray), a, b를

지정해 주면, 해당 함수를 통해 t값과 p값이 자동으로 계산됩니다.

scipy.stats.ttest_ind | https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html


1
2
3
4
# t-검정 계산
t, p = stats.ttest_ind(a, b)
print("t = " + str(t))
print("p = " + str(p))
cs


그 외에도 유형에 따라 다음과 같은 t-검정 계산 함수들이 제공됩니다.

scipy.stats.ttest_1samp | https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_1samp.html#scipy.stats.ttest_1samp

scipy.stats.ttest_ind_from_stats | https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind_from_stats.html#scipy.stats.ttest_ind_from_stats

scipy.stats.ttest_rel | https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html#scipy.stats.ttest_rel


p는 표본 데이터의 유의확률이며 t값을 통해 계산됩니다. 그리고 유의수준의 기준은

p<.05, p<.01, p<.001 3가지가 있으며 숫자가 작을수록 더 엄격한 수준으로 봅니다.


이러한 유의확률과 유의수준을 비교하여,


유의확률 p가 유의수준에 비해 더 크면 비유의적이라고 하며, 귀무가설(null hypothesis)

채택되고 대립가설(alternative hypothesis)이 기각되었다고 합니다.


반대로 유의확률p가 유의수준에 비해 더 작으면 유의적이라고 하며, 귀무가설이 기각되고

대립가설이 채택되었다고 합니다. 두 집단 간의 평균이 차이가 '있다'고 해석할 수 있습니다.


위와 같이 사이파이가 제공하는 함수를 통해 t-검정을 편하게 계산하고, 해석하는 것은 가능합니다.

그러나 이러한 함수를 사용해서는 t-검정이 어떤 방식으로, t값과 p값을 계산하는지 알 수 없습니다.


어뮬리아 앵클 님의 글은 t-검정 계산과정을 파이썬으로 작성한 것입니다.


아래 공식은 등분산 가정에서 두 개의 독립적인 표본에 대한 't-검정' 계산 방법을 나타낸 것입니다.

Independent two-sample t-test | https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test


[1] 동일한 표본 크기, 동일한 분산(Equal sample sizes, equal variance)


[2] 동일하거나 동일하지 않은 표본 크기, 동일한 분산(Equal or unequal sample sizes, equal variance)



위 식에서 알 수 있듯이, t-검정을 계산하려면 두 개 표본집단의 평균, 크기, 분산을 알아야 합니다.


표본집단의 분산은 모집단 분산의 추정치이며, 불편추정량(unbiased estimator)이 되도록 합니다.

불편추정량은 편의(bias)가 없는(0) 추정량, 즉 표본통계량이 모집단통계량과 차이가 없는 상태입니다.


이러한 표본집단의 분산 계산은 넘파이 제공 함수를 이용하겠습니다.

numpy.var | https://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html


그리고 t-검정을 위한 [1] 식과 [2] 식의 분모는 아래와 같이 작성할 수 있겠습니다.


1
2
3
4
5
6
7
8
9
# 표본의 분산(불편추정량) 계산
var_a = a.var(ddof=1)
var_b = b.var(ddof=1)
 
# [1] 동일한 표본 크기, 동일한 분산
= np.sqrt((var_a + var_b)/2)
 
# [2] 동일하거나 동일하지 않은 표본 크기, 동일한 분산
= np.sqrt(((a.size-1)*var_a+(b.size-1)*var_b) / (a.size+b.size-2))
cs


다음으로는 t-검정을 계산합니다.

1
2
3
# t-검정 계산
= (a.mean() - b.mean()) / (s * np.sqrt(1/a.size+1/b.size))
print("t = " + str(t))
cs


이제 자유도(degree of freedom)를 계산하고, t값과 자유도로부터 p값을 계산해주면 되겠습니다.

1
2
3
4
5
6
# 자유도 계산
df = (a.size - 1+ (b.size - 1)
 
# 유의확률 p값 계산
= 1 - stats.t.cdf(t,df=df)
print("p = " + str(2*p))
cs


자유도는 독립변수의 개수로 계산되는데요, 자유도와 불편추정량의 개념은 아래 '통계의 본질' 유튜브를

참고하시면 되겠습니다. 좋은 학습자료를 공유해 주신 '통계의 본질' 유튜버 님께 감사드립니다.




이상으로 파이썬으로 t-검정을 계산하는 과정을 정리해 봤습니다.

어뮬리아 앵클 님이 작성하신 글에서 t-검정은 [1] 식에 따라 정리되어 있습니다.


제 생각에는 공간정보학 전공자들도 사회과학 연구조사방법론을 알아두면, 논문 작성에 있어 보다 풍성한

결과 해석이 가능해지리라 생각됩니다. 기본적으로 내 전공에 충실하면서 타 전공 연구자와 소통하는 것이

중요하지 않을까 생각해 봅니다.