콘텐츠로 이동

조건부확률

무언가를 알게 되면 확률이 달라진다. 카드가 그림 카드라는 사실을 알면 그것이 킹일 확률이 달라지고, 검사가 양성이라는 사실을 알면 병에 걸렸을 확률이 달라진다. 조건부확률은 이 "알게 된 뒤의 확률"을 정확히 정의한다. 확률론에서 가장 널리 쓰이는 도구이며, 베이즈 정리·통계적 추론·불확실성 아래의 의사결정이 모두 여기서 출발한다.

이 절은 세 개의 정리로 이루어진다. 조건부확률이 무엇인지(정리 1), 두 단계로 이어지는 시행의 확률을 어떻게 곱하는지(정리 2), 여러 갈래로 갈라지는 경우를 어떻게 더하는지(정리 3)이다.

1. 표본공간을 좁히면 확률이 달라진다

조건을 건다는 것은 표본공간을 갈아 끼우는 일이다. \(B\)가 일어났음을 알면 \(B\) 바깥의 결과는 더 이상 가능하지 않으므로 버리고, 남은 것들의 확률 합이 다시 1이 되도록 척도를 맞춘다.

정리 1. 조건부확률의 정의 — 좁혀진 표본공간에서의 비율

\(P(B) > 0\)일 때, 사건 \(B\)가 주어졌을 때 사건 \(A\)의 조건부확률은 다음과 같다.

\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} \]

\(B\)에 배정된 전체 확률 가운데 \(A\)에도 속하는 부분의 비율이다. 분모가 \(P(\Omega) = 1\)이 아니라 \(P(B)\)라는 점이 전부다.

"갈아 끼운다"는 말을 그림으로 보면 이렇다.

조건부확률 — 표본공간을 B로 갈아 끼운다

왼쪽에서는 모든 확률을 \(\Omega\) 전체에 대한 비율로 잰다. 오른쪽에서 \(B\)가 일어났음을 알고 나면 \(B\) 바깥은 더 이상 가능하지 않으므로 흐려지고, 남은 세계는 \(B\)뿐이다. 그 안에서 \(A\)에 해당하는 부분은 \(A\) 전체가 아니라 \(A \cap B\)이며, 이것을 새 전체인 \(P(B)\)로 나눈 것이 \(P(A \mid B)\)다. \(B\)로 나누는 일이 곧 "\(B\)의 확률이 1이 되도록 눈금을 다시 매기는" 일이다.

이 정의는 새로운 확률을 하나 만들어 낸다. \(P(\cdot \mid B)\)는 그 자체로 확률의 세 공리를 모두 만족하는 어엿한 확률측도다(연습문제 3). 조건을 건 뒤에도 확률론의 모든 규칙을 그대로 쓸 수 있는 이유가 여기에 있다.

보기 1. 카드 뽑기. 표준 52장 한 벌에서 한 장을 뽑는다. \(A\) = "킹", \(B\) = "그림 카드(J, Q, K)"라 하자.

풀이
\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} = \frac{4/52}{12/52} = \frac{4}{12} = \frac{1}{3} \]

모든 킹이 그림 카드이므로 \(A \cap B = A\)이다. 그림 카드라는 사실을 알면 가능성이 12장으로 좁혀지고, 그중 4장이 킹이다.

보기 2. 주사위 두 개. \(A\) = "합이 8", \(B\) = "첫 주사위가 3"이라 하자. \(P(B) = 1/6\)이고 \(A \cap B = \{(3,5)\}\)이므로 \(P(A \cap B) = 1/36\)이다.

풀이
\[ P(A \mid B) = \frac{1/36}{1/6} = \frac{1}{6} \]

모의실험으로 확인해 보자.

보기 3. 주사위로 조건부확률 확인하기. 보기 2의 \(A\) = "합이 8", \(B\) = "첫 주사위가 3"을 10만 번 모의실험으로 세어 본다.

(1) 10만 번 중 \(B\)가 일어나는 횟수의 기댓값은 얼마인가. 그 횟수로 나눈 비율 추정값의 몬테카를로 표준오차를 적으시오.

(2) 모의실험으로 \(P(A \mid B)\)를 세어 보기 2의 \(1/6\)과 견주고, 차이가 (1)의 오차로 설명되는지 판정하시오.

풀이

(1) 이론값. 보기 2에서 \(P(A \mid B) = 1/6 = 0.16667\)이다. 조건부확률을 세는 일은 \(B\)가 일어난 시행만 모아 놓고 그 안에서 \(A\)의 비율을 재는 것이므로, 유효 표본크기는 10만이 아니라 \(B\)가 일어난 횟수다. 그 횟수는 \(\text{Binomial}(100000, 1/6)\)을 따르므로

\[ E[n_B] = \frac{100000}{6} = 16667, \qquad \operatorname{sd}(n_B) = \sqrt{100000 \cdot \tfrac16 \cdot \tfrac56} = 118 \]

이다. \(n_B\)를 고정하고 보면 추정값 \(\hat p = n_{A \cap B}/n_B\)는 성공확률 \(1/6\)인 \(n_B\)번의 시행에서 나온 비율이므로

\[ \operatorname{se}(\hat p) = \sqrt{\frac{p(1-p)}{n_B}} = \sqrt{\frac{(1/6)(5/6)}{16667}} = 0.00289 \]

다. 셋째 자리까지만 믿을 수 있다는 뜻이다. 10만 번을 돌렸는데도 그런데, 분모가 10만이 아니라 1만 6천이기 때문이다. 조건을 좁히면 자료도 그만큼 줄어든다.

(2) 모의실험. 코드가 하는 일이 정의 그대로임에 주목하라. mask_B로 표본공간을 좁히고, 그 안에서 \(A\)가 일어난 비율을 센다.

import numpy as np

