公開日: 最終更新日:

【Python】scipy.statsを使って正規分布の累積分布関数をプロットする

あまり調べても出てこなかった上に,いちいちPython上でライブラリを使わず積分して求めるやり方とかが出てくるので覚え書きとして.

一般的に我々がよく目にする正規分布のあの釣鐘状のグラフは確率密度関数をプロットしたものである.それのプロットの仕方はそこら中に出回っているのでそちらを参照してほしい.

今回はこれを得たい!

これが今回プロットしたいもの

累積分布関数って?

統計学的にもう一つ大事な関数として,累積分布関数(あるいは単に「分布関数」)がある.詳しい説明は省くが,要は連続確率変数Xに対して,累積分布関数F(x)

    \[F(x) = P(X \leq x), F(- \infty) = 0, F(+ \infty) = 1\]

つまり,確率変数Xが取る値x以下の値を取る確率,である.

F(x)が微分可能であるとき,その導関数を確率密度関数という.よくf(x)で表されるアレである.正規分布の確率密度関数は誰もが見たことがあるだろう.

    \[f(x) = \frac{1}{\sqrt{2 \pi \sigma^2}} \text{exp} \left( - \frac{(x-\mu)^2}{2\sigma^2} \right)\]

また,この確率密度関数からも累積分布関数を求めることができる.

    \[F(x) = \int_{-\infty}^x f(y) dy ,   f(y) \geq 0\]

 

細かい数学的定義はともかくとして,今回は累積分布関数のグラフをPythonでプロットしてやりたい.より詳しい説明は統計数理の本を参照してほしい.

scipy.statsを使って累積分布関数を得る

scipyという科学計算ライブラリを今回用いる.また,Matplotlibも使う.

import numpy as np #毎度おなじみ
import matplotlib.pyplot as plt #毎度おなじみ
from scipy.stats import norm 



x = np.arange(1500, 3000) # 1500~3000の要素が入ったリストを作る
y = norm.cdf(x, loc=2000, scale=60) # 平均2000,標準偏差60の正規分布の累積分布関数

plt.figure(0)
plt.grid(True)
plt.plot(x, y)
plt.xlabel("value")
plt.ylabel("probability")
plt.savefig("ruiseki.png", dpi=200)
plt.show()
“ruiseki.png”

scipy.statsを使えば一瞬である.最高.

気をつける部分としてはscaleには分散ではなく標準偏差,つまり分散の平方根が入る.

あまり必要となる場面は思い浮かばないが,とにかく私は卒論において一時的にこのグラフが欲しくて苦労した経験があるのでネットの海に放流しておく.