モンテカルロシミュレーションSimVoiで利用する確率分布の乱数関数はこれで探そう。
モンテカルロシミュレーションを行う準備となる事柄は下のnoteでご紹介しました。
しかしながらいざ始めようと思うと、エクセルで売上=単価x顧客などのように簡単なモデルは作ったもののそれぞれ顧客や単価が変数としたときにどのような確率分布の乱数をセットすればよいのかわからないことがあると思います。
今回はこのSimVoiが提供している17の関数から主な確率分布について紹介をして選びやすいようにしたいと思います。
三角分布(Triangular Distribution)
三角分布は、最小値、最大値、最頻値(最も可能性が高い値)が明確な場合に使用されます。形状は名前の通り三角形になります。
身近な例:プロジェクトのタスク完了時間の予測。最短時間(最小値)、最長時間(最大値)、最も可能性が高い時間(最頻値)を基に分布を作成します。
利用関数:RandTriangular
二項分布(Binomial Distribution)
二項分布は、成功と失敗の2つの結果がある試行をn回行ったときの成功回数の分布です。
身近な例:コイン投げ。表(成功)と裏(失敗)の2つの結果があり、これをn回行ったときの表が出る回数の分布が二項分布になります。
利用関数:RandBinomial
一様分布(Uniform Distribution)
一様分布は、ある範囲内の全ての値が等しい確率で発生する分布です。
身近な例:さいころを投げる行為。1から6までの各目が出る確率は等しく、これは一様分布になります。
利用関数:RandUniform
対数正規分布(Log-Normal Distribution)
対数正規分布は、ある変数の対数が正規分布に従うとき、その変数の分布を対数正規分布と言います。対数を取ることで、非対称なデータを対称にすることができます。
身近な例:人間の所得分布。所得は0以上で、高所得者(長い右の裾)が少数存在するため、対数を取ると正規分布に近い形になります。
利用関数:RandLogNormal あるいは RandTruncLogNormal
指数分布(Exponential Distribution)
指数分布は、ある事象が次に起こるまでの間隔が一定の平均率で発生する場合の分布です。
身近な例:バス停でバスが来るまでの待ち時間。バスが一定の間隔で運行している場合、次のバスが来るまでの待ち時間は指数分布に従います。
利用関数:RandExponential
正規分布(Normal Distribution)
正規分布は、自然界や社会現象など様々なデータの分布によく現れる、ベル形の分布です。平均値を中心に左右対称の形状をしています。
身近な例:大人の身長。大人の身長は平均値を中心に左右対称の分布を示し、これは正規分布に従います。
利用関数:RandNormal
ポアソン分布
ポアソン分布は、一定の時間や空間における稀な事象の発生回数を表す確率分布です。
身近な例:一定の時間内に特定のウェブサイトに訪れるユーザーの数、一定の時間内にコールセンターにかかってくる電話の数、一定の面積内に生えている木の数などがあります。
利用関数:RandPoisson
その他、離散的な確率分布表が作れる場合は、RandDiscrete関数で個別指定する方法もあります。
それぞれの分布の計算モデルは次のような図を見るとイメージしやすいかと思います。
#三角分布:最小値=75000、最大値=220000、最頻値=15000 (メイン価格が15万を中心に三角分布に従うとき)
#二項分布:試行回数n=100、成功確率p=0.2(製品の不良率が2%の例を使用)
#一様分布:最小値=1、最大値=6(さいころを使用)
#対数正規分布:平均μ=3、標準偏差σ=1(所得の例を使用)
#指数分布:平均待ち時間λ=5 (電車を想定)
#正規分布:平均μ=170、標準偏差σ=10 (身長を想定)
#ポアソン分布: 平均λ=10(1時間あたりの平均訪問者数)
上の描写で用いたPython Codeは次の通り。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom, uniform, lognorm, expon, norm, poisson
#それぞれの描写につかっているモデルは次の通りです。イメージしやす値を利用しています。
#サイズは1万回をそれぞれ実行しています。
#三角分布:最小値=75000、最大値=220000、最頻値=15000 (メイン価格が15万を中心に三角分布に従うとき)
#二項分布:試行回数n=100、成功確率p=0.2(製品の不良率が2%の例を使用)
#一様分布:最小値=1、最大値=6(さいころを使用)
#対数正規分布:平均μ=3、標準偏差σ=1(所得の例を使用)
#指数分布:平均待ち時間λ=5 (電車を想定)
#正規分布:平均μ=170、標準偏差σ=10 (身長を想定)
#ポアソン分布: 平均λ=10(1時間あたりの平均訪問者数)
# Triangular distribution
plt.figure(figsize=(10, 6))
values = np.random.triangular(left=75000, mode=150000, right=220000, size=10000)
plt.hist(values, bins=50, density=True)
plt.title('Triangular Distribution')
plt.show()
# Binomial distribution
n, p = 10, 0.2
x = np.arange(binom.ppf(0.01, n, p), binom.ppf(0.99, n, p))
plt.plot(x, binom.pmf(x, n, p), 'bo', ms=8)
plt.title('Binomial Distribution')
plt.show()
# Uniform distribution
values = np.random.uniform(low=1, high=6, size=10000)
plt.hist(values, bins=6, density=True)
plt.title('Uniform Distribution')
plt.show()
# Log-normal distribution
mu, sigma = 3,1
values = np.random.lognormal(mean=mu, sigma=sigma, size=10000)
plt.hist(values, bins=100, density=True)
plt.title('Log-Normal Distribution')
plt.show()
# Exponential distribution
values = np.random.exponential(scale=5, size=10000)
plt.hist(values, bins=50, density=True)
plt.title('Exponential Distribution')
plt.show()
# Normal distribution
values = np.random.normal(loc=170, scale=10, size=10000)
plt.hist(values, bins=50, density=True)
plt.title('Normal Distribution')
plt.show()
# Poisson distribution
lambda_ = 10
values = np.random.poisson(lam=lambda_, size=10000)
plt.hist(values, bins=30, density=True)
plt.title('Poisson Distribution')
plt.show()
この記事が気に入ったらサポートをしてみませんか?