def conditional_probability_simulation(n_simulations=100_000):
    """주사위 두 개로 조건부확률을 모의실험한다.

    조건부확률을 계산하는 대신 **직접 세어 본다.**
    P(A|B) = (A와 B가 모두 일어난 횟수) / (B가 일어난 횟수)
    라는 정의를 그대로 코드로 옮긴 것이다.
    """
    np.random.seed(42)

    # randint(1, 7)은 1 이상 7 미만, 즉 1~6을 뽑는다
    die1 = np.random.randint(1, 7, size=n_simulations)
    die2 = np.random.randint(1, 7, size=n_simulations)
    total = die1 + die2

    # 여기가 조건부확률의 핵심이다. 표본공간을 "첫 주사위가 3인 시행"으로 좁힌다.
    mask_B = die1 == 3                            # 조건 B가 성립한 시행들
    mask_A_and_B = (die1 == 3) & (total == 8)     # 그중 A도 성립한 시행들

    # 전체 10만이 아니라 **좁혀진 표본공간의 크기**로 나눈다.
    # 이 한 줄이 P(A|B) = P(A∩B)/P(B) 를 실행한 것이다.
    p_conditional = mask_A_and_B.sum() / mask_B.sum()
    print(f"Simulated P(sum=8 | die1=3) = {p_conditional:.4f}")
    print(f"Theoretical P(sum=8 | die1=3) = {1/6:.4f}")

    # 분모가 몇인지, 그래서 오차가 얼마인지 함께 본다.
    n_B, n_AB = int(mask_B.sum()), int(mask_A_and_B.sum())
    se = np.sqrt((1/6) * (5/6) / n_B)
    print(f"n_B = {n_B:,} (기댓값 {n_simulations/6:,.0f}),  n_AB = {n_AB:,}")
    print(f"se = {se:.5f},  차이 = {p_conditional - 1/6:+.5f}"
          f"  ({(p_conditional - 1/6) / se:+.2f} se)")

conditional_probability_simulation()

출력:

Simulated P(sum=8 | die1=3) = 0.1705
Theoretical P(sum=8 | die1=3) = 0.1667
n_B = 16,390 (기댓값 16,667),  n_AB = 2,795
se = 0.00291,  차이 = +0.00386  (+1.33 se)

맞는다. 모의값 \(0.1705\)가 참값 \(0.16667\)에서 \(+0.0039\) 어긋나 있는데, 그것은 표준오차 \(0.0029\)의 \(1.33\)배다. 이 정도 어긋남은 열 번에 두 번쯤 나오는 흔한 일이다. 참값이 소수 셋째 자리에서 비껴 보이는 것은 난수 때문이지 식이 틀려서가 아니다.

\(n_B = 16{,}390\)이 기댓값 \(16{,}667\)보다 \(277\) 작은 것도 같은 성질이다. \(\operatorname{sd}(n_B) = 118\)이므로 \(-2.3\) 표준편차에 해당한다. 조건 \(B\) 자체가 몇 번 일어나는지도 난수에 맡긴 양이며, 이 변동이 다시 \(\hat p\)의 분모를 흔든다.

2. 두 단계 시행과 확률나무

정의의 양변에 \(P(B)\)를 곱하면 방향이 뒤집힌다. 조건부확률을 구하는 식이 결합확률을 만드는 식이 된다. 이것이 두 단계로 이어지는 시행을 다루는 표준 도구다.

정리 2. 곱셈 규칙 — 경로의 곱

\[ P(A \cap B) = P(A \mid B)\,P(B) = P(B \mid A)\,P(A) \]

세 개 이상의 사건으로 이어지면 연쇄 법칙이 된다.

\[ P(A_1 \cap A_2 \cap \cdots \cap A_n) = \prod_{i=1}^{n} P(A_i \mid A_1, \ldots, A_{i-1}) \]
증명

\(P(B) > 0\)이면 정리 1의 정의에 \(P(B)\)를 곱해

\[ P(A \mid B)\,P(B) = \frac{P(A \cap B)}{P(B)} \cdot P(B) = P(A \cap B) \]

를 얻는다. \(A\)와 \(B\)의 역할을 바꾸면 \(P(B \mid A)P(A) = P(A \cap B)\)이므로 두 곱이 같다.

연쇄 법칙은 \(n\)에 대한 귀납이다. \(n = 2\)는 위에서 본 곱셈 규칙이다. \(n\)에서 성립한다고 가정하고 \(B = A_1 \cap \cdots \cap A_n\)으로 두면 곱셈 규칙 한 번으로

\[ P(B \cap A_{n+1}) = P(A_{n+1} \mid B)\,P(B) = P(A_{n+1} \mid A_1, \ldots, A_n) \prod_{i=1}^{n} P(A_i \mid A_1, \ldots, A_{i-1}) \]

이 되어 \(n+1\)에서도 성립한다. \(\square\)

곱셈 규칙은 확률나무로 읽으면 명확해진다. 나무의 각 가지에 조건부확률을 적고, 뿌리에서 잎까지 한 경로를 따라 곱하면 그 경로의 확률이 된다.

             ┌─ 2번째 에이스   3/51 ──→  경로 확률 = (4/52)(3/51)
   1번째 에이스 ─┤
    4/52     └─ 2번째 비에이스 48/51 ──→ (4/52)(48/51)
  ─┤
   1번째 비에이스 ┌─ 2번째 에이스   4/51 ──→ (48/52)(4/51)
    48/52    ─┤
             └─ 2번째 비에이스 47/51 ──→ (48/52)(47/51)

보기 4. 에이스 두 장 연속. 52장에서 비복원으로 두 장을 뽑아 둘 다 에이스일 확률은 맨 위 경로다.

풀이
\[ P(A_1 \cap A_2) = P(A_1)\,P(A_2 \mid A_1) = \frac{4}{52} \cdot \frac{3}{51} = \frac{12}{2652} \approx 0.0045 \]

두 번째 가지의 확률이 \(4/52\)가 아니라 \(3/51\)인 것이 핵심이다. 첫 단계의 결과가 두 번째 단계의 조건을 바꾼다. 비복원추출, 마르코프 연쇄, 순차적 베이즈 갱신이 모두 이 구조 위에 서 있다.

