チェビシェフ・マルコフ・イェンセンの不等式を理解する

確率変数の分布が完全にわかっていれば、どんな確率も正確に計算できます。しかし実際には、分布の完全な情報が得られないことが少なくありません。平均値と分散だけはわかっているが、分布の形はわからない — そんな状況で「確率変数が極端な値を取る確率はどれくらいか?」を見積もりたいとき、強力な道具になるのが確率不等式(probability inequalities)です。

確率不等式は、分布の限られた情報(期待値、分散など)だけから確率の上界(あるいは下界)を与えます。正確な値は求まりませんが、「少なくともこれ以下である」「最悪でもこの程度である」という保証が得られるのです。

確率不等式を理解すると、以下のような場面で活用できます。

  • 大数の法則の証明: チェビシェフの不等式から弱法則が証明できる
  • 統計的推定: 信頼区間の幅に関する保証
  • 機械学習理論: 学習アルゴリズムの汎化誤差の上界(PAC学習理論)
  • アルゴリズム解析: ランダムアルゴリズムの成功確率の保証
  • 最適化: 凸関数の期待値に関する不等式(イェンセン)

本記事の内容

  • マルコフの不等式 — 最も基本的な確率不等式
  • チェビシェフの不等式 — 分散を使った改善
  • イェンセンの不等式 — 凸関数と期待値の関係
  • これらの不等式間の関係
  • Pythonによる可視化と数値実験

前提知識

この記事を読む前に、以下の概念を理解しておくとスムーズです。

マルコフの不等式 — 「期待値だけから確率を上界する」

直感

マルコフの不等式の直感は非常にシンプルです。「平均が低いのに大きな値が頻繁に出ることはない」ということです。

たとえば、ある会社の平均年収が500万円だとします。年収が5,000万円以上の社員の割合はどれくらいでしょうか?全員が5,000万円以上なら平均も5,000万円以上になるはずなので、5,000万円以上の社員は最大でも $500/5000 = 10\%$ 以下です。

これがマルコフの不等式の本質です。

定理の主張

$X$ が非負の確率変数($X \geq 0$)で $E[X] < \infty$ のとき、任意の $a > 0$ に対して

$$ \begin{equation} P(X \geq a) \leq \frac{E[X]}{a} \end{equation} $$

証明

証明は驚くほど短いです。

$X \geq 0$ のとき、$X \geq a \cdot \mathbf{1}(X \geq a)$ が成り立ちます。ここで $\mathbf{1}(X \geq a)$ は $X \geq a$ のとき1、そうでないとき0の指示関数です。

この不等式は、$X \geq a$ のときは $X \geq a \cdot 1 = a$ で成立し、$X < a$ のときは右辺が0なので $X \geq 0 = a \cdot 0$ で成立します。

両辺の期待値を取ると

$$ E[X] \geq a \cdot E[\mathbf{1}(X \geq a)] = a \cdot P(X \geq a) $$

$a > 0$ で割ると

$$ P(X \geq a) \leq \frac{E[X]}{a} $$

マルコフの不等式の限界

マルコフの不等式は期待値だけから得られる最良の上界ですが、一般にはかなり緩い(保守的な)上界です。分布の詳しい情報を使えば、もっとタイトな上界が得られます。

分散の情報を使って改善するのが、次に見るチェビシェフの不等式です。

チェビシェフの不等式 — 「分散を使った改善」

直感

チェビシェフの不等式は、「分散が小さい確率変数は、平均の近くに集中する」ことを定量化します。

テストの成績で考えましょう。平均70点、標準偏差10点のテストで、90点以上(平均から20点以上離れた)の生徒はどれくらいいるでしょうか?チェビシェフの不等式は、分布の形によらず、この割合の上界を与えます。

定理の主張

確率変数 $X$ が $E[X] = \mu$、$\text{Var}(X) = \sigma^2 < \infty$ を満たすとき、任意の $k > 0$ に対して

