🎓 レベル:標準 | 重要度:A(必須)
📎 前提:逆関数法 | 合成法・変数変換法 | 関連:離散事象シミュレーションとは
要点(BLUF)
- シミュレーションで頻出する3分布——正規(測定誤差・CLT)・指数(待ち時間・寿命)・ポアソン(一定時間の到着数)——の生成と性質を押さえます。
- 実用では
np.random.default_rng()の高速生成器を使いますが、裏では逆関数法・変数変換・棄却法が動いています(前トピックまでの技法)。 - 平均・分散を理論値と照合:正規 、指数(平均2)、ポアソン(平均=分散=4)がすべて一致します。
1. 3つの代表的分布
| 分布 | 用途 | 平均 | 分散 | 裏の生成技法 |
|---|---|---|---|---|
| 正規 | 測定誤差・合計量(CLT) | 変数変換(Box–Muller/Ziggurat) | ||
| 指数 | 待ち時間・寿命・到着間隔 | 逆関数法 | ||
| ポアソン | 一定時間の到着数・稀少事象 | 指数間隔の積み上げ/逆関数法 |
これらは「どんな現象に使うか」とセットで覚えると、モデル化で入力分布を選ぶときに迷いません。
2. 生成と検証
import numpy as np
# 乱数シードを固定
rng = np.random.default_rng(6)
normal = rng.normal(10, 2, 400_000) # 正規 N(10, 2^2)
expo = rng.exponential(1/0.5, 400_000) # 指数(レート0.5 -> 平均2)
poisson = rng.poisson(4.0, 400_000) # ポアソン(平均4)
print(f"正規 N(10,2): 平均={normal.mean():.3f} 標準偏差={normal.std():.3f}")
print(f"指数(平均2): 平均={expo.mean():.3f} (理論2.0) 分散={expo.var():.3f} (理論4.0)")
print(f"ポアソン(4): 平均={poisson.mean():.3f} 分散={poisson.var():.3f} (両方 理論4.0)")
出力:
正規 N(10,2): 平均=10.002 標準偏差=2.003
指数(平均2): 平均=2.000 (理論2.0) 分散=3.979 (理論4.0)
ポアソン(4): 平均=3.998 分散=4.004 (両方 理論4.0)
出力の意味:正規は平均 10.002・標準偏差 2.003、指数は平均 2.000・分散 3.979、ポアソンは平均 3.998・分散 4.004。すべて理論値と一致。とくにポアソンは平均と分散がともに に等しい(等分散性)のが特徴で、これは過分散データ(分散 > 平均)をポアソンで無理にモデル化してはいけない、という実務的注意につながります。
3. ポアソンと指数の表裏一体
指数分布とポアソン分布は同じ現象の2つの見方です。「事象がレート でランダムに起きる」ポアソン過程において、
- 到着間隔は (指数分布、平均 )
- 単位時間あたりの到着数は
import numpy as np
# 乱数シードを固定
rng = np.random.default_rng(11)
lam = 3.0 # レート 3件/時間
T = 100_000 # 観測時間
# 指数間隔を積み上げてポアソン過程を作る
inter = rng.exponential(1/lam, int(lam*T*1.2))
arrival = np.cumsum(inter)
arrival = arrival[arrival < T]
# 各単位時間の到着数を数える
counts = np.histogram(arrival, bins=np.arange(0, T+1))[0]
print(f"単位時間あたり到着数の平均 = {counts.mean():.3f} (理論 {lam})")
print(f"単位時間あたり到着数の分散 = {counts.var():.3f} (理論 {lam})")
出力:
単位時間あたり到着数の平均 = 2.994 (理論 3.0)
単位時間あたり到着数の分散 = 2.995 (理論 3.0)
出力の意味:指数分布の到着間隔を積み上げただけで、単位時間の到着数が平均 2.994・分散 2.995 のポアソン分布(理論 )になりました。この表裏関係は、離散事象シミュレーションで到着過程をモデル化する土台です。
4. 他分布への広がり
- 一様: は 。すべての変換の出発点。
- 二項・幾何:ベルヌーイ試行の和・最初の成功までの回数。離散の逆関数法で生成。
- ガンマ・ベータ・カイ二乗・・:正規や指数の和・比から変数変換で構成。
- 実用では理論を理解した上で、numpy/scipy の最適化済み生成器(
rng.gamma,rng.betaなど)を使うのが正解です。中身は逆関数法・変数変換・棄却法の組み合わせです。
数式の直観的意味
指数とポアソンが表裏なのは、「待ち時間がメモリレス(無記憶)」だから。指数分布は「あとどれくらい待つか」が過去の経過時間によらない唯一の連続分布で、この性質ゆえに到着が**完全にランダム(ポアソン過程)**になります。ポアソンの平均=分散も同じ根から来ていて、 が大きくなると相対的なばらつき が小さくなる——大量到着ほど安定して見える、という直観につながります。
⚠️ よくある誤解・落とし穴
- 「
exponentialの引数はレート」ではない:numpy のrng.exponential(scale)は**スケール (平均)**を取ります。レートを渡すと逆数を間違えます。 - 「ポアソンは分散を別に指定できる」ではない:ポアソンは平均=分散の1パラメータ分布。分散が平均と違うデータには負の二項分布などを使います。
- 「正規分布なら負の値が出ても問題ない」ではない:待ち時間・個数を正規でモデル化すると負値が出て破綻します。正の量には指数・対数正規・ガンマを。
- 「裾の確率も正確に出る」ではない:標準的な生成器は中心はよく合いますが、極端な裾(稀少事象)の精度には重点サンプリングが要ります。
- 「平均が合えば分布も合っている」ではない:平均だけでなく分散・分位点・分布形まで照合するのが正しい検証です(検証と妥当性確認(V&V))。
対応シミュレーション参照
本文の3分布の生成・検証(default_rng(6))とポアソン過程=指数間隔の対応(default_rng(11))。
関連ノート
- 逆関数法(前提・指数の生成法)
- 合成法・変数変換法(前提・正規の生成法)
- 離散事象シミュレーションとは(到着過程のモデル化)
- モンテカルロ積分の原理(これらを使って期待値を推定)
- 第2章 乱数生成 目次
- シミュレーション・モンテカルロ法 全体目次