【Scipy】統計学や機械学習で頻出の確率密度関数を扱う

Posted: , Category: Python , 確率分布

PythonのライブラリであるScipyには、統計学で頻出する確率密度関数が多数収録されており、データを何かしらの確率分布でモデリングする際には、毎度お世話になることになります。

特にScipyのStatsモジュールには、ありとあらゆる確率密度関数が収録されており、statsモジュールを利用することで、基本的な確率密度関数はほとんど利用することができます。

ここでは、機械学習や統計学で利用頻度の高い基本的な確率密度関数を列挙し、この記事を参照することで、基本的な確率分布ならどんな分布でも利用できるような辞書的なページを目指していきます。

Scipy.statsモジュールに収録されている確率分布

連続確率密度関数、離散的確率密度関数に分けて紹介します。

続確率密度関数の一覧
  • 正規分布
  • 多次元ガウス分布
  • 指数分布
  • ベータ分布
  • ガンマ分布
離散的確立質量関数の一覧
  • ベルヌーイ分布
  • 二項分布
  • 多項分布
  • ポアソン分布

Scipyで連続確率密度関数を扱う

正規分布(1次元ガウス分布)

正規分布(Normal distribution)の定義
\begin{equation}
\begin{split}
\mathcal{N}(x | \mu, \sigma) = \frac{1}{\sqrt{2\pi\sigma^2}}
exp
\biggl \{
- \frac{(x-\mu)^2}{2\sigma^2}
\biggr \}
\end{split}
\end{equation}
正規分布の確率密度関数を扱うscipy関数

stats.norm.pdf(x, loc, scale) 

loc … 正規分布の定義における$\mu$
sclae … 正規分布の定義における$\sigma$

正規分布を描写する

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

fig, ax = plt.subplots(1, 2, figsize=(10, 3), dpi=100)

mu = 0
sigma = 1
mus = [-5, -2, 0, 2, 5]
sigmas = [0.3, 0.5, 1, 3, 5]

x = np.linspace(-10, 10, 500)
for idx, param in enumerate(mus):
    y = stats.norm.pdf(x, param, sigma)
    ax[0].plot(x, y, label=r"$\mu = {}$".format(param))

x = np.linspace(-5, 5, 500)
for idx, param in enumerate(sigmas):
    y = stats.norm.pdf(x, mu, param)
    ax[1].plot(x, y, label=r"$\sigma = {}$".format(param))

ax[0].set_title(r"normal distribution change $ \mu$")
ax[0].legend()

ax[1].set_title(r"normal distribution change $ \sigma$")
ax[1].legend()

Scipyで離散的確率質量関数を扱う

ポアソン分布

ポアソン分布(Poisson distribution)の定義
\begin{equation}
\begin{split}
Poisson(x | \lambda) =  \frac {\lambda^{x}}{x !} e^{- \lambda}
\end{split}
\end{equation}
ポアソンの確率質量関数を扱うscipy関数

stats.norm.pdf(x, mu) 

mu … ポアソン分布の定義におけるパラメータ$\lambda$

ポアソン分布を描写する

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

fig, ax = plt.subplots(figsize=(10, 3), dpi=100)

params = [10, 20, 30]
x = np.arange(0, 50)

for idx, lmd in enumerate(params):
    pmf = stats.poisson.pmf(x, lmd)
    ax.bar(x, pmf, label=f"$\lambda$ = {lmd}")

ax.legend()

引用と参考サイトの一覧

本記事をまとめるにあたって、参考にしたサイトやページをまとめて記載します。

引用・参考サイト一覧

【広告】
統計学的にあなたの悩みを解決します。
仕事やプライベートでお悩みの方は、ベテラン占い師 蓮若菜にご相談ください。

機械学習と情報技術