$$ \begin{equation} P(|X – \mu| \geq k\sigma) \leq \frac{1}{k^2} \end{equation} $$

あるいは、$\varepsilon = k\sigma$ として

$$ P(|X – \mu| \geq \varepsilon) \leq \frac{\sigma^2}{\varepsilon^2} $$

マルコフの不等式からの導出

チェビシェフの不等式はマルコフの不等式から簡単に導けます。

$Y = (X – \mu)^2$ とおくと、$Y \geq 0$ であり $E[Y] = \sigma^2$ です。

$|X – \mu| \geq \varepsilon$ は $Y \geq \varepsilon^2$ と同値なので、マルコフの不等式を $Y$ に適用すると

$$ P(|X – \mu| \geq \varepsilon) = P(Y \geq \varepsilon^2) \leq \frac{E[Y]}{\varepsilon^2} = \frac{\sigma^2}{\varepsilon^2} $$

具体的な数値

$k$ の値ごとにチェビシェフの上界を見てみましょう。

$k$ $P(\|X – \mu\| \geq k\sigma) \leq$ 意味
1 1.000(情報なし) 1σ以上離れる確率は100%以下
2 0.250 2σ以上離れる確率は25%以下
3 0.111 3σ以上離れる確率は11.1%以下
5 0.040 5σ以上離れる確率は4%以下
10 0.010 10σ以上離れる確率は1%以下

正規分布なら $P(|X – \mu| \geq 2\sigma) \approx 0.046$ なので、チェビシェフの上界(0.25)はかなり緩いです。しかし、チェビシェフの不等式の真価は分布に依存しないことにあります。

チェビシェフの不等式の最適性

チェビシェフの不等式は、分散だけから得られる上界として最良です。つまり、任意の $k > 0$ に対して、等号を達成する分布が存在します。

等号を達成する分布は、3点分布($X = \mu – k\sigma, \mu, \mu + k\sigma$)を適切な確率で取る分布です。このことは、チェビシェフの不等式がこれ以上改善できない(追加情報なしでは)ことを意味しています。

マルコフとチェビシェフの不等式は「確率を上から抑える」ものでしたが、次に見るイェンセンの不等式は方向が異なり、「関数の期待値」と「期待値の関数」の大小関係を述べます。

イェンセンの不等式 — 「凸関数と期待値」

直感

イェンセンの不等式の直感は、「凸関数の期待値は、期待値の関数値以上である」ということです。

サイコロの目 $X$ の二乗の期待値と、期待値の二乗を比べてみましょう。

$$ E[X^2] = \frac{1+4+9+16+25+36}{6} = \frac{91}{6} \approx 15.17 $$

$$ (E[X])^2 = 3.5^2 = 12.25 $$

$E[X^2] > (E[X])^2$ です。$f(x) = x^2$ が凸関数なので、$E[f(X)] \geq f(E[X])$ が成り立っています。これがイェンセンの不等式です。

凸関数の復習

関数 $f: \mathbb{R} \to \mathbb{R}$ が(convex)であるとは、任意の $x, y \in \mathbb{R}$ と $\lambda \in [0, 1]$ に対して

$$ f(\lambda x + (1-\lambda)y) \leq \lambda f(x) + (1-\lambda) f(y) $$

が成り立つことです。幾何学的には、グラフ上の任意の2点を結ぶ線分がグラフの上にあるということです。

$f$ が2回微分可能なら、$f”(x) \geq 0$ が凸性の必要十分条件です。

代表的な凸関数: $x^2$, $|x|$, $e^x$, $-\ln x$ ($x > 0$)

代表的な凹関数(上に凸): $\sqrt{x}$ ($x \geq 0$), $\ln x$ ($x > 0$)

定理の主張

$f$ が凸関数で、$E[X]$ と $E[f(X)]$ が存在するとき

$$ \begin{equation} f(E[X]) \leq E[f(X)] \end{equation} $$

