Generator.f – F分布から乱数配列を作成する方法

Generator.fは、NumPyのrandomモジュールのジェネレータメソッドで、F分布から乱数配列を生成します。

F分布はF検定で帰無仮説に従う分布として用いられます。統計学において、非常に重要な分布と言えます。

ここでは、このF分布の乱数配列を生成するGenerator.fについて解説します。

目次

1. 書式

Generator.f

書き方:

Generator.f(dfnum, dfden, size=None)

パラメーター:

dfnum: float or array_like of floats
集団間の自由度(>0)
dfden: float or array_like of float
集団内の自由度(>0)
size: int or tuple of ints, optional
出力する配列のshape。デフォルト値のNoneで、dfnumとdfdenがともにスカラーの場合は、乱数を1つ返す。それ以外の場合はnp.broadcast(dfnum, dfden).sizeの乱数を返す。

戻り値: 

out: ndarray or scalar
指定のパラメータのf分布からの乱数

Notes

F統計量は、集団内の分散と集団間の分散の比較に使われます。分布の計算は標本に依存します。そこでは、それぞれの自由度関数が問題になります。dfnum変数は、標本の数-1であり集団間の自由度です。一方でdfdenは、集団内の自由度であり、それぞれのグループの標本数-集団数です。

2. サンプルコード

それではサンプルコードを見ていきましょう。

まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。

In [1]:
import numpy as np
rng = np.random.default_rng()
rng
Out[1]:
Generator(PCG64) at 0x7FA0A6B88D68

こうして作成したジェネレータオブジェクト rng に対して、Generator.fを呼び出します。その際、第一引数に集団間の自由度であるdfnum、第二引数に集団内の自由度であるdfden、第三引数にsizeを渡します。

第一引数と第二引数だけを渡した場合は、指定の自由度のf分布から1つ乱数を返します。

In [2]:
rng.f(1., 5.)
Out[2]:
0.14470567429830442

第三引数でshapeを指定することができます。shapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [3]:
rng.f(1., 5., 5)
Out[3]:
array([1.21391395, 0.01387446, 0.62918092, 3.23484094, 2.27193196])

もちろん、それぞれの自由度によって分布の形状は異なります。

In [4]:
import matplotlib.pyplot as plt

plt.subplot(221)
s = rng.f(1., 10., 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.title('dfnum=1., dfden=10.', fontsize=12)

plt.subplot(222)
s = rng.f(1., 48., 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.title('dfnum=1., dfden=48.', fontsize=12)

plt.subplot(223)
s = rng.f(5., 5., 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.title('dfnum=5., dfden=5.', fontsize=12)

plt.subplot(224)
s = rng.f(2., 30., 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.title('dfnum=2., dfden=30.', fontsize=12)

plt.tight_layout()
plt.show()

応用例

例として2つの集団を考えてみましょう。一方は糖尿病を患っている25名の子供たち、他方は糖尿病を患っていない25名の子供たちの集団です。それぞれの集団で、空腹時血糖値が計測されました。症例群では86.1、対照群では82.2でした。標準偏差はそれぞれ2.09と2.49です。

これらのデータは、両親が糖尿病を患っているかどうかは、子供たちの血糖値には影響しないという帰無仮説と一貫しているでしょうか。なお、データからF統計量を計算すると、結果は36.01でした。

F分布から標本を精製します。

In [5]:
dfnum = 1. #集団間の自由度
dfden=48. # 集団内の自由度
s = rng.f(dfnum, dfden, 1000)

この標本のトップ1%の下限は、次のようになります。

In [6]:
np.sort(s)[-10]
Out[5]:
7.775431813240223

つまりF統計量の計測結果が36であるのに対して、この標本では7.78を上回るチャンスは1%ほどしかありません。そのため、この帰無仮説は棄却されます。

3. まとめ

以上のように、Generator.fはF分布から乱数配列を生成するジェネレータメソッドです。

これまで使われていたnp.random.f関数は継続して使用可能ですが、Generator.fメソッドを使った方が遥かに高速で科学技術計算に適しています。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる