1 개요
지금까지 확률변수는 하나의 고정된 분포를 가진다고 가정하였다. 그러나 현실에서는 분포의 모수 자체가 또 다른 확률변수인 경우가 많다 (Casella & Berger, 2002, Ch.4).
실무 예시: 곤충이 낳는 알의 수가 포아송 분포 \(\text{Poi}(\lambda)\) 를 따르지만, \(\lambda\) 가 모든 어미에게 동일하지 않다. 건강한 어미는 \(\lambda = 20\) , 약한 어미는 \(\lambda = 5\) 일 수 있다. 이를 “모수가 고정”된 것으로 보는 대신, \(\lambda\) 도 확률변수로 모형화하면 계층모형(hierarchical model)이 된다. 예를 들어 \(\lambda \sim \text{Ga}(\alpha, \beta)\) 로 두면, 어미마다 다른 \(\lambda\) 를 가지는 이질성(heterogeneity)을 모형에 반영할 수 있다.
계층모형에서 두 가지 핵심 도구가 자연스럽게 등장한다:
- 전체 기대값의 법칙 (Adam’s law): \(E[X] = E[E[X|Y]]\)
- 전체 분산의 법칙 (Eve’s law): \(\text{Var}(X) = E[\text{Var}(X|Y)] + \text{Var}(E[X|Y])\)
그리고 계층모형에서 중간 변수를 적분(또는 합산)하여 제거하면 혼합분포(mixture distribution)를 얻는다.
2 계층모형의 구조
계층모형의 기본 형태:
\[ X | Y \sim f(x|y), \quad Y \sim f_Y(y) \]
\(X\) 의 주변분포는:
\[ f_X(x) = \int f(x|y) \, f_Y(y) \, dy \quad \text{(연속)} \quad \text{또는} \quad \sum_y f(x|y) \, f_Y(y) \quad \text{(이산)} \]
계층모형의 장점은 복잡한 주변분포를 간단한 조건부 모형의 결합으로 표현할 수 있다는 것이다. 주변분포를 직접 다루는 것보다 각 층의 조건부 모형이 더 직관적이고 해석 가능한 경우가 많다.
3 전체 기대값의 법칙 (Law of Total Expectation)
\(X\) 와 \(Y\) 가 임의의 확률변수이면:
\[ E[X] = E[E[X|Y]] \]
증명의 핵심:
\[ E[X] = \iint x \, f(x, y) \, dx \, dy = \int \left[\int x \, f(x|y) \, dx\right] f_Y(y) \, dy = \int E[X|y] \, f_Y(y) \, dy = E[E[X|Y]] \]
내부 적분이 \(E[X|y]\) 이고, 외부 적분이 그것의 \(Y\) 에 대한 기대값이다.
주의: 이 식에서 “E”가 세 번 등장하며 각각 다른 기대값이다:
- 좌변의 \(E\) : \(X\) 의 주변분포에 대한 기대값
- 외부 \(E\) : \(Y\) 의 주변분포에 대한 기대값
- 내부 \(E\) : \(X|Y\) 의 조건부분포에 대한 기대값
4 전체 분산의 법칙 (Law of Total Variance)
\(X\) 와 \(Y\) 가 임의의 확률변수이면:
\[ \text{Var}(X) = E[\text{Var}(X|Y)] + \text{Var}(E[X|Y]) \]
이 분해의 의미:
| 항 | 의미 | ANOVA 용어 |
|---|---|---|
| \(E[\text{Var}(X|Y)]\) | 그룹 내 분산의 평균 | Within-group variance |
| \(\text{Var}(E[X|Y])\) | 그룹 간 분산 | Between-group variance |
| \(\text{Var}(X)\) | 전체 분산 | Total variance |
전체 분산 = 그룹 내 분산 + 그룹 간 분산. 이것이 ANOVA의 이론적 기반이다. \(Y\) 가 그룹 변수일 때, 전체 변동을 그룹 내 변동과 그룹 간 변동으로 분해한다.
5 예시: 이항-포아송 계층
곤충이 \(Y \sim \text{Poi}(\lambda)\) 개의 알을 낳고, 각 알이 독립적으로 확률 \(p\) 로 생존한다 (Casella & Berger, 2002, Example 4.4.1):
\[ X|Y \sim \text{Bin}(Y, p), \quad Y \sim \text{Poi}(\lambda) \]
기대값: \(E[X] = E[E[X|Y]] = E[pY] = p\lambda\)
주변분포: \(X \sim \text{Poi}(\lambda p)\) (위 이변량 변환 포스트에서 유사한 결과를 보았다)
분산: 전체 분산의 법칙을 적용하면:
\[ \text{Var}(X) = E[\text{Var}(X|Y)] + \text{Var}(E[X|Y]) = E[Yp(1-p)] + \text{Var}(pY) \]
\[ = \lambda p(1-p) + p^2 \lambda = \lambda p \]
\(\text{Poi}(\lambda p)\) 의 분산 \(\lambda p\) 와 일치한다.
6 예시: 베타-이항 계층
성공 확률 자체가 변동하는 이항 실험 (Casella & Berger, 2002, Example 4.4.6):
\[ X|P \sim \text{Bin}(n, P), \quad P \sim \text{Beta}(\alpha, \beta) \]
기대값:
\[ E[X] = E[E[X|P]] = E[nP] = n \cdot \frac{\alpha}{\alpha + \beta} \]
분산: 전체 분산의 법칙으로 (Casella & Berger, 2002, Example 4.4.8):
\[ \text{Var}(X) = E[nP(1-P)] + \text{Var}(nP) = n \frac{\alpha\beta(\alpha + \beta + n)}{(\alpha + \beta)^2(\alpha + \beta + 1)} \]
\(P\) 가 고정된 \(p\) 일 때 \(\text{Var}(X) = np(1-p)\) 인 것과 비교하면, \(P\) 의 변동이 추가 분산을 만들어낸다. 이것이 과분산(overdispersion)의 메커니즘이다.
7 예시: 포아송-감마 혼합 = 음이항
\(Y|\Lambda \sim \text{Poi}(\Lambda)\) , \(\Lambda \sim \text{Gamma}(\alpha, \beta)\) 인 계층에서 \(Y\) 의 주변분포는 음이항분포가 된다 (Casella & Berger, 2002, Ch.4).
\[ P(Y = y) = \int_0^{\infty} \frac{e^{-\lambda} \lambda^y}{y!} \cdot \frac{\lambda^{\alpha-1} e^{-\lambda/\beta}}{\Gamma(\alpha) \beta^{\alpha}} \, d\lambda \]
적분을 수행하면 음이항 PMF를 얻는다. 이 결과의 실무적 의미: 음이항분포는 “더 변동이 큰 포아송”으로 해석할 수 있다. 포아송의 모수 \(\Lambda\) 자체가 감마분포를 따르면, 주변적으로 음이항이 된다.
8 혼합분포 (Mixture Distribution)
확률변수 \(X\) 의 분포가 또 다른 확률변수의 분포에 의존하면, \(X\) 는 혼합분포(mixture distribution)를 가진다고 한다.
계층모형에서 중간 변수를 주변화(marginalize)하면 혼합분포가 된다:
| 계층 | 혼합 결과 |
|---|---|
| Bin\((Y, p)\) + Poi\((\lambda)\) | Poi\((\lambda p)\) |
| Poi\((\Lambda)\) + Gamma\((\alpha, \beta)\) | 음이항 |
| Bin\((n, P)\) + Beta\((\alpha, \beta)\) | 베타-이항 |
| \(\chi^2_{p+2K}\) + Poi\((\lambda)\) | 비중심 카이제곱 |
비중심 카이제곱 예시 (Casella & Berger, 2002, Ch.4): \(X|K \sim \chi^2_{p+2K}\) , \(K \sim \text{Poi}(\lambda)\) 이면 \(E[X] = E[p + 2K] = p + 2\lambda\) 로, 복잡한 PDF를 직접 적분하지 않고도 기대값을 계산할 수 있다.
9 왜 계층모형이 중요한가
| 측면 | 설명 |
|---|---|
| 모형의 직관성 | 3단계 계층이 2단계보다 수학적으로 동등하지만, 각 층의 의미가 명확하여 이해하기 쉽다 |
| 계산의 단순화 | 복잡한 주변분포의 적률을 조건부 적률의 반복으로 간단히 구할 수 있다 |
| 과분산 모형화 | 모수의 변동을 허용하여 포아송보다 큰 분산을 자연스럽게 표현한다 |
| 베이지안 추론 | 사전-가능도-사후의 구조가 본질적으로 계층모형이다 |
10 응용 분야
| 분야 | 계층모형 | 구체적 예시 |
|---|---|---|
| ANOVA | \(X_{ij} | \mu_i \sim N(\mu_i, \sigma^2)\) | 분산 분해 = 전체 분산의 법칙 |
| 베이지안 | \(X|\theta \sim f(x|\theta)\) , \(\theta \sim \pi(\theta)\) | 사후분포 \(\propto\) 가능도 \(\times\) 사전 |
| 과분산 | Poi\((\Lambda)\) + Gamma | 음이항 회귀 (포아송 회귀의 대안) |
| 혼합모형 | \(X|Z=k \sim f_k(x)\) , \(Z \sim \text{Categorical}\) | Gaussian Mixture Model (GMM) |
| 다수준 분석 | 학생 \(|\) 학교 \(|\) 지역 | 교육학, 역학의 다수준 모형 |
| 메타분석 | 효과 \(|\) 연구 \(\sim N(\mu_i, \sigma_i^2)\) | 랜덤효과 메타분석 |
11 코드 예시
11.1 Step 1: 순수 Python 구현 (원리 이해)
전체 기대값의 법칙과 전체 분산의 법칙을 이항-포아송 계층에서 검증한다.
import math
import random
random.seed(42)
lam = 10.0
p = 0.3
n_sim = 200000
X_samples = []
for _ in range(n_sim):
y = 0
# 포아송 난수 생성 (역변환법)
L = math.exp(-lam)
k = 0
pp = 1.0
while pp > L:
k += 1
pp *= random.random()
y = k - 1
# 이항 난수: y번 시행, 성공확률 p
x = sum(1 for _ in range(y) if random.random() < p)
X_samples.append(x)
mean_x = sum(X_samples) / n_sim
var_x = sum((x - mean_x)**2 for x in X_samples) / n_sim
print("이항-포아송 계층: X|Y ~ Bin(Y, 0.3), Y ~ Poi(10)")
print(f" E[X] (시뮬레이션) = {mean_x:.3f}")
print(f" E[X] (이론: lambda*p) = {lam * p:.3f}")
print(f" Var(X) (시뮬레이션) = {var_x:.3f}")
print(f" Var(X) (이론: lambda*p) = {lam * p:.3f}")
print(f"\n전체 분산 분해:")
print(f" E[Var(X|Y)] = E[Yp(1-p)] = lambda*p*(1-p) = {lam*p*(1-p):.3f}")
print(f" Var(E[X|Y]) = Var(pY) = p^2*lambda = {p**2*lam:.3f}")
print(f" 합계 = {lam*p*(1-p) + p**2*lam:.3f}")11.2 Step 2: scipy/numpy 구현 (실무 활용)
베타-이항 계층에서 과분산을 확인하고, 포아송-감마 혼합이 음이항이 됨을 시각화한다.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(42)
n_sim = 100000
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
# --- 1) 베타-이항: 과분산 확인 ---
n_trials = 20
alpha, beta_param = 2, 5
P = np.random.beta(alpha, beta_param, n_sim)
X_beta_bin = np.array([np.random.binomial(n_trials, pp) for pp in P])
# 고정 p에서의 이항과 비교
p_fixed = alpha / (alpha + beta_param)
X_bin = np.random.binomial(n_trials, p_fixed, n_sim)
ax = axes[0]
ax.hist(X_bin, bins=range(n_trials+2), density=True, alpha=0.5, label=f"Bin({n_trials}, {p_fixed:.2f})")
ax.hist(X_beta_bin, bins=range(n_trials+2), density=True, alpha=0.5, label="Beta-Bin (overdispersed)")
ax.set_title("Beta-Binomial: Overdispersion")
ax.legend(fontsize=8)
ax.set_xlabel("X")
print(f"[Beta-Bin] Var = {np.var(X_beta_bin):.2f} vs [Bin] Var = {np.var(X_bin):.2f}")
# --- 2) 포아송-감마 혼합 = 음이항 ---
alpha_g, beta_g = 3.0, 2.0
Lambda = np.random.gamma(alpha_g, beta_g, n_sim)
Y_mixture = np.array([np.random.poisson(lam_i) for lam_i in Lambda])
# 음이항 이론 분포
r_nb = alpha_g
p_nb = 1 / (1 + beta_g)
y_vals = np.arange(0, 30)
nb_pmf = stats.nbinom.pmf(y_vals, r_nb, p_nb)
ax = axes[1]
ax.hist(Y_mixture, bins=range(31), density=True, alpha=0.6, label="Poi-Gamma mixture (sim)")
ax.plot(y_vals, nb_pmf, 'ro-', markersize=4, label=f"NB(r={r_nb}, p={p_nb:.2f})")
ax.set_title("Poisson-Gamma = Negative Binomial")
ax.legend(fontsize=8)
ax.set_xlabel("Y")
# --- 3) 전체 분산 법칙 시각화 ---
ax = axes[2]
# 그룹별 기대값의 분산 vs 그룹 내 분산의 평균
n_groups = 5
group_means = []
within_vars = []
all_data = []
for _ in range(1000):
mu_group = np.random.normal(0, 2) # 그룹 간 변동
data = np.random.normal(mu_group, 1, 30) # 그룹 내 변동
group_means.append(np.mean(data))
within_vars.append(np.var(data))
all_data.extend(data)
total_var = np.var(all_data)
between_var = np.var(group_means)
within_var_mean = np.mean(within_vars)
bars = ax.bar(["Within\nE[Var(X|Y)]", "Between\nVar(E[X|Y])", "Total\nVar(X)"],
[within_var_mean, between_var, total_var],
color=['steelblue', 'coral', 'gray'])
ax.set_title("Law of Total Variance")
ax.set_ylabel("Variance")
# 합이 맞는지 표시
ax.axhline(y=within_var_mean + between_var, color='black',
linestyle='--', alpha=0.5, label=f"Sum={within_var_mean+between_var:.2f}")
ax.legend(fontsize=8)
plt.tight_layout()
plt.show()12 관련 주제
선행 지식
- 조건부분포와 독립성 – 조건부 기대값의 정의
- 결합분포와 주변분포 – 주변화(marginalization)
후속 주제
관련 개념