区間[0,1]の一様分布からサンプリングした値の集合が、一様分布に従っているか判断する方法を知りたいです。
サンプリングした値の平均0.5、分散1/12 (0.0833) に近いかで判断する方法よりも正確な方法をお願いします。
平均・分散だけの判断だと等差数列0.005, 0.015, ..., 0.995は平均0.5、分散0.0833になります。
python
1statistics.mean([0.01 * i + 0.005 for i in range(100)]) # 0.5 2statistics.pvariance([0.01 * i + 0.005 for i in range(100)]) # 0.0833
しかし、0.2113を50サンプルと0.7887を50サンプルの集合も平均0.5、分散0.0833になり、等差数列と明らかに従う分布が異なりますが区別できません。
python
1statistics.mean([0.2113] * 50 + [0.7887] * 50) # 0.5 2statistics.pvariance([0.2113] * 50 + [0.7887] * 50) # 0.0833
分布間の距離といえばKL情報量とかを思い浮かべますが、サンプリング集合から計算する方法を知りたいです。別の方法でも構いません。
追記:
よくよく考えれば0.1区切りのヒストグラムでbinのサンプル数の分散を見れば十分かもしれません。
質問の意味が、乱数が本当に「ランダムなのか」検定したい、ということならば、たとえば下記で提案されてる「RMTテスト」は実数の乱数の検定もできる、とのことです
https://repository.lib.tottori-u.ac.jp/files/public/0/4496/20180622150003229055/G21_15101A00282.pdf
質問の意味が、「ランダムなのか」ではなく「一様なのか」でしたら、的外れかもしれません
(論文詳しく読んで無いので、分布の形の検定に使えるのかは分かりません)
【追記】質問読み直したら、そもそも対象が「乱数」って書いてないですね
完全に的外れですね
失礼しました
ご回答ありがとうございます。一様分布に従うデータに対する異常検知をしたくて質問をしました。ややこしくてすいませんでした。
RMTテストという乱数の検定方法があるのですね。参考にさせていただきます。
> 0.1区切りのヒストグラムでbinのサンプル数の分散を見れば
元データが完全な一様分布だとすると、各binには平均して全データ数の1/10が入るので、その数から(元データが完全な一様分布だったとしても発生してしまう)各binに入るデータ個数のバラツキを統計的に計算しておいて、その予想バラツキよりも変動が大きかったらアラームを上げる、みたいな感じですかね
はい、おっしゃる通りの方法が現時点で無難かなと感じております。最初の例 (等差数列の集合と偏った集合) だと、それぞれ分散が0と400なので区別できそうです。
```python
statistics.pvariance([10] * 10) # 0
statistics.pvariance([0] * 8 + [50] * 2) # 400
```
binの頻度なら全体をサンプル数で割れば離散確率分布になるので、対象が一様分布に限らず、分布間の距離を一応計算できるかなと思っています。
サンプル集合が,ある分布に従っているかどうかを検定する,という話でしょうか.
そうであれば,分布の検定の話を調べると良いのではないかと思います.
"K-S検定" (コルモゴロフ-スミルノフ検定) とか何とかいうやつがそれっぽい?
ググった内容を斜め読みしただけの感じですが,
検定対象の分布(今回は一様分布)の累積確率密度関数とサンプルの累積との差を見るっぽい(?)ので,
「等差数列0.005, 0.015, ..., 0.995」よりも「0.2113を50サンプルと0.7887を50サンプル」のほうが「それっぽくない」という結果が得られるのではないかと想像します.
> "K-S検定" (コルモゴロフ-スミルノフ検定) とか何とかいうやつがそれっぽい?
ご回答ありがとうございます。K-S検定はまさに私が知りたかったものでした。
調べてみましたが結構簡単に求められますね。ヒストグラムの差よりも累積分布の差を見る方がビンの数を決める必要がなくサンプル数に左右されず理にかなっていそうなので、大変ありがたい情報です。
回答1件
あなたの回答
tips
プレビュー