正規分布の $P(c_1 \leq X \leq c_2)$ の確率を図示するPythonコード

正規分布から確率を計算し、グラフで図示することをPythonでやってみよう。

Pythonコード

scipy.stats.normcdf()関数で累積分布関数を扱うことができる。

正規分布 $N(\mu, \sigma)$ の累積分布関数を $F_X(x)$ とすると, $P(c_1 \leq X \leq c_2) = F(c_2)-F(c_1)$ であるので, 確率はcdf(c2, mu, sigma)-cdf(c1, mu, sigma)で求めることができる。

入力例. 正規分布 $N(50, 10^2)$ の確率 $P(45 \leq X \leq 65)$ を出力しグラフで図示する。

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

# 平均と標準偏差
mu = 50
sigma = 10

# 塗りつぶす範囲
c1 = 45 #小
c2 = 65 #大

# xの範囲
X = np.linspace(mu - 5*sigma, mu + 5*sigma, 500)
pdf = norm.pdf(X, mu, sigma)

# グラフ作成
fig, ax = plt.subplots(figsize=(8,5))

# PDF描画
ax.plot(X, pdf, color='orange', label='PDF')
ax.set_xlabel('x')
ax.set_ylabel('PDF', color='orange')
ax.tick_params(axis='y', labelcolor='orange')

# 指定範囲を塗りつぶし
mask = (X >= c1) & (X <= c2)
ax.fill_between(X[mask], pdf[mask], color='orange', alpha=0.3)

# 面積を計算
area = norm.cdf(c2, mu, sigma) - norm.cdf(c1, mu, sigma)

# 枠内 左上に表示
ax.text(
    0.05, 0.95,
    f"P({c1} <= X <= {c2}) = {area:.4f}",
    transform=ax.transAxes,   # 枠内の相対座標
    fontsize=12,
    va='top', ha='left',
    bbox=dict(facecolor="white", alpha=0.7, edgecolor="gray")
)

# グリッド・タイトル・凡例
ax.grid(True, linestyle='--', alpha=0.5)
ax.legend(loc='upper right')

plt.title(f'Normal Distribution PDF (shaded between {c1} and {c2})')
plt.tight_layout()
plt.show()

コメントを残す