numpy.random関数を使った各種分布図

Posted on 2019/08/20 in programming , Updated on: 2019/08/20

はじめに

numpy には、乱数生成を実行する関数が多く用意されている。python 標準の random モジュールより高速に動くため、データサイエンスにおいても最も重要な機能の一つである。この記事では、主要な各種 random モジュールの説明および用いた乱数をプロットすることで、生成された乱数を視覚化する。
公式ドキュメント

インポート

In [1]:
import numpy as np

# グラフ描画ライブラリ
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('white')
%matplotlib inline

random.rand()

引数として与えられた形状配列を作成して、0~1の一様分布からランダムに数値をサンプリングする。

In [ ]:
np.random.rand()
#  0.34294639674805394
In [ ]:
# 1次元 3要素
np.random.rand(3)
#  array([0.71700898, 0.26107009, 0.12630629])
In [ ]:
# 2次元 4x4要素
np.random.rand(4, 4)
# array([[0.73182774, 0.6799907 , 0.64545167, 0.82626256],
#        [0.04220962, 0.16653286, 0.02354368, 0.89450616],
#        [0.95302194, 0.56173775, 0.07572539, 0.10183865],
#        [0.77396516, 0.81401857, 0.4561875 , 0.48631094]])

分布

In [2]:
# 1次元 1000要素 => プロット
rand_1 = np.random.rand(10000)

# 生成された乱数の分布と確率密度関数を表示
sns.distplot(rand_1, bins=50)
plt.title('Random value graph', fontsize=15)
plt.show()

生成された乱数はすべて、0~1の間に収まっていることがわかる。

random.randint()

ランダムな整数を生成する。randの後につく"int"は、Integer(整数)の略。引数として、生成する数値の取りうる最小値、最大値を渡す。

In [ ]:
# 1 ~ 99 の中からランダムに一つの整数を返す。
np.random.randint(1, 100)
#  36

複数の整数値による配列を得たい場合は、3つ目の引数でアレイの形状を渡す。

In [ ]:
# 1 ~ 99 の中からランダムに5つの整数を 1次元アレイとして返す
np.random.randint(1, 100, 5)
#  array([35, 53, 51, 23, 53])

3つ目の引数に、リストもしくはタプルで所望の形状を渡すことで n次元アレイを返す。

In [ ]:
# 1 ~ 99 の中からランダムな整数の 5x5 2次元アレイとして返す
np.random.randint(1, 100, (5,5))
# array([[ 3, 38,  7, 41, 75],
#        [80, 18, 33, 24, 68],
#        [98, 52, 38, 28, 98],
#        [ 7, 96, 96, 14,  3],
#        [57, 36, 26, 31, 16]])

分布

In [3]:
rand_2 = np.random.randint(1, 100, 100000)

sns.distplot(rand_2, bins=50)
plt.title('Random integer value graph', fontsize=15)
plt.show()

random.randn()

一様分布からサンプリングする.rand().randint()とは異なり、randn()は平均0, 標準偏差1の正規分布からサンプリングする。randのあとにつく"n"は、Normal Distributoin (正規分布) の頭文字。
正規分布-Wiki

In [ ]:
np.random.randn(2)
#  array([-0.86086465, -0.09589871])
In [ ]:
np.random.randn(3, 3)
# array([[-0.57081706,  2.56610772,  0.17165976],
#        [ 0.61240865,  0.38139663,  0.10562155],
#        [-2.33326751,  0.17512012,  0.13607136]])

分布

In [4]:
rand_3 = np.random.randn(10000)

sns.distplot(rand_3, bins=50)
plt.title('Normal distribution graph', fontsize=15)
plt.show()

分布の中央(平均)が0の正規分布になっていることがわかる。

random.exponential

指数分布から値を取り出す。第一引数には"scale"のパラメータを渡し、第二引数には取り出したい数、もしくは形状を渡す。
指数分布-Wiki

In [ ]:
np.random.exponential(0.5, 5)
# array([0.06961911, 0.70570132, 0.71340574, 0.1818974 , 0.71709865])

