4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

0からはじめるPython ~ポアソン到着モデルによる待ち時間のシミュレーション~

Last updated at Posted at 2023-03-13

はじめに

こんにちは、現在0からPythonを学んでいる初心者エンジニアです。
この投稿は私が学んだことのアウトプットの場として、そして私と同じ初心者エンジニアさんの少しでも役に立てればと思い、投稿しています。私自身も全くの初心者なので、感想やアドバイスあれば、気軽にコメント頂けると幸いです。

ポアソン到着モデルとは

今回はポアソン到着モデルによる待ち時間シミュレーションに関して解説したいと思います。

ポアソン到着モデルとは待ち行列理論における待ち行列シミュレーションモデルのひとつで、待ち行列理論とはシステムにおける待ち行列を数学的に分析するための理論であり、待ち行列とは複数の要求や仕事が処理されるために待機している状態を表すモデルです。具体的には、コールセンターでの電話や、カフェの注文、工場の製品などが挙げられます。

ではこの待ち行列をどう数学的に表すのか、待ち行列シミュレーションモデルの1つにポアソン分布を用いた今回解説するポアソン到着モデルがあります。

ポアソン到着モデルとはお客さんの到着時間に、統計的性質である定常性、独立性、希少性が成り立つものと考え、到着の様子をポアソン分布で表現する方法である。ポアソン分布の説明に関してはこちらの記事を参考にして頂きたいです。

ある一定の$t$時間あたりに到着するお客さんの数がポアソン分布に従う時、

P(k)=e^{-\lambda t}\frac{(\lambda t)^k}{k!} \tag{1}

と表すことができ、ここでkは到着するお客さんの数、$\lambda[{人} / s]$は平均到着率(t時間あたりに到着するお客さんの数の平均値)で、要するにこの式は「t時間以内にk人のお客さんが到着する確率」を表します。この到着のことをポアソン到着といいます。

例えば、単位時間(t=1)あたり平均5人($\lambda$=5)のお客さんが来るお店で、7人(k=7)のお客さんが来る確率は

P(7)=e^{-5}\frac{5^7}{7!}\approx 0.104 \tag{2}

となります。

到着時間の分布

実際に、到着時刻はどのような分布に従うかを考えます。
結論から言うと、ポアソン到着の時、お客さんの到着時間の間隔は指数分布に従います。
こちらがその証明です。

証明
時間間隔Tの間に事象が一回も起きない(1人もお客さんが到着しない)確率は

P(0)=e^{-\lambda T} \tag{3}

であり、従って、事象が起きる時間間隔がT以下(あるお客さんが到着してからT時間以内で次のお客さんが到着する)の確率は余事象を使い

P(k\geq1)=1-p(0)=1-e^{-\lambda T} \tag{4}

となり、(4)を微分すると

\left(1-e^{-\lambda T}\right)'=\lambda e^{-\lambda T} \tag{5}

となります。これは指数分布の確率密度関数の一種であるため、ポアソン到着の時、お客さんの到着時間は指数分布に従うことがわかります。

ポアソン到着モデルによる待ち行列のシミュレーション

シミュレーションを行うにあたって、確率変数であるTを発生させたい場合(4)の式をTに関して解いて

T=-\frac{1}{\lambda}\log \left(1-P(k\geq1)\right) \tag{6}

となることがわかります。
今回は(6)の式中 $P(k\geq1)$に一様乱数 $U(0,1)$を与えることでTを生成し、50人分のお客さんの到着時刻をシミュレーションするコードを示します。($\lambda$=1とする)

import numpy as np  # ベクトル演算などに用いる
import matplotlib.pyplot  as plt  # グラフの生成に用いる
from scipy.stats import uniform  # 一様分布を用いるため

N=50  # 人数を入力
arrive=np.zeros(N)  # 値が0の要素をN個持つ配列を定義(求めた値を保存する場所を用意)
lamb=1  # lambdaの値を入力

sum=0  # 今後使う関数の初期値を定義
for i in range(N):  # 0からN-1までiをループさせる
    sum-=(1/lamb)*np.log(1-uniform.rvs(size=1))  # (6)の式を用いて到着時刻をを計算
    arrive[i]=sum  # 到着時刻を配列に入力

fig,ax=plt.subplots(figsize=(8,5))  # 表示するグラフのサイズを指定
ax.vlines(arrive,ymin=0,ymax=1)  # 到着時刻に縦線を引く
plt.xlabel('time')  # x軸のラベルにtimeと表示
plt.show()  # グラフを表示

そして実行結果が
スクリーンショット 2023-03-13 18.48.37.png
となり、50人分のお客さんの到着時刻をシミュレーションすることができました。

待ち行列理論の目的

最初にも少し触れましたが、このポアソン到着モデルを用いた待ち行列理論をどのようなことに利用しているかを紹介したいと思います。
まず代表的な例が銀行などの窓口の数です。お客さんの待つ時間が大きくなることはサービスとして良くないですが、窓口の数を増やしすぎても余計に人件費などがかかってしまいます。このような問題の解決方法として、窓口の数を効率的にするために、待ち行列理論が使われています。
上の例以外にも会社などで快適にネットワークが使えるようになるためのサーバ数を決めたりなど様々な場面で使われている待ち行列理論に皆様も興味を持っていただけたでしょうか?

まとめ

以上が、ポアソン到着モデルによる待ち時間シミュレーションに関しての解説になります。
最後まで読んで頂きありがとうございました。引き続き私と一緒に研鑽していきましょう。

参考

橋本洋志,牧野浩二."データサイエンス教本 Pythonで学ぶ統計分析・パターン認識・深層学習・信号処理・時系列データ分析".オーム社,2018
ポアソン過程の到着間隔~指数分布
0からはじめるPython ~ポアソン分布とは~

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?