NumPy random.poisson でポアソン分布に従って乱数を生成する方法

2024-04-02

NumPy の Random Sampling で random.poisson() を使う

ポアソン分布 は、ある期間内に発生する事象の回数を表す離散確率分布です。例えば、1分間に電話がかかってくる回数や、1日に発生する地震の回数などがポアソン分布に従うと考えられます。

NumPy で random.poisson() を使うには、以下の手順が必要です。

  1. NumPy をインポートする
  2. random モジュールから poisson() 関数をインポートする
  3. ポアソン分布の平均値を指定する
  4. poisson() 関数を実行して、乱数を生成する

例:

import numpy as np

from numpy.random import poisson

# 平均値を5と設定
mean = 5

# 10個の乱数を生成
# 生成される乱数は 0 から 14 までの整数
# それぞれの値が、平均5のポアソン分布に従って発生する事象の回数を表す
random_numbers = poisson(mean, 10)

print(random_numbers)

出力例:

[4 6 5 3 7 5 6 2 5 5]

random.poisson() 関数の引数

  • lam (float): ポアソン分布の平均値
  • size (int or tuple): 生成する乱数の個数
    • 省略すると、デフォルトで1個の乱数を生成

random.poisson() 関数の戻り値

  • 生成された乱数を含む NumPy 配列

補足

  • random.poisson() は、整数値のみを生成します。
  • ポアソン分布は、平均値が大きくなるほど、分布が左右対称に近づきます。

応用例

  • シミュレーション
  • モンテカルロ法
  • 統計分析
  • random.poisson() 以外にも、NumPy には様々な確率分布に従って乱数を生成する関数があります。詳細は NumPy 公式ドキュメントを参照してください。
  • ポアソン分布について詳しく知りたい場合は、統計学の教科書などを参照してください。


NumPy random.poisson サンプルコード

import numpy as np

from numpy.random import poisson

# サイコロの目を100回振る
dice_rolls = poisson(6, 100)

# 各目の出現回数を集計
counts = np.bincount(dice_rolls)

# 結果を表示
print(counts)

出力例:

[15 17 18 16 14 20]

電話の着信回数

import numpy as np

from numpy.random import poisson

# 1時間あたりの平均着信回数を3回と設定
mean_calls_per_hour = 3

# 1日の着信回数を100日分シミュレーション
daily_calls = poisson(mean_calls_per_hour / 60, 100)

# 結果を表示
print(daily_calls)

出力例:

[4 5 3 2 6 5 4 3 5 7]

顧客の来店数

import numpy as np

from numpy.random import poisson

# 1時間あたりの平均来店回数を4人と設定
mean_customers_per_hour = 4

# 1日の来店回数を1週間分シミュレーション
weekly_customers = poisson(mean_customers_per_hour / 60, 7)

# 結果を表示
print(weekly_customers)

出力例:

[28 32 29 30 27 31 33]

ポアソン分布の確率密度関数

import numpy as np

from scipy import stats

import matplotlib.pyplot as plt

# 平均値を5と設定
mean = 5

# x軸の範囲を設定
x = np.arange(0, 15)

# ポアソン分布の確率密度関数を計算
pdf = stats.poisson(mean).pmf(x)

# グラフを描画
plt.plot(x, pdf, label="Poisson distribution (mean=5)")
plt.xlabel("x")
plt.ylabel("Probability")
plt.legend()
plt.show()

グラフ例:

Poisson distribution: [無効な URL を削除しました]

ポアソン分布の累積分布関数

import numpy as np

from scipy import stats

import matplotlib.pyplot as plt

# 平均値を5と設定
mean = 5

# x軸の範囲を設定
x = np.arange(0, 15)

# ポアソン分布の累積分布関数を計算
cdf = stats.poisson(mean).cdf(x)

# グラフを描画
plt.plot(x, cdf, label="Poisson distribution (mean=5)")
plt.xlabel("x")
plt.ylabel("Cumulative probability")
plt.legend()
plt.show()

グラフ例:

Poisson distribution CDF: [無効な URL を削除しました]

  • 上記はあくまでもサンプルコードです。用途に合わせてコードを


NumPy random.poisson 以外の方法

NumPy の random.random と random.choice を使う

import numpy as np

def poisson(lam, size):
  """
  NumPy の random.random と random.choice を使って、
  ポアソン分布に従って乱数を生成する関数
  """
  p = np.exp(-lam)
  k = np.arange(0, 15)
  probs = np.zeros(15)
  probs[0] = p
  for i in range(1, 15):
    probs[i] = probs[i-1] + p * lam / i
  return np.random.choice(k, size=size, p=probs)

# 平均値を5と設定
mean = 5