3. 원인을 나누어 전체를 더하기

경로를 곱해서 얻었으니, 이제 여러 경로를 더할 차례다. 어떤 사건이 서로 다른 여러 경로로 일어날 수 있다면, 각 경로의 확률을 계산해 모두 더하면 된다.

정리 3. 전확률의 법칙 — 경로의 합

\(B_1, \ldots, B_n\)이 표본공간 \(\Omega\)의 분할을 이루면(서로 배반이고 합집합이 \(\Omega\)이면), 임의의 사건 \(A\)에 대해

\[ P(A) = \sum_{i=1}^{n} P(A \mid B_i)\,P(B_i) \]

이다. 각 항 \(P(A \mid B_i)P(B_i)\)가 정리 2의 경로 확률이고, 전체 확률은 그 합이다.

증명

\(B_1, \ldots, B_n\)이 분할이므로 \(A\)는

\[ A = A \cap \Omega = A \cap \left(\bigcup_{i=1}^{n} B_i\right) = \bigcup_{i=1}^{n} (A \cap B_i) \]

로 쪼개진다. \(B_i\)들이 서로 배반이면 \(A \cap B_i\)들도 서로 배반이므로 유한가법성이 적용되고, 각 항에 정리 2의 곱셈 규칙을 쓰면

\[ P(A) = \sum_{i=1}^{n} P(A \cap B_i) = \sum_{i=1}^{n} P(A \mid B_i)\,P(B_i) \]

이다. 첫 등호가 분할이고 둘째 등호가 곱셈 규칙이다. 전확률의 법칙은 이 둘을 이어 붙인 것에 지나지 않는다. \(\square\)

분할이 가산무한개여도 같다. 유한가법성 대신 공리 (3)을 쓰면 되며, \(P(B_i) = 0\)인 항은 \(P(A \mid B_i)\)가 정의되지 않으므로 \(P(A \cap B_i) = 0\)으로 읽어 합에서 빼면 된다.

그림으로 보면 "쪼개고 더한다"가 눈에 들어온다.

전확률의 법칙 — 분할 위의 합

분할이라는 말은 상자를 빈틈없이, 겹치지 않게 나누었다는 뜻이다. 그러면 사건 \(A\)도 자동으로 \(A \cap B_1, \ldots, A \cap B_n\)으로 쪼개지고, 이들 역시 서로소이므로 조각마다 따로 재서 더해도 된다. 이것이 위 증명의 내용 전부다.

이 정리의 쓸모는 방향에 있다. \(P(A)\)를 직접 구하기는 어려운데 각 시나리오 \(B_i\) 안에서는 쉬운 경우가 흔하다. 그럴 때 문제를 시나리오별로 쪼개고 다시 합친다.

보기 5. 의학 검사. 어떤 질병이 인구의 1%에 발생한다. 검사의 민감도는 95%(\(P(\text{양성} \mid \text{질병}) = 0.95\)), 특이도는 90%(\(P(\text{음성} \mid \text{질병 없음}) = 0.90\))다. 검사가 양성일 확률은 얼마인가?

"양성"은 두 경로로 도달할 수 있다. 병이 있으면서 맞게 나온 경우와, 병이 없으면서 잘못 나온 경우다.

풀이
\[ \begin{aligned} P(\text{양성}) &= P(\text{양성} \mid \text{질병})\,P(\text{질병}) + P(\text{양성} \mid \text{질병 없음})\,P(\text{질병 없음}) \\ &= 0.95 \times 0.01 + 0.10 \times 0.99 \\ &= 0.0095 + 0.099 = 0.1085 \end{aligned} \]

두 번째 항이 첫 번째 항의 열 배다

실제로 병이 있는 사람은 1%뿐인데 인구의 10.85%가 양성 판정을 받는다. 양성자의 대부분이 건강한 사람인 것이다.

원인은 두 경로의 밑변 크기가 다르다는 데 있다. 병이 있는 1%에서 나오는 참양성은 \(0.0095\)인 반면, 병이 없는 99%에서 나오는 거짓양성은 \(0.099\)다. 검사의 정확도가 아무리 높아도 드문 병에서는 거짓양성이 참양성을 압도한다.

"양성이면 병일 확률은 얼마인가"라는 반대 방향의 물음에 답하려면 다음 절의 베이즈 정리가 필요하다. 여기서 계산한 \(P(\text{양성}) = 0.1085\)가 그 식의 분모가 된다.

보기 6. 전확률의 법칙 모의실험. 보기 5의 설정을 100만 명에게 적용한다.

(1) 전확률의 법칙이 예측하는 \(P(\text{양성})\)과 두 경로 각각의 기여를 적고, 100만 명 모의실험에서 양성률 추정값의 몬테카를로 표준오차를 구하시오.

(2) 모의실험으로 (1)의 세 수를 모두 확인하시오.

풀이

(1) 이론값. 보기 5에서 이미 계산했다. 경로가 둘이고 각 경로의 무게는 "그 시나리오의 확률 × 그 시나리오 안에서 양성일 확률"이다.

\[ \underbrace{0.95 \times 0.01}_{\text{참양성 } 0.00950} \; + \; \underbrace{0.10 \times 0.99}_{\text{거짓양성 } 0.09900} \; = \; 0.10850 \]

모의실험은 이 세 수를 따로따로 재현해야 한다. 합만 맞고 쪼갠 몫이 틀리면 우연히 맞은 것이다.

양성 여부는 사람마다 독립인 베르누이 시행이므로 100만 명에서 양성률 추정값의 표준오차는

\[ \operatorname{se} = \sqrt{\frac{0.1085 \times 0.8915}{10^6}} = 0.00031 \]

이다. 소수 넷째 자리까지 맞아야 하고, 그 이상을 기대해서는 안 된다.

(2) 모의실험.

import numpy as np

