正規分布の $P(c_1 \leq X \leq c_2)$ の確率を図示するPythonコード
正規分布から確率を計算し、グラフで図示することをPythonでやってみよう。
Pythonコード
scipy.stats.norm
のcdf()
関数で累積分布関数を扱うことができる。
正規分布 $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()
