# 단일표본 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
'Python' 카테고리의 다른 글
[Python] 얕은 복사(shallow copy) vs 깊은 복사(deep copy) (0) | 2024.01.12 |
---|---|
[Python] 문자열 포매팅(string formatting) (2) | 2024.01.11 |
[Python] 클래스 (2) | 2024.01.10 |
[Python] 람다(lambda) 함수 (0) | 2024.01.10 |
[Python] 지역 변수와 전역 변수 (2) | 2024.01.10 |