파이썬 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으로 받을 수 있습니다.
'Python > Scipy' 카테고리의 다른 글
[Scipy] 파이썬 p-value 찾기 방법 정리(T-test, 회귀 분석) (0) | 2022.07.13 |
---|---|
[Scipy] 파이썬 정규분포 확률밀도함수, 누적분포함수, 백분위수 찾기 : pdf, cdf, ppf (0) | 2022.06.04 |
[Scipy] 파이썬 상관계수 구하기 함수 정리(피어슨, 스피어만, 켄달) (0) | 2022.02.20 |