Student's t-test
두 집단간의 평균 차이가 통계적으로 유의한지 확인하기 위해 쓰는 통계 분석 기법입니다. 스튜던트는 그 만든 양반 필명임.
t-test의 종류
1. 단일 표본 t-test: 단일 집단의 평균과 특정 값과의 차이가 통계적으로 유의미한지 확인할 때 쓴다.
2. 독립 표본 t-test: 두 집단간 차이를 보는건데, 그 두 집단이 서로 다른 집단이다.
3. 대응 표본 t-test: 두 집단이 비포 앤 애프터다. (예: 운동 전/운동 후)
# 샘플 (샘플 크기가 충분)
group_A = np.random.normal(loc=50, scale=10, size=50)
group_B = np.random.normal(loc=55, scale=12, size=50)
# 샘플(크기는 충분하지 않지만 조건은 만족)
group_C = np.random.normal(loc=100, scale=15, size=15)
group_D = np.random.normal(loc=105, scale=15, size=15)
# 샘플(티테스트 하면 안되는)
group_E = np.random.exponential(scale=2, size=10) # 비정규 분포
group_F = np.random.normal(loc=10, scale=1, size=10)
샘플이 세개임다. 잘 따라오십쇼.
표본 수가 충분할 때
t_stat, p_value = stats.ttest_ind(group_A, group_B)
print(f'T-statistic: {t_stat:.4f}')
if p_value < 0.05:
print(f"p-value: {p_value:.4e}")
print(f"Reject the null hypothesis")
else:
print(f"p-value: {p_value:.4e}")
print(f"Fail to reject the null hypothesis")
그 표본 수 마지노선이 30이거든요? 30개 넘으면 걍 돌리십쇼.
T-statistic: -2.8980
p-value: 4.6337e-03
Reject the null hypothesis
두 집단의 차이가 통계적으로 유의미하다 뭐 이런 얘기다.
표본 수가 적다!
다음것도 돌리려고 봤더니... 표본 수가 30개가 안된다? 그래도 10개가 넘었다면 아직 희망은 있습니다.
정규성 검사
# 1. 두 집단의 정규성 검정
stat, p_value = shapiro(group_C)
if p_value < 0.05:
print(f"p-value: {p_value:.4e}")
print(f"정규성을 만족하지 않으므로, T-test를 할 수 없습니다. ")
else:
print(f"p-value: {p_value:.4e}")
print(f"정규성을 만족하므로, T-test를 할 수 있습니다.")
# 1. 두 집단의 정규성 검정
stat, p_value = shapiro(group_D)
if p_value < 0.05:
print(f"p-value: {p_value:.4e}")
print(f"정규성을 만족하지 않으므로, T-test를 할 수 없습니다. ")
else:
print(f"p-value: {p_value:.4e}")
print(f"정규성을 만족하므로, T-test를 할 수 있습니다.")
일단 정규성과 등분산성을 만족하고 표본의 수가 10보다는 크면 t-test 돌릴 수는 있다. 근데 문제가 뭐냐… 정규성을 둘 중 하나라도 만족하지 않으면 비모수 검정으로 빠지셔야 합니다. t-test는 데이터가 정규분포를 따른다는 모수적 가정을 기반으로 하거든… 혹시 시각적으로 보고싶다 그러면 큐큐플롯 함 그려보십쇼.
등분산성 검사
# 등분산성 검정
stat, p = levene(group_C, group_D)
print(f"Levene test statistic: {stat:.4f}")
if p < 0.05:
print("등분산성을 만족하지 않으므로, 등분산 t-test를 할 수 없습니다.")
else:
print("등분산성을 만족하므로, 등분산 t-test를 할 수 있습니다.")
이거 돌리면 등분산인지도 확인 가능하다. 아마 그룹 C, 그룹 D는 표본 수는 적지만 조건을 만족하는 걸로 만들어서 당연하게도 등분산성을 만족할 것이다. 아 큐큐도 일자예요? 둘다 일자면 t-test 합격이다.
t_stat, p_value = stats.ttest_ind(group_C, group_D)
print(f'T-statistic: {t_stat:.4f}')
if p_value < 0.05:
print(f"p-value: {p_value:.4e}")
print(f"Reject the null hypothesis")
else:
print(f"p-value: {p_value:.4e}")
print(f"Fail to reject the null hypothesis")
T-statistic: -1.4077
p-value: 1.7024e-01
Fail to reject the null hypothesis
귀무가설 기각은 실패했다. 두 집단간 차이가 통계적으로 유의하진 않다네...
정규성, 등분산성 위반 시
그룹 E, F 역시 표본의 수가 작기때문에 정규성 및 등분산성 검정을 해봤는데 등분산이 아니고 한쪽이 정규성을 위반한다. 그럼 어떻게 해요? 비모수로 빠지셔야죠.
본인이 하려던 t-test가 대응 표본이면 윌콕슨 부호순위 검정(단일표본도)을, 독립 표본이면 여기서도 자주 봤던 맨-휘트니 U 검정을 하면 된다. 아 등분산성도 망했어요? 그러면 웰치스 t-test도 있습니다.
u_stat, p_val = stats.mannwhitneyu(group_E, group_F, alternative='two-sided')
print("=== Mann-Whitney U Test 결과 ===")
print(f"U 통계량: {u_stat:.2f}")
print(f"p-value: {p_val:.4e}") # 지수 표기법으로 출력 (매우 작을 경우 대비)
# 3. 결과 해석
alpha = 0.05
if p_val < alpha:
print(f"\n[해석] p-value가 {alpha}보다 작으므로, 두 집단간의 차이는 통계적으로 매우 유의미합니다.")
else:
print(f"\n[해석] p-value가 {alpha}보다 크므로, 두 집단 간의 차이가 통계적으로 유의미하다고 볼 수 없습니다.")
이건 독립표본이니까 맨 휫흐니로 틀어보겠음.
=== Mann-Whitney U Test 결과 ===
U 통계량: 0.00
p-value: 1.8267e-04
[해석] p-value가 0.05보다 작으므로, 두 집단간의 차이는 통계적으로 매우 유의미합니다.
그렇다고 합니다.
'Statics' 카테고리의 다른 글
| 통계는 실전이야: Chi-square(카이제곱검정) (0) | 2026.02.02 |
|---|---|
| 정규성, 그리고 비모수검정 (0) | 2026.02.01 |
| PCA, MCA, FAMD (0) | 2026.01.29 |
| 섀넌 엔트로피 (0) | 2026.01.28 |
| MSA, 폐암 분석 파일에 통계분석 추가 (0) | 2026.01.23 |