Python/Scipy

[Scipy] 파이썬 t-검정 정리 : 단일표본, 독립표본, 대응표본

jimmy_AI 2022. 2. 27. 19:15
반응형

파이썬 T-test 예제

안녕하세요. 이번 시간에는 파이썬 Scipy 라이브러리를 활용하여

단일, 독립 및 대응표본의 각 경우에 대해서 t 검정을 진행하는 방법을

다루어보도록 하겠습니다.

 

 

단일표본 t 검정 : stats.ttest_1samp

먼저, 1개의 표본의 모평균을 검정하는 단일표본 T-test의 예시를 살펴보겠습니다.

 

아래와 같이 0~1의 균일분포에서 랜덤 추출한 값에 100을 곱한 100개의 데이터

있다고 가정해보고, 이 집단의 모평균을 검정해보도록 하겠습니다.

import numpy as np

a = np.random.random(100) * 100

# 앞의 5개 값 예시
a[:5] # array([70.20398434, 44.41203954, 85.43068622, 29.52316572, 36.33465145])

이 집단 값의 평균은 50이 될 것으로 짐작해볼 수 있기에,

모평균이 50인지에 대하여 단일표본 t 검정을 진행해보도록 하겠습니다.

 

이 과정은 Scipy 내의 stats.ttest_1samp 함수를 통해 손쉽게 검정이 가능합니다.

input으로는 검정할 집단과 모평균 값을 차례로 넣어주시면 됩니다.

from scipy import stats

stats.ttest_1samp(a, 50)
# Ttest_1sampResult(statistic=-1.08879625330993, pvalue=0.278887129298058)​

1samp 함수의 반환 결과는 t 값과 p-value가 차례로 등장하게 됩니다.

 

만일, 유의 수준을 0.05로 잡았다면, 위의 예시에서 p-value는 0.279 정도로

0.05보다 크기에 모평균이 50이 아니라는 대립가설을 채택할 수 없게 됩니다.

(모평균을 50 정도로 가정해도 큰 지장이 없는 상황)

반응형

독립표본 t 검정 : stats.ttest_ind

이번에는 두 집단이 독립이라는 가정 하에 모평균이 같은지를 검정하는

독립표본 T-test의 방법에 대해서 살펴보겠습니다.

 

위와 같은 식으로 100개의 0~1 사이의 균일분포 데이터를 두 번 뽑은 뒤,

한 집단은 100배, 다른 집단은 120배를 해주고, 두 집단의 모평균이 같을지를 검정해보겠습니다.

a = np.random.random(100) * 100
b = np.random.random(100) * 120

우선, 독립표본 검정 전에는 등분산 검정이 반드시 먼저 실행되는 것이 좋기에,

두 집단의 levene 등분산 검정 p-value를 추출해보도록 하겠습니다.

from scipy.stats import levene

# 등분산 검정
levene(a, b) # LeveneResult(statistic=0.12606536868205742, pvalue=0.7229249172195504)

p-value가 0.72 정도로 매우 큰 값이라 등분산으로 가정하고 T-test를 진행하겠습니다.

 

독립표본 t 검정은 stats.ttest_ind 함수에 두 집단을 input으로 넣어 진행해주시면 되며,

등분산 여부는 equal_var 인자에 지정하여 검정을 실행하면 됩니다.

stats.ttest_ind(a, b, equal_var = True)
# Ttest_indResult(statistic=-2.4768668558394986, pvalue=0.014092272347315497)

검정 결과의 p-value는 0.014 정도였습니다.

유의 수준이 0.05였다면 두 집단의 모평균을 다르게 볼 수 있지만,

유의 수준이 0.01이라면 두 집단의 모평균을 다르게 가정하기는 어려운 상황이었습니다.

 

 

대응표본 t 검정 : stats.ttest_rel

마지막으로, 두 집단의 데이터가 같은 환자의 약 투여 전/후의 결과 등으로

각 데이터끼리 pair를 이루고 있는 경우, 유의미한 변화가 있는지를 검정하는

대응표본 T-test의 방법에 대해서 다루어보도록 하겠습니다.

 

여기서는 한 집단은 0~1의 균일분포 결과의 100배를 곱한 결과를 받고,

이 결과에 새로운 균일분포의 10배의 값을 더한 새로운 집단을 만들어

두 집단의 차이가 유의한지에 대하여 검정해보도록 하겠습니다.

a = np.random.random(100) * 100
b = a + np.random.random(100) * 10

대응표본 t 검정은 stats.ttest_rel 함수를 통해서 이루어지게 됩니다.

(여기서는 등분산 검정을 따로 시행해주실 필요는 없습니다.)

stats.ttest_rel(a, b)
# Ttest_relResult(statistic=-17.867839256833662, pvalue=9.609887906558265e-33)

p-value가 0에 매우 가까운 작은 값이 등장하여 유의 수준에 상관 없이

거의 무조건 두 집단의 유의미한 차이가 있다는 가설을 받아들일 수 있게 되었습니다.

 

참고로, stats.ttest류의 함수들에서는 예시에서 보여드린 np.array뿐 아니라,

리스트, pd.Series(DataFrame column) 등 여러 자료형을 모두 input으로 받을 수 있습니다.