def medical_test_simulation(n_people=1_000_000):
    """전확률의 법칙을 100만 명 모의실험으로 확인한다."""
    np.random.seed(42)

    prevalence = 0.01            # 유병률 P(질병) = 1%
    sensitivity = 0.95           # 민감도 P(양성|질병) = 95%
    false_positive_rate = 0.10   # 위양성률 P(양성|건강) = 10%

    # 1단계: 100만 명 각자가 질병을 가졌는지 정한다(확률 1%)
    has_disease = np.random.rand(n_people) < prevalence

    # 2단계: 검사 결과를 정한다. 여기서 확률이 사람에 따라 달라진다.
    # np.where(조건, 참일 때, 거짓일 때) 로 두 경우를 한 번에 처리한다.
    #   질병이 있으면 95% 확률로 양성
    #   건강하면    10% 확률로 양성
    test_positive = np.where(
        has_disease,
        np.random.rand(n_people) < sensitivity,
        np.random.rand(n_people) < false_positive_rate
    )

    # 전체 양성률. 전확률의 법칙이 예측하는 값과 맞는지 아래에서 비교한다.
    #   P(양성) = P(양성|질병)P(질병) + P(양성|건강)P(건강)
    #           = 0.95*0.01 + 0.10*0.99 = 0.1085
    p_positive = test_positive.mean()
    print(f"Simulated P(positive) = {p_positive:.4f}")
    print(f"Theoretical P(positive) = {0.1085:.4f}")

    # 합만이 아니라 두 경로를 따로 재어 본다.
    tp = (has_disease & test_positive).mean()        # 질병이면서 양성
    fp = (~has_disease & test_positive).mean()       # 건강하면서 양성
    se = np.sqrt(0.1085 * (1 - 0.1085) / n_people)
    print(f"  참양성   {tp:.5f} (이론 0.00950)")
    print(f"  거짓양성 {fp:.5f} (이론 0.09900)")
    print(f"  합       {tp + fp:.5f} (이론 0.10850),  se = {se:.5f},"
          f"  차이 = {p_positive - 0.1085:+.5f}")

medical_test_simulation()

출력:

Simulated P(positive) = 0.1085
Theoretical P(positive) = 0.1085
  참양성   0.00950 (이론 0.00950)
  거짓양성 0.09903 (이론 0.09900)
  합       0.10853 (이론 0.10850),  se = 0.00031,  차이 = +0.00004

세 수가 모두 맞는다. 합이 \(0.10853\)으로 이론값에서 \(+0.00004\) 어긋나 있고 이는 표준오차 \(0.00031\)의 \(0.1\)배에 지나지 않는다. 쪼갠 몫도 참양성 \(0.00950\), 거짓양성 \(0.09903\)으로 각각 \(0.00950\)과 \(0.09900\)에 붙어 있다.

거짓양성이 참양성의 10.4배라는 것도 모의실험에서 그대로 읽힌다. 전확률의 법칙은 이 두 덩어리를 더하는 일이고, 다음 절의 베이즈 정리는 거꾸로 합에서 첫째 덩어리가 차지하는 몫을 묻는다. 그 몫이 \(0.00950/0.10853 = 0.0875\)이며, 그것이 보기 5의 경고가 가리키던 수다.

연습문제

연습문제 1. 항아리에 빨간 구슬 4개와 파란 구슬 6개가 있다. 구슬 두 개를 비복원으로 뽑는다. 첫 구슬이 파란색이라는 조건에서 두 번째 구슬이 빨간색일 확률은 얼마인가?

풀이

\(B_1\) = "첫 구슬이 파란색", \(R_2\) = "두 번째 구슬이 빨간색"이라 하자.

파란 구슬 하나를 뽑고 나면 항아리에는 빨간 구슬 4개와 파란 구슬 5개(총 9개)가 남는다. 따라서

\[ P(R_2 \mid B_1) = \frac{4}{9} \]

이다.

연습문제 2. 어떤 공장에서 기계 A가 제품의 60%를, 기계 B가 40%를 생산한다. 기계 A의 불량률은 2%이고 기계 B의 불량률은 5%다. 제품 하나를 무작위로 골랐다. 전확률의 법칙을 사용해 그 제품이 불량일 확률을 계산하라.

풀이

\(A\) = "기계 A가 생산", \(B\) = "기계 B가 생산", \(D\) = "불량"이라 하자. 다음이 주어져 있다.

\[ P(A) = 0.60, \quad P(B) = 0.40 \]
\[ P(D \mid A) = 0.02, \quad P(D \mid B) = 0.05 \]

전확률의 법칙에 의해

\[ P(D) = P(D \mid A) P(A) + P(D \mid B) P(B) = 0.02 \times 0.60 + 0.05 \times 0.40 = 0.012 + 0.020 = 0.032 \]

이다. 전체 불량률은 3.2%다.

연습문제 3. \(P(B) > 0\)이면 \(P(\cdot \mid B)\)가 확률의 세 공리를 만족함을 증명하라. 즉 조건부확률 자체가 제한된 표본공간 위의 타당한 확률측도임을 보여라.

풀이

\(P(\cdot \mid B)\)에 대해 세 공리를 확인한다.

범위: 임의의 사건 \(A\)에 대해 \(P(A \cap B) \geq 0\)이고 \(P(B) > 0\)이므로

\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} \geq 0 \]

이다. 위쪽은 \(A \cap B \subseteq B\)에서 나온다. 단조성에 의해 \(P(A \cap B) \leq P(B)\)이므로

\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} \leq \frac{P(B)}{P(B)} = 1 \]

정규화: \(\emptyset \cap B = \emptyset\)이고 \(\Omega \cap B = B\)이므로

\[ P(\emptyset \mid B) = \frac{P(\emptyset)}{P(B)} = 0, \qquad P(\Omega \mid B) = \frac{P(\Omega \cap B)}{P(B)} = \frac{P(B)}{P(B)} = 1 \]

가산가법성: \(A_1, A_2, \ldots\)가 서로 배반이면 \(A_1 \cap B, A_2 \cap B, \ldots\)도 서로 배반이므로

