Z - test 예제
5. Python 실습 예시
파이썬의 scipy나 statsmodels에는 T 검정 함수는 이미 잘 구현되어 있지만, Z 검정을 직접 해주는 함수는 상대적으로 적습니다(표본분포가 정규인지를 확인하는 normaltest와는 다른 개념).
대신, statsmodels.stats.weightstats.ztest 함수를 사용하거나, 사용자가 Z 통계량 공식을 직접 구현할 수 있습니다.
아래 예시는 statsmodels.stats.weightstats.ztest 함수를 이용한 예시입니다.
5.1 라이브러리 임포트
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm # 정규분포, cdf 등
from statsmodels.stats.weightstats import ztest
5.2 단일 표본 Z 검정 (One-sample Z-test)
(a) 가상의 데이터 생성
- 실제로는 “모집단 표준편차를 안다”는 가정이 필요하지만, 예시를 위해 ‘어느 정도 알려져 있다고 가정’합니다.
- 예를 들어, 제품 무게의 모집단 표준편차가 로 알려져 있고, 모집단 평균이 50이라고 알려져 있는지 검정해 보려 합니다. σ=5\sigma=5
np.random.seed(123)
n = 40 # 표본 크기
true_mean = 52 # 실제 데이터는 평균 52에서 왔다고 가정
known_sigma = 5
sample = np.random.normal(loc=true_mean, scale=known_sigma, size=n)
print("Sample data (first 5):", sample[:5])
print("Sample mean:", np.mean(sample))
(b) 직접 공식으로 Z 통계량 계산 (예시)
# 귀무가설에서의 모평균
mu_0 = 50
sample_mean = np.mean(sample)
z_value = (sample_mean - mu_0) / (known_sigma / np.sqrt(n))
# z_value로부터 양측 검정 p-value 계산
# 정규분포에서 cdf 이용
p_value = 2 * (1 - norm.cdf(abs(z_value))) # 양측 검정
print("[Manual Z-test Calculation]")
print(f"z-statistic = {z_value:.4f}, p-value = {p_value:.4f}")
(c) statsmodels 활용 (Two-sample용 ztest를 변형)
ztest 함수는 사실상 “표본 1 vs. 표본 2” 형태를 가정합니다.
“단일 표본”인 경우, 다음과 같이 value=mu_0를 지정하여 사용 가능하나, 모집단 표준편차를 직접 설정하는 기능은 없으므로, 결과 해석 시 주의가 필요합니다(표본 표준편차 사용).
- 이 경우는 T 검정과 유사한 방식으로 동작하게 됩니다(큰 표본이면 Z 검정과 근사).
z_stat, p_val = ztest(sample, value=50) # 실제로는 모집단 표준편차(σ) 반영 X
print("\n[statsmodels ztest (using sample std)]")
print(f"z-statistic = {z_stat:.4f}, p-value = {p_val:.4f}")
주의:
5.3 독립 표본 Z 검정 (Two-sample Z-test)
(a) 가상의 두 집단 생성
- 집단 A: 평균 170, , 표본 크기 50 σ=10\sigma=10
- 집단 B: 평균 175, , 표본 크기 60 σ=10\sigma=10
- “?”라는 가설 검정 μA=μB\mu_A = \mu_B
np.random.seed(999)
nA, nB = 50, 60
sigmaA, sigmaB = 10, 10 # 알려져 있다고 가정
groupA = np.random.normal(loc=170, scale=sigmaA, size=nA)
groupB = np.random.normal(loc=175, scale=sigmaB, size=nB)
print("Mean of group A:", np.mean(groupA))
print("Mean of group B:", np.mean(groupB))
(b) 직접 공식으로 Z 통계량 계산
meanA = np.mean(groupA)
meanB = np.mean(groupB)
# 귀무가설: muA - muB = 0
# 분산의 합
var_sum = (sigmaA**2 / nA) + (sigmaB**2 / nB)
z_val_2samp = (meanA - meanB) / np.sqrt(var_sum)
p_val_2samp = 2 * (1 - norm.cdf(abs(z_val_2samp))) # 양측 검정
print("\n[Manual Two-sample Z-test]")
print(f"Z statistic = {z_val_2samp:.4f}, p-value = {p_val_2samp:.4f}")
(c) statsmodels 활용
ztest를 두 개 표본에 대해 바로 적용할 수 있습니다. 하지만, 내부적으로는 표본 표준편차를 사용하기 때문에(모집단 표준편차가 아닌) 실제 의미의 “독립 표본 Z 검정”과는 약간 다를 수 있습니다.
표본 크기가 충분히 크면 근사적으로 사용 가능합니다.
z_stat_model, p_val_model = ztest(groupA, groupB)
print("\n[statsmodels.stats.weightstats.ztest]")
print(f"Z statistic = {z_stat_model:.4f}, p-value = {p_val_model:.4f}")
주의: 실제로 모집단 σ\sigma가 기지일 때와는 조금 다르므로, n이 크거나 σ\sigma와 ss가 유사하다고 판단될 때 사용합니다.
6. 결과 해석
- p-value < α\alpha (예: 0.05)
- 귀무가설 기각 → “통계적으로 유의한 차이가 있다(또는 평균이 와 다르다).” μ0\mu_0
- p-value >= α\alpha
- 귀무가설 채택(또는 기각 못 함) → “유의한 차이를 발견하지 못함.”
- 실제로는 Z 검정보다는 T 검정이 구현이 잘 되어 있고, 모집단 표준편차(σ\sigma)를 모르는 경우가 대부분이므로, 크게 문제 되지 않을 만큼 표본이 많거나(수백~수천 개 이상) σ\sigma가 정확히 알려진 경우가 아니라면 T 검정을 권장하는 편입니다.
- 신뢰구간(Confidence Interval)과 효과 크기(Effect Size)도 함께 확인하면 더 풍부한 해석이 가능합니다(예: Cohen’s d 등).
7. 요약
- Z 검정: 모집단 표준편차를 알고 있거나, 표본 크기가 커서 라고 볼 수 있을 때 사용. 검정 통계량 는 표준정규분포(Z 분포)를 따름. σ≈s\sigma \approx s zz
- 단일 표본 Z 검정: 한 집단 평균 vs. 기준값() μ0\mu_0
- 독립 표본 Z 검정: 두 집단 평균 비교
- Python에서
statsmodels.stats.weightstats.ztest()를 사용하면 편리하지만, 내부적으로 모집단 표준편차가 아닌 표본 표준편차를 사용한다는 점에 주의. - n이 충분히 크면 T 검정 vs. Z 검정은 대체로 유사한 결과를 얻게 됩니다.
참고문헌
- Montgomery, D. C., & Runger, G. C. (2010). Applied Statistics and Probability for Engineers. John Wiley & Sons.
- Lehmann, E. L., & Romano, J. P. (2005). Testing Statistical Hypotheses (3rd ed.). Springer.
- statsmodels 공식 문서: statsmodels.stats.weightstats.ztest 이상으로 Z 검정(Z-test)에 대한 개념과 Python 실습 예시를 살펴보았습니다. 실제 데이터 분석 시에는 모집단 표준편차를 정말로 알고 있는지, 또는 표본 수가 충분히 커서 z 검정 적용이 타당한지를 먼저 꼼꼼히 확인한 뒤 분석을 진행하시면 됩니다.