2025년 2학기 계량분석 강의자료

7주차: 단일모집단 평균 검정 (One-Sample T-test)

1. T-test란 무엇인가?


2. 단일모집단 평균 검정


3. 예제 풀이

🔎 문제

📌 풀이

  1. 가설 설정
    • $H_0$: 평균 = 0.05
    • $H_a$: 평균 $\ne$ 0.05
  2. 통계량 계산

    $$t = \frac{0.053 - 0.05}{0.003/\sqrt{10}}$$

    • $t = \frac{0.003}{0.00095} \approx 3.16$
  3. 판단
    • 자유도(df) = 9
    • 유의수준 5% → 임계값 약 $\pm$2.26
    • 계산된 $t$ = 3.16 > 2.26 → 귀무가설 기각

✅ 결론

→ 기계는 정상 직경 0.05인치와 차이가 있다. 즉, 정상적으로 작동하지 않을 가능성이 크다.

4. 실습 & 토론


5. 정리

1. 두 모집단 평균차이 검정이란?


2. 검정 절차

  1. 가설 설정
    • 귀무가설($H_0$): 두 집단의 평균은 같다 ($\mu_1 = \mu_2$)
    • 연구가설($H_a$): 두 집단의 평균은 다르다 ($\mu_1 \neq \mu_2$)
  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}}$$

  3. 유의수준과 비교
    • 계산된 $t$값과 임계값 비교
    • 또는 p-value 활용

3. 예제 풀이

🔎 문제

📌 풀이 과정

  1. 가설 설정
    • $H_0$: 두 팀의 평균 작업 시간은 같다
    • $H_a$: 두 팀의 평균 작업 시간은 다르다
  2. 검정통계량 계산
    • 두 표본 평균과 표준편차, 표본 크기를 이용해 $t$값 계산
  3. 판단
    • 자유도 계산 후, 임계값과 비교
    • p-value < 0.05라면 귀무가설 기각

✅ 결론

  • 만약 $t$값이 임계값보다 크면 → 두 집단은 실제로 차이가 있다
  • 그렇지 않으면 → 두 집단 차이는 우연일 가능성이 크다

4. 실습 & 토론


5. 정리

Python 실습 — T-test


0) 준비

사용할 라이브러리

주의: `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}")

해석 가이드


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}")

해석 가이드


3) 마무리 체크