【統計学・データ分析】Pythonで実装しながら覚えるポアソン分布

こんにちは。今日は、統計学に関する内容です!

最近、統計検定の勉強をしているのですが、その中でいろいろな統計分布の種類があることを知ったは良いものの、違いが直感的によく分からず、実務に活かせる気がしなかったので、実際に絵や式を書いてみながら自分の頭を整理しておきたいと思います。

今回はその中でもポアソン分布について整理してみたいと思います。

なお、各内容の詳細については、他のWebサイトに分かりやすい説明があれば、そちらを引用させていただき、紹介させていただいております。

それでは早速参ります!

ポアソン分布の理論

概要

ポアソン分布は、二項分布において期待値np=λを固定し、試行回数n→∞、成功確率p→0のような極限をとったときに得られる確率分布として定義されます。

つまり、ポアソン分布は、試行回数nが十分に大きく、かつ滅多に起こらない事象に対する二項分布と考えることができます。

実務的には、滅多に起こらない事象に対して、

単位時間当たりに平均λ回起こる事象が丁度k回起こる確率」を求める際に活用され、一定時間に電話のかかってくる回数や交通事故の件数、また昔は軍隊で馬に蹴られて死亡する兵士の数、などで活用された確率モデルです。

確率関数(確率質量関数)

$$P(X = x) = f(x) = \frac{e^{-\lambda}\lambda^x}{x!} $$

これは、二項分布の確率質量から求めることができます。

二項分布の場合、確率関数は以下のように表すことができました。

$$P(X = x) = {}_n\mathrm{C}_xp^x(1 – p)^{n – x}$$ここで、ポアソン分布の場合np=λで一定なので、 $$p=\frac{\lambda}{n} $$であり、これを二項分布の確率関数に代入すると、$$P(X=x) = {}_n\mathrm{C}_x(\frac{\lambda}{n})^x(1 – (\frac{\lambda}{n}))^{n – x}$$となります。ここでさらに、一般的に$$ \lim_{n \to \infty} (1+\frac{a}{k})^k = e^a$$であることを利用すると、二項分布の確率関数は、n->∞をとると$$P(X=x) \to \frac{1}{x!} \times 1 \times e^-\lambda^x$$に収束し、最初の確率関数の式が得られました。

期待値

$$ \mu = E(X) = np = \lambda $$

分散

$$ \lambda $$となります。と、これも二項分布の分散の式から導出することができます。下の二項分布の分散の式でn→∞, p→0の極限を取ると、$$ \sigma^2 = E[X^2] – \mu^2 = V(X) = np(1 – p) = \lambda(1-p) \to \lambda$$となりましたね。

Pythonによる実装サンプル

Scipyを使って簡単に実装する

ポアソン分布は、Scipyが提供するメソッドで簡単に再現できてしまいます!

文法については以下から確認できます。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.poisson.html

以下は、単位時間の中で平均0.7回起こる事象が、k回起こる確率分布を算出しています。

from scipy.stats import poisson
import numpy as np

#Probablity of Success
mu = 0.7

mean, var, skew, kurt = poisson.stats(mu, moments='mvsk')

#Mean
print("Mean:", mean)

#Var
print("Var:", var)

#Skew
print("Skew:", skew)

#Kurt
print("Kurt:", kurt)

#PMF (Probablity Mass Function)
x = np.arange(poisson.ppf(0.01, mu),
              poisson.ppf(0.99, mu))
print("PMF:",poisson.pmf(x,mu))

plt.bar(x, poisson.pmf(x,mu), label="PMF")
plt.title("PMF")
plt.xlabel("Data Points")
plt.ylabel("Probablity")
plt.legend()
plt.show()

#CDF (Cumulative Density Function)

print("CDF:",poisson.cdf(x,mu))

plt.bar(x, poisson.cdf(x,mu), label="CDF")
plt.title("CDF")
plt.xlabel("Data Points")
plt.ylabel("Cumulative Probablity")
plt.legend()
plt.show()

一から実装する

こちらは、以下のQiitaで非常に分かりやすく解説されていましたので、こちらのコードを使って自分の手元で再現してみました。

https://qiita.com/g-k/items/836820b826775feb5628

こちらでは、scipyに頼らず、上の理論式の通りに関数を実装しています。二項分布の実装とは異なり、非常にシンプルです。

import math

def poisson(lambda_, k):
    k = int(k)
    result = (lambda_**k) * (math.exp(-lambda_))  / math.factorial(k)
    return result

x =  np.arange(1, 50, 1)
y1= [poisson(10,i) for i in x]
y2= [poisson(20,i) for i in x]
y3= [poisson(30,i) for i in x]

plt.bar(x, y1, align="center", width=0.4, color="red"
                ,alpha=0.5, label="Poisson λ= %d" % 10)

plt.bar(x, y2, align="center", width=0.4, color="green"
                ,alpha=0.5, label="Poisson λ= %d" % 20)

plt.bar(x, y3, align="center", width=0.4, color="blue"
                ,alpha=0.5, label="Poisson λ= %d" % 30)

plt.legend()
plt.show()

確率分布についてもっと勉強するなら・・・

統計検定公式テキストで体系的に理解を深める

確率分布は、統計検定2級の出題範囲となっています。理論的な部分をもっと勉強されたい方は、以下のテキストを読まれると、体系的に学ぶことができます。

私もこちらで勉強しています。統計検定の公式テキストではありますが、比較的に分かりやすく解説されており、何より知識が体系的に整理されているので全体像を掴んで、理論の概要を理解するには良いと思います。

このテキストで分かりづらいと思った部分は、部分毎にネットで詳しく解説された記事を探したり、Udemyなどのオンラインコンテンツを利用していけば十分に理解が深まると思います。

オンライン講座を受講する

オンラインの講座を活用することも有効です。これらの講座は科目毎に単体で販売されているので、購入してすぐに受講を開始することができます。

Udemyは私も資格試験対策などでよく利用するのですが、30日以内の返金保証もあり、また、受講者数が多く口コミ評価が良いコースは内容もとても充実していて満足度が高いため、安心して利用できています。書籍と違ってスマホでみれるため、移動時間などの隙間時間などにも進めることができてオススメです。

頻繁に割引セールを行っているので、割引されているタイミングで購入を検討しても良いと思います。

ちなみに、日本語の統計学のコースは、こちらが最も受講者数が多く、口コミ評価も良いものになります。

【ゼロからおさらい】統計学の基礎

画像に alt 属性が指定されていません。ファイル名: image-9-1024x491.jpg

以上、確率分布について勉強したり実験してみたことをまとめた記事でした。

最後までご覧いただきありがとうございました!

0

この記事を気に入っていただけたらシェアをお願いします!

ABOUT US

アバター
Yuu113
初めまして。Yuu113と申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。