正規分布の確率の値を図示するPythonコード

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

Pythonコード

scipy.stats.normpdf()関数で正規分布の確率密度関数, 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$ 軸を同じスケールにすると、次のグラフになります。

コメントを残す