\[ P\!\left(\bigcup_i A_i \mid B\right) = \frac{P\!\left(\bigcup_i (A_i \cap B)\right)}{P(B)} = \frac{\sum_i P(A_i \cap B)}{P(B)} = \sum_i P(A_i \mid B) \]

세 공리가 모두 성립하므로 \(P(\cdot \mid B)\)는 타당한 확률측도다. \(\square\)

연습문제 4. 공정한 주사위 두 개를 굴린다. \(A\) = "합이 10 이상", \(B\) = "두 주사위 모두 5 이상"이라 하자. \(P(A \mid B)\)를 계산하라.

풀이

먼저 사건 \(B\) = "두 주사위 모두 5 이상"을 파악한다. 각 주사위가 5 또는 6일 수 있으므로 \(B = \{(5,5),(5,6),(6,5),(6,6)\}\)이고 \(|B| = 4\), \(P(B) = 4/36\)이다.

다음으로 \(A \cap B\)는 \(B\)의 결과 중 합이 10 이상인 것이다.

  • \((5,5)\): 합 \(= 10\) (해당)
  • \((5,6)\): 합 \(= 11\) (해당)
  • \((6,5)\): 합 \(= 11\) (해당)
  • \((6,6)\): 합 \(= 12\) (해당)

\(B\)의 네 결과가 모두 합이 \(\geq 10\)이므로 \(A \cap B = B\)이고 \(P(A \cap B) = 4/36\)이다.

\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} = \frac{4/36}{4/36} = 1 \]

두 주사위가 모두 5 이상이면 합은 반드시 10 이상이다.

연습문제 5. 결합확률에 대한 연쇄 법칙은 \(P(A_1, A_2, A_3) = P(A_1) P(A_2 \mid A_1) P(A_3 \mid A_1, A_2)\)이다. 이를 사용해 표준 52장 카드 한 벌에서 비복원으로 카드 3장을 뽑을 때 \(P(\text{하트 3연속})\)을 계산하라.

풀이

\(H_i\)를 "\(i\)번째 카드가 하트"라 하자. 52장 한 벌에 하트는 13장이다.

\[ P(H_1, H_2, H_3) = P(H_1) P(H_2 \mid H_1) P(H_3 \mid H_1, H_2) \]

\(P(H_1) = 13/52 = 1/4\)이다.

하트 한 장을 뽑고 나면 51장 중 하트가 12장이므로 \(P(H_2 \mid H_1) = 12/51\)이다.

하트 두 장을 뽑고 나면 50장 중 하트가 11장이므로 \(P(H_3 \mid H_1, H_2) = 11/50\)이다.

결합확률: \(P(H_1, H_2, H_3) = (1/4)(12/51)(11/50) = 132/10200 = 11/850 \approx 0.0129\).

하트를 연속 3장 뽑을 확률은 약 1.3%다.

일반적인 연쇄 법칙: \(P(A_1, \ldots, A_n) = \prod_{i=1}^n P(A_i \mid A_1, \ldots, A_{i-1})\). 이것이 순차적 확률 모형 — 마르코프 연쇄, 은닉 마르코프 모형, 순차적 베이즈 갱신 — 의 토대다.

연습문제 6. 몬티 홀 문제. 문이 셋인데 하나 뒤에는 자동차가, 둘 뒤에는 염소가 있다. 당신은 1번 문을 골랐다. (각 문 뒤에 무엇이 있는지 아는) 진행자가 3번 문을 열어 염소를 보여주고 바꿀 기회를 준다. 바꿀 때와 그대로 둘 때 이길 확률은 각각 얼마인가?

풀이

\(C_i\)를 "자동차가 \(i\)번 문 뒤에 있다"라 하자(\(i = 1, 2, 3\)에 대해 균등한 사전확률 \(P(C_i) = 1/3\)). \(H_3\)을 "진행자가 3번 문을 연다"라 하자.

진행자의 행동: 당신이 자동차를 골랐다면(1번 문, \(C_1\)) 진행자는 2번과 3번 중 무작위로 고르므로 \(P(H_3 \mid C_1) = 1/2\)이다. 자동차가 2번 문 뒤에 있으면(\(C_2\)) 진행자는 3번을 열 수밖에 없으므로 \(P(H_3 \mid C_2) = 1\)이다. 자동차가 3번 문 뒤에 있으면 진행자가 그 문을 열 수 없으므로 \(P(H_3 \mid C_3) = 0\)이다.

베이즈에 의해

\(P(C_1 \mid H_3) = (1/2)(1/3) / P(H_3) = (1/6)/P(H_3)\).

\(P(C_2 \mid H_3) = (1)(1/3) / P(H_3) = (1/3)/P(H_3)\).

\(P(C_3 \mid H_3) = (0)(1/3) / P(H_3) = 0\).

정규화하면 \(P(H_3) = 1/6 + 1/3 + 0 = 1/2\)이므로 \(P(C_1 \mid H_3) = 1/3\), \(P(C_2 \mid H_3) = 2/3\), \(P(C_3 \mid H_3) = 0\)이다.

그대로 두기: 확률 \(P(C_1 \mid H_3) = 1/3\)로 이긴다. 바꾸기: 확률 \(P(C_2 \mid H_3) = 2/3\)로 이긴다.

바꾸면 이길 확률이 두 배가 된다. 직관은 이렇다. 처음 고른 문이 맞을 확률은 1/3이었고, 진행자의 선택이 정보를 주기 때문에 진행자가 열지 않은 문이 나머지 2/3의 확률을 떠안는다. 이 문제는 널리 알려졌을 때 수학자들조차 헷갈리게 한 것으로 유명하다. 베이즈 정리로 형식화하기 전까지는 답이 틀린 것처럼 느껴진다.

연습문제 7. 연습문제 6의 몬티 홀처럼 조건 사건을 어떻게 서술하느냐가 답을 바꾸는 문제가 또 있다. 두 아이 문제를 풀어라.

어떤 가정에 아이가 둘 있다. 다음 각 정보가 주어졌을 때 둘 다 아들일 확률은?

