【統計学・データ分析】Pythonで実装しながら覚える指数分布

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

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

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

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

それでは早速参ります!

Contents

指数分布の理論

概要

指数分布は連続型確率分布の1つです。

指数分布の概要については、こちらが非常に分かり易かったのでご紹介します。

https://bellcurve.jp/statistics/course/8009.html

指数分布は連続型確率分布の一つで、機械が故障してから次に故障するまでの期間や、災害が起こってから次に起こるまでの期間のように、次に何かが起こるまでの期間が従う分布です。

上記Webサイトより引用

ということで、実務的には、「単位時間の間に平均(期待値)でλ回発生する事象において次のx分以内に事象が発生する確率」といった問題を解くために活用されます。

確率関数(確率密度関数)

$$ f(x) = \begin{cases} \lambda e^{- \lambda x} & x \geq 0 \\ 0 & x < 0\end{cases} $$ 上の式から分かるように、指数分布は、パラメータλによって決定されます。このλは、単位時間における事象の発生回数の期待値となります。 ちなみに、指数分布が題材となる問題では、次の時間x"以内"に事象が発生する確率を求めたかったりするので、その場合には以下の累積分布関数を用います。 $$ F(x) = 1-e^(\lambda t) $$

期待値

上で紹介したλを用いて、期待値は以下のように表現されます。

$$ E[X]=\frac{1}{\lambda} $$

分散

こちらもλを用いて以下のように表現されます。

$$ V[X]=\frac{1}{\lambda^2} $$

Pythonによる実装サンプル

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

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

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

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

上の理論式だと、指数分布にはパラメータλがありますが、scipyのexpon(pdf)には、なぜか正規分布と同じlocとscaleのパラメータしかない。これはどういうことだ・・?(後で調べる)

from scipy.stats import expon
import numpy as np

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

#Mean
print("Mean:", mean)

#Var
print("Var:", var)

#Skew
print("Skew:", skew)

#Kurt
print("Kurt:", kurt)

#PDF (Probablity Density Function)
x = np.linspace(expon.ppf(0.01), expon.ppf(0.99), 100)

plt.plot(x, expon.pdf(x), label="PDF")
plt.title("PDF")
plt.xlabel("Data Points")
plt.ylabel("Probablity")
plt.legend()
plt.show()

#CDF (Cumulative Density Function)
plt.plot(x, expon.cdf(x), label="CDF")
plt.title("CDF")
plt.xlabel("Data Points")
plt.ylabel("Cumulative Probablity")
plt.legend()
plt.show()

一から実装する

上では、Scipyを利用した方法をご紹介しましたが、もちろん最初に解説した理論に基づいて、一から実装することも可能です。

以下にサンプルコードを示します。

こちらでも、上と同じ結果を確認することができました。こちらでは、理論式の通り、lambdaをパラメータにした実装ができました。

import math

lmd1 = 1
lmd2 = 5
lmd3 = 10

def expon(l,t):
    result = l*math.exp(-l*t)
    return result

x =  np.arange(0,1,0.01)
y1 = [expon(lmd1,i) for i in x]
y2 = [expon(lmd2,i) for i in x]
y3 = [expon(lmd3,i) for i in x]

plt.plot(x, y1, label="Lambda:1")
plt.plot(x, y2, label="Lambda:5")
plt.plot(x, y3, label="Lambda:10")
plt.xlabel("t")
plt.ylabel("Probablity Density")
plt.legend()
plt.show()

ここで、λの値によらずt=0が最も次の事象が起こる確率が高くなる理由が直感的によく分からない・・と思ったのですが、以下にまさにその点が解説されていました。

https://qiita.com/g-k/items/5809fb97a6b4807f648f

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

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

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

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

Udemy講座

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

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

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

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

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