1. T-test란 무엇인가?
- 정의: 어떤 집단(모집단)의 평균이 우리가 아는 기준값과 같은지 확인하는 방법.
- 언제 쓰는가?
- 예: 컵라면의 표기 무게가 100g이라고 할 때, 실제로 100g이 맞는지 알고 싶을 때
- 즉, "평균값이 기준과 차이가 있나?"를 검정할 때 사용
- T-분포:
- 표본이 적을 때 사용하는 분포 (정규분포와 비슷하지만 꼬리가 두꺼움)
- 표본이 커지면 정규분포와 거의 같아짐
2. 단일모집단 평균 검정
- 정의: 표본의 평균이 특정 기준값과 같은지 여부를 검정하는 것
- 절차:
- 1. 가설 세우기
- 귀무가설($H_0$): 기준값과 같다
- 연구가설($H_a$): 기준값과 다르다
- 2. 검정통계량 계산
$$t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}$$
- $\bar{x}$ = 표본 평균, $\mu_0$ = 기준 평균, $s$ = 표본 표준편차, $n$ = 표본 크기
- 3. 유의수준과 비교
- 계산된 $t$값을 임계값과 비교
- 혹은 p-value를 이용해 판단
- 1. 가설 세우기
3. 예제 풀이
🔎 문제
- 세밀한 부품을 만드는 기계가 정상인지 확인한다.
- 기준 직경: 0.05인치
- 표본 10개 → 평균 0.053인치, 표준편차 0.003인치
- 유의수준: 5%
📌 풀이
- 가설 설정
- $H_0$: 평균 = 0.05
- $H_a$: 평균 $\ne$ 0.05
- 통계량 계산
$$t = \frac{0.053 - 0.05}{0.003/\sqrt{10}}$$
- $t = \frac{0.003}{0.00095} \approx 3.16$
- 판단
- 자유도(df) = 9
- 유의수준 5% → 임계값 약 $\pm$2.26
- 계산된 $t$ = 3.16 > 2.26 → 귀무가설 기각
✅ 결론
→ 기계는 정상 직경 0.05인치와 차이가 있다.
즉, 정상적으로 작동하지 않을 가능성이 크다.
4. 실습 & 토론
- 실습 예제 (계산기/엑셀/파이썬 활용 가능)
- 어떤 초콜릿바의 표기 무게는 50g이다.
- 표본 8개를 조사한 결과: 평균 48.5g, 표준편차 1.2g.
- 이 초콜릿바의 무게가 표기와 차이가 있는지 검정하라.
- 토론 질문
- 1. 왜 실제 평균과 표기 평균이 차이가 날 수 있을까?
- 2. 차이가 아주 작더라도 “유의하다”고 결론 날 수 있는 이유는?
5. 정리
- T-test는 평균값의 차이를 검정하는 도구
- 단일모집단 T-test → “한 집단의 평균 vs 기준값” 비교
- 절차: 가설 설정 → 통계량 계산 → 유의수준과 비교 → 결론
- 실제 생활 예시:
- 식품 무게, 시험 점수, 공산품 규격 검사
1. 두 모집단 평균차이 검정이란?
- 정의: 서로 독립적인 두 집단의 평균값 차이가 우연인지, 아니면 실제로 유의미한 차이가 있는지 확인하는 방법
- 예시:
- 남학생과 여학생의 수학 시험 점수 비교
- 다이어트 프로그램 A와 B를 적용한 두 그룹의 체중 변화량 비교
- 신규 소프트웨어 vs 기존 소프트웨어 사용 시 작업 시간 비교
- 키포인트:
- 집단은 반드시 독립적이어야 함
- 즉, 한 사람은 두 집단에 동시에 속할 수 없음
2. 검정 절차
- 가설 설정
- 귀무가설($H_0$): 두 집단의 평균은 같다 ($\mu_1 = \mu_2$)
- 연구가설($H_a$): 두 집단의 평균은 다르다 ($\mu_1 \neq \mu_2$)
- 검정통계량 계산
- 두 집단의 표준편차가 같다고 가정(등분산 가정)할 때:
$$t = \frac{\bar{x}_1 - \bar{x}_2}{s_p \sqrt{1/n_1 + 1/n_2}}$$
($s_p$: 풀링된 표준편차)
- 표준편차가 다르다고 가정(이분산 가정)할 때:
$$t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{s_1^2/n_1 + s_2^2/n_2}}$$
- 두 집단의 표준편차가 같다고 가정(등분산 가정)할 때:
- 유의수준과 비교
- 계산된 $t$값과 임계값 비교
- 또는 p-value 활용
3. 예제 풀이
🔎 문제
- 24명의 전문가를 무작위로 두 팀(각 12명)으로 나눔.
- A팀: 기존 시스템 사용
- B팀: 신규 소프트웨어 사용
- 두 팀의 평균 작업 시간에 차이가 있는지, 유의수준 5%에서 검정
📌 풀이 과정
- 가설 설정
- $H_0$: 두 팀의 평균 작업 시간은 같다
- $H_a$: 두 팀의 평균 작업 시간은 다르다
- 검정통계량 계산
- 두 표본 평균과 표준편차, 표본 크기를 이용해 $t$값 계산
- 판단
- 자유도 계산 후, 임계값과 비교
- p-value < 0.05라면 귀무가설 기각
✅ 결론
- 만약 $t$값이 임계값보다 크면 → 두 집단은 실제로 차이가 있다
- 그렇지 않으면 → 두 집단 차이는 우연일 가능성이 크다
4. 실습 & 토론
- 실습 예제
- 남학생 10명, 여학생 10명의 수학 점수를 비교
- 평균, 표준편차를 주고 직접 $t$값 계산해보기
- 토론 질문
- 1. 남녀 성별에 따라 시험 점수가 차이가 난다면, 그 이유는 무엇일까?
- 2. 통계적으로 차이가 없다고 나왔을 때, 실제로도 차이가 없는 것일까?
5. 정리
- 두 모집단 평균차이 검정은 두 독립 집단의 평균 비교에 사용
- 절차: 가설 설정 → $t$값 계산 → 임계값(p-value)와 비교 → 결론
- 실제 생활 예시:
- 신약 효과 검증 (투약군 vs 위약군)
- 교육 프로그램 효과 비교 (참여 학생 vs 비참여 학생)
Python 실습 — T-test
0) 준비
사용할 라이브러리
- `numpy` / `pandas`: 데이터 생성·정리
- `scipy.stats`: 단일표본 t-검정(`ttest_1samp`), 독립표본 t-검정(`ttest_ind`), 등분산 검정(`levene`)
주의: `ttest_ind`는 **레빈(Levene) 검정이 자동으로 실행되지 않습니다.** 등분산 가정은 `equal_var=True/False`로 직접 정해야 해요. 등분산 여부는 `stats.levene()`로 별도 확인합니다.
1) 단일모집단 평균 검정 (One-Sample t-test)
핵심 목표
- 표본 평균이 기준값(모집단 가정 평균)과 다른지 검정
코드
import numpy as np
from scipy import stats
# 1) 데이터: 베어링 직경(인치) 10개 - 예시용 가상 데이터
data = np.array([0.053, 0.052, 0.054, 0.053, 0.051,
0.055, 0.052, 0.053, 0.054, 0.056])
# 2) 기준 평균(제조사가 주장하는 정상 직경)
mu0 = 0.050
# 3) 단일표본 t-검정
t_stat, p_value = stats.ttest_1samp(data, popmean=mu0)
# 4) 유의수준
alpha = 0.05
print(f"[One-Sample t-test] t={t_stat:.3f}, p={p_value:.4f}")
if p_value < alpha:
print("→ 유의: 기준 평균과 다릅니다. (H0 기각)")
else:
print("→ 비유의: 기준 평균과 다르다고 보기 어렵습니다. (H0 유지)")
# (선택) 간단 효과크기: Cohen's d (단일표본용)
# d = (xbar - mu0) / s, 여기서 s는 표본 표준편차
xbar = data.mean()
s = data.std(ddof=1)
d = (xbar - mu0) / s
print(f"(참고) 효과크기 Cohen's d = {d:.2f}")
해석 가이드
- $p < 0.05$ → “차이가 있다”로 결론
- $p \ge 0.05$ → “차이가 있다고 보기 어렵다”
- Cohen’s d는 차이의 크기(영향력)를 보여줌(0.2$\approx$작음, 0.5$\approx$중간, 0.8$\approx$큼)
2) 두 모집단 평균차이 검정 (Independent Samples t-test)
핵심 목표
- 서로 독립적인 두 집단 평균이 다른지 검정
절차: 등분산 여부 확인 → t-검정(등분산/웰치) → 해석
코드
import numpy as np
from scipy import stats
# 1) 데이터: 작업 완료 시간(분) - 예시용 가상 데이터
old_system = np.array([325, 290, 310, 335, 305, 300, 320, 295, 340, 315, 330, 325])
new_soft = np.array([295, 275, 280, 265, 290, 270, 285, 260, 295, 280, 275, 285])
# 2) 등분산 검정 (Levene)
lev_stat, lev_p = stats.levene(old_system, new_soft, center='median')
print(f"[Levene 등분산 검정] stat={lev_stat:.3f}, p={lev_p:.4f}")
equal_var = True if lev_p >= 0.05 else False
print(f"→ 등분산 가정: {equal_var}")
# 3) 독립표본 t-검정
# equal_var=True → 등분산 가정(고전적 t-검정)
# equal_var=False → 비등분산 가정(웰치 Welch t-검정; 보통 더 안전)
t_stat, p_value = stats.ttest_ind(old_system, new_soft, equal_var=equal_var)
alpha = 0.05
print(f"[Independent t-test] t={t_stat:.3f}, p={p_value:.4f} (equal_var={equal_var})")
if p_value < alpha:
print("→ 유의: 두 집단 평균이 다릅니다. (H0 기각)")
else:
print("→ 비유의: 두 집단 평균이 다르다고 보기 어렵습니다. (H0 유지)")
# (선택) 효과크기: Cohen's d (독립표본용)
def cohens_d_ind(x, y, equal_var=True):
nx, ny = len(x), len(y)
if equal_var:
# 풀링분산
sx2 = x.var(ddof=1)
sy2 = y.var(ddof=1)
sp2 = ((nx-1)*sx2 + (ny-1)*sy2) / (nx+ny-2)
sp = np.sqrt(sp2)
return (x.mean() - y.mean()) / sp
else:
# Welch d: 표준화는 각 표준편차의 평균으로 근사(수업용 간단 버전)
sx, sy = x.std(ddof=1), y.std(ddof=1)
s_avg = (sx + sy) / 2
return (x.mean() - y.mean()) / s_avg
d = cohens_d_ind(old_system, new_soft, equal_var=equal_var)
print(f"(참고) 효과크기 Cohen's d = {d:.2f}")
해석 가이드
- 먼저 Levene $p \ge 0.05$면 등분산 가정(`equal_var=True`) 사용
- Levene $p < 0.05$면 등분산 깨짐 → Welch t-검정(`equal_var=False`) 사용
- $p < 0.05$면 “두 집단 평균이 다르다”
- 효과크기 $d$가 클수록 실제 차이도 큼(해석 예: 0.2 작음, 0.5 중간, 0.8 큼)
3) 마무리 체크
- 단일표본: `ttest_1samp(data, mu0)`
- 독립표본: `ttest_ind(group1, group2, equal_var=...)`
- 등분산은 자동 판단이 아님! `stats.levene()`로 확인 후 `equal_var` 결정
- 통계적 유의미($p$)와 실제 영향력($d$)을 함께 보자