Z-검정으로 모평균·모비율의 p-값 판단하기

모표준편차가 알려진 모평균과 단일 모비율에 Z-검정을 적용하고 p-값, 신뢰구간, 검정력을 해석하는 방법

2026-08-14 · 최초 발행 2024-04-29

Z 통계량이 판단에 쓰이는 조건

Z-검정은 표본에서 얻은 통계량을 표준정규분포 기준으로 정규화해 귀무가설을 평가하는 방법이다. 중심극한정리와 정규근사 가정을 전제로 하며, 모표준편차 σ를 알고 있는 모평균 문제와 모비율 문제에 주로 적용한다.

모평균을 검정할 때 귀무가설은 H0: μ = μ0으로 둔다. 대립가설은 양측의 μ ≠ μ0이거나, 단측의 μ > μ0, μ < μ0 형태가 된다.

Z = (X̄ − μ0) / (σ / √n)

귀무가설 아래에서 이 통계량은 Z ~ N(0,1)을 따른다. 모평균의 95% 신뢰구간은 다음과 같다.

X̄ ± 1.96 × (σ/√n)

단일 모비율에서는 H0: p = p0을 기준으로 표본비율 를 비교한다.

Z = (p̂ − p0) / sqrt(p0(1−p0)/n)

정규근사를 사용하려면 np0(1−p0) ≥ 10 조건을 권장한다. 모비율의 95% Wald 신뢰구간은 다음과 같으며, 소표본이나 극단 비율에서는 Wilson 또는 Agresti–Coull 구간을 사용하는 편이 낫다.

p̂ ± 1.96 × sqrt(p̂(1−p̂)/n)

p-값은 대립가설의 방향에 맞춰 계산한다.

  • 양측 검정: p = 2 × [1 − Φ(|Z|)]
  • 상측 검정: p = 1 − Φ(Z)
  • 하측 검정: p = Φ(Z)

가정이 결과를 바꾸는 지점

표본은 독립적이고 무작위로 추출됐다고 가정한다. 이상치와 누락치도 검정 결과에 영향을 줄 수 있으므로 입력 단계에서 확인해야 한다. 모평균 Z-검정은 σ가 알려진 상황에 맞고, 큰 표본에서는 근사로 적용할 수 있다.

모비율 검정에서는 정규근사 조건이 특히 중요하다. 비율이 극단적이거나 표본이 작으면 이산 정확 검정 또는 보정된 신뢰구간을 검토해야 한다.

검정 절차에는 표본크기 n, 요약통계 또는 성공수 x, 귀무가설 값 μ0 또는 p0, 유의수준 α가 들어간다. 이 값을 바탕으로 Z 통계량과 p-값을 계산하고, 임계값 또는 p-값 기준으로 결론을 낸다. 결과에는 기각 또는 채택 판단뿐 아니라 추정치, 신뢰구간, 효과크기 차이, 검정력과 표본크기 관련 메모를 남긴다.

신뢰구간이 귀무가설 값 μ0 또는 p0을 포함하지 않으면 같은 α에서 귀무가설을 기각한다. 효과크기 δ = X̄ − μ0 또는 p̂ − p0와 표준오차 SE가 Z값을 결정하며, 더 큰 n이나 더 작은 σ로 SE가 줄면 검정력은 증가한다.

표본크기는 사전에 기대 효과와 검정력을 놓고 설계할 수 있다.

  • 모평균 양측 검정: n ≈ ((z*{1−α/2} + z*{1−β}) × σ / |δ|)^2
  • 모비율 양측 검정: n ≈ ((z*{1−α/2}√(p0(1−p0)) + z*{1−β}√(p1(1−p1))) / |p1 − p0|)^2

β는 제2종 오류이며, 1−β는 검정력이다. 이 설계에는 사전 효과크기 가정이 필요하다.

입력부터 보고까지의 흐름

모평균 σ 알려짐모비율아니오양측상측하측아니오입력: n, 또는 x/n, μ0 또는p0, α, 양/단측검정 유형Z = (X̄−μ0)/(σ/√n)np0(1−p0) 10?Z = (p̂−p0)/√(p0(1−p0)/n)대안 권고: 정확 검정/보정 구간양측/단측p = 2(1−Φ(|Z|))p = 1−Φ(Z)p = Φ(Z)p α ?H0 기각H0 유지신뢰구간·효과크기·검정력 보고

운영 지표에 연결하는 방식

제조 공정에서는 규격 중심값과 샘플 평균을 비교할 때 활용할 수 있다. σ가 공정능력지수나 역사 데이터로 알려져 있다면 즉시 판정하고 라인에 피드백할 수 있다.

웹·앱 A/B 테스트에서는 전환율 p를 목표 p0와 비교한다. 대규모 트래픽 환경에서는 실시간 p-값 모니터링과 조기중단 규칙을 결합하는 방식이 가능하다.

운영 SLA에서는 오류율 상한을 단측 검정으로 다룰 수 있다. 주간 배포 전후의 비율 비교에서도 베이스라인에 대한 1표본 전처리로 사용할 수 있다.

방법 성능(계산) 확장성(대규모 n) 일관성(가정 위배 민감도) 안정성(소표본/극단비율) 운영 편의
Z-검정(모평균, σ 알려짐) 매우 빠름 매우 높음 σ 추정 오류에 민감 소표본 시 한계 임계값·p-값 계산 단순
Z-검정(모비율) 매우 빠름 매우 높음 np0(1−p0) 조건 민감 극단비율에 취약 스트리밍 카운트로 즉시 적용
t-검정(모평균, σ 미지) 빠름 높음 정규성에 다소 민감 소표본에 상대적 강점 σ 미지 상황 기본 선택

