確率論や統計学を学ぶうえで避けて通れないのが 条件付き確率 です。条件付き確率は、ある事象が起こったという情報のもとで、別の事象が起こる確率を表す概念であり、ベイズ推定や機械学習の基礎となる重要な概念です。
本記事では、条件付き確率の定義から直感的な理解、ベイズの定理の導出、そして Python での計算例までを丁寧に解説します。
本記事の内容
- 条件付き確率の定義と直感的な理解
- 同時確率との関係
- ベイズの定理の導出
- Python での計算例と可視化
前提知識
この記事を読む前に、以下の概念を理解しておくと理解が深まります。
- 確率の基本的な定義(事象、標本空間)
- 集合の基本演算(積集合、和集合)
条件付き確率とは
条件付き確率とは、ある事象 $B$ が起こったという条件のもとで、事象 $A$ が起こる確率のことです。日常的な例で考えると、「今日雨が降っている(事象 $B$)という条件のもとで、傘を持っている人の割合(事象 $A$ の確率)」のようなイメージです。
何も条件がない場合の確率 $P(A)$ と、条件 $B$ が与えられた場合の確率 $P(A|B)$ は、一般に異なる値をとります。
条件付き確率の数学的定義
事象 $B$ が起こったという条件のもとでの事象 $A$ の条件付き確率は、次のように定義されます。
$$ \begin{equation} P(A|B) = \frac{P(A \cap B)}{P(B)} \quad (P(B) > 0) \end{equation} $$
ここで、
- $P(A|B)$:事象 $B$ が起こったもとでの事象 $A$ の条件付き確率
- $P(A \cap B)$:事象 $A$ と事象 $B$ が同時に起こる確率(同時確率)
- $P(B)$:事象 $B$ が起こる確率(周辺確率)
です。
直感的な理解
条件付き確率は、「全体の標本空間を事象 $B$ に制限したときの $A$ の割合」と考えることができます。
例えば、52枚のトランプから1枚引く試行を考えましょう。
- $A$:引いたカードがハートである
- $B$:引いたカードが絵札(J, Q, K)である
このとき、
$$ P(A|B) = \frac{P(A \cap B)}{P(B)} = \frac{3/52}{12/52} = \frac{3}{12} = \frac{1}{4} $$
絵札12枚のうちハートの絵札は3枚なので、$1/4$ という結果は直感とも一致します。
同時確率と条件付き確率の関係
(1) 式を変形すると、同時確率と条件付き確率の関係が得られます。
$$ \begin{equation} P(A \cap B) = P(A|B) \cdot P(B) \end{equation} $$
同様に、$A$ と $B$ を入れ替えると、
$$ \begin{equation} P(A \cap B) = P(B|A) \cdot P(A) \end{equation} $$
(2) と (3) より、次の等式が成り立ちます。
$$ \begin{equation} P(A|B) \cdot P(B) = P(B|A) \cdot P(A) = P(A \cap B) \end{equation} $$
この関係式は非常に重要です。条件付き確率と同時確率の関係を示しており、ベイズの定理の出発点となります。
条件付き確率は同時確率以上になる
(1) 式から、$0 < P(B) \leq 1$ であるため、
$$ P(A|B) = \frac{P(A \cap B)}{P(B)} \geq P(A \cap B) $$
が成り立ちます。つまり、条件付き確率は同時確率以上です。これは、条件を与えることで標本空間が狭くなり、相対的に確率が大きくなることを反映しています。
ベイズの定理の導出
(4) 式から、ベイズの定理を導出することができます。
$$ \begin{align} P(A|B) \cdot P(B) &= P(B|A) \cdot P(A) \\ P(A|B) &= \frac{P(B|A) \cdot P(A)}{P(B)} \end{align} $$
これがベイズの定理です。各項には以下のような名前がついています。
| 記号 | 名前 | 意味 |
|---|---|---|
| $P(A \mid B)$ | 事後確率 | データ $B$ を観測した後の $A$ の確率 |
| $P(A)$ | 事前確率 | データを観測する前の $A$ の確率 |
| $P(B \mid A)$ | 尤度 | $A$ のもとで $B$ が観測される確率 |
| $P(B)$ | 周辺尤度(エビデンス) | $B$ が観測される確率 |
ベイズの定理は、「事前確率を尤度で更新して事後確率を得る」という解釈ができます。
全確率の定理
ベイズの定理の分母 $P(B)$ を計算する際に必要となるのが全確率の定理です。
互いに排反な事象 $A_1, A_2, \dots, A_n$ が標本空間を分割しているとき($A_1 \cup A_2 \cup \dots \cup A_n = \Omega$)、
$$ \begin{equation} P(B) = \sum_{i=1}^{n} P(B|A_i) \cdot P(A_i) \end{equation} $$
が成り立ちます。
具体例:病気の検査問題
条件付き確率の典型的な応用例として、病気の検査問題を考えましょう。
- ある病気の有病率:$P(D) = 0.01$(1%)
- 検査の感度(病気の人が陽性になる確率):$P(T|D) = 0.95$
- 検査の特異度(健康な人が陰性になる確率):$P(\overline{T}|\overline{D}) = 0.90$
このとき、検査で陽性だった人が実際に病気である確率 $P(D|T)$ を求めます。
まず、全確率の定理を使って $P(T)$ を求めます。
$$ \begin{align} P(T) &= P(T|D) \cdot P(D) + P(T|\overline{D}) \cdot P(\overline{D}) \\ &= 0.95 \times 0.01 + 0.10 \times 0.99 \\ &= 0.0095 + 0.099 \\ &= 0.1085 \end{align} $$
ベイズの定理より、
$$ \begin{align} P(D|T) &= \frac{P(T|D) \cdot P(D)}{P(T)} \\ &= \frac{0.95 \times 0.01}{0.1085} \\ &\approx 0.0876 \end{align} $$
検査で陽性になっても、実際に病気である確率は約 $8.76\%$ にとどまります。有病率が低い場合、偽陽性の影響が大きいことがわかります。
Python での実装
条件付き確率とベイズの定理を Python で計算・可視化してみましょう。
import numpy as np
import matplotlib.pyplot as plt
# 病気の検査問題
P_D = 0.01 # 有病率
P_T_given_D = 0.95 # 感度
P_T_given_notD = 0.10 # 偽陽性率(1 - 特異度)
# 全確率の定理で P(T) を計算
P_notD = 1 - P_D
P_T = P_T_given_D * P_D + P_T_given_notD * P_notD
# ベイズの定理で P(D|T) を計算
P_D_given_T = (P_T_given_D * P_D) / P_T
print(f"P(T) = {P_T:.4f}")
print(f"P(D|T) = {P_D_given_T:.4f}")
# 有病率を変化させたときの P(D|T) の変化を可視化
prevalence = np.linspace(0.001, 0.5, 500)
P_T_array = P_T_given_D * prevalence + P_T_given_notD * (1 - prevalence)
P_D_given_T_array = (P_T_given_D * prevalence) / P_T_array
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(prevalence, P_D_given_T_array, linewidth=2)
ax.set_xlabel("Prevalence P(D)", fontsize=12)
ax.set_ylabel("P(D|T)", fontsize=12)
ax.set_title("Posterior Probability vs Prevalence (Bayes' Theorem)", fontsize=13)
ax.axhline(y=0.5, color='r', linestyle='--', alpha=0.5, label="P(D|T) = 0.5")
ax.axvline(x=0.01, color='g', linestyle='--', alpha=0.5, label="Prevalence = 0.01")
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このコードでは、有病率 $P(D)$ を横軸に変化させたときの事後確率 $P(D|T)$ の変化をグラフ化しています。有病率が低いほど、陽性と判定されても実際に病気である確率が低くなることが視覚的に確認できます。
import numpy as np
import matplotlib.pyplot as plt
# モンテカルロシミュレーションで条件付き確率を検証
np.random.seed(42)
n_people = 100000
P_D = 0.01
# 病気の有無を生成
is_sick = np.random.rand(n_people) < P_D
# 検査結果を生成
test_result = np.zeros(n_people, dtype=bool)
test_result[is_sick] = np.random.rand(is_sick.sum()) < 0.95 # 感度
test_result[~is_sick] = np.random.rand((~is_sick).sum()) < 0.10 # 偽陽性率
# 条件付き確率の計算
P_D_given_T_sim = is_sick[test_result].sum() / test_result.sum()
print(f"シミュレーション結果:")
print(f" 総人数: {n_people}")
print(f" 病気の人数: {is_sick.sum()}")
print(f" 陽性の人数: {test_result.sum()}")
print(f" 陽性かつ病気: {(is_sick & test_result).sum()}")
print(f" P(D|T) (シミュレーション): {P_D_given_T_sim:.4f}")
print(f" P(D|T) (理論値): {(0.95 * 0.01) / (0.95 * 0.01 + 0.10 * 0.99):.4f}")
モンテカルロシミュレーションにより、理論値とシミュレーション結果がよく一致することが確認できます。
まとめ
本記事では、条件付き確率について解説しました。
- 条件付き確率 $P(A|B)$ は、事象 $B$ が起こったもとでの事象 $A$ の確率であり、$P(A \cap B) / P(B)$ で定義される
- 条件付き確率は同時確率以上の値をとる
- ベイズの定理は条件付き確率から導出され、事前確率を尤度で更新して事後確率を得る枠組みを提供する
- 病気の検査問題のように、有病率が低い場合は偽陽性の影響が大きくなる
次のステップとして、以下の記事も参考にしてください。