【Python】Numpyで一様分布や正規分布、二項分布、ポアソン分布に従う乱数を発生させる

pythonのnumpyを使うことで統計分析に使える様々な種類の乱数を発生させることができる。

その一覧をまとめておきたいと思う。

numpyの乱数出力設定

シード値の固定と出力桁数の固定は以下の通りです。

np.random.seed(hoge) # シード値の固定
np.set_printoptions(precision=hoge) # 出力桁数の固定

一様分布 (Uniform distribution)

一様分布:全ての事象が発生する確率が等しい事象の分布

np.random.rand(hoge) # hoge個の一様分布に従う乱数を発生
np.random.random(hoge) # 上と同じ

np.random.rand()は0~1の範囲で乱数を生成する。

np.random.randomも同じだが、多次元配列の形を指定する場合には引数の指定方法に違いがある。

np.random.rand(行数,列数) # .randomと違ってタプルで渡すとエラーになる
np.random.random((行数,列数)) # .randomはタプルを渡す

CMD上での実行結果の例を載せます。
この記事では、np.set_printoptions(precision=5)で予め出力桁数を指定しています。

>>> np.random.rand(10)
array([0.04972, 0.77555, 0.08981, 0.49068, 0.99712, 0.067  , 0.27647,
       0.8071 , 0.0364 , 0.86218])
>>> np.random.rand(10)
array([0.52092, 0.51356, 0.63744, 0.36252, 0.5153 , 0.51083, 0.25019,
       0.88656, 0.27519, 0.8532 ])

数値範囲を指定した一様分布

整数の乱数を発生させるには、np.random.randint()を使う。

np.random.randint(low,high,size)

lowからhigtまでの値で一様分布に従う乱数を発生させる

実行例はこちらです。

>>> np.random.randint(1,100,10)
array([89, 84, 75, 27, 90, 56,  4, 59, 90, 34])

>>> np.random.randint(100,size=10) # lowなしの場合
array([25, 38, 97, 62, 17, 19, 70, 65, 37, 92])

floatでの乱数を発生させるには、np.random.uniform()を使う。

np.random.uniform(low,high,size)

np.random.uniform()を使った場合の例はこちらです。

>>> np.random.uniform(100,200,10)
array([185.96231, 147.76033, 153.00573, 104.42658, 197.18393, 153.49722,
       181.12692, 108.39224, 137.65058, 145.79512])

正規分布に従う乱数 (Normal distribution)

投資関連では最も一般的な左右対称の釣鐘型の分布、正規分布に従う乱数を発生させます。

ちなみに、ある変数が正規分布が従う場合、その変数の値は、68.27%の確立で平均±1標準偏差内、95.45%の確立で平均±2標準偏差内、99.73%の確率で平均±3標準偏差内に収まります。

株価リターン等が正規分布しているかというとそうでもないですが、一般的に使われるリスク指標なので正規分布については覚えておいたほうがいいと思います。

大手金融機関のホームページなどで投資信託を比較するときにも役立ちます。

余談はさておき、正規分布に従う乱数発生方法を示します。

標準正規分布に従う乱数発生

標準正規分布は、平均が0、分散(/標準偏差)が1の正規分布です。

np.random.randn(hoge) # hoge個の分布に従う乱数を発生させる

実行結果の例はこちらです。

>>> np.random.randn(10)
array([ 0.6015 ,  1.07371, -1.05746,  0.46232,  1.5043 , -0.516  ,
       -1.24276,  1.83233, -0.7103 , -0.87925])
>>> np.random.randn(10)
array([-0.73281, -0.73262, -0.06529, -1.05303,  0.43214, -2.12933,
        0.52953,  0.44541, -1.05471,  0.2267 ])

正規分布に従う乱数発生

平均と標準偏差を自分で決めて乱数発生させることもできます。

np.random.normal(平均,標準偏差,size)

実行結果は次のようになります。

>>> np.random.normal(10,3,10) # 平均10、標準偏差3、sizeが10
array([ 5.08244,  8.04802,  9.9994 ,  7.75077,  7.43132, 12.37002,
        7.81148,  8.17463, 13.70297, 13.52232])

二項分布 (Binominal distribution)

二項分布:
ベルヌーイ試行を一定回数行った際の成功回数を変数とする分布

ベルヌーイ試行:
成功確率が一定、結果が成功か失敗のみである試行

np.random.binomial(n,p,size=None)
# n:試行回数 p:成功確率 size:乱数個数

実行結果例はこちら

>>> np.random.binomial(10,0.5,10)
array([4, 4, 7, 5, 8, 2, 5, 5, 9, 2])
>>> np.random.binomial(10,0.5,10)
array([7, 6, 6, 7, 5, 5, 7, 2, 4, 6])

ポアソン分布 (Poisson distribution)

ポアソン分布:
一定期間に平均λ回発生する事象がちょうどk回発生する確率を示す。

np.random.poisson(lam=1.0, size=None)
# lamは事象の平均発生回数。初期値は1.0。

np.random.poisson(lam=(hoge1,hoge2),size=(行数,列数))
# 多次元のポアソン分布発生

結果の例はこちらです。

>>> np.random.poisson(lam=100,size=10)
array([ 90,  93, 100, 106,  90,  87, 108,  95, 106, 104])

>>> np.random.poisson(lam=(100.,500.),size=(10,2))
array([[104, 524],
       [ 88, 469],
       [ 95, 537],
       [ 90, 475],
       [ 97, 492],
       [ 94, 513],
       [ 97, 515],
       [ 82, 492],
       [106, 519],
       [ 93, 520]])