여러 실험을 동시에 수행하면 FDR 또는 Bonferroni 보정이 필요하다. 보수적인 보정은 검정력을 낮출 수 있다. 실시간 모니터링과 조기중단에서는 SPRT 또는 alpha spending으로 알파 지출을 관리할 수 있지만, 구현 복잡도와 비용 절감 사이의 선택이 따른다.

재현 가능한 계산 예시

전제조건은 다음과 같다.

  • Python 3.11+, numpy 1.26+, scipy 1.11+, statsmodels 0.14+
  • R 4.3+, base stats 사용(필요 시 BSDA 패키지)

Python에서 모평균과 모비율 검정

# python 3.11
import math
from math import sqrt
from statistics import mean
from scipy.stats import norm
from statsmodels.stats.proportion import proportions_ztest

# 1) 모평균 Z-검정(σ 알려짐)
def z_test_mean(sample, mu0, sigma, alternative="two-sided"):
    n = len(sample)
    xbar = mean(sample)
    z = (xbar - mu0) / (sigma / sqrt(n))
    if alternative == "two-sided":
        p = 2 * (1 - norm.cdf(abs(z)))
    elif alternative == "larger":
        p = 1 - norm.cdf(z)
    else:  # "smaller"
        p = norm.cdf(z)
    return z, p

# 예시
sample = [101.2, 99.8, 100.5, 100.1, 99.9, 100.4]
z, p = z_test_mean(sample, mu0=100.0, sigma=0.8, alternative="two-sided")
print("mean Z, p =", z, p)

# 2) 모비율 Z-검정(1표본)
def z_test_prop_one(x, n, p0, alternative="two-sided"):
    # 근사 타당성 체크
    if n * p0 * (1 - p0) < 10:
        print("경고: np0(1-p0) < 10 → 정규근사 부적절 가능")
    phat = x / n
    se0 = math.sqrt(p0 * (1 - p0) / n)
    z = (phat - p0) / se0
    if alternative == "two-sided":
        p = 2 * (1 - norm.cdf(abs(z)))
    elif alternative == "larger":
        p = 1 - norm.cdf(z)
    else:
        p = norm.cdf(z)
    return z, p

z2, p2 = z_test_prop_one(x=520, n=1000, p0=0.5, alternative="larger")
print("prop Z, p =", z2, p2)

# 3) 참고: statsmodels의 1표본 비율 검정은 2표본 API를 변형하여 사용 가능
# count=[x, n-x], nobs=[n, n]로 귀무가설 p0와의 비교를 직접 표현하기 복잡하므로
# 위의 수식을 직접 구현하는 것을 권장.

R에서 p-값을 직접 계산하는 방법

# R 4.3
# 1) 모평균 Z-검정(σ 알려짐)
z_test_mean <- function(x, mu0, sigma, alternative=c("two.sided","greater","less")) {
  alternative <- match.arg(alternative)
  n <- length(x)
  xbar <- mean(x)
  z <- (xbar - mu0) / (sigma / sqrt(n))
  if (alternative == "two.sided") {
    p <- 2 * (1 - pnorm(abs(z)))
  } else if (alternative == "greater") {
    p <- 1 - pnorm(z)
  } else {
    p <- pnorm(z)
  }
  list(z=z, p.value=p)
}

sample <- c(101.2, 99.8, 100.5, 100.1, 99.9, 100.4)
zres <- z_test_mean(sample, mu0=100, sigma=0.8, alternative="two.sided")
print(zres)

# 2) 모비율 Z-검정(1표본)
z_test_prop_one <- function(x, n, p0, alternative=c("two.sided","greater","less")) {
  alternative <- match.arg(alternative)
  if (n * p0 * (1 - p0) < 10) warning("np0(1-p0) < 10: 정규근사 부적절 가능")
  phat <- x / n
  se0 <- sqrt(p0 * (1 - p0) / n)
  z <- (phat - p0) / se0
  if (alternative == "two.sided") {
    p <- 2 * (1 - pnorm(abs(z)))
  } else if (alternative == "greater") {
    p <- 1 - pnorm(z)
  } else {
    p <- pnorm(z)
  }
  list(z=z, p.value=p)
}

zres2 <- z_test_prop_one(520, 1000, 0.5, alternative="greater")
print(zres2)

예외 조건까지 포함한 운영 기준

σ를 모르는 모평균 문제에는 t-검정을 권장한다. 대용량에서는 Z와 근사적으로 유사할 수 있지만, 보고서에는 적용 가정을 명시해야 한다.

모비율이 0 또는 1에 가까운 극단 비율이거나 표본이 작다면 정확 검정 또는 Wilson 같은 보정 구간을 사용한다. 다중 모니터링에서 조기중단을 반복하면 알파 인플레이션이 생길 수 있으므로, 사전에 계획된 순차 방법을 적용한다.

계산 지연을 밀리초 단위로 최소화하면서 대규모 스트리밍에서도 실시간 의사결정을 지원할 수 있다. 표본크기를 최적화하면 실험 기간 20~40% 단축을 기대할 수 있으며, 절차를 표준화하면 팀 간 판단 일관성과 보고서 자동화가 쉬워진다. 가정 위반을 검출하는 과정은 잘못된 결론의 리스크를 줄이는 역할도 한다.

Z-검정가설검정모평균모비율p-값