$f$ が凹関数のときは不等号の向きが逆になります。

$$ f(E[X]) \geq E[f(X)] $$

証明

凸関数 $f$ に対して、任意の点 $a$ での接線(支持超平面)$f(x) \geq f(a) + f'(a)(x – a)$ が成り立ちます(凸関数の定義的性質)。

$a = E[X]$ として

$$ f(X) \geq f(E[X]) + f'(E[X])(X – E[X]) $$

両辺の期待値を取ると

$$ E[f(X)] \geq f(E[X]) + f'(E[X]) \underbrace{E[X – E[X]]}_{=0} = f(E[X]) $$

イェンセンの不等式の応用

分散の非負性: $f(x) = x^2$(凸関数)をイェンセンの不等式に適用すると

$$ E[X^2] \geq (E[X])^2 \quad \Rightarrow \quad \text{Var}(X) = E[X^2] – (E[X])^2 \geq 0 $$

相加平均 ≥ 相乗平均(AM-GM不等式): $f(x) = -\ln x$(凸関数)を使うと

$$ -\ln(E[X]) \leq E[-\ln X] \quad \Rightarrow \quad \ln(E[X]) \geq E[\ln X] $$

$$ E[X] \geq \exp(E[\ln X]) = \left(\prod x_i^{p_i}\right) $$

これはAM-GM不等式の一般化です。

KLダイバージェンスの非負性: $f(x) = x \ln x$(凸関数)を使うと

$$ D_{\text{KL}}(P \| Q) = E_P\left[\ln\frac{P}{Q}\right] \geq 0 $$

これは情報理論のギブスの不等式であり、KLダイバージェンスが常に非負であることの証明に使われます。

それでは、Pythonでこれらの不等式を可視化しましょう。

Pythonでの実装と可視化

マルコフとチェビシェフの不等式の比較

理論的な上界と実際の確率を比較します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# (a) マルコフの不等式: 指数分布
ax = axes[0, 0]
lam = 1.0
mu_exp = 1 / lam
a_range = np.linspace(0.1, 10, 200)

# マルコフの上界
markov_bound = mu_exp / a_range
markov_bound = np.minimum(markov_bound, 1.0)

# 実際の確率 P(X >= a) = exp(-λa)
exact_prob = np.exp(-lam * a_range)

ax.plot(a_range, exact_prob, 'b-', linewidth=2.5, label='Exact P(X ≥ a)')
ax.plot(a_range, markov_bound, 'r--', linewidth=2,
        label='Markov: E[X]/a')
ax.fill_between(a_range, exact_prob, markov_bound,
                where=markov_bound >= exact_prob,
                alpha=0.1, color='red', label='Gap (bound - exact)')
ax.set_xlabel('a', fontsize=12)
ax.set_ylabel('Probability', fontsize=12)
ax.set_title("Markov's Inequality: Exp(1)", fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 1.1)

# (b) チェビシェフの不等式: 正規分布
ax = axes[0, 1]
k_range = np.linspace(0.5, 5, 200)

# チェビシェフの上界
chebyshev_bound = 1 / k_range**2
chebyshev_bound = np.minimum(chebyshev_bound, 1.0)

# 正規分布の場合の実際の確率
exact_normal = 2 * (1 - stats.norm.cdf(k_range))

# 一様分布の場合
exact_uniform = np.where(k_range <= np.sqrt(3), 1 - k_range / np.sqrt(3), 0)

ax.plot(k_range, exact_normal, 'b-', linewidth=2.5, label='Normal')
ax.plot(k_range, exact_uniform, 'g-', linewidth=2, label='Uniform[-1,1]')
ax.plot(k_range, chebyshev_bound, 'r--', linewidth=2.5,
        label='Chebyshev: $1/k^2$')
