正規分布の確率の値を図示するPythonコード
正規分布から確率を計算し、グラフで図示することをPythonでやってみよう。
Pythonコード
scipy.stats.norm
のpdf()
関数で正規分布の確率密度関数, cdf()
関数で累積分布関数を扱う。
入力例. 正規分布 $N(50, 10^2)$ の累積分布関数の値 $F(60) = \int_{-\infty}^{60}f(x)dx$ を出力しグラフで図示する。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# 平均と標準偏差
mu = 50
sigma = 10
# 塗りつぶすxの値
c = 60
# xの範囲
X = np.linspace(mu - 5*sigma, mu + 5*sigma, 500)
pdf = norm.pdf(X, mu, sigma)
cdf_value = norm.cdf(c, mu, sigma)
# グラフ作成
fig, ax1 = plt.subplots(figsize=(8,5))
# PDF描画
ax1.plot(X, pdf, color='orange', label='PDF')
ax1.set_xlabel('x')
ax1.set_ylabel('PDF', color='orange')
ax1.tick_params(axis='y', labelcolor='orange')
# PDF下側の塗りつぶし
X_fill = X[X <= c]
pdf_fill = pdf[X <= c]
ax1.fill_between(X_fill, pdf_fill, color='orange', alpha=0.3)
# CDFを右軸に表示
ax2 = ax1.twinx()
ax2.plot(X, norm.cdf(X, mu, sigma), color='blue', label='CDF')
ax2.set_ylabel('CDF', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# x=c の位置にCDF値まで垂直線
ax2.vlines(c, 0, cdf_value, color='blue', linestyle='--', alpha=0.6)
# 水平方向の線:CDF値の高さで右端まで
x_right = ax1.get_xlim()[1] # x軸の右端
ax2.hlines(cdf_value, c, x_right, color='blue', linestyle='--', alpha=0.6)
# CDFのドット
ax2.plot(c, cdf_value, 'bo', markersize=6)
# CDF値を右上に表示(キャプション)
ax2.text(0.95, 0.90, f"CDF(x={c}) = {cdf_value:.3f}", color='blue',
fontsize=12, verticalalignment='top', horizontalalignment='right',
transform=ax2.transAxes, bbox=dict(facecolor='white', alpha=0.5, edgecolor='blue'))
# グリッド・タイトル・凡例
ax1.grid(True, linestyle='--', alpha=0.5)
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines + lines2, labels + labels2, loc='upper left')
plt.title(f'Normal Distribution PDF & CDF (shaded to x={c})')
plt.show()

ちなみに、PDFとCDFの $y$ 軸を同じスケールにすると、次のグラフになります。
