確率密度関数(Probability Density Function, PDF)は、連続確率分布を扱う上で最も基本的な概念の一つです。
離散確率分布では各値に直接確率を割り当てることができますが、連続確率変数では「ある1点の確率」は常に0になるため、確率密度という概念を導入する必要があります。本記事では、この確率密度関数の直感的な理解と数学的な定義を丁寧に解説します。
本記事の内容
- 離散確率分布と連続確率分布の違い
- 確率密度関数の定義と直感的な理解
- 累積分布関数との関係
- Pythonでの可視化と性質の確認
離散確率分布と連続確率分布
まず、離散と連続の違いを確認しましょう。
離散確率分布は、サイコロの目のように、確率変数が取りうる値が有限個(または可算無限個)の場合です。各値 $x_i$ に対して確率 $P(X = x_i)$ を直接割り当てることができます。
例えば、公正なサイコロであれば、
$$ P(X = k) = \frac{1}{6} \quad (k = 1, 2, 3, 4, 5, 6) $$
一方、連続確率分布は、身長や温度のように、確率変数が連続的な値を取る場合です。このとき、ある特定の1点の確率は常に0になります。
$$ P(X = x) = 0 \quad (\text{任意の } x) $$
これは直感に反するかもしれませんが、連続的な値の中から「ぴったりその値」が出る確率は無限小であるため、0になります。代わりに、ある区間に入る確率を考える必要があります。
確率密度関数の定義
連続確率変数 $X$ に対して、以下の条件を満たす関数 $f(x)$ を確率密度関数(PDF)と呼びます。
$$ P(a \le X \le b) = \int_a^b f(x) \, dx $$
確率密度関数は以下の2つの性質を満たします。
$$ f(x) \ge 0 \quad (\text{全ての } x \text{ に対して}) $$
$$ \int_{-\infty}^{\infty} f(x) \, dx = 1 $$
重要なポイントとして、$f(x)$ 自体は確率ではなく確率密度です。$f(x)$ の値が1を超えることもあり得ます。確率を得るためには、区間で積分する必要があります。
イメージとしては、確率密度関数のグラフの下側の面積が確率に対応しています。全体の面積が1で、区間 $[a, b]$ の面積が $P(a \le X \le b)$ になります。
累積分布関数との関係
確率密度関数 $f(x)$ を $-\infty$ から $x$ まで積分した関数を累積分布関数(Cumulative Distribution Function, CDF)と呼びます。
$$ F(x) = P(X \le x) = \int_{-\infty}^{x} f(t) \, dt $$
逆に、累積分布関数が微分可能であれば、その導関数が確率密度関数になります。
$$ f(x) = \frac{dF(x)}{dx} $$
この関係は、微積分の基本定理そのものです。
具体例: 正規分布のPDF
最も代表的な連続確率分布である正規分布の確率密度関数は以下で与えられます。
$$ f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left( -\frac{(x – \mu)^2}{2\sigma^2} \right) $$
ここで、$\mu$ は平均、$\sigma^2$ は分散です。この関数を $-\infty$ から $\infty$ まで積分すると1になることが保証されています。
Pythonでの可視化
確率密度関数の性質をPythonで確認してみましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
x = np.linspace(-5, 5, 500)
# 正規分布のPDF
mu, sigma = 0, 1
pdf = stats.norm.pdf(x, mu, sigma)
cdf = stats.norm.cdf(x, mu, sigma)
fig, axes = plt.subplots(1, 3, figsize=(16, 4))
# 1. PDFの全体像
axes[0].plot(x, pdf, 'b-', linewidth=2)
axes[0].set_title("PDF: N(0, 1)")
axes[0].set_xlabel("x")
axes[0].set_ylabel("f(x)")
axes[0].grid(True, alpha=0.3)
# 2. 区間の確率(面積として表示)
axes[1].plot(x, pdf, 'b-', linewidth=2)
a, b = -1, 1.5
mask = (x >= a) & (x <= b)
axes[1].fill_between(x[mask], pdf[mask], alpha=0.4, color='orange')
prob_ab = stats.norm.cdf(b, mu, sigma) - stats.norm.cdf(a, mu, sigma)
axes[1].set_title(f"P({a} <= X <= {b}) = {prob_ab:.4f}")
axes[1].set_xlabel("x")
axes[1].set_ylabel("f(x)")
axes[1].grid(True, alpha=0.3)
# 3. CDFとの関係
axes[2].plot(x, cdf, 'r-', linewidth=2, label='CDF: F(x)')
axes[2].plot(x, pdf, 'b--', linewidth=1.5, alpha=0.5, label='PDF: f(x)')
axes[2].set_title("CDF and PDF")
axes[2].set_xlabel("x")
axes[2].set_ylabel("F(x) / f(x)")
axes[2].legend()
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
中央のグラフで、オレンジ色の面積が区間 $[-1, 1.5]$ の確率を表していることが確認できます。
さまざまな分布のPDFを比較
パラメータを変えたときにPDFの形状がどのように変化するか、可視化で確認しましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
x = np.linspace(-6, 6, 500)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 正規分布: 平均の違い
for mu in [-2, 0, 2]:
axes[0].plot(x, stats.norm.pdf(x, mu, 1), linewidth=2, label=f'mu={mu}, sigma=1')
axes[0].set_title("Normal PDF: varying mu")
axes[0].set_xlabel("x")
axes[0].set_ylabel("f(x)")
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 正規分布: 分散の違い
for sigma in [0.5, 1.0, 2.0]:
axes[1].plot(x, stats.norm.pdf(x, 0, sigma), linewidth=2, label=f'mu=0, sigma={sigma}')
axes[1].set_title("Normal PDF: varying sigma")
axes[1].set_xlabel("x")
axes[1].set_ylabel("f(x)")
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
平均 $\mu$ を変えるとグラフが左右にシフトし、標準偏差 $\sigma$ を変えるとグラフの幅(広がり具合)が変わることが確認できます。$\sigma$ が小さいほど鋭いピークを持ち、$f(x)$ の最大値が大きくなりますが、面積(全確率)は常に1のままです。
確率密度が1を超える例
確率密度関数の値自体は確率ではないため、1を超えることがあります。以下の例で確認しましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
x = np.linspace(-1, 1, 500)
# sigma=0.2 の正規分布
sigma_small = 0.2
pdf_sharp = stats.norm.pdf(x, 0, sigma_small)
plt.figure(figsize=(8, 5))
plt.plot(x, pdf_sharp, 'b-', linewidth=2, label=f'N(0, {sigma_small}^2)')
plt.axhline(y=1, color='r', linestyle='--', alpha=0.5, label='f(x) = 1')
plt.fill_between(x, pdf_sharp, alpha=0.2, color='steelblue')
plt.title(f"PDF can exceed 1 (max = {pdf_sharp.max():.2f})")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
$\sigma = 0.2$ の正規分布では、$f(0) \approx 2.0$ となり、確率密度の値が1を超えます。しかし、全区間の面積(積分値)は1であることに変わりはありません。
まとめ
本記事では、確率密度関数(PDF)について解説しました。
- 確率密度関数は連続確率変数の分布を記述する関数であり、区間での積分が確率を与える
- $f(x)$ 自体は確率ではなく確率密度であり、1を超えることもある
- 全区間の積分が1、かつ非負であることがPDFの条件
- 累積分布関数(CDF)はPDFの積分であり、互いに微積分の関係にある
- パラメータの変化によりPDFの形状が変わるが、面積は常に1を保つ