[CS300 #015] 주요 확률분포 — 이항·포아송·정규
컴퓨터공학 300 주제 시리즈의 015번째 글이다. 전체 지도는 여기.
한 줄 요약
이항분포는 “n 번 시도 중 성공 횟수”, 포아송분포는 “일정 시간 동안 드물게 일어나는 사건의 횟수”, 정규분포는 “작은 독립 효과가 많이 더해진 값” 의 모델이다. 세 분포는 극한으로 서로 이어져 있고, 각각이 맞는 상황과 틀리는 상황을 아는 것이 중요하다.
왜 필요한가
“서버 100 대 중 하루에 몇 대가 고장 날까?” 는 이항분포, “초당 들어오는 요청 수” 는 포아송분포로 첫 근사를 한다. “이번 배포 후 응답 시간이 정말 나빠졌나?” 를 판단할 때는 정규분포를 바탕으로 한 통계 검정을 쓴다(다음 글).
분포를 안다는 것은 평균 하나가 아니라 모양 전체를 안다는 뜻이다. 모양을 알면 “평균은 5 인데 10 이상이 나올 확률은?” 같은 꼬리 질문에 답할 수 있다. 용량 계획과 알림 임계값은 대부분 꼬리 질문이다.
핵심 개념
이항분포 B(n, p)
성공 확률 p 인 독립 시행(베르누이 시행)을 n 번 할 때 성공 횟수 X 의 분포다.
P(X = k) = C(n, k) · pᵏ · (1−p)ⁿ⁻ᵏ, k = 0, 1, ..., n
E[X] = np, Var(X) = np(1−p)
C(n, k) 는 성공할 k 자리를 고르는 방법의 수(007번 글), pᵏ(1−p)ⁿ⁻ᵏ 는 그런 특정 배치 하나의 확률이다. 평균과 분산은 각 시행의 지시 변수(평균 p, 분산 p(1−p))를 n 개 더한 것이다. 시행이 독립이므로 분산도 더해진다(014번 글).
전제 조건. 시행 횟수가 고정, 시행끼리 독립, 성공 확률이 모두 같음. 하나라도 깨지면 이항분포가 아니다. 같은 랙의 서버들이 전원 장애로 함께 죽는다면 독립이 깨진 것이다.
포아송분포 Poisson(λ)
일정한 구간(시간, 공간)에서 사건이 평균 λ 번 일어나고, 사건들이 서로 독립이며 동시에 일어나지 않을 때, 그 구간의 사건 수 X 의 분포다.
P(X = k) = e^(−λ) · λᵏ / k!, k = 0, 1, 2, ...
E[X] = λ, Var(X) = λ
평균과 분산이 같다는 것이 특징이다. 실제 데이터에서 분산이 평균보다 훨씬 크면(과산포) 포아송 모델이 맞지 않는다는 신호다.
이항분포의 극한. n 이 크고 p 가 작으며 np = λ 가 적당할 때 B(n, p) ≈ Poisson(λ) 이다. 사용자 백만 명이 각각 매초 아주 작은 확률로 요청을 보내면, 초당 요청 수는 포아송에 가깝다. “많은 독립 주체가 각각 드물게 행동한다” 가 포아송의 핵심 조건이다.
포아송 과정에서 사건 사이의 간격은 평균 1/λ 인 지수분포를 따른다. 큐잉 이론의 기본 모델(M/M/1 등)이 이 가정 위에 서 있다.
정규분포 N(μ, σ²)
평균 μ, 분산 σ² 인 종 모양의 연속 분포다.
f(x) = (1 / (σ√(2π))) · exp(−(x−μ)² / (2σ²))
| 범위 | 확률(근사) |
|---|---|
| μ ± 1σ | 68.3% |
| μ ± 2σ | 95.4% |
| μ ± 3σ | 99.7% |
이른바 68-95-99.7 규칙이다. 표준화 Z = (X − μ)/σ 를 하면 모든 정규분포가 표준정규분포 N(0, 1) 로 바뀐다.
중심극한정리. 같은 분포를 따르는 독립 확률변수 n 개의 평균은, 원래 분포가 무엇이든(분산이 유한하면) n 이 커질수록 정규분포에 가까워진다. 평균은 μ, 표준편차는 σ/√n 이다. 측정 오차, 표본 평균, 여러 요인의 합이 정규분포처럼 보이는 이유이자, 다음 글의 신뢰구간과 가설 검정의 근거다.
이항분포의 정규 근사. np 와 n(1−p) 가 모두 충분히 크면 B(n, p) ≈ N(np, np(1−p)) 이다.
세 분포 비교
| 분포 | 값 | 모수 | 평균 | 분산 | 전형적 상황 |
|---|---|---|---|---|---|
| 이항 | 0..n 정수 | n, p | np | np(1−p) | n 번 중 성공 횟수 |
| 포아송 | 0 이상 정수 | λ | λ | λ | 단위 시간당 드문 사건 수 |
| 정규 | 실수 전체 | μ, σ | μ | σ² | 많은 작은 효과의 합, 표본 평균 |
정규가 아닌 것을 정규라고 가정하면
응답 시간은 0 아래로 내려가지 않고 오른쪽 꼬리가 길다. 이런 값에 “평균 + 3σ 를 넘으면 이상” 같은 정규 기반 규칙을 그대로 쓰면, 정상적인 꼬리 값에도 알림이 자주 울린다. 이럴 때는 로그를 취해 보거나(로그정규), 분위수 기반 임계값을 쓴다.
직접 해 보기
이항분포와 포아송 근사를 비교하고, statistics.NormalDist 로 68-95-99.7 규칙과 정규 근사를 확인한다.
import math
from statistics import NormalDist
def binom_pmf(k, n, p):
return math.comb(n, k) * p**k * (1 - p)**(n - k)
def poisson_pmf(k, lam):
return math.exp(-lam) * lam**k / math.factorial(k)
# 1) 서버 1000 대, 각 0.3% 확률로 하루 중 고장: B(1000, 0.003) vs Poisson(3)
n, p = 1000, 0.003
for k in range(7):
print(k, round(binom_pmf(k, n, p), 4), round(poisson_pmf(k, n * p), 4))
tail_b = 1 - sum(binom_pmf(k, n, p) for k in range(7))
print("7대 이상 고장 확률:", round(tail_b, 4))
# 2) 68-95-99.7
Z = NormalDist(0, 1)
print([round(Z.cdf(k) - Z.cdf(-k), 4) for k in (1, 2, 3)])
# 3) 이항의 정규 근사: B(100, 0.5) 에서 X <= 40
exact = sum(binom_pmf(k, 100, 0.5) for k in range(41))
approx = NormalDist(50, math.sqrt(25)).cdf(40.5) # 연속성 보정
print(round(exact, 4), round(approx, 4))
실행 결과다.
0 0.0496 0.0498
1 0.1491 0.1494
2 0.2242 0.224
3 0.2244 0.224
4 0.1683 0.168
5 0.1009 0.1008
6 0.0503 0.0504
7대 이상 고장 확률: 0.0333
[0.6827, 0.9545, 0.9973]
0.0284 0.0287
이항분포와 포아송 근사가 소수 셋째 자리까지 거의 같다. 평균 3 대가 고장 나는 환경에서도 7 대 이상 고장 나는 날이 약 3.3%, 한 달에 한 번꼴로 온다. 예비 용량을 평균이 아니라 꼬리로 잡아야 하는 이유다.
현업에서는
- 예비 용량 계획. “평균 고장 수” 만큼만 예비를 두면 위 예에서는 4 대 이상 고장 나는 날(약 35%), 즉 사흘에 한 번꼴로 모자란다. 위 예처럼 꼬리 확률을 계산해서 “월 1 회 이하로만 부족하게” 같은 목표에 맞춰 예비를 정한다. 단, 고장이 서로 독립이라는 가정이 깨지는 상관 장애(같은 전원, 같은 커널 업데이트)는 따로 따져야 한다.
- 트래픽 모델링. 많은 독립 사용자가 만드는 요청 도착은 포아송 과정으로 첫 근사를 한다. 하지만 배치 작업, 크론 잡, 재시도 폭주는 독립 가정을 깨고 분산을 키운다. 정각마다 몰리는 크론 잡 때문에 클러스터 부하가 튀는 것은 흔한 장면이다.
- 이상 탐지 임계값. NIST 의 통계 핸드북은 이상값을 판정할 때 정규성을 가정하는 방법들이 데이터가 정규를 따르지 않으면 잘못된 결론을 낼 수 있다고 경고한다(NIST/SEMATECH e-Handbook, Detection of Outliers). 메트릭의 모양을 먼저 보고 임계값 방식을 고른다.
- 도구. 파이썬 표준 라이브러리의
statistics.NormalDist로 정규분포의 누적확률과 분위수를 바로 계산할 수 있다(Python, statistics.NormalDist).
확인 문제
- 공정한 동전을 10 번 던져 앞면이 정확히 5 번 나올 확률은?
- 초당 평균 2 건의 요청이 포아송 과정으로 들어온다. 어떤 1 초 동안 요청이 하나도 없을 확률은?
- 응답 시간이 N(200ms, 30²) 를 따른다면 260ms 를 넘을 확률은 대략?
- 어떤 데이터의 평균이 5, 분산이 40 이다. 포아송 모델이 적절한가?
풀이
- C(10, 5) / 2¹⁰ = 252/1024 ≈ 0.246.
- e⁻² ≈ 0.135.
- Z = (260 − 200)/30 = 2. 위쪽 꼬리는 (1 − 0.9545)/2 ≈ 0.023.
- 아니다. 포아송은 평균과 분산이 같아야 한다. 분산이 훨씬 크므로 과산포다.