본문 바로가기
개발/Python

T 검정

by 피로물든딸기 2025. 9. 14.
반응형

전체 링크

 

평균에 대한 가설검정


가정

- 정규성 : 데이터가 정규분포를 따른다고 가정 

- 연속형 데이터 : 데이터가 연속하고, 평균을 계산할 수 있어야 함.

- 독립성 : 두 지반의 데이터는 서로 독립적이어야 하고, 한 집단의 값이 다른 집단 값에 영향을 주면 안된다.


ttest_1samp (단일 표본 t-검정)

- 한 집단의 평균이 특정 값(모집단 평균)과 다른지 검정할 때 사용.

- ex) 한 학급 학생들의 시험 평균이 70점과 다른지 확인.

 

귀무/대립 가설

H₀ : sample_mean == popmean

H₁ : sample_mean != popmean

from scipy.stats import ttest_1samp

# 학생 시험 점수
scores = [68, 72, 75, 70, 69, 74, 73]

# 모집단 평균 70과 비교
t_stat, p_val = ttest_1samp(scores, popmean=70)

print("t-statistic:", t_stat) # 1.5768009924727366
print("p-value:", p_val) # 0.1659143165940077

 

정규성을 만족하지 않는 경우 - Wilcoxon 부호 순위 검정[비모수], scipy.stats.wilcoxon(data - 기대값, alternative)


ttest_ind (독립 표본 t-검정)

- 두 독립된 집단의 평균이 서로 다른지 검정할 때 사용.

- 예: 남학생과 여학생의 수학 점수 평균 비교.

- 두 집단의 분산이 같은 경우 (eqaul_var=True) : 독립 표본 t-검정 (Student's t-test)

풀링된 분산 (공통 분산)

 

- 두 집단의 분산이 다른 경우 (eqaul_var=False) : Welch's t-test 

 

귀무/대립 가설

H₀ : mean_group1 == mean_group2

H₁ : mean_group1 != mean_group2

from scipy.stats import ttest_ind

# 남학생, 여학생 점수
male_scores = [68, 72, 75, 70, 69]
female_scores = [74, 77, 73, 75, 76]

# equal_val=True, 두 집단의 분산이 같다고 가정
t_stat, p_val = ttest_ind(male_scores, female_scores, equal_var=True)

print("t-statistic:", t_stat) # -2.940588176458822
print("p-value:", p_val) # 0.018692816860882495

 

등분산성을 만족하지 않는 경우 - Welch's t-검정[모수], eqaul_var=False

 

정규성(+ 등분산성)을 만족하지 않는 경우 - scipy.stats.mannwhitneyu(A, B, alternative='two-sided')


ttest_rel (대응 표본 t-검정)

- 같은 대상이 두 조건에서 측정되었을 때 평균 차이를 검정.

- 예: 다이어트 전후 체중 변화, 약물 투여 전후 혈압 변화.

 

귀무 / 대립 가설

H₀ : mean_diff == 0

H₁ : mean_diff != 0

from scipy.stats import ttest_rel

# 다이어트 전후 체중
before = [80, 75, 78, 90, 85]
after  = [78, 73, 77, 88, 84]

t_stat, p_val = ttest_rel(before, after)

print("t-statistic:", t_stat) # 6.531972647421809
print("p-value:", p_val) # 0.002837845926734446

 

정규성을 만족하지 않는 경우 - Wilcoxon의 부호 순위 검정, scipy.stats.wilcoxon(after, before)

 

양측 검정 vs 단측 검정

import numpy as np
from scipy.stats import ttest_rel

before = np.array([70, 75, 68, 72, 74])
after  = np.array([75, 78, 70, 76, 77])

stat, pvalue = ttest_rel(after, before)
print(stat, pvalue) # 6.667948594698257 0.0026285451076807544

 

p-value가 양측 검정의 절반이 된다.

stat, pvalue_two = ttest_rel(after, before)

pvalue_one = pvalue_two / 2 if stat > 0 else 1 - pvalue_two / 2

print(stat, pvalue_one) # 6.667948594698257 0.0013142725538403772

pvalue_one_left = pvalue_two / 2 if stat < 0 else 1 - pvalue_two / 2
pvalue_one_left # 0.9986857274461596

 

 

우측 단측 검정은 차이가 + 방향(증가)” 인지를 보는 검정

 

H₀: μ(after−before) ≤ 0

H₁: μ(after−before) > 0

 

stat < 0이라면 표본 평균차이가 오히려 감소 방향이라는 뜻이므로, 우측 검정에서 유리한 증거가 전혀 없다.

p-value는 큰 값(1에 가까움) 이 나와야 정상 

 

즉, p-value = 1 - (p_one / 2)

 

예시 코드

import numpy as np
from scipy.stats import ttest_rel

before = np.array([70, 75, 68, 72, 74])
after  = np.array([75, 78, 70, 76, 77])

stat, p_two = ttest_rel(after, before)

p_right = p_two/2 if stat > 0 else 1 - p_two/2
p_left  = p_two/2 if stat < 0 else 1 - p_two/2

print("t-statistic =", stat) # 6.667948594698257
print("two-sided p =", p_two) # 0.0026285451076807544
print("right-tailed p (after > before) =", p_right) # 0.0013142725538403772
print("left-tailed  p (after < before) =", p_left) # 0.9986857274461596
반응형

'개발 > Python' 카테고리의 다른 글

groupby + agg로 여러 컬럼 집계하기  (0) 2025.10.05
앙상블 (Ensemble)  (0) 2025.09.14
datetime  (0) 2025.09.14
LogisticRegression Hyper Parameters and Attributes  (0) 2025.09.14
카이제곱 검정  (0) 2025.09.14

댓글