math
CHAPTER 41 / 45
읽기 약 2분
FUNCTION
확률 분포: 데이터의 모양
핵심 개념
균등·정규·이항·포아송 분포 — 사용자 행동·서버 요청·오류율 분석.
본문
주요 확률 분포
| 분포 | 모양 | 사용처 |
|---|---|---|
| 균등 (Uniform) | 평평 | 무작위 추출 |
| 정규 (Normal) | 종 모양 | 자연 현상, 측정값 |
| 이항 (Binomial) | 막대 | n번 시도 중 성공 횟수 |
| 포아송 (Poisson) | 우측 꼬리 | 단위 시간당 이벤트 수 |
| 지수 (Exponential) | 우측 감소 | 이벤트 간격 |
정규분포 (가우시안)
import numpy as np
import matplotlib.pyplot as plt
# N(평균=0, 표준편차=1)
samples = np.random.normal(loc=0, scale=1, size=10000)
plt.hist(samples, bins=50, density=True, alpha=0.7)
plt.title("정규분포 N(0, 1)")
plt.xlabel("값")
plt.ylabel("확률 밀도")
plt.show()
# 68-95-99.7 규칙
# ±1σ 안: 68.27%
# ±2σ 안: 95.45%
# ±3σ 안: 99.73%
within_1sigma = np.sum(np.abs(samples) < 1) / len(samples)
within_2sigma = np.sum(np.abs(samples) < 2) / len(samples)
within_3sigma = np.sum(np.abs(samples) < 3) / len(samples)
print(f"±1σ: {within_1sigma:.4f}") # ~0.68
print(f"±2σ: {within_2sigma:.4f}") # ~0.95
print(f"±3σ: {within_3sigma:.4f}") # ~0.997이항분포
# n번 시도, 각 시도 성공 확률 p
# 예: 동전 100번 던질 때 앞면 횟수
n_trials = 100
p = 0.5
samples = np.random.binomial(n=n_trials, p=p, size=10000)
print(f"평균: {samples.mean():.2f} (이론: {n_trials*p})")
print(f"분산: {samples.var():.2f} (이론: {n_trials*p*(1-p)})")
plt.hist(samples, bins=30, density=True, alpha=0.7)
plt.title(f"이항분포 B(n={n_trials}, p={p})")
plt.show()
# 실전 — A/B 테스트
# 100명 방문 시 변형 A로 5% 전환 (CTR=0.05)
n_visitors = 100
true_ctr = 0.05
# 1000번 실험 시뮬레이션
results = np.random.binomial(n=n_visitors, p=true_ctr, size=1000)
print(f"\n100명 중 전환 횟수의 분포:")
print(f"평균: {results.mean():.1f}")
print(f"95% 구간: {np.percentile(results, 2.5):.0f} ~ {np.percentile(results, 97.5):.0f}")포아송분포
# 단위 시간당 이벤트 수 — 평균 λ
# 예: 시간당 평균 3건의 콜센터 콜
import numpy as np
lambd = 3 # 시간당 평균 3건
samples = np.random.poisson(lam=lambd, size=10000)
print(f"평균: {samples.mean():.2f} (이론: {lambd})")
print(f"분산: {samples.var():.2f} (이론: {lambd}) ← 포아송은 평균=분산")
# 시간당 정확히 5건이 들어올 확률
from scipy import stats
p_5 = stats.poisson.pmf(5, mu=lambd)
print(f"\n시간당 5건: P = {p_5:.4f}") # 약 0.10
# 시간당 0건 (call 없음)
print(f"시간당 0건: P = {stats.poisson.pmf(0, mu=lambd):.4f}") # 0.05분포 시각화
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
x = np.linspace(-5, 5, 1000)
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 정규
axes[0, 0].plot(x, stats.norm.pdf(x, 0, 1))
axes[0, 0].set_title("정규분포 N(0, 1)")
# 균등 (-2~2)
axes[0, 1].plot(x, stats.uniform.pdf(x, -2, 4))
axes[0, 1].set_title("균등분포 U(-2, 2)")
# 지수
x_exp = np.linspace(0, 5, 1000)
axes[1, 0].plot(x_exp, stats.expon.pdf(x_exp, scale=1))
axes[1, 0].set_title("지수분포 (λ=1)")
# 포아송 (이산)
k = np.arange(0, 15)
axes[1, 1].bar(k, stats.poisson.pmf(k, mu=3))
axes[1, 1].set_title("포아송분포 (λ=3)")
plt.tight_layout()
plt.show()실전 — 서버 응답 시간 분석
import numpy as np
# 1000개 요청의 응답 시간 (ms)
response_times = np.concatenate([
np.random.lognormal(mean=2.0, sigma=0.5, size=950), # 일반 요청
np.random.lognormal(mean=4.0, sigma=0.3, size=50), # 느린 요청 (5% 이상치)
])
# 통계
print(f"평균: {response_times.mean():.1f}ms")
print(f"중앙값: {np.median(response_times):.1f}ms")
print(f"P95: {np.percentile(response_times, 95):.1f}ms")
print(f"P99: {np.percentile(response_times, 99):.1f}ms")
# 시각화
plt.hist(response_times, bins=50, alpha=0.7)
plt.axvline(np.percentile(response_times, 95), color='red', label='P95')
plt.axvline(np.percentile(response_times, 99), color='orange', label='P99')
plt.xlabel('응답 시간 (ms)')
plt.ylabel('빈도')
plt.legend()
plt.title("응답 시간 분포 — Long tail")
plt.show()
# → "평균"보다 "P95/P99"가 더 의미있는 지표다음 챕터
CH.42 "베이즈 정리" — AI 추론의 수학적 기반.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 모니터링 데이터(응답 시간/오류율)를 분포로 분석해서 적합한 모델과 SLO 임계값을 추천해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
한국 SaaS 5개의 P95/P99 SLO 정책과 실제 가용성 사례를 비교 분석해줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 GA4 데이터에서 사용자 행동 분포를 분석해서 이상치 탐지 + 코호트 핵심 지표를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 분포 분석 도구(Datadog/New Relic/Grafana)와 실무 활용 트렌드를 솔직히 알려줘.
⭐ 이것만 기억하세요
확률 분포: 데이터의 모양은 이 3가지만 확실히 잡으세요
1.정규분포는 자연 현상의 가장 흔한 모양 — 68-95-99.7 규칙으로 빠른 확률 추정
2.이항분포는 N번 시도 중 성공 횟수 — A/B 테스트의 기본
3.다음 챕터 CH.42에서 베이즈 정리 — 사전확률을 데이터로 업데이트
공유하기
진행도 41 / 45