(a) "적어도 하나는 아들이다." (b) "첫째가 아들이다." (c) "화요일에 태어난 아들이 있다."

풀이
import numpy as np

rng = np.random.default_rng(0)
N = 2_000_000
kids = rng.integers(0, 2, (N, 2))            # 0=딸, 1=아들
day = rng.integers(0, 7, (N, 2))             # 0~6, 1=화요일
both = kids.sum(axis=1) == 2

cond_a = kids.sum(axis=1) >= 1
cond_b = kids[:, 0] == 1
cond_c = ((kids == 1) & (day == 1)).any(axis=1)

print(f"(a) 적어도 하나 아들:        {both[cond_a].mean():.6f}   이론 1/3 = {1/3:.6f}")
print(f"(b) 첫째가 아들:             {both[cond_b].mean():.6f}   이론 1/2 = {0.5:.6f}")
print(f"(c) 화요일에 태어난 아들 있음: {both[cond_c].mean():.6f}   이론 13/27 = {13/27:.6f}")

출력:

(a) 적어도 하나 아들:        0.333428   이론 1/3 = 0.333333
(b) 첫째가 아들:             0.500179   이론 1/2 = 0.500000
(c) 화요일에 태어난 아들 있음: 0.481286   이론 13/27 = 0.481481

(a) \(1/3\). 표본공간은 \(\{(\text{남},\text{남}), (\text{남},\text{여}), (\text{여},\text{남}), (\text{여},\text{여})\}\)이고 각각 확률 \(1/4\)다. 조건 "적어도 하나 아들"은 앞의 셋을 남기고, 그중 둘 다 아들인 것은 하나다.

(b) \(1/2\). 조건이 첫째를 지목하므로 표본공간이 \(\{(\text{남},\text{남}), (\text{남},\text{여})\}\)로 좁아진다. 둘째의 성별은 여전히 반반이다.

(a)와 (b)의 차이가 핵심이다. 둘 다 "아들이 있다"는 정보처럼 들리지만, (b)는 어느 아이인지까지 지목한다. 정리 \(1\)의 표현으로는 좁혀진 표본공간의 크기가 다르다(\(3\)개 대 \(2\)개).

(c) \(13/27 \approx 0.4815\). 놀랍게도 \(1/3\)과 \(1/2\) 사이다.

각 아이를 (성별, 요일)로 나타내면 \(14\)가지, 두 아이면 \(196\)가지가 동등확률이다. "화요일생 아들이 적어도 하나"인 경우를 세면

\[ \underbrace{13}_{\text{첫째가 화요일생 아들}} + \underbrace{13}_{\text{둘째가 화요일생 아들}} + \underbrace{1}_{\text{둘 다}} = 27 \]

이고, 그중 둘 다 아들인 것은 \(7 + 7 - 1 = 13\)이다.

왜 요일이 답을 바꾸는가. 정보가 구체적일수록 "어느 아이인지"를 더 많이 지목하기 때문이다. 극단적으로 "\(3\)월 \(14\)일 오후 \(2\)시에 태어난 아들이 있다"처럼 유일하게 특정되면 답이 \(1/2\)에 수렴한다. (c)는 (a)와 (b) 사이의 중간 정도로 특정한 셈이다.

실무적 교훈

이 문제들이 헷갈리는 진짜 이유는 정보가 어떻게 얻어졌는지가 서술되지 않았기 때문이다. "화요일생 아들이 있다"를 부모가 자발적으로 말한 것인지, 우리가 "화요일생 아들이 있습니까?"라고 물어 확인한 것인지에 따라 조건 사건이 달라진다.

1장의 표집 기제 논의가 여기서 되풀이된다. 관측된 자료만으로는 부족하고, 그 자료가 어떻게 선택되었는지를 알아야 조건부확률을 계산할 수 있다. 몬티 홀도 진행자의 행동 규칙을 명시해야만 답이 정해진다. \(\square\)

연습문제 8. 연습문제 5의 연쇄 법칙을 일반화하라. \(n\)개 사건에 대한 형태를 쓰고, 이것이 왜 확률모형의 기본 도구인지 설명하라.

풀이

일반 연쇄 법칙.

\[ P(A_1 \cap \cdots \cap A_n) = P(A_1)\,P(A_2\mid A_1)\,P(A_3\mid A_1,A_2)\cdots P(A_n \mid A_1,\ldots,A_{n-1}) \]

증명은 귀납이다. \(n=2\)는 정리 \(2\)의 곱셈 규칙이고, \(n\)에서 \(n+1\)로 갈 때 \(B = A_1\cap\cdots\cap A_n\)으로 두고 곱셈 규칙을 한 번 더 적용하면 된다. \(\square\)

import numpy as np
from math import comb

# 카드 13장 하트 중 연속으로 뽑기
print("52장에서 비복원으로 k장을 뽑아 모두 하트일 확률")
print(f"{'k':>4}{'연쇄 법칙':>14}{'조합으로':>14}")
for k in (1, 2, 3, 5, 13):
    chain = np.prod([(13 - i) / (52 - i) for i in range(k)])
    direct = comb(13, k) / comb(52, k)
    print(f"{k:>4}{chain:>14.8f}{direct:>14.8f}")

# 마르코프 가정이 있으면 항이 줄어든다
print("\n연쇄 법칙의 항 개수 (조건에 들어가는 변수 수)")
print(f"{'n':>5}{'일반':>12}{'마르코프(1차)':>16}")
for n in (3, 5, 10, 50):
    print(f"{n:>5}{sum(range(n)):>12}{n - 1:>16}")

출력:

52장에서 비복원으로 k장을 뽑아 모두 하트일 확률
   k         연쇄 법칙          조합으로
   1    0.25000000    0.25000000
   2    0.05882353    0.05882353
   3    0.01294118    0.01294118
   5    0.00049520    0.00049520
  13    0.00000000    0.00000000

연쇄 법칙의 항 개수 (조건에 들어가는 변수 수)
    n          일반        마르코프(1차)
    3           3               2
    5          10               4
   10          45               9
   50        1225              49

