확률의 계산 규칙 (The Calculus of Probabilities)

조건부 확률, 곱셈 법칙, 전확률 정리, 독립성, 조합론

공리로부터 출발해 확률을 실제로 계산하는 규칙들을 유도한다. 조건부 확률 정의, 곱셈 법칙, 전확률 정리, 독립성의 수학적 정의, 유한 표본공간에서의 조합론(순열·조합·이항계수)까지 다룬다.

Statistics
저자

Kwangmin Kim

공개

2026년 03월 27일

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)

조건부 확률 정의를 재배열하면 교사건의 확률을 계산하는 공식이 된다.

정리: 곱셈 법칙 (General 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)의 정의

정의: 분할 (Partition)

사건들 \(B_1, B_2, \ldots, B_k\)\(\Omega\)분할이라 함은:

  1. \(B_i \cap B_j = \emptyset\) for \(i \neq j\) (쌍마다 서로소)
  2. \(\bigcup_{i=1}^k B_i = \Omega\) (표본공간을 완전히 덮음)
  3. \(P(B_i) > 0\) for all \(i\)

4.2 전확률 정리

정리: 전확률 정리 (Law of Total Probability)

\(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 두 사건의 독립

정의: 독립 (Independence)

두 사건 \(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 조건부 독립

정의: 조건부 독립 (Conditional Independence)

\(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\) 개 사건의 상호 독립

정의: 상호 독립 (Mutual Independence)

\(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.2850

10.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 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

Enjoy this blog? Get notified of new posts by email: