Python

[Python] t 검정(t-test)

주댕이 2024. 1. 11. 17:21

# 단일표본 t 검정(1표본 t 검정, 1-sample t-test)

  • 모분산을 알지 못하는 상황에서 정규분포의 모평균에 대한 검정
  • 귀무가설: 𝜇 = 𝜇0 (모평균과 표본평균이 같다)
  • 대립가설: 𝜇 ≠ 𝜇0 (모평균과 표본평균이 같지 않다)
def pmean_test(sample, mean0, alpha=0.05):
    '''
    sample: 표본 데이터
    mean: 귀무가설에서 설정한 평균값, 검정하고자 하는 값
    alpha: 유의수준, 기본값 0.05
    '''
    s_mean = np.mean(sample)  # 표본 데이터 'sample'의 평균 계싼
    u_var = np.var(sample, ddof=1)  # 표본의 비편향 분산 계산
                                    # 'ddof=1': 비편향 분산을 계산하기 위해 자유도 보정 수행
    n = len(sample)  # 표본의 크기 계산
    rv = stats.t(df=n-1)  # 자유도가 (n-1)인 t-분포 생성
    interval = rv.interval(1-alpha)  # 유의수준(1-alpha)에 해당하는 신뢰구간 계산

    t = (s_mean - mean0) / np.sqrt(u_var/n)  # t 통계량 계산
                                             # 주어진 표본 평균과 귀무가설의 평균 간의 차이를 비편향 표준편차로 나눈 값
    print(f't통계량 값은 {t:.3f}')  # 계산된 t 통계량 출력
    if interval[0] <= t <= interval[1]:
        print('귀무가설을 채택')
    else:
        print('귀무가설을 기각')
    # 계산된 t 통계량이 신뢰구간에 속하는지 확인: 속하면 귀무가설 채택, 그렇지 않으면 기각

    if t < 0:
        p = rv.cdf(t) * 2
    else:
        p = (1 - rv.cdf(t)) * 2
    # t 통계량의 부호에 따라 p값 계산
    # p값은 t 분포의 양측에서의 누적 분포 함수를 이용하여 계산
    # rd.cdf(t): t 분포에서 확률 변수가 t 이하일 확률 계산, 주어진 t 통계량보다 낮은 값들이 나타날 확률 반환
    
    print(f'p값은 {p:.3f}')  # 계산된 p값 출력

pmean_test(sample, 130)
# t통계량 값은 -1.455
# 귀무가설을 채택
# p값은 0.169

 

  • scipy.stats의 ttest_1samp 함수 이용하기
    • 반환값: t 검정통계량, p값
t, p = stats.ttest_1samp(sample, 130)
t, p  # (-1.455, 0.169)

 

 

# 대응표본 t 검정(paired t-test)

import pandas as pd

training_rel = pd.read_csv('data/ch11_training_rel.csv')
training_rel['차'] = training_rel['후'] - training_rel['전']
training_rel.head()
# 	전	후	차
# 0	59	41	-18
# 1	52	63	11
# 2	55	68	13
# 3	61	59	-2
# 4	59	84	25

 

  • scipy.stats의  ttest_rel 함수 이용하기
t, p = stats.ttest_rel(training_rel['후'], training_rel['전'])
t, p  # (2.204, 0.040)
  • +) 차이의 평균을 구하여 단일표본 t 검정 수행하기: scipy.stats의 ttest_1samp 이용하기
t,p = stats.ttest_1samp(training_rel['차'], 0)
# 0: 귀무가설에서 설정한 평균값, 주어진 표본의 평균이 해당 값과 같은지 검정한다.
t, p  # (2.204, 0.040)

 

 

# 독립표본 t 검정(independent t-test)

training_ind = pd.read_csv('data/ch11_training_ind.csv')
training_ind.head()
# 	A	B
# 0	47	49
# 1	50	52
# 2	37	54
# 3	60	48
# 4	39	51

 

  • 등분산성이 가정됨
t, p = stats.ttest_ind(training_ind['A'], training_ind['B'], equal_var = True)
t, p  # (-1.761, 0.086)

 

  • 등분산성이 가정되지 않음
t, p = stats.ttest_ind(training_ind['A'], training_ind['B'], equal_var = False)
t, p  # (-1.761, 0.087)
728x90