NumPy は、Python でデータ分析や統計解析を行う時、
生データを分析しやすい形に整理するデータ加工
などを行う時、
行列演算などスムーズに行う時
などに活躍するライブラリです。
ディープラーニングなどの人工知能や機械学習、
時系列分析などでも頻繁に使われます。
NumPy を使いこなすことで、
Python よりもサクッと実装でき、プログラミングが加速させることができます。
データ分析や統計モデリングなどでは、確率分布を扱う機会が多くあります。
NumPyでは、確率分布にしたがった乱数を生成する機能があります。
なんらかの確率分布にしたがったデータを生成することで、
現実を確率論の世界にモデル化して、シミュレーションすることも可能です。
とはいっても、
- 確率分布にしたがった乱数ってなに?
といった方も多いかと思います。
確率分布にしたがった乱数とは?については、
以下の記事でサクッとわかりやすく、解説しています↓
『【Python 数学】確率分布にしたがった乱数とは?について、サクッとわかりやすくまとめました【Python 入門】』
本記事では、
- Python NumPy を使った、確率分布にしたがった乱数の生成方法
について、初学者の方にもわかりやすいように、サクッと、わかりやすく、まとめたいと思います。
- 【Python NumPy random randn normal】ベクトル・行列の生成・初期化方法(8):正規分布にしたがった乱数の生成・初期化方法(random randn normal)について、サンプルコードとともに、サクッとわかりやすくまとめました【Python 入門】
- 正規分布とは?
- 正規分布の具体例とは?どんな時に使うの?
- 「正規分布(ベルカーブ)」にしたがった乱数の生成方法とは
- Python NumPy で「標準正規分布」に従う乱数を生成する
- Python NumPy で「標準正規分布」に従う乱数を、複数個、生成する
- Python NumPy で「標準正規分布」に従う乱数を、固定して生成する; np.random.seed( )
- Python NumPy で「標準正規分布」に従う乱数を、固定して、行列を生成する; np.random.seed( )
- Python NumPy で「標準正規分布」に従う乱数の行列を生成する
- Python NumPy で「正規分布」に従う乱数を生成する
- Python NumPy で「正規分布」に従う乱数を生成する:平均や標準偏差を指定する local scale
- Python NumPy で「正規分布」に従う乱数を複数個、生成する:平均や標準偏差を指定する local scale
- Python NumPy で「正規分布」に従う乱数の行列を生成する:平均や標準偏差を指定する local scale
【Python NumPy random randn normal】ベクトル・行列の生成・初期化方法(8):正規分布にしたがった乱数の生成・初期化方法(random randn normal)について、サンプルコードとともに、サクッとわかりやすくまとめました【Python 入門】
確率分布といっても、様々なものがあります。
にしたがった乱数を生成する
例えば、以下のものがあります。
- 正規分布
- 二項分布
- ベータ分布
- ガンマ分布
- ポアソン分布
- カイ2乗分布
他にもいろいろありますが、
これらの確率分布は、統計解析やデータ分析などでよく使われるものになります。
ここでは、1番よく使われる基本の確率分布である
- 「正規分布(ベルカーブ)」にしたがった乱数の生成方法
についてご紹介します。
といっても、正規分布について馴染みが薄い方も多いかと思います。
そこで本記事では、
- 正規分布ってなに?
- 正規分布には、どんな例があるの?
- Python NumPy で、正規分布にしたがった乱数の精製方法とは?
といった内容で、初学者の方にも、わかりやすく、サクッと学べるようにまとめます。
正規分布とは?
正規分布は、英語でノーマル・ディストリビューションなんですが、
- ノーマルを日本語にして正規
- ディストリビューションが分布
になります。
ノーマルは、普通の意味もあるように、
- 正規分布は、身の周りによくある分布
です。
図で描くと、以下の感じになります。
ヨコ軸の値が出る確率がタテ軸に書かれています。
具体的には、例えば、
- 0という値が出る確率は 0,4 くらい
- 2 という値が出る確率は0.1 くらい
といったことがわかります。
このグラフの特徴は、平均を中心(この例では平均0)にして、
左右対称の釣鐘の曲線です。
釣鐘の形なので、ベルカーブとも呼ばれます。
数式で表すと、以下のように描かれます。
ある値xを考えた時に、
その値が正規分布にしたがって出る確率が
f(x)になります。
図では、ヨコ軸がx、タテ軸 f(x) になります。
f(x)は、xが出る確率を表現しているわけです。
f(x)を正規分布の「確率密度関数」とも言います。
文字がたくさんあるので、わかりにくいかもしれません。
少し解説すると、この式は、2つの式のかけ算になっています。
- 分数×指数関数
の形をしています。
分数部分は
分母にルートがあり、中身は
2×パイ(円周率)×(xの標準偏差の2畳)
となっています。
指数部分は
exp( ) は、ネイピア数の指数関数(ex)と同じものです。
ネイピア数はだいたい2.7くらいの値の無理数です。
exの x の部分が複雑な時は、書きにくいので、
exp( )として書く書き方が使われます。
正規分布の式の指数部分では、
( ) の中が分数になっていて、
- 分母には 2×(xの標準偏差の2乗)
- 分子には、xとxの平均値(μ)の差の2乗
があり、マイナスがついています。
この分数を指数関数 exp( ) に与えています。
正規分布の確率密度関数を計算するには、
xとxの平均と標準偏差を求めておき、
上の式に代入して計算すればオッケーです。
この辺は統計学で詳しく学べますので、
興味がある方は統計学の教科書などを参照してみてください。
正規分布の具体例とは?どんな時に使うの?
正規分布の例としては、
- 身長の分布
などがよく挙げられます。
正規分布が関係する例としては、
データ分析や人工知能などでは、
- データを正規化する
という処理を行うことがあります。
これは、データを分析する前に、
平均0、標準偏差1の分布に変えることなどを言います。
様々な種類のデータを比較するために、
尺度をそろえるために正規化を行います。
これをプログラミングするのは大変!
と思われるかも知れませんが、大丈夫です。
Python NumPy を使えば、サクッとプログラムすることが可能です。
「正規分布(ベルカーブ)」にしたがった乱数の生成方法とは
正規分布には、パラメータが2つあります。
平均と標準偏差です。
平均と標準偏差によって、ベルカーブの中心や広がり方が変わります。
平均0、標準偏差1の正規分布を「標準正規分布」と言います。
Python NumPy で「標準正規分布」に従う乱数を生成する
標準正規分布に従う乱数を生成するには、
- np.random.randn( )
が使えます。
かっこの中に何も書かないと、1個の乱数を生成します。
標準正規分布なので、乱数は0付近の値が出る確率が高く、
値が大きかったり小さかったら出る確率が低くなります。
Python NumPy で「標準正規分布」に従う乱数を、複数個、生成する
乱数を複数個生成するには、
- np.random.randn(個数)
とすると、指定した個数の乱数を生成できます。
例えば、In[17]のように、
- np.random.randn( 3 )
とすると、3つの乱数列を生成できます。
Out[17]のように、NumPyアレイとして返されているのがわかります。
また、In[18]のように、
- np.random.randn(3, 2)
とすると、3行2列の計6個の乱数行列を生成できます。
Out[18] のように、NumPyアレイとして行列が返されているのがわかります。
Python NumPy で「標準正規分布」に従う乱数を、固定して生成する; np.random.seed( )
乱数の生成は、毎回違う値が生成されます。
同じ乱数を生成したい場合には、
(1), np.random.seed( 値 ) を設定します
(2), np.random,randn( )
として、2段階で乱数を生成します。
np.random.seed( 値 )を同じ値にセットすると、
同じ乱数列が生成されます。
上の例のように np.random.seed(3) として乱数を生成すると、
Out[20][22]のように、同じ値が生成されています。
Python NumPy で「標準正規分布」に従う乱数を、固定して、行列を生成する; np.random.seed( )
複数個の同じ乱数を生成することもできます。
同じ乱数を複数個生成したい場合には、
(1), np.random.seed( 値 ) を設定します
(2), np.random,randn(個数)
として、2段階で乱数を生成します。
np.random.seed( 値 )を同じ値にセットすると、
同じ乱数列が生成されます。
上の例のように np.random.seed(3) として乱数を生成すると、
Out[25][27]のように、同じ値が生成されています。
Python NumPy で「標準正規分布」に従う乱数の行列を生成する
乱数で行列を生成・初期化することができます。
- np.random.rand(行数, 列数)
と指定することで、
標準正規分布にしたがった乱数行列を生成できます。
Python NumPy で「正規分布」に従う乱数を生成する
正規分布にしたがう乱数を生成するには、
- np.random.normal( )
を使えばオッケーです。
かっこの中に何も書かないと、乱数を1個生成します。
Python NumPy で「正規分布」に従う乱数を生成する:平均や標準偏差を指定する local scale
平均と標準偏差を指定した正規分布にしたがう乱数を生成するには、
- 平均を loc
- 標準偏差を scale
で指定します。
例えば、In[3]のように、
- np.random.normal(loc=2, scale=3)
とすればオッケーです。
Python NumPy で「正規分布」に従う乱数を複数個、生成する:平均や標準偏差を指定する local scale
平均と標準偏差に従う正規分布にしたがう乱数を複数個生成することができます。
size = 個数
を使って、生成する乱数の個数を指定します。
例えば、
In[33] のように、
np.random.normal(loc=2, scale=3, size=3)
と指定すればオッケーです。
In[34] のように、
loc や scale を省略することができます。
Python NumPy で「正規分布」に従う乱数の行列を生成する:平均や標準偏差を指定する local scale
平均と標準偏差に従う正規分布にしたがう乱数の行列を生成することができます。
size = (行数, 列数)
を使って、生成する乱数の行列を指定します。
例えば、
In[36] のように、
np.random.normal(loc=2, scale=3, size=(3, 2))
と指定すればオッケーです。
In[37] のように、
loc や scale, size を省略することができます。
というわけで、本記事では、
- 正規分布ってなに?
- 正規分布には、どんな例があるの?
- Python NumPy で、正規分布にしたがった乱数の精製方法とは?
といった内容で、初学者の方にも、わかりやすく、
サクッと学べるようにまとめました。
こちらもございます↓