確率変数の条件付き独立について分かりやすく解説

確率変数の条件付き独立(conditional independence)について解説します。条件付き独立の関係性を利用することで、確率変数の計算が大幅に簡単になる場面が多くあります。ベイズネットワークやグラフィカルモデルの基礎となる概念です。

本記事の内容

  • 条件付き独立の定義
  • 独立と条件付き独立の違い
  • ベイズネットワークでの活用
  • Python でのシミュレーション

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

条件付き独立の定義

確率変数 $x, y, z$ について、$z$ が与えられた条件のもとで $x$ と $y$ が条件付き独立であるとは、

$$ \begin{equation} p(x, y | z) = p(x | z) \cdot p(y | z) \end{equation} $$

が任意の $x, y, z$ に対して成り立つことです。

この条件付き独立の関係は、慣習的に次のように表記されます。

$$ \begin{equation} x \perp\!\!\!\perp y \mid z \end{equation} $$

同値な表現

(1) 式から、以下の同値な表現が導けます。

$$ \begin{align} p(x | y, z) &= p(x | z) \\ p(y | x, z) &= p(y | z) \end{align} $$

(3) 式は「$z$ を知っていれば、$y$ の情報は $x$ の予測に影響しない」ことを意味します。

独立と条件付き独立の違い

独立 ($x \perp\!\!\!\perp y$) と条件付き独立 ($x \perp\!\!\!\perp y \mid z$) は別の概念であり、一方が成り立っても他方が成り立つとは限りません。

独立だが条件付き独立でない例

2つの独立なコイン $x, y$ を投げ、$z = x + y$(表の合計枚数)とします。

  • $x \perp\!\!\!\perp y$:コインは独立
  • $x \not\perp\!\!\!\perp y \mid z$:$z = 1$ と知ったとき、$x = 1$ なら $y = 0$ が確定する

$z$ で条件付けると、独立だった $x$ と $y$ に依存関係が生まれます。

条件付き独立だが独立でない例

身長 $x$ と語彙力 $y$ は相関があります(共に年齢 $z$ に依存)。しかし、年齢 $z$ で条件付けると、身長と語彙力は条件付き独立に近くなります。

$$ x \not\perp\!\!\!\perp y, \quad x \perp\!\!\!\perp y \mid z $$

ベイズネットワークでの利用

条件付き独立は、ベイズネットワーク(有向グラフィカルモデル)において同時分布を効率的に分解するために利用されます。

$N$ 個の変数の同時分布は一般に指数的な数のパラメータを持ちますが、条件付き独立の関係を活用すると、

$$ p(x_1, x_2, \dots, x_N) = \prod_{i=1}^{N} p(x_i | \text{pa}(x_i)) $$

と分解でき、$\text{pa}(x_i)$ は $x_i$ の親ノードの集合です。

Python でのシミュレーション

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
N = 10000

# 例: Z -> X, Z -> Y(Xは Zの結果、Yも Zの結果)
# Z: 年齢(5-80歳)
Z = np.random.uniform(5, 80, N)

# X: 身長(年齢に依存)
X = 50 + 1.5 * Z + np.random.normal(0, 5, N)
X = np.clip(X, 50, 200)

# Y: 語彙力(年齢に依存)
Y = 100 + 50 * np.log(Z + 1) + np.random.normal(0, 30, N)

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# 左: XとYの周辺的な相関(独立でない)
ax1 = axes[0]
ax1.scatter(X, Y, s=3, alpha=0.2, color='blue')
corr_marginal = np.corrcoef(X, Y)[0, 1]
ax1.set_xlabel('Height (X)', fontsize=12)
ax1.set_ylabel('Vocabulary (Y)', fontsize=12)
ax1.set_title(f'Marginal: corr(X,Y) = {corr_marginal:.3f}', fontsize=12)
ax1.grid(True, alpha=0.3)

# 中央: 年齢で条件付けた場合(条件付き独立に近い)
ax2 = axes[1]
# 年齢20-25歳の人だけ抽出
mask = (Z >= 20) & (Z <= 25)
ax2.scatter(X[mask], Y[mask], s=10, alpha=0.3, color='green')
corr_cond = np.corrcoef(X[mask], Y[mask])[0, 1]
ax2.set_xlabel('Height (X)', fontsize=12)
ax2.set_ylabel('Vocabulary (Y)', fontsize=12)
ax2.set_title(f'Conditional (Z=20-25): corr(X,Y|Z) = {corr_cond:.3f}', fontsize=12)
ax2.grid(True, alpha=0.3)

# 右: 複数の年齢層での条件付き相関
ax3 = axes[2]
age_bins = [(5, 15), (20, 30), (35, 45), (50, 60), (65, 75)]
cond_corrs = []
for low, high in age_bins:
    m = (Z >= low) & (Z <= high)
    if m.sum() > 10:
        c = np.corrcoef(X[m], Y[m])[0, 1]
        cond_corrs.append(c)
    else:
        cond_corrs.append(0)

labels = [f'{l}-{h}' for l, h in age_bins]
ax3.bar(labels, cond_corrs, color='teal', alpha=0.7)
ax3.axhline(y=0, color='k', linestyle='--', alpha=0.3)
ax3.axhline(y=corr_marginal, color='r', linestyle='--', alpha=0.5,
            label=f'Marginal corr = {corr_marginal:.3f}')
ax3.set_xlabel('Age group (Z)', fontsize=12)
ax3.set_ylabel('Conditional correlation', fontsize=12)
ax3.set_title('Conditional Correlation by Age Group', fontsize=12)
ax3.legend(fontsize=10)
ax3.grid(True, alpha=0.3)

plt.suptitle('Conditional Independence: X perp Y | Z', fontsize=14)
plt.tight_layout()
plt.show()

左のグラフでは、身長と語彙力に周辺的な正の相関がありますが、中央のグラフでは年齢で条件付けると相関がほぼ消えることが確認できます。右のグラフでは、各年齢層での条件付き相関が周辺相関よりも大幅に小さいことがわかります。

まとめ

本記事では、条件付き独立について解説しました。

  • 条件付き独立 $x \perp\!\!\!\perp y \mid z$ は、$z$ が与えられたもとで $x$ と $y$ が独立になる性質
  • 独立と条件付き独立は別の概念であり、一方が成り立っても他方は成り立たないことがある
  • ベイズネットワークでは条件付き独立を利用して同時分布を効率的に分解する
  • 交絡因子を条件付けることで見かけの相関を除去できる

次のステップとして、以下の記事も参考にしてください。