연쇄 법칙이 기본 도구인 이유는 결합분포를 조건부분포의 곱으로 쪼개기 때문이다. 결합분포는 다루기 어렵지만 조건부분포는 하나씩 모형화할 수 있다.

그런데 그대로 쓰면 항이 폭발한다. \(n\)번째 항은 \(n-1\)개 변수에 조건을 걸므로, 이진 변수 \(n\)개라면 \(2^{n-1}\)개의 조건부확률을 지정해야 한다. \(n = 50\)이면 불가능하다.

그래서 구조 가정을 넣는다.

가정 형태 어디에 쓰이는가
마르코프성 \(P(A_n \mid A_1,\ldots,A_{n-1}) = P(A_n\mid A_{n-1})\) 마르코프 연쇄, 시계열
조건부 독립 일부 조건을 떨어뜨린다 나이브 베이즈, 베이즈망
교환가능성 순서가 무관하다 계층모형

마르코프 가정이면 조건 변수가 \(1\)개로 줄어 항이 \(n-1\)개가 된다. 위 표에서 \(n=50\)일 때 일반 연쇄는 조건 변수가 총 \(1225\)개인데 마르코프는 \(49\)개다.

베이즈망이 이 발상의 일반형이다. 어떤 조건을 떨어뜨릴 수 있는지를 그래프로 표현하고, 그 그래프가 결합분포의 인수분해를 정한다. 1장에서 본 인과 그래프가 바로 이것이며, 연쇄 법칙 + 조건부 독립 가정이 그 수학적 내용이다.

다음 절의 조건부 독립이 이 이야기를 이어받는다. \(\square\)

연습문제 9. 조건부확률의 정의는 \(P(B) > 0\)을 요구한다. 연속형 확률변수에서는 어떻게 되는가?

풀이
import numpy as np

rng = np.random.default_rng(2)
N = 4_000_000
x = rng.normal(0, 1, N)
y = 0.8 * x + rng.normal(0, 0.6, N)

print(f"P(X = 0.5) 를 추정하려 하면")
for eps in (0.1, 0.01, 0.001, 0.0001):
    m = np.abs(x - 0.5) < eps
    print(f"  |X - 0.5| < {eps:<7}: 해당 표본 {m.sum():>8}개 "
          f"({m.mean():.6f})   E[Y|·] = {y[m].mean() if m.sum() else float('nan'):.4f}")
print(f"\n이론값 E[Y | X=0.5] = 0.8 x 0.5 = {0.8 * 0.5:.4f}")

출력:

P(X = 0.5) 를 추정하려 하면
  |X - 0.5| < 0.1    : 해당 표본   281692개 (0.070423)   E[Y|·] = 0.3988
  |X - 0.5| < 0.01   : 해당 표본    28047개 (0.007012)   E[Y|·] = 0.4044
  |X - 0.5| < 0.001  : 해당 표본     2814개 (0.000704)   E[Y|·] = 0.4032
  |X - 0.5| < 0.0001 : 해당 표본      256개 (0.000064)   E[Y|·] = 0.4033

이론값 E[Y | X=0.5] = 0.8 x 0.5 = 0.4000

\(P(X = 0.5) = 0\)이므로 조건부확률의 정의를 그대로 쓸 수 없다. 분모가 \(0\)이다.

그런데 \(\mathbb{E}[Y \mid X = 0.5]\)는 분명히 의미가 있다. 위 출력에서 구간을 좁혀 갈수록 추정값이 \(0.4\)에 안정적으로 수렴한다. 표본 수는 줄지만 값은 흔들리지 않는다.

해결책은 극한이다.

\[ \mathbb{E}[Y \mid X = x] = \lim_{\varepsilon \to 0}\mathbb{E}\!\left[Y \,\big|\, \lvert X - x\rvert < \varepsilon\right] \]

그리고 조건부밀도를 직접 정의한다.

\[ f_{Y\mid X}(y \mid x) = \frac{f_{X,Y}(x,y)}{f_X(x)}, \qquad f_X(x) > 0 \]

형태는 같지만 확률이 아니라 밀도의 비다. 분모가 \(0\)이 아니므로 정의가 살아난다.

보렐–콜모고로프 역설

이 극한이 어떻게 좁혀 가느냐에 의존한다는 것이 깊은 문제다. 구면 위의 균등분포에서 "적도 위의 조건부분포"를 구할 때, 위도로 좁히면 균등이 나오고 경도로 좁히면 균등이 아니다. 같은 측도 \(0\)인 사건에 조건을 걸었는데 답이 다르다.

이 때문에 측도론에서는 조건부기댓값을 극한이 아니라 \(\sigma\)-대수에 대한 사영으로 정의한다. 앞 절 공리 문서 연습문제 11에서 \(\mathcal{F}\)가 "정보를 형식화하는 언어"라고 한 것이 여기서 구체화된다. \(\mathbb{E}[Y \mid \mathcal{G}]\)는 "\(\mathcal{G}\)가 담은 정보로 \(Y\)를 가장 잘 예측한 것"으로 정의되며, 이 정의는 유일성(거의 확실하게)을 보장한다.

실무에서는 어떻게 하는가. 대부분의 경우 밀도의 비로 충분하다. 회귀분석의 \(\mathbb{E}[Y\mid X=x]\)가 정확히 이것이며, 조건이 어떻게 주어졌는지가 자연스럽게 정해지므로 역설이 나타나지 않는다. 역설은 조건 사건을 서술하는 방식이 여럿일 때만 생기며, 그 점에서 연습문제 7의 두 아이 문제와 같은 뿌리를 갖는다. \(\square\)

연습문제 10. 정리 \(3\)의 전확률의 법칙을 재귀적으로 써 보라. 도박꾼의 파산 문제를 풀어라.

\(p\)의 확률로 \(1\)원을 따고 \(1-p\)의 확률로 \(1\)원을 잃는 게임을 한다. 현재 \(i\)원을 갖고 있고, \(0\)원이 되면 파산하며 \(N\)원에 도달하면 목표 달성이다. 목표에 도달할 확률은?

