1 이 포스트의 위치
앞선 포스트에서 공리(Axioms)를 세웠다면, 이 포스트는 공리를 도구로 바꾸는 과정이다.
\[ \underbrace{3\text{개의 공리}}_{\text{38-axiomatic-foundations}} \xrightarrow{\text{유도}} \underbrace{\text{계산 규칙들}}_{\text{이 포스트}} \xrightarrow{\text{응용}} \underbrace{\text{추론·모델링}}_{\text{이후 포스트}} \]
Casella & Berger (2002, Ch.1.2)의 체계를 기반으로 한다.
이 포스트의 네 도구는 현대 데이터 과학의 뼈대다:
- 조건부 확률 → 추천 시스템: “이 사용자가 클릭한 이력이 주어졌을 때, 다음에 클릭할 확률은?”
- 곱셈 법칙 → 언어 모델: \(P(w_1, w_2, \ldots, w_n) = P(w_1)P(w_2 \mid w_1) \cdots P(w_n \mid w_{1:n-1})\)
- 전확률 정리 → 진단: 여러 원인 경로를 합산해 전체 양성률 계산
- 독립성 → iid 가정: 통계 추론과 ML의 거의 모든 이론이 “관측치가 독립”에서 출발한다
공리가 “확률이란 무엇인가”를 정했다면, 이 규칙들은 “확률로 무엇을 할 수 있는가”를 정한다.
2 조건부 확률 (Conditional Probability)
2.1 정의
\(P(B) > 0\) 인 사건 \(B\) 에 대해, \(B\) 가 주어졌을 때 \(A\) 의 조건부 확률은:
\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} \]
\(B\) 가 발생했음을 알았다는 것은 표본공간이 \(\Omega\) 에서 \(B\) 로 축소됨을 의미한다. \(P(A \mid B)\) 는 이 축소된 공간 \(B\) 안에서 \(A\) 가 차지하는 비율이다.
\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} = \frac{\text{A와 B가 동시에 발생할 확률}}{\text{B가 발생할 확률}} \]
예시: 주사위 \(\Omega = \{1,\ldots,6\}\), \(A=\{4,5,6\}\), \(B=\{2,4,6\}\) (짝수)
\[ P(A \mid B) = \frac{P(\{4,6\})}{P(\{2,4,6\})} = \frac{2/6}{3/6} = \frac{2}{3} \]
“짝수가 나왔음을 알 때, 4 이상일 확률”은 \(2/3\) 이다.
2.2 조건부 확률도 확률 공간을 이룬다
\(P(\cdot \mid B)\) 는 표본공간 \(B\) 위에서 콜모고로프 공리를 모두 만족한다:
- \(P(A \mid B) \geq 0\) ✓
- \(P(B \mid B) = P(B)/P(B) = 1\) ✓
- \(A_i \cap A_j = \emptyset\) 이면 \(P(\bigcup A_i \mid B) = \sum P(A_i \mid B)\) ✓
따라서 조건부 확률 자체가 유효한 확률 측도다.
3 곱셈 법칙 (Multiplication Rule)
조건부 확률 정의를 재배열하면 교사건의 확률을 계산하는 공식이 된다.
\[ P(A \cap B) = P(A \mid B)\, P(B) = P(B \mid A)\, P(A) \]
\(n\) 개 사건으로 확장하면:
\[ P(A_1 \cap A_2 \cap \cdots \cap A_n) = P(A_1)\, P(A_2 \mid A_1)\, P(A_3 \mid A_1 \cap A_2) \cdots P(A_n \mid A_1 \cap \cdots \cap A_{n-1}) \]
예시: 빨간 공 3개, 파란 공 2개인 주머니에서 비복원으로 2개 순서대로 뽑을 때
\[ P(\text{1번째 빨강} \cap \text{2번째 파랑}) = P(\text{1번째 빨강}) \times P(\text{2번째 파랑} \mid \text{1번째 빨강}) = \frac{3}{5} \times \frac{2}{4} = \frac{6}{20} = \frac{3}{10} \]
4 전확률 정리 (Law of Total Probability)
4.1 분할(Partition)의 정의
사건들 \(B_1, B_2, \ldots, B_k\) 가 \(\Omega\) 의 분할이라 함은:
- \(B_i \cap B_j = \emptyset\) for \(i \neq j\) (쌍마다 서로소)
- \(\bigcup_{i=1}^k B_i = \Omega\) (표본공간을 완전히 덮음)
- \(P(B_i) > 0\) for all \(i\)
4.2 전확률 정리
\(B_1, \ldots, B_k\) 가 \(\Omega\) 의 분할이면, 임의의 사건 \(A\) 에 대해:
\[ P(A) = \sum_{i=1}^k P(A \mid B_i)\, P(B_i) \]
증명
\(A = A \cap \Omega = A \cap \left(\bigcup_{i=1}^k B_i\right) = \bigcup_{i=1}^k (A \cap B_i)\)
\(B_i\) 들이 서로소이므로 \(A \cap B_i\) 들도 서로소. 공리 3에 의해:
\[ P(A) = \sum_{i=1}^k P(A \cap B_i) = \sum_{i=1}^k P(A \mid B_i)\, P(B_i) \quad\blacksquare \]
\(B_i\) 를 “원인”, \(A\) 를 “결과”로 생각하면:
\[ P(\text{결과}) = \sum_i P(\text{결과} \mid \text{원인}_i) \times P(\text{원인}_i) \]
각 원인 경로를 통해 결과가 발생할 확률을 모두 더한 것이다.
예시: 공장 A가 60%, 공장 B가 40% 생산. 불량률은 A: 2%, B: 5%.
\[ P(\text{불량}) = P(\text{불량} \mid A)\,P(A) + P(\text{불량} \mid B)\,P(B) = 0.02 \times 0.6 + 0.05 \times 0.4 = 0.012 + 0.020 = 0.032 \]
전체 불량률은 3.2%다.
5 독립성 (Independence)
5.1 두 사건의 독립
두 사건 \(A\) 와 \(B\) 가 독립(independent) 이면:
\[ P(A \cap B) = P(A)\, P(B) \]
동치 조건 (\(P(B) > 0\) 일 때): \(P(A \mid B) = P(A)\)
\(B\) 가 발생했다는 사실이 \(A\) 의 확률을 바꾸지 않는다. \(B\) 에 대한 정보가 \(A\) 에 대해 아무것도 말해주지 않는다.
\(P(A \mid B) = P(A)\): “B를 알든 모르든, A의 확률은 그대로다.”
주의: 서로소(disjoint)와 독립(independent)은 다른 개념이다.
| 서로소 | 독립 | |
|---|---|---|
| 정의 | \(A \cap B = \emptyset\) | \(P(A \cap B) = P(A)P(B)\) |
| 의미 | 동시에 발생 불가 | 서로 정보 무관 |
| \(P(A), P(B) > 0\) 이면 | 독립이 아님 | \(A \cap B \neq \emptyset\) 가능 |
서로소이고 \(P(A), P(B) > 0\) 이면: \[ P(A \cap B) = 0 \neq P(A)P(B) > 0 \] 따라서 서로소이면 독립이 아니다.
- iid 가정: MLE, 중심극한정리, 부트스트랩 — 모두 “데이터가 독립 동일 분포”에서 시작한다
- 우도 함수: \(L(\theta) = \prod_{i=1}^n f(x_i \mid \theta)\) — 곱으로 쓸 수 있는 이유가 독립이다
- 인과 추론: 무작위 배정(randomization)의 목표가 처치와 교란변수의 독립이다
- 딥러닝: 미니배치 SGD가 수렴하는 이유 중 하나가 표본의 (근사적) 독립이다
독립이 아니면 곱이 안 되고, 곱이 안 되면 계산이 폭발적으로 복잡해진다.
5.2 조건부 독립
\(P(C) > 0\) 일 때, \(A\) 와 \(B\) 가 \(C\) 에 대해 조건부 독립이면:
\[ P(A \cap B \mid C) = P(A \mid C)\, P(B \mid C) \]
\(A\) 와 \(B\) 가 독립이더라도 \(C\) 가 주어지면 조건부 독립이 아닐 수 있다 (설명인자 역설, Berkson’s paradox).
반대로, 조건부 독립이더라도 비조건부로는 독립이 아닐 수 있다 (Simpson’s paradox 배경).
5.3 \(n\) 개 사건의 상호 독립
\(n\) 개의 사건 \(A_1, \ldots, A_n\) 이 상호 독립이면, 모든 부분집합 인덱스 \(\{i_1, \ldots, i_k\} \subseteq \{1,\ldots,n\}\) 에 대해:
\[ P(A_{i_1} \cap \cdots \cap A_{i_k}) = P(A_{i_1}) \cdots P(A_{i_k}) \]
주의: 쌍별 독립(pairwise independence)이 상호 독립을 보장하지 않는다.
반례 (Bernstein, 1946):
동전 두 번 던지기 \(\Omega = \{HH, HT, TH, TT\}\), 균등 분포. \(A = \{HH, HT\}\), \(B = \{HH, TH\}\), \(C = \{HH, TT\}\) 로 정의하면: - \(A, B\) 쌍별 독립: \(P(A \cap B) = 1/4 = 1/2 \cdot 1/2\) ✓ - \(A, C\) 쌍별 독립: \(P(A \cap C) = 1/4 = 1/2 \cdot 1/2\) ✓ - \(B, C\) 쌍별 독립: ✓
하지만 \(P(A \cap B \cap C) = P(\{HH\}) = 1/4 \neq 1/8 = P(A)P(B)P(C)\) → 상호 독립 아님
6 유한 표본공간의 조합론
표본공간이 유한하고 균등 분포(equally likely outcomes)이면:
\[ P(A) = \frac{|A|}{|\Omega|} \]
사건의 크기를 세는 것이 핵심 → 조합론(Combinatorics) 이 필요하다.
6.1 순열 (Permutations)
\(n\) 개의 서로 다른 원소에서 \(r\) 개를 순서 있게 나열하는 경우의 수:
\[ P(n, r) = {}_nP_r = \frac{n!}{(n-r)!} = n(n-1)\cdots(n-r+1) \]
\(n\) 개 전체를 나열하는 경우: \(n! = n \times (n-1) \times \cdots \times 1\)
예시: 5명 중 회장·부회장·총무를 선출하는 경우의 수
\[ P(5, 3) = \frac{5!}{2!} = 5 \times 4 \times 3 = 60 \]
6.2 조합 (Combinations)
\(n\) 개의 서로 다른 원소에서 \(r\) 개를 순서 없이 선택하는 경우의 수:
\[ \binom{n}{r} = C(n, r) = \frac{n!}{r!\,(n-r)!} \]
이항계수(binomial coefficient) 라고도 하며, \(0 \leq r \leq n\) 에서 정의된다.
순열과의 관계: \(r\) 개를 선택한 후 순서를 고려하면 \(r!\) 가지 나열 방법이 있으므로:
\[ P(n, r) = \binom{n}{r} \times r! \quad\Rightarrow\quad \binom{n}{r} = \frac{P(n,r)}{r!} \]
예시: 52장 카드에서 포커 패 5장을 뽑는 경우의 수
\[ \binom{52}{5} = \frac{52!}{5! \cdot 47!} = 2{,}598{,}960 \]
6.3 이항계수의 성질
\[ \binom{n}{0} = 1, \quad \binom{n}{n} = 1, \quad \binom{n}{r} = \binom{n}{n-r} \]
파스칼의 항등식(Pascal’s Identity):
\[ \binom{n}{r} = \binom{n-1}{r-1} + \binom{n-1}{r} \]
이항 정리(Binomial Theorem):
\[ (x + y)^n = \sum_{r=0}^n \binom{n}{r} x^r y^{n-r} \]
\(x = y = 1\) 을 대입하면: \(\sum_{r=0}^n \binom{n}{r} = 2^n\) (전체 부분집합의 수).
6.4 중복 조합 (Combinations with Repetition)
\(n\) 개에서 중복을 허용하여 \(r\) 개를 선택하는 경우의 수:
\[ \binom{n+r-1}{r} \]
예시: 편의점 음료 3종류(콜라, 사이다, 주스)에서 중복을 허용하여 4캔 고르는 경우의 수
\[ \binom{3+4-1}{4} = \binom{6}{4} = 15 \]
6.5 다항계수 (Multinomial Coefficient)
\(n\) 개를 \(k\) 개의 그룹으로 \(n_1, n_2, \ldots, n_k\) 개씩 나누는 경우 (\(\sum n_i = n\)):
\[ \binom{n}{n_1, n_2, \ldots, n_k} = \frac{n!}{n_1!\, n_2!\, \cdots\, n_k!} \]
다항 정리(Multinomial Theorem):
\[ (x_1 + x_2 + \cdots + x_k)^n = \sum_{\substack{n_1+\cdots+n_k=n \\ n_i \geq 0}} \binom{n}{n_1,\ldots,n_k} x_1^{n_1} \cdots x_k^{n_k} \]
7 응용: 고전 확률 문제
7.1 생일 문제 (Birthday Problem)
\(n\) 명 중 생일이 같은 사람이 한 쌍이라도 있을 확률은?
\(A^c\) = “모든 생일이 다르다”로 여사건을 먼저 계산:
\[ P(A^c) = \frac{365 \times 364 \times \cdots \times (365-n+1)}{365^n} = \prod_{k=0}^{n-1} \left(1 - \frac{k}{365}\right) \]
\[ P(A) = 1 - P(A^c) \]
| \(n\) | \(P(\text{같은 생일 쌍 존재})\) |
|---|---|
| 10 | 11.7% |
| 23 | 50.7% |
| 30 | 70.6% |
| 50 | 97.0% |
| 70 | 99.9% |
\(n=23\) 에서 이미 50%를 넘는다. 직관에 반하는 이유는: 쌍의 수가 \(\binom{23}{2} = 253\) 으로, 생각보다 많기 때문이다.
7.2 포커 확률
\(\binom{52}{5} = 2{,}598{,}960\) 가지 패 중:
| 족보 | 경우의 수 | 확률 |
|---|---|---|
| 로열 플러시 | 4 | 0.000154% |
| 스트레이트 플러시 | 36 | 0.00139% |
| 포카드 | 624 | 0.0240% |
| 풀하우스 | 3,744 | 0.144% |
| 플러시 | 5,108 | 0.197% |
| 스트레이트 | 10,200 | 0.392% |
| 원페어 | 1,098,240 | 42.3% |
8 응용 분야
| 분야 | 활용 | 구체적 예시 |
|---|---|---|
| 통계적 추론 | 조건부 분포, 충분통계량 | \(P(\mathbf{X} \mid T(\mathbf{X}))\) 가 \(\theta\) 무관 ↔︎ 충분통계량 |
| 기계학습 | 나이브 베이즈 | \(P(Y \mid X_1,\ldots,X_n) \propto P(Y)\prod P(X_i \mid Y)\) (조건부 독립 가정) |
| 암호학 | 조합론으로 경우의 수 계산 | AES 키 공간 \(2^{128}\), 브루트포스 불가 |
| 역학(Epidemiology) | 전확률 정리로 유병률 계산 | 검사 민감도·특이도 → 양성예측도(PPV) |
| 딥러닝 | 드롭아웃 확률 | 뉴런 독립 비활성화 가정 |
9 예시: 전확률 정리 + 곱셈 법칙 통합
문제: AI 모델이 스팸 메일을 분류한다.
- 실제 스팸 비율: \(P(S) = 0.3\)
- 스팸이면 “스팸”으로 분류될 확률 (민감도): \(P(\hat{S} \mid S) = 0.95\)
- 정상 메일이면 “스팸”으로 분류될 확률 (1-특이도): \(P(\hat{S} \mid S^c) = 0.02\)
전확률 정리로 전체 알람률 계산:
\[ P(\hat{S}) = P(\hat{S} \mid S)\,P(S) + P(\hat{S} \mid S^c)\,P(S^c) = 0.95 \times 0.3 + 0.02 \times 0.7 = 0.285 + 0.014 = 0.299 \]
곱셈 법칙으로 교사건 계산:
\[ P(\hat{S} \cap S) = P(\hat{S} \mid S)\,P(S) = 0.95 \times 0.3 = 0.285 \]
→ 다음 포스트의 베이즈 정리를 적용하면 “알람이 울렸을 때 실제 스팸일 확률”을 계산할 수 있다.
10 코드 예시
10.1 Step 1: 순수 Python — 조합론과 확률 계산
import math
from itertools import combinations, permutations
# ── 순열·조합 계산 ─────────────────────────────────────────────
def perm(n, r):
return math.factorial(n) // math.factorial(n - r)
def comb(n, r):
return math.comb(n, r) # Python 3.8+
print(f"P(5,3) = {perm(5, 3)}") # 60
print(f"C(52,5) = {comb(52, 5)}") # 2,598,960
print(f"C(6,4) = {comb(6, 4)}") # 15 (중복조합 C(3+4-1,4))
# ── 생일 문제 ──────────────────────────────────────────────────
def birthday_prob(n, days=365):
"""n명 중 생일이 같은 쌍이 존재할 확률"""
p_no_match = 1.0
for k in range(n):
p_no_match *= (days - k) / days
return 1 - p_no_match
print("\n생일 문제:")
for n in [10, 23, 30, 50, 70]:
print(f" n={n:3d}: {birthday_prob(n):.4f}")
# ── 전확률 정리 ─────────────────────────────────────────────────
p_S = 0.30 # P(S)
p_Sc = 1 - p_S
p_hat_given_S = 0.95 # P(Ŝ|S)
p_hat_given_Sc = 0.02 # P(Ŝ|S^c)
p_hat = p_hat_given_S * p_S + p_hat_given_Sc * p_Sc
p_intersect = p_hat_given_S * p_S # P(Ŝ ∩ S)
print(f"\nP(알람) = {p_hat:.4f}") # 0.2990
print(f"P(알람 ∩ 스팸) = {p_intersect:.4f}") # 0.285010.2 Step 2: scipy·itertools — 독립성 검정과 조합 열거
import numpy as np
from scipy.stats import chi2_contingency
from itertools import combinations
# ── 독립성 통계 검정 (카이제곱) ────────────────────────────────
# 광고 클릭(A/B) × 구매 여부의 분할표
observed = np.array([[120, 80], # 광고 A: 클릭 후 구매 120, 미구매 80
[90, 110]]) # 광고 B: 클릭 후 구매 90, 미구매 110
chi2, p_value, dof, expected = chi2_contingency(observed)
print(f"χ² = {chi2:.4f}, p-value = {p_value:.4f}")
print(f"→ {'독립 기각 (연관성 있음)' if p_value < 0.05 else '독립 기각 실패'}")
# ── 포커 플러시 확률 직접 계산 ──────────────────────────────────
deck = [(rank, suit)
for rank in range(1, 14) # A,2,...,K
for suit in ['S', 'H', 'D', 'C']] # 스페이드, 하트, 다이아, 클럽
# 플러시 수: 각 수트에서 5장 선택
flush_count = 4 * math.comb(13, 5) # 4 수트 × C(13,5)
total_hands = math.comb(52, 5)
# 스트레이트 플러시 제외 (실제 플러시는 스트레이트 플러시 제외)
straight_flush = 4 * 10 # 각 수트 10가지 스트레이트
flush_only = flush_count - straight_flush
print(f"\n총 패: {total_hands:,}")
print(f"플러시 (스트레이트 플러시 포함): {flush_count:,}")
print(f"순수 플러시: {flush_only:,}")
print(f"플러시 확률: {flush_only/total_hands:.6f}") # ≈ 0.001965
# ── 독립성 수치 검증 ───────────────────────────────────────────
Omega_size = 6 # 주사위
A = {2, 4, 6} # 짝수
B = {4, 5, 6} # 4 이상
P = lambda E: len(E) / Omega_size
PA_int_B = len(A & B) / Omega_size # P(A ∩ B)
print(f"\nP(A) × P(B) = {P(A) * P(B):.4f}")
print(f"P(A ∩ B) = {PA_int_B:.4f}")
print(f"독립: {abs(P(A) * P(B) - PA_int_B) < 1e-9}") # False: 독립 아님11 관련 주제
선행 지식
- 확률론의 언어: 집합론 — 사건, σ-대수
- 확률론의 공리적 기초 — 콜모고로프 공리, 포함-배제
후속 주제
- Conditional Probability — 조건부 확률의 심화
- Bayes’ Rule — 전확률 정리의 역(逆): 사후 확률 계산
- Independence & Random Variables — 독립 확률변수의 결합 분포
관련 개념
- Binomial Distribution — 이항계수가 확률의 가중치
- Convergence in Probability — 독립 사건의 수렴 이론 (대수의 법칙)