ax.set_xlabel('$k$ (multiples of $\\sigma$)', fontsize=12)
ax.set_ylabel('$P(|X-\\mu| \\geq k\\sigma)$', fontsize=12)
ax.set_title("Chebyshev's Inequality", fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_yscale('log')
ax.set_ylim(1e-4, 2)

# (c) チェビシェフの等号を達成する分布
ax = axes[1, 0]
k_values = [2, 3, 4]
colors_k = ['steelblue', 'coral', 'green']

for k, color in zip(k_values, colors_k):
    # 3点分布: P(X = -kσ) = 1/(2k²), P(X = 0) = 1 - 1/k², P(X = kσ) = 1/(2k²)
    sigma = 1
    p_extreme = 1 / (2 * k**2)
    p_center = 1 - 1 / k**2
    x_vals = [-k*sigma, 0, k*sigma]
    p_vals = [p_extreme, p_center, p_extreme]

    markerline, stemlines, baseline = ax.stem(x_vals, p_vals, basefmt=' ')
    stemlines.set_color(color)
    markerline.set_color(color)
    markerline.set_markersize(8)
    ax.plot([], [], 'o', color=color, markersize=8,
            label=f'k={k}: P(|X|≥{k}σ)={2*p_extreme:.4f}=1/{k}²')

ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Probability', fontsize=12)
ax.set_title('Distributions Achieving Chebyshev Equality', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (d) 各不等式の概要図
ax = axes[1, 1]
inequalities = ['Markov', 'Chebyshev', 'Hoeffding\n(bounded)', 'Chernoff\n(MGF-based)']
info_needed = ['E[X]', 'E[X], Var(X)', 'E[X], bounds', 'MGF']
tightness = [1, 2, 3, 4]  # 相対的なタイトさ
colors_ineq = ['lightsalmon', 'lightblue', 'lightgreen', 'plum']

bars = ax.barh(range(4), tightness, color=colors_ineq, edgecolor='gray',
               height=0.6)
ax.set_yticks(range(4))
ax.set_yticklabels(inequalities, fontsize=11)
ax.set_xlabel('Relative tightness →', fontsize=12)
ax.set_title('Hierarchy of Concentration Inequalities', fontsize=12)

# 必要な情報をバー内に表示
for i, (bar, info) in enumerate(zip(bars, info_needed)):
    ax.text(bar.get_width() / 2, bar.get_y() + bar.get_height() / 2,
            f'Requires: {info}', ha='center', va='center', fontsize=9,
            fontweight='bold')

ax.grid(True, alpha=0.3, axis='x')

plt.tight_layout()
plt.savefig('probability_inequalities.png', dpi=150, bbox_inches='tight')
plt.show()

この可視化から、確率不等式の性質と関係が読み取れます。

  1. 左上(マルコフの不等式): 指数分布に対して、マルコフの上界(赤い破線)は実際の確率(青い実線)よりかなり大きく、特に $a$ が大きいときギャップが大きいです。マルコフの不等式は期待値のみから得られる「最弱の」上界ですが、どんな非負確率変数にも適用できる汎用性があります。

  2. 右上(チェビシェフの不等式): 正規分布(青)と一様分布(緑)の実際の確率に対して、チェビシェフの上界(赤い破線)は両方を抑えています。正規分布は裾が軽いため上界との差が大きいですが、一様分布のような有界な分布では比較的タイトです。対数スケールで見ると、チェビシェフは $O(1/k^2)$、正規分布は $O(e^{-k^2/2})$ で減衰しており、正規分布では指数的な集中不等式がより適切です。

  3. 左下(等号達成分布): チェビシェフの等号を達成する3点分布が示されています。確率質量が0と $\pm k\sigma$ に集中しており、これが「最悪ケース」の分布です。

  4. 右下(不等式の階層): より多くの情報を使う不等式ほどタイトな上界が得られます。

イェンセンの不等式の可視化

凸関数に対するイェンセンの不等式を幾何学的に可視化します。

import numpy as np
import matplotlib.pyplot as plt

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

# (a) 凸関数 f(x) = x^2 でのイェンセンの不等式
ax = axes[0]
x = np.linspace(-2, 4, 300)
f = x**2

# 確率変数: X = 0 (prob 0.5) or X = 3 (prob 0.5)
x_vals = [0, 3]
p_vals = [0.5, 0.5]
E_X = sum(xi * pi for xi, pi in zip(x_vals, p_vals))  # = 1.5
f_E_X = E_X**2  # f(E[X]) = 2.25
E_f_X = sum(xi**2 * pi for xi, pi in zip(x_vals, p_vals))  # E[f(X)] = 4.5

ax.plot(x, f, 'b-', linewidth=2, label='$f(x) = x^2$ (convex)')
# 弦(2点を結ぶ線分)
ax.plot(x_vals, [xi**2 for xi in x_vals], 'ro', markersize=10, zorder=5)
ax.plot(x_vals, [xi**2 for xi in x_vals], 'r--', linewidth=1.5)

# E[X] と f(E[X])
ax.plot(E_X, f_E_X, 'g^', markersize=12, zorder=5,
        label=f'$f(E[X]) = {f_E_X}$')
# E[X] と E[f(X)]
ax.plot(E_X, E_f_X, 'ms', markersize=12, zorder=5,
        label=f'$E[f(X)] = {E_f_X}$')

# ギャップを示す矢印
ax.annotate('', xy=(E_X, E_f_X), xytext=(E_X, f_E_X),
            arrowprops=dict(arrowstyle='<->', color='orange', lw=2))
ax.text(E_X + 0.15, (f_E_X + E_f_X)/2, f'Gap = {E_f_X - f_E_X:.2f}',
        fontsize=11, color='orange', fontweight='bold')

ax.axvline(E_X, color='gray', linestyle=':', alpha=0.5)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('f(x)', fontsize=12)
ax.set_title("Jensen's Inequality: Convex Case\n"
             r'$f(E[X]) \leq E[f(X)]$', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (b) 凹関数 f(x) = ln(x) でのイェンセンの不等式
ax = axes[1]
x = np.linspace(0.1, 5, 300)
f = np.log(x)

x_vals = [0.5, 4]
p_vals = [0.5, 0.5]
E_X = 2.25
f_E_X = np.log(E_X)
E_f_X = 0.5 * np.log(0.5) + 0.5 * np.log(4)

ax.plot(x, f, 'b-', linewidth=2, label='$f(x) = \\ln(x)$ (concave)')
ax.plot(x_vals, [np.log(xi) for xi in x_vals], 'ro', markersize=10, zorder=5)
ax.plot(x_vals, [np.log(xi) for xi in x_vals], 'r--', linewidth=1.5)

ax.plot(E_X, f_E_X, 'g^', markersize=12, zorder=5,
        label=f'$f(E[X]) = {f_E_X:.3f}$')
ax.plot(E_X, E_f_X, 'ms', markersize=12, zorder=5,
        label=f'$E[f(X)] = {E_f_X:.3f}$')

ax.annotate('', xy=(E_X, f_E_X), xytext=(E_X, E_f_X),
            arrowprops=dict(arrowstyle='<->', color='orange', lw=2))
ax.text(E_X + 0.15, (f_E_X + E_f_X)/2, f'Gap = {f_E_X - E_f_X:.3f}',
        fontsize=11, color='orange', fontweight='bold')

ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('f(x)', fontsize=12)
ax.set_title("Jensen's Inequality: Concave Case\n"
             r'$f(E[X]) \geq E[f(X)]$', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (c) 分散を使ったギャップの定量化
ax = axes[2]
# f(x) = x^2: E[f(X)] - f(E[X]) = E[X^2] - (E[X])^2 = Var(X)
sigma_range = np.linspace(0, 3, 100)
mu = 2  # 固定

# 正規分布のE[X^2]とE[X]^2の差 = Var(X) = σ^2
gap = sigma_range**2

ax.plot(sigma_range, gap, 'b-', linewidth=2.5,
        label=r'$E[X^2] - (E[X])^2 = \sigma^2$')
ax.fill_between(sigma_range, 0, gap, alpha=0.2, color='blue')

ax.set_xlabel('$\\sigma$ (standard deviation)', fontsize=12)
ax.set_ylabel('Jensen gap: $E[f(X)] - f(E[X])$', fontsize=12)
ax.set_title("Jensen's Gap for $f(x) = x^2$\n= Variance", fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('jensen_inequality.png', dpi=150, bbox_inches='tight')
plt.show()

この可視化から、イェンセンの不等式の幾何学的な意味が直感的に理解できます。

  1. 左図(凸関数 $x^2$): 放物線のグラフ上の2点(赤い丸)を結ぶ弦(赤い破線)は常にグラフの上にあります。$E[f(X)]$(弦の中点の高さ、紫の四角)は $f(E[X])$(曲線上の点、緑の三角)より上にあり、差(ギャップ)は2.25です。この場合のギャップは分散 $\text{Var}(X)$ に等しいです。

  2. 中央図(凹関数 $\ln x$): 対数関数は凹なので不等号が逆転し、$f(E[X]) \geq E[f(X)]$(AM-GM不等式の対数版)です。弦はグラフの下にあり、$E[\ln X] \leq \ln(E[X])$ が成り立っています。

  3. 右図(ギャップと分散の関係): $f(x) = x^2$ の場合、イェンセンのギャップ $E[X^2] – (E[X])^2$ は正確に分散 $\sigma^2$ に等しいです。分散が大きいほどギャップも大きくなり、凸関数の下を通る「損失」が大きくなります。

発展的な集中不等式

ホフディングの不等式

有界な確率変数に対しては、チェビシェフの不等式より遥かにタイトなホフディングの不等式が使えます。

$X_1, \ldots, X_n$ が独立で、$a_i \leq X_i \leq b_i$ のとき

$$ P\left(\bar{X}_n – E[\bar{X}_n] \geq t\right) \leq \exp\left(-\frac{2n^2 t^2}{\sum_{i=1}^{n}(b_i – a_i)^2}\right) $$

チェビシェフの $1/k^2$ の多項式的な減衰に対して、ホフディングは指数的な減衰を与えます。これは有界性の情報を使うことで得られる大幅な改善です。

チェルノフ限界

最も一般的で強力な集中不等式はチェルノフ限界(Chernoff bound)です。

$$ P(X \geq a) = P(e^{tX} \geq e^{ta}) \leq \frac{E[e^{tX}]}{e^{ta}} = e^{-ta} M_X(t) $$

右辺を $t > 0$ で最小化すると、最もタイトな上界が得られます。チェルノフ限界は積率母関数(MGF)の情報を最大限に活用するため、原理的に最も強い指数的集中不等式です。

まとめ

本記事では、マルコフ・チェビシェフ・イェンセンの3つの基本的な確率不等式を解説しました。

  • マルコフの不等式 $P(X \geq a) \leq E[X]/a$ は、非負確率変数の期待値だけから確率の上界を与える最も基本的な不等式
  • チェビシェフの不等式 $P(|X – \mu| \geq k\sigma) \leq 1/k^2$ は、マルコフの不等式に分散の情報を加えて改善したもので、大数の弱法則の証明に使われる
  • イェンセンの不等式 $f(E[X]) \leq E[f(X)]$(凸関数の場合)は、期待値と関数の順序を入れ替えたときの大小関係を規定し、AM-GM不等式やKLダイバージェンスの非負性を含む
  • これらの不等式は分布の形によらず成立するため、分布の詳細が不明な状況で特に有用
  • より強い集中不等式(ホフディング、チェルノフ)は分布のより多くの情報を使って指数的にタイトな上界を与える

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