# 10個の乱数を生成
random_numbers = poisson(mean, 10)

# 結果を表示
print(random_numbers)

scipy.stats モジュールを使う

from scipy import stats

# 平均値を5と設定
mean = 5

# 10個の乱数を生成
random_numbers = stats.poisson(mean).rvs(10)

# 結果を表示
print(random_numbers)

自作の関数を使う

ポアソン分布の確率密度関数を用いて、自作の関数で乱数を生成することもできます。

  • 速度が重要な場合は、NumPy の random.poisson を使うのがおすすめです。
  • より柔軟な方法が必要な場合は、NumPy の random.randomrandom.choice を使うか、scipy.stats モジュールを使うのがおすすめです。
  • より詳細な制御が必要な場合は、自作の関数を使うのがおすすめです。



Pythonプログラマー必見!NumPy static ma.MaskedArray.__new__(): データ分析をレベルアップ

static ma. MaskedArray. __new__() は、ma. MaskedArray オブジェクトを作成するための静的メソッドです。このメソッドは、データ、マスク、およびオプションのデータ型を指定して、新しい ma. MaskedArray オブジェクトを作成します。



NumPy C-API: PyArray_GETPTR2() 関数で多次元配列を自在に操る - 高速アクセスとデータ操作

関数概要:引数:arr: 要素へのポインタを取得したいNumPy配列オブジェクトへのポインタind: 各次元におけるインデックスを表す整数配列へのポインタstrides: 各次元におけるストライドを表す整数配列へのポインタ(オプション)戻り値:


void PyUFunc_O_O() 関数で実現するオブジェクト型入力のユニバーサル関数

入力と出力バッファの確保: 関数は、入力と出力データを格納するためのメモリ領域を確保します。入力データの型変換: 関数は、入力オブジェクトの型を、対応する NumPy 型に変換します。ユニバーサル関数の呼び出し: 関数は、指定されたユニバーサル関数を、変換された入力データを使用して呼び出します。


NumPy C-API: void PyUFunc_f_f() 関数で始める高速 NumPy コード開発

NumPy C-API は、C 言語から NumPy 配列を操作するための強力なツールを提供します。その中でも、void PyUFunc_f_f() 関数は、2 つの入力配列と 1 つの出力配列を受け取り、要素ごとの演算を実行する重要な関数です。


PyArray_ITER_RESET() を使ったサンプルコード: 実践で学ぶイテレータ操作

イテレータは、配列などのデータ構造を要素ごとに順にアクセスするための仕組みです。 NumPy では、PyArray_IterNew() 関数を使ってイテレータを作成できます。PyArray_ITER_RESET() は、すでに作成済みの イテレータを最初の要素に戻します。 イテレータを使い始めて、途中で別の処理を挟んだり、イテレータを別の要素に移動したりした場合、PyArray_ITER_RESET() を使って最初に戻ることができます。



NumPy Laguerreモジュール:ラゲール多項式の世界へようこそ

ラゲール多項式は、以下の式で定義される特殊関数です。ここで、Ln(−1)​(x)は、次数nの一般化ラゲール多項式です。ラゲール多項式は、量子力学や統計学など様々な分野で応用されています。Laguerre. truncate()関数は、以下の引数を受け取ります。


NumPy.tri() 関数を使ったその他の方法

numpy. tri()関数は以下の4つのパラメータを受け取ります。N: 作成する配列の行数M: 作成する配列の列数 (省略可。デフォルトはNと同じ)k: 対角線の位置 (デフォルトは0。0の場合は主対角線、負の場合は主対角線より下、正の場合は主対角線より上)


NumPy C-API: NPY_ITER_MULTI_INDEXを使ってC言語で効率的な多重ループ処理を行う方法

NPY_ITER_MULTI_INDEXは、配列の各要素を反復処理する際に、以下の情報を提供します。現在のイテレーションにおける各軸のインデックス各軸のループカウンタ現在の要素へのポインタこれらの情報を利用することで、複雑な多重ループを記述することなく、配列の各要素にアクセスすることができます。


NumPy C-API: PyArray_CGT() 関数で共役転置積を計算する

PyArray_CGT() 関数は、NumPy C-API の一部であり、2つの配列間の共役転置積 (Conjugate Transpose Product, 以下 CGT) を計算するために使用されます。これは、数学的には以下の式で表されます。


NumPyのRandom Samplingにおける random.RandomState.standard_exponential() :詳細解説

指数分布は、ある事象が発生するまでの待ち時間を表す確率分布です。例えば、電話が鳴るまでの時間、故障するまでの時間などが指数分布に従う場合があります。指数分布の確率密度関数は以下の式で表されます。ここで、λ は形状パラメータと呼ばれる定数で、分布の形状を決定します。