풀이

첫걸음 분석. \(u_i\)를 "현재 \(i\)원일 때 목표에 도달할 확률"이라 하자. 첫 판의 결과로 분할하면 전확률의 법칙이

\[ u_i = p\,u_{i+1} + (1-p)\,u_{i-1}, \qquad u_0 = 0,\ u_N = 1 \]

을 준다. 정리 \(3\)을 "다음 상태"라는 분할에 적용한 것이다.

풀이. \(q = (1-p)/p\)라 하면

\[ u_i = \begin{cases} \dfrac{1 - q^{\,i}}{1 - q^{\,N}} & p \ne \tfrac12 \\[8pt] \dfrac{i}{N} & p = \tfrac12 \end{cases} \]
import numpy as np

def theory(p, i, N):
    if abs(p - 0.5) < 1e-12:
        return i / N
    q = (1 - p) / p
    return (1 - q ** i) / (1 - q ** N)

def simulate(p, i, N, reps=40_000, seed=1):
    rng = np.random.default_rng(seed)
    wins = 0
    for _ in range(reps):
        x = i
        while 0 < x < N:
            x += 1 if rng.random() < p else -1
        wins += (x == N)
    return wins / reps

print(f"{'p':>6}{'시작':>6}{'목표':>6}{'모의':>10}{'이론':>10}")
for p, i, N in [(0.5, 5, 10), (0.45, 5, 10), (0.6, 5, 10)]:
    print(f"{p:>6}{i:>6}{N:>6}{simulate(p, i, N):>10.4f}{theory(p, i, N):>10.4f}")

print("\n공정한 게임에서 목표를 키우면")
for N in (10, 50, 200, 1000):
    print(f"  1원으로 시작해 {N}원 목표: {theory(0.5, 1, N):.6f}")

print("\n약간 불리한 게임(p=0.49)에서 자본을 늘리면")
for i, N in [(10, 20), (50, 100), (200, 400), (500, 1000)]:
    print(f"  {i}원으로 시작해 {N}원 목표: {theory(0.49, i, N):.3e}")

출력:

     p    시작    목표        모의        이론
   0.5     5    10    0.5017    0.5000
  0.45     5    10    0.2688    0.2683
   0.6     5    10    0.8845    0.8836

공정한 게임에서 목표를 키우면
  1원으로 시작해 10원 목표: 0.100000
  1원으로 시작해 50원 목표: 0.020000
  1원으로 시작해 200원 목표: 0.005000
  1원으로 시작해 1000원 목표: 0.001000

약간 불리한 게임(p=0.49)에서 자본을 늘리면
  10원으로 시작해 20원 목표: 4.013e-01
  50원으로 시작해 100원 목표: 1.192e-01
  200원으로 시작해 400원 목표: 3.350e-04
  500원으로 시작해 1000원 목표: 2.056e-09

모의와 이론이 정확히 맞는다.

두 가지 결과가 인상적이다.

첫째, 공정한 게임(\(p = 0.5\))에서도 목표가 크면 거의 불가능하다. \(1\)원으로 \(1000\)원을 만들 확률은 \(0.001\)이다. 기댓값이 \(0\)인 게임인데도 그렇다. 기댓값이 공정하다는 것과 이길 가능성이 높다는 것은 전혀 다르다.

둘째, 약간 불리한 게임에서는 자본을 늘려도 소용없다. \(p = 0.49\)에서 비율을 유지한 채(\(i/N = 1/2\)) 판돈을 키우면 성공 확률이

\[ 0.401 \;\to\; 0.119 \;\to\; 3.4\times10^{-4} \;\to\; 2.1\times10^{-9} \]

로 급락한다. 불리한 게임을 오래 할수록 파산이 확실해진다.

왜 그런가. \(q = (1-p)/p > 1\)이므로 \(q^N\)이 지수적으로 자란다. 한 판의 우위가 아주 작아도 판수가 많아지면 그 효과가 지수적으로 누적된다. 카지노의 사업 모형이 정확히 이것이며, 3.5절 큰수의 법칙이 같은 이야기를 다른 언어로 한다.

첫걸음 분석의 일반성. 이 기법은 마르코프 연쇄 전반에 쓰인다. "다음 한 걸음"으로 분할하고 전확률의 법칙을 적용해 재귀식을 세우는 것이며, 흡수 확률·기대 도달 시간·정상분포가 모두 이 방식으로 계산된다. 정리 \(3\)이 단순한 계산 도구가 아니라 확률과정 분석의 출발점임을 보여 준다. \(\square\)

정리하며

세 정리는 하나의 그림으로 이어진다. 확률나무다.

  • 정리 1은 나무의 가지 하나에 무엇을 적을지 정한다. 가지의 값은 조건부확률 \(P(A \mid B)\)이고, 그것은 좁혀진 표본공간에서의 비율이다.
  • 정리 2는 뿌리에서 잎까지 한 경로를 따라 곱한다. 곱셈 규칙이다.
  • 정리 3은 같은 결과에 닿는 여러 경로를 더한다. 전확률의 법칙이다.

곱하고 더하는 이 두 동작이 확률 계산의 거의 전부다. 복잡해 보이는 문제도 대개 "경로를 어떻게 나눌 것인가"를 정하고 나면 곱셈과 덧셈만 남는다.

한 가지가 아직 빠져 있다. 지금까지는 원인에서 결과로 나무를 따라 내려왔다. 병이 있으면 검사가 양성일 확률, 기계 A가 만들었으면 불량일 확률처럼. 그러나 현실에서 우리가 관측하는 것은 대개 결과이고, 알고 싶은 것은 원인이다. 검사가 양성일 때 병이 있을 확률은 얼마인가?

나무를 거꾸로 거슬러 올라가는 이 물음에 답하는 것이 다음 절의 베이즈 정리다. 그리고 그 식의 분모에는 방금 정리 3으로 계산한 전확률이 그대로 들어간다.