python で
結果を
超幾何分布とは 何か
一言で
言うと
超幾何分布 | 統計用語集 | 統計WEB から引用します。 N個からなる
集団が 2つの 性質を もつときに、 各集団が M個、 N-M個であるとする。 ここから n個を 取り出す ときに、 M個の 中から m個が 取り出されるとすると、 この 確率分布は 超幾何分布に 従う。 公式
母集団の要素の 数N, ある 属性の 要素数M, 標本数の n で 以下のように 記載できます。
$$ f(m) = \frac{{}M\mathrm{C}_m\cdot{}\mathrm{C}_{n - m}} {{}_N\mathrm{C}_n} $$
- 超幾何分布の
実用例
捕獲再捕獲法に用いられます。 以下、 sec2 からの 引用です。 超幾何分布は,生態学で
動物の 生息数を 推定するのに 用いられる .m 匹の 動物を 捕獲して 目印を つけたのち放す.十分時間が 経過して, 捕獲した 動物と そうでない 動物>が 混ざり 合ったと 考えられてから, k 匹を 再捕獲する .再捕獲で 捕まった 目印つきの 個体数を X と すると, 対象と なっている 動物の 生息数を m + n と 考えると, X は 超幾何>分布に 従う.これを 捕獲再捕獲法(capture - recapture method),も しくは,標識・再捕獲法(mark - recapture method)と いう.
超幾何分布の 計算が できる ライブラリに ついて
他の分布と
numpy.random.hypergeometric
scipy.stats.hypergeom
例によって、
numpy.random.hypergeometric を 使う
超幾何分布に
パラメータは、
- ヒストグラム描画
# ヒストグラム描画 %matplotlib inline import numpy as np import matplotlib.pyplot as plt # ngood 白玉 90個、 nbad 赤玉 10、 標本数 50 ngood, nbad, nsamp = 90, 10, 50 # 10000回試行する。 # 標本数 50 個のうち、白い玉が何個あったかが返る s = np.random.hypergeometric(ngood, nbad, nsamp, 10000) # ヒストグラムに描画 plt.hist(s)
(array([ 7., 84., 388., 1116., 2090., 2524., 2252., 1097., 382., 60.]), array([ 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50.]), <a list of 10 Patch objects>)
- n回起こる
確率を 求める
n回 属性Aが起こる 確率を 求めます。
import numpy as np # ngood 白玉 90個、 nbad 赤玉 10、 標本数 50 ngood, nbad, nsamp = 90, 10, 50 # 10000回試行する。 # 標本数 50 個のうち、白い玉が何個あったかが返る s = np.random.hypergeometric(ngood, nbad, nsamp, 10000) print("白玉が取り出される回数45回。 赤が5つ。", (s == 45).sum() / 10000) print("白玉が取り出される回数40回。 赤が0つ。", (s == 40).sum() / 10000)
白玉が取り出される回数45回。 赤が5つ。 0.2632 白玉が取り出される回数40回。 赤が0つ。 0.0007
scipy.stats.hypergeom を 使う
scipy.stats.hypergeom を
- ヒストグラムを
描画する
%matplotlib inline from scipy.stats import hypergeom import matplotlib.pyplot as plt # 100個 玉があって、そのうち 10個 が赤玉、 50 個 を取り出した時に、赤玉が出る確率 をグラフ出力する。 [M, n, N] = [100, 10, 50] rv = hypergeom(M, n, N) x = np.arange(0, n+1) pmf_dogs = rv.pmf(x) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x, pmf_dogs, 'bo') ax.vlines(x, 0, pmf_dogs, lw=2) ax.set_xlabel('# of dogs in our group of chosen animals') ax.set_ylabel('hypergeom PMF') plt.show()
- n回起こる
確率を 求める
確率質量関数probability mass function
で5回赤玉が 出た時の 確率を 求める ことができます。
超幾何分布は離散型の 離散型の 確率変数なので、 確率質量関数で、 連続確率変数 の 場合は、 確率密度関数 probability density function
になり、 scipy では、 分布ごとに、 意識していて、 当たり 前かもですが、 メソッド名が pmf
、pdf
で違います。
# 100個 玉があって、そのうち 10個 が赤玉、 50 個 を取り出す時 [M, n, N] = [100, 10, 50] # 5回赤玉が出る確率を求める hypergeom.pmf(5, M, n, N)
0.25933354622553628
- ランダムな
配列を 返す
rvs
を使うと、 numpy.random.hypergeometric と 同様の 超幾何分布に 従う、 ランダムな 配列を 取得できます。
%matplotlib inline import matplotlib.pyplot as plt # 100個 玉があって、そのうち 10個 が赤玉、 50 個 を取り出す時 [M, n, N] = [100, 10, 50] R = hypergeom.rvs(M, n, N, size=10000) plt.hist(R)
(array([ 4., 69., 395., 1180., 2157., 2577., 2041., 1119., 388., 70.]), array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), <a list of 10 Patch objects>)
引数の
%matplotlib inline import matplotlib.pyplot as plt # 100個 玉があって、そのうち 90個 が白玉、 50 個 を取り出す時 [M, n, N] = [100, 90, 50] R = hypergeom.rvs(M, n, N, size=10000) plt.hist(R)
(array([ 5., 62., 373., 1179., 2091., 2614., 2090., 1131., 360., 95.]), array([ 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50.]), <a list of 10 Patch objects>)
参考
以下、
以上です。
コメント