1 왜 지수 분포인가
지수 분포는 “사건이 발생하기까지의 대기 시간” 을 모델링하는 가장 기본적인 분포이다. 더 정확히는, 단위 시간당 평균 \(\lambda\) 번 사건이 발생하는 포아송 과정에서 다음 사건까지의 대기 시간이 정확히 지수 분포를 따른다.
지수 분포가 특별한 이유:
- 무기억성(memoryless property): 이미 \(t\) 시간을 기다렸더라도 앞으로 \(s\) 시간을 더 기다려야 할 확률은 처음부터 \(s\) 를 기다릴 확률과 동일하다. 연속 분포 중 이 성질을 갖는 유일한 분포이다.
- 포아송 과정의 시간 구조: 포아송 분포(사건 횟수)와 지수 분포(사건 간격)는 같은 과정의 두 관점이다.
- 감마·와이블의 출발점: 지수 분포에서 형상 모수를 도입하면 감마와 와이블을 얻는다.
2 정의
\(X \sim \text{Exp}(\beta)\) 이면:
\[ f(x \mid \beta) = \frac{1}{\beta} e^{-x/\beta}, \quad x > 0 \]
\[ F(x \mid \beta) = 1 - e^{-x/\beta}, \quad x > 0 \]
- \(\beta > 0\): 척도 모수(scale parameter), \(\beta = E[X]\) (평균 대기 시간)
감마와의 관계: \(\text{Exp}(\beta) = \text{Gamma}(1, \beta)\).
rate 모수화: \(\lambda = 1/\beta\) (단위 시간당 사건 수)로 표기하면 \(f(x|\lambda) = \lambda e^{-\lambda x}\).
PDF \(f(x) = \frac{1}{\beta} e^{-x/\beta}\):
- \(\frac{1}{\beta}\): \(x = 0\) 에서의 밀도이자 정규화 상수. \(\beta\) 가 클수록 \(x = 0\) 에서의 높이가 낮아지고 분포가 오른쪽으로 퍼진다.
- \(e^{-x/\beta}\): 시간이 지날수록 밀도가 지수적으로 감소한다. \(x = \beta\) (평균)가 되면 밀도가 \(e^{-1} \approx 0.368\) 배로 줄어든다.
- \(x = 0\) 에서 최대값: 지금 당장 사건이 일어날 확률 밀도가 가장 높다. 기다릴수록 밀도가 감소한다.
CDF \(F(x) = 1 - e^{-x/\beta}\):
- “\(x\) 시간 이전에 사건이 발생할 확률”이다.
- \(x = \beta\) (평균 대기 시간)에서 \(F(\beta) = 1 - e^{-1} \approx 0.632\). 평균 대기 시간이 지나도 약 37%는 아직 발생하지 않았다.
- CDF가 여사건 형태인 이유: 생존 함수 \(S(x) = P(X > x) = e^{-x/\beta}\) 가 단순한 지수 감소이기 때문이다.
| 표기 | 모수 | \(E[X]\) | 소프트웨어 |
|---|---|---|---|
| \(\text{Exp}(\beta)\) (scale) | 평균 대기 시간 | \(\beta\) | scipy.stats.expon(scale=β) |
| \(\text{Exp}(\lambda)\) (rate) | 단위 시간당 사건 수 | \(1/\lambda\) | numpy.random.exponential(scale=1/λ) |
이 포스트는 Casella & Berger와 동일하게 scale 모수화 \(\beta\) 를 사용한다.
3 평균, 분산, MGF
감마 분포의 특수 케이스 \(\alpha = 1\) 을 적용한다:
| 성질 | 값 | 유도 |
|---|---|---|
| \(E[X]\) | \(\beta\) | \(\alpha\beta\big|_{\alpha=1} = \beta\) |
| \(E[X^2]\) | \(2\beta^2\) | \(\alpha(\alpha+1)\beta^2\big|_{\alpha=1} = 2\beta^2\) |
| \(\text{Var}(X)\) | \(\beta^2\) | \(\alpha\beta^2\big|_{\alpha=1} = \beta^2\) |
| MGF \(M_X(t)\) | \((1-\beta t)^{-1}\), \(t < 1/\beta\) | \((1-\beta t)^{-\alpha}\big|_{\alpha=1}\) |
직접 유도 (부분적분):
\[ E[X] = \int_0^\infty x \cdot \frac{1}{\beta} e^{-x/\beta} dx = \left[-x e^{-x/\beta}\right]_0^\infty + \int_0^\infty e^{-x/\beta} dx = 0 + \beta = \beta \]
\(\left[-x e^{-x/\beta}\right]_0^\infty\) 의 두 끝:
- \(x \to \infty\): \(x\) 가 아무리 빠르게 커져도 \(e^{-x/\beta}\) 가 지수적으로 더 빠르게 0으로 수렴한다. 로피탈 법칙: \(\lim_{x\to\infty} x / e^{x/\beta} = 0\).
- \(x = 0\): \(0 \cdot e^0 = 0\).
남은 적분 \(\int_0^\infty e^{-x/\beta} dx = \beta\) 는 단순한 지수 적분이다.
결과가 \(\beta\) 인 것은 자연스럽다 — 지수 분포의 유일한 모수가 평균 대기 시간이기도 하다. \(\beta\) 가 “척도 모수”라 불리는 이유가 여기에 있다.
4 생존 함수와 위험 함수
생존 분석(survival analysis)에서 지수 분포는 가장 단순한 수명 모형이다.
생존 함수 (Survival Function):
\[ S(x) = P(X > x) = 1 - F(x) = e^{-x/\beta} \]
위험 함수 (Hazard Function): 시간 \(x\) 까지 생존한 개체가 \([x, x+dx)\) 에서 실패할 순간 비율:
\[ h(x) = \frac{f(x)}{S(x)} = \frac{(1/\beta) e^{-x/\beta}}{e^{-x/\beta}} = \frac{1}{\beta} = \lambda \]
지수 분포의 위험함수는 상수이다. 이를 상수 위험률(constant hazard)이라 한다.
\(h(x) = \lambda\) (상수)라는 것은 “나이가 들어도 실패 위험이 변하지 않는다” 는 뜻이다.
- 현재까지 얼마나 오래 살았든, 다음 순간의 사망 위험은 항상 동일하다.
- 이것이 무기억성의 위험함수 표현이다.
- 감소하는 위험률 (처음에 약한 개체가 빨리 죽고 강한 개체가 남는 경우): 와이블 분포(\(\gamma < 1\))
- 증가하는 위험률 (노화처럼 시간이 지날수록 위험 증가): 와이블 분포(\(\gamma > 1\))
5 무기억성 (Memoryless Property)
5.1 정의와 증명
\(X \sim \text{Exp}(\beta)\) 이면, 임의의 \(s, t > 0\) 에 대해:
\[ P(X > s + t \mid X > t) = P(X > s) \]
“\(t\) 시간 동안 기다렸다는 사실이 앞으로의 대기 시간 분포에 영향을 주지 않는다.”
증명 (Casella & Berger, 2002, Ch.3.3):
\[ P(X > s + t \mid X > t) = \frac{P(X > s+t,\ X > t)}{P(X > t)} = \frac{P(X > s+t)}{P(X > t)} \]
\[ = \frac{e^{-(s+t)/\beta}}{e^{-t/\beta}} = e^{-s/\beta} = P(X > s) \quad \square \]
5.2 역도: 무기억성이면 지수 분포
연속 분포에서 무기억성을 만족하면 반드시 지수 분포이다.
증명: \(G(x) = P(X > x)\) 로 정의하면, 무기억성 조건은 \(G(s+t) = G(s)G(t)\) 이다.
이 함수방정식의 연속 해(continuous solution)는 \(G(x) = e^{-\lambda x}\) (\(\lambda > 0\)) 뿐이다.
따라서 \(F(x) = 1 - e^{-\lambda x}\) — 지수 분포의 CDF이다. \(\square\)
\(G(s+t) = G(s)G(t)\) 는 Cauchy 함수방정식이다. 연속 함수로 제한하면 해는 \(G(x) = a^x\) 형태이고, \(G(0) = 1\), \(G(x) \to 0\) 조건으로 \(a = e^{-\lambda}\) (\(\lambda > 0\)) 만 가능하다.
6 포아송 과정과의 이중성
지수 분포와 포아송 분포는 같은 확률 과정의 두 관점이다.
포아송 과정 (rate \(\lambda = 1/\beta\)): - 단위 시간에 평균 \(\lambda\) 번 사건 발생 - 시각 \(t\) 까지의 사건 수 \(N(t) \sim \text{Poisson}(\lambda t)\) - 연속된 사건 간격 \(T_i\) 는 iid \(\text{Exp}(\beta)\)
이중성:
\[ P(T_1 > t) = P(N(t) = 0) = e^{-\lambda t} = e^{-t/\beta} \]
첫 번째 사건까지 대기 시간 \(T_1\) 이 \(t\) 보다 길 확률 = 시각 \(t\) 까지 사건이 0건일 확률.
| 관점 | 확률변수 | 분포 |
|---|---|---|
| 사건 횟수 | \(N(t)\): 시각 \(t\) 까지 사건 수 | \(\text{Poisson}(\lambda t)\) |
| 대기 시간 | \(T_k\): \(k\) 번째 사건까지 총 시간 | \(\text{Gamma}(k, \beta) = \text{Erlang}(k, \lambda)\) |
| 첫 대기 | \(T_1 = T\): 다음 사건까지 시간 | \(\text{Exp}(\beta)\) |
\(P(T_1 > t) = P(N(t) = 0)\) 을 말로 하면: “첫 번째 사건이 \(t\) 이후에 발생한다” = “시각 \(t\) 까지 사건이 하나도 발생하지 않는다”. 이 두 문장은 완전히 동일한 사건이다.
- 시간 축 관점: 대기 시간 \(T_1\) 이 얼마나 긴지를 보는 것 → 지수 분포
- 사건 수 관점: 특정 시간 구간에 사건이 몇 번 발생했는지를 보는 것 → 포아송 분포
같은 랜덤 과정(포아송 과정)을 어떤 측면에서 보느냐에 따라 분포가 달라진다. 지수 분포와 포아송 분포는 별개의 분포가 아니라 같은 과정의 두 표현이다.
비유: 버스 도착 문제에서 “다음 버스까지 몇 분을 기다리는가”(지수)와 “1시간 동안 버스가 몇 대 오는가”(포아송)는 동일한 버스 도착 과정을 서로 다른 질문으로 바라본 것이다.
7 기하 분포와의 대응 — 이산 유사체
이산 분포에서 무기억성을 갖는 유일한 분포가 기하 분포이다. 지수 분포는 기하 분포의 연속 유사체이다.
| 성질 | 지수 분포 \(\text{Exp}(\beta)\) | 기하 분포 \(\text{Geom}(p)\) |
|---|---|---|
| 지지 | \((0, \infty)\) (연속) | \(\{1, 2, 3, \ldots\}\) (이산) |
| 무기억성 | \(P(X>s+t\|X>t) = P(X>s)\) | \(P(X>m+n\|X>m) = P(X>n)\) |
| 평균 | \(\beta = 1/\lambda\) | \(1/p\) |
| 위험률 | 상수 \(\lambda\) | 상수 \(p\) |
| 관계 | \(\lfloor X/\delta \rfloor \to \text{Geom}\) as \(\delta \to 0\) | 지수의 이산 근사 |
8 와이블 분포로의 일반화
Casella & Berger(2002, Ch.3.3): \(X \sim \text{Exp}(\beta)\) 이면 \(Y = X^{1/\gamma}\) 는 와이블 분포를 따른다.
\[ f_Y(y \mid \gamma, \beta) = \frac{\gamma}{\beta} y^{\gamma-1} e^{-y^\gamma/\beta}, \quad y > 0 \]
와이블의 위험함수:
\[ h_Y(y) = \frac{\gamma}{\beta} y^{\gamma-1} \]
| \(\gamma\) | 위험함수 형태 | 해석 |
|---|---|---|
| \(\gamma < 1\) | 감소 | 초기 고장률 높음, 이후 안정 (burn-in) |
| \(\gamma = 1\) | 상수 | 지수 분포 — 무기억성 |
| \(\gamma > 1\) | 증가 | 노화, 피로 파괴 (wear-out) |
9 코드 예시
9.1 Step 1: 순수 Python — 무기억성 직접 검증
import math
import random
def exp_pdf(x, beta):
return (1/beta) * math.exp(-x/beta) if x > 0 else 0.0
def exp_survival(x, beta):
return math.exp(-x/beta) if x > 0 else 1.0
# 무기억성 P(X > s+t | X > t) = P(X > s) 수치 검증
beta = 3.0
s, t = 2.0, 5.0
lhs = exp_survival(s + t, beta) / exp_survival(t, beta)
rhs = exp_survival(s, beta)
print("=== 무기억성 수치 검증 ===")
print(f"P(X > {s+t} | X > {t}) = {lhs:.8f}")
print(f"P(X > {s}) = {rhs:.8f}")
print(f"동일한가: {'YES' if abs(lhs - rhs) < 1e-10 else 'NO'}")
# 위험함수 h(x) = 1/β 상수 확인
print(f"\n=== 위험함수 h(x) = 1/β = {1/beta:.4f} ===")
for x in [0.5, 1.0, 2.0, 5.0, 10.0]:
hx = exp_pdf(x, beta) / exp_survival(x, beta)
print(f"h({x:4.1f}) = {hx:.6f} (이론: {1/beta:.6f})")
# 무기억성 시뮬레이션: t시간 기다린 후 남은 대기시간 분포
random.seed(42)
beta_sim = 2.0
t_cond = 3.0 # 이미 3 이상 기다린 조건
n_sim = 100_000
# X ~ Exp(β), X > t 조건 하의 X - t 분포
residuals = []
while len(residuals) < n_sim:
x = random.expovariate(1/beta_sim)
if x > t_cond:
residuals.append(x - t_cond) # 조건부 남은 시간
import statistics
mean_res = statistics.mean(residuals)
stdev_res = statistics.stdev(residuals)
print(f"\n=== 무기억성 시뮬레이션 (β={beta_sim}, t={t_cond}) ===")
print(f"조건부 잔여 대기시간 평균={mean_res:.4f} (이론: β = {beta_sim})")
print(f"조건부 잔여 대기시간 표준편차={stdev_res:.4f} (이론: β = {beta_sim})")=== 무기억성 수치 검증 ===
P(X > 7.0 | X > 5.0) = 0.51341712
P(X > 2.0) = 0.51341712
동일한가: YES
=== 위험함수 h(x) = 1/β = 0.3333 ===
h( 0.5) = 0.333333 (이론: 0.333333)
h( 1.0) = 0.333333 (이론: 0.333333)
h( 2.0) = 0.333333 (이론: 0.333333)
h( 5.0) = 0.333333 (이론: 0.333333)
h(10.0) = 0.333333 (이론: 0.333333)
=== 무기억성 시뮬레이션 (β=2.0, t=3.0) ===
조건부 잔여 대기시간 평균=1.9997 (이론: β = 2.0)
조건부 잔여 대기시간 표준편차=2.0001 (이론: β = 2.0)
9.2 Step 2: scipy.stats — 포아송 과정 이중성
import numpy as np
from scipy import stats
np.random.seed(0)
N = 100_000
# ── 포아송 과정 이중성 검증 ────────────────────────────────────
lam = 0.5 # rate (단위 시간당 사건 수)
beta = 1/lam
# 방법 1: 지수 분포에서 첫 사건 대기시간 직접 샘플링
T1_direct = np.random.exponential(scale=beta, size=N)
# 방법 2: 포아송 과정 시뮬레이션 → P(T1 > t) = P(N(t) = 0) 확인
t_grid = np.array([0.5, 1.0, 2.0, 3.0, 5.0])
print("=== 포아송 과정 이중성: P(T₁ > t) = P(N(t) = 0) ===")
print(f"{'t':>5} | {'P(T₁>t) 이론':>14} | {'P(T₁>t) 시뮬':>14} | {'P(N(t)=0) 이론':>14}")
print("-" * 55)
for t in t_grid:
p_theory = np.exp(-lam * t) # e^{-λt}
p_T1_sim = np.mean(T1_direct > t) # 시뮬레이션
p_N0_theory = stats.poisson.pmf(0, mu=lam*t) # e^{-λt}
print(f"{t:>5.1f} | {p_theory:>14.6f} | {p_T1_sim:>14.6f} | {p_N0_theory:>14.6f}")
# ── 에를랑: k번째 사건까지 대기시간 = Gamma(k, β) ─────────────
print(f"\n=== Erlang: k번째 사건까지 대기시간 (λ={lam}) ===")
for k in [1, 3, 5]:
# 지수 간격 k개 합산
erlang_sim = np.sum(np.random.exponential(beta, (N, k)), axis=1)
mean_th = k * beta
var_th = k * beta**2
ks_stat, p_val = stats.kstest(erlang_sim, 'gamma', args=(k, 0, beta))
print(f"k={k}: 표본 평균={erlang_sim.mean():.3f} (이론:{mean_th:.1f}), "
f"KS p={p_val:.4f} {'OK' if p_val>0.05 else 'FAIL'}")
# ── MLE: 지수 분포 모수 추정 ──────────────────────────────────
print(f"\n=== MLE 추정: β_hat = x̄ ===")
beta_true = 4.0
data = np.random.exponential(scale=beta_true, size=200)
beta_hat = data.mean() # MLE: β̂ = x̄
se_hat = beta_hat / np.sqrt(len(data)) # MLE 표준오차
print(f"β_true={beta_true}, β_hat={beta_hat:.4f}, SE={se_hat:.4f}")
print(f"95% CI: ({beta_hat - 1.96*se_hat:.4f}, {beta_hat + 1.96*se_hat:.4f})")
print(f"β_true 포함: {'YES' if beta_hat - 1.96*se_hat < beta_true < beta_hat + 1.96*se_hat else 'NO'}")=== 포아송 과정 이중성: P(T₁ > t) = P(N(t) = 0) ===
t | P(T₁>t) 이론 | P(T₁>t) 시뮬 | P(N(t)=0) 이론
-------------------------------------------------------
0.5 | 0.778801 | 0.778870 | 0.778801
1.0 | 0.606531 | 0.606220 | 0.606531
2.0 | 0.367879 | 0.368100 | 0.367879
3.0 | 0.223130 | 0.222920 | 0.223130
5.0 | 0.082085 | 0.082200 | 0.082085
=== Erlang: k번째 사건까지 대기시간 (λ=0.5) ===
k=1: 표본 평균=2.002 (이론:2.0), KS p=0.8143 OK
k=3: 표본 평균=5.991 (이론:6.0), KS p=0.6027 OK
k=5: 표본 평균=9.993 (이론:10.0), KS p=0.4561 OK
=== MLE 추정: β_hat = x̄ ===
β_true=4.0, β_hat=3.9421, SE=0.2787
95% CI: (3.3958, 4.4884)
β_true 포함: YES
9.3 Step 3: 와이블 위험함수 비교
import numpy as np
from scipy import stats
x = np.linspace(0.01, 5, 500)
beta_w = 2.0 # scale
print("=== 와이블 위험함수 h(x) = (γ/β) * x^(γ-1) ===")
print(f"{'x':>6} | {'γ=0.5 (감소)':>14} | {'γ=1.0 (상수)':>14} | {'γ=2.0 (증가)':>14}")
print("-" * 55)
for xi in [0.5, 1.0, 2.0, 3.0, 4.0]:
h_05 = (0.5/beta_w) * xi**(0.5-1)
h_10 = (1.0/beta_w) * xi**(1.0-1) # = 1/β (상수)
h_20 = (2.0/beta_w) * xi**(2.0-1)
print(f"{xi:>6.1f} | {h_05:>14.6f} | {h_10:>14.6f} | {h_20:>14.6f}")
# 지수분포 MLE가 x̄인 이유
print(f"\n=== MLE 유도: 로그우도 최대화 ===")
print("log L(β) = -n*log(β) - (1/β)*Σxᵢ")
print("d/dβ log L = -n/β + Σxᵢ/β² = 0")
print("=> β̂ = Σxᵢ/n = x̄ (표본 평균이 MLE)")
np.random.seed(1)
for beta_t in [1.0, 3.0, 5.0]:
samp = np.random.exponential(scale=beta_t, size=1000)
print(f"β={beta_t}: β̂ = x̄ = {samp.mean():.4f}")=== 와이블 위험함수 h(x) = (γ/β) * x^(γ-1) ===
x | γ=0.5 (감소) | γ=1.0 (상수) | γ=2.0 (증가)
-------------------------------------------------------
0.5 | 0.353553 | 0.500000 | 0.500000
1.0 | 0.250000 | 0.500000 | 1.000000
2.0 | 0.176777 | 0.500000 | 2.000000
3.0 | 0.144338 | 0.500000 | 3.000000
4.0 | 0.125000 | 0.500000 | 4.000000
=== MLE 유도: 로그우도 최대화 ===
log L(β) = -n*log(β) - (1/β)*Σxᵢ
d/dβ log L = -n/β + Σxᵢ/β² = 0
=> β̂ = Σxᵢ/n = x̄ (표본 평균이 MLE)
β=1.0: β̂ = x̄ = 0.9965
β=3.0: β̂ = x̄ = 3.0049
β=5.0: β̂ = x̄ = 4.9830
10 MLE — 표본 평균이 최대우도추정량
로그우도 함수:
\[ \ell(\beta) = \sum_{i=1}^n \log f(x_i \mid \beta) = -n\log\beta - \frac{1}{\beta}\sum_{i=1}^n x_i \]
\(\beta\) 에 대해 미분하면:
\[ \frac{d\ell}{d\beta} = -\frac{n}{\beta} + \frac{\sum x_i}{\beta^2} = 0 \implies \hat{\beta} = \frac{1}{n}\sum_{i=1}^n x_i = \bar{x} \]
\(\hat{\beta} = \bar{x}\) 는 비편향이며, 피셔 정보량으로부터 분산의 하한이 \(\beta^2/n\) 이고 이를 달성하므로 UMVUE(균일최소분산 불편추정량)이다.
지수 분포의 유일한 모수 \(\beta\) 는 평균 대기 시간이다. \(n\) 번 사건을 관측했을 때, 가장 자연스러운 \(\beta\) 의 추정량은 “평균적으로 얼마나 기다렸는가” — 즉 \(\bar{x}\) 이다.
로그우도 \(\ell(\beta) = -n\log\beta - \frac{1}{\beta}\sum x_i\) 를 \(\beta\) 로 미분하면:
\[\frac{d\ell}{d\beta} = -\frac{n}{\beta} + \frac{\sum x_i}{\beta^2} = 0 \implies \hat{\beta} = \bar{x}\]
두 번째 항 \(\sum x_i / \beta^2\) 는 “데이터의 총 대기 시간이 모수 추정에 미치는 기여”이고, 이것이 첫 번째 항(모수의 페널티)과 균형을 이루는 지점이 \(\bar{x}\) 이다.
지수 분포는 단일 모수 지수족이고 충분통계량이 \(\sum x_i\) (= \(n\bar{x}\))이기 때문에 \(\bar{x}\) 가 MLE임이 보장된다.
11 응용 분야
| 분야 | 활용 | 이유 |
|---|---|---|
| 대기 행렬 이론 | 서비스 시간, 도착 간격 | 포아송 입력 → 지수 간격 |
| 신뢰성 공학 | 전자 부품 수명 (burn-in 이후) | 상수 위험률, 무기억성 |
| 생존 분석 | 기저 위험함수(baseline hazard) | 콕스 비례위험 모형의 특수 케이스 |
| 베이지안 통계 | 포아송 rate의 켤레 사전분포 | \(\lambda \mid \alpha,\beta \sim \text{Gamma}\) |
| 보험 수리 | 보험금 청구 시간 간격 | 포아송 클레임 과정 |
| 네트워크 | 패킷 도착 간격 | 랜덤 액세스 프로토콜 |
12 성질 요약
| 성질 | 값 |
|---|---|
| 지지 | \((0, \infty)\) |
| 평균 \(E[X]\) | \(\beta\) |
| 분산 \(\text{Var}(X)\) | \(\beta^2\) |
| 왜도 | 2 (모수 무관) |
| 첨도(초과) | 6 (모수 무관) |
| MGF \(M_X(t)\) | \((1-\beta t)^{-1}\), \(t < 1/\beta\) |
| 위험함수 | \(1/\beta\) (상수) |
| MLE | \(\hat{\beta} = \bar{x}\) |
| 무기억성 | 연속 분포 중 유일 |
| 감마와의 관계 | \(\text{Gamma}(1, \beta)\) |
13 관련 주제
선행 지식
- 감마 분포 (Gamma Distribution)
- 포아송 분포 — 이중성의 상대방
- 기하 분포 — 이산 유사체
후속 주제
관련 개념