分布

In [5]:
rand_4 = np.random.exponential(1, 1000)
sns.distplot(rand_4, bins=50, label='scale=0.5')
plt.title('Exponential distribution graph', fontsize=15)
plt.show()

random.beta()

任意のbeta分布から値を取り出す。第一引数には"α"、第二引数には"β"のパラメータを渡し、第三引数には取り出したい数、もしくは形状を渡す。
beta分布-Wiki

In [ ]:
np.random.beta(1, 1, 1)
# array([0.05266333])
In [ ]:
np.random.beta(2, 5, (3, 5))
# array([[0.33818884, 0.23247171, 0.6272282 , 0.12705662, 0.18657287],
#        [0.48438455, 0.66198256, 0.18368918, 0.15080482, 0.20918101],
#        [0.29432319, 0.21903753, 0.1482676 , 0.0879696 , 0.36886679]])

分布

In [6]:
# α=2, β=5
rand_4 = np.random.beta(2, 5, 1000)

# α=5, β=2
rand_5 = np.random.beta(5, 2, 1000)

sns.distplot(rand_4, bins=50, label='α=2 β=5')
sns.distplot(rand_5, bins=50, label='α=5 β=2')

plt.title('Two beta distribution graph', fontsize=15)
plt.legend()
plt.show()

α、β値により、0~1の範囲で偏り(skewness)を持った任意の分布が得られる。

random.binomial()

任意の二項分布から値を取り出す。第一引数には"n"、第二引数には"p"のパラメータを渡し、第三引数には取り出したい数、もしくは形状を渡す。
二項分布-Wiki

In [ ]:
np.random.binomial(20, 0.5, 10)
# array([ 4,  7, 12,  9, 12, 15,  7, 11,  8, 12])

分布

In [7]:
rand_6 = np.random.binomial(20, 0.5, 100)
rand_7 = np.random.binomial(20, 0.7, 100)
rand_8 = np.random.binomial(40, 0.5, 100)

sns.distplot(rand_6, label='n=20 p=0.5')
sns.distplot(rand_7, label='n=20 p=0.7')
sns.distplot(rand_8, label='n=40 p=0.5')

plt.title('Three binomial distribution graph', fontsize=15)
plt.legend()
plt.show()

random.chisquare()

任意のカイ二乗分布から値を取り出す。第一引数には独立確立変数"df"、第二引数には取り出したい数、もしくは形状を渡す。
カイ二乗分布-Wiki

In [ ]:
np.random.chisquare(1, 10)
# array([0.29635903, 3.74744849, 0.54934283, 0.54021101, 0.58029301,
#        0.04113205, 0.03050801, 0.71353022, 0.06868004, 0.13612042])

分布

In [8]:
rand_9 = np.random.chisquare(3, 1000)
rand_10 = np.random.chisquare(5, 1000)
rand_11 = np.random.chisquare(7, 1000)

sns.distplot(rand_9, label='df=3')
sns.distplot(rand_10, label='df=5')
sns.distplot(rand_11, label='df=7')

plt.title('Three chisquare distribution graph', fontsize=15)
plt.legend()
plt.show()

random.gamma()

任意のガンマ分布から値を取り出す。第一引数には形状"k"、第二引数にスケール"Θ"を、第三引数には取り出したい数、もしくは形状を渡す。
ガンマ分布-Wiki

In [ ]:
np.random.gamma(1, 2, 5)
# array([0.659644  , 2.2722199 , 0.00498076, 0.39080928, 4.55915891])

分布

In [9]:
rand_12 = np.random.gamma(3, 1, 1000)
rand_13 = np.random.gamma(5, 1, 1000)
rand_14 = np.random.gamma(9, 1, 1000)


sns.distplot(rand_12, label='k=3 Θ=1')
sns.distplot(rand_13, label='k=5 Θ=1')
sns.distplot(rand_14, label='k=9 Θ=1')

plt.title('Three gamma distribution graph', fontsize=15)
plt.legend()
plt.show()
In [ ]: