いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)正規分布に従う乱数を生成する

 Googleスプレッドシートで、正規分布に従って分布する乱数を生成する方法についてです。

  • NORMINV関数とRAND関数やRANDARRAY関数を組み合わせることにより正規分布に従う乱数を生成できます。引数として平均と標準偏差を指定できます。

手順

NORMINV関数の戻り値

f:id:accs2014:20200801121928p:plain:right:w450

 NORMINV関数は正規分布の累積分布関数の逆関数を返します。
 分布を特徴づける平均(第2引数)と標準偏差(第3変数)のほか、累積確率(第1引数)を与えることでその累積確率に対応する確率変数の値を返します(ただしこの戻り値は乱数ではなく、引数が一定であれば常に同じ値を返します)。

 画像ではC2で分布の平均を、C3セルで標準偏差を設定しています。値はそれぞれ0と1ですので、つまり標準正規分布を意味しています。
 さらにB6~B8セルに次のように入力します。

=NORMINV(0.5,C2,C3)
=NORMINV(0.75,C2,C3)
=NORMINV(1,C2,C3)

f:id:accs2014:20200801121932p:plain:right:w450

 確定すると結果はそれぞれ0、0.6744897502、エラーとなります。
 正規分布の累積確率が0.5(50%)に達する値は分布の平均値にほかなりませんので、結果は0になります。
 また、累積確率が1(100%)に達する値は無限大(∞)ですので結果はエラーになる、というわけです。このように第1引数として0以下や1以上の値を与えるとエラーになります。

正規分布に従う乱数を1つ生成する例

f:id:accs2014:20200801125805p:plain:right:w450

 NORMINV関数の第1引数として「0から1までの一様分布する乱数」を与えることで、正規分布に従う乱数を生成することができます。
 つまり第1引数を「RAND()」とすることで生成できます。

 画像ではB6セルに次のように入力することで標準正規分布(平均0、標準偏差1)に従う乱数を生成しています。

 B6セル

=NORMINV(RAND(),C2,C3)

正規分布に従う乱数を複数生成する例

f:id:accs2014:20200801121942p:plain:right:w450

 乱数を複数生成する場合はNORMINV関数とRANDARRAY関数を組み合わせます。

 画像ではB6セルに次のように入力することで標準正規分布による乱数を10個生成しています。

 B6セル

=ARRAYFORMULA(NORMINV(RANDARRAY(10),C2,C3))

 生成する乱数の数はRANDARRAY関数の引数で指定します。
 さらに10個の戻り値(乱数)を一括して得るためにARRAYFOMULA関数が必要です。

多数の乱数を生成して分布をシミュレートする例

 多数の乱数を生成して分布を集計する例です。
 画像ではC7セルにFREQUENCY関数を使った式を入力しています。これにより乱数を10000個生成するとともに(1つ1つの乱数の表示を省略して)分布の結果だけを得ています。

f:id:accs2014:20200801144843p:plain:w750

 C7セル

=FREQUENCY(ARRAYFORMULA(NORMINV(RANDARRAY(10000),C2,C3)),A7:A20)

 集計の区切りとなる数値はA7からA20までに入力しておき、それを参照しています。区切り数値の解釈はB列に記しているとおりです(これらは手入力)。
 FREQUENCY関数の戻り値として得られているのはC7からC21までの数値です。

 なお、集計の結果を棒グラフ(度数分布)として表示しています。
 正規分布特有の山なりの分布に従っているのがわかります。