回答:
Rコードを使用した例を次に示します。出力の前には#が付きます。フェアダイ:
rolls <- sample(1:20, 200, replace = T)
table(rolls)
#rolls
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 7 8 11 9 12 14 9 14 11 7 11 10 13 8 8 5 13 9 10 11
chisq.test(table(rolls), p = rep(0.05, 20))
# Chi-squared test for given probabilities
#
# data: table(rolls)
# X-squared = 11.6, df = 19, p-value = 0.902
バイアスのかかったダイ-1から10までの数字はそれぞれ0.045の確率です。これらの11〜20の確率は0.055-200スローです。
rolls <- sample(1:20, 200, replace = T, prob=cbind(rep(0.045,10), rep(0.055,10)))
table(rolls)
#rolls
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 8 9 7 12 9 7 14 5 10 12 11 13 14 16 6 10 10 7 9 11
chisq.test(table(rolls), p = rep(0.05, 20))
# Chi-squared test for given probabilities
#
# data: table(rolls)
# X-squared = 16.2, df = 19, p-value = 0.6439
バイアスの証拠が不十分です(p = 0.64)。
偏ったダイ、1000スロー:
rolls <- sample(1:20, 1000, replace = T, prob=cbind(rep(0.045,10), rep(0.055,10)))
table(rolls)
#rolls
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 42 47 34 42 47 45 48 43 42 45 52 50 57 57 60 68 49 67 42 63
chisq.test(table(rolls), p = rep(0.05, 20))
# Chi-squared test for given probabilities
#
# data: table(rolls)
# X-squared = 32.36, df = 19, p-value = 0.02846
現在p <0.05であり、バイアスの証拠が見られ始めています。同様のシミュレーションを使用して、検出が期待できるバイアスのレベルと、特定のpレベルでの検出に必要なスローの数を推定できます。
うわー、私が入力を終える前でさえ、2つの他の答え。
あなたはそれを手でやりたいですか、それともエクセルでやりたいですか?
Rで実行したい場合は、次の方法で実行できます。
ステップ1:サイコロを100回転がします(言いましょう)。
ステップ2:各番号を取得した回数を数える
ステップ3:このようにRに入れます(私が書いた数字の代わりに、あなたが得た各ダイスロールの回数を書きます):
x <- as.table(c(1,2,3,4,5,6,7,80,9,10,11,12,13,14,15,16,17,18,19,20))
ステップ4:単純に次のコマンドを実行します:
chisq.test(x)
P値が低い場合(例:0.05以下)-ダイのバランスが取れていません。
このコマンドは、バランスの取れたダイをシミュレートします(P =〜.5):
chisq.test(table(sample(1:20, 100, T)))
そして、これは不均衡なダイをシミュレートします:
chisq.test(table(c(rep(20,10),sample(1:20, 100, T))))
(約P =〜.005になります)
さて、本当の問題は、いくつのダイをどのレベルの検出能力にロールすべきかということです。誰かがそれを解決したいなら、彼は歓迎されます...
更新:このトピックに関する素晴らしい記事もここにあります。
まず、@ Glen_bが言ったことに沿って、ベイジアンは、ダイスが正確に公平であるかどうかに実際には興味がありません-そうではありません。彼が気にするのは、それが十分に近いかどうかですに、文脈で「十分」が何を意味する、例えば、各側の公平の5%以内でです。
とにかく、ここに方法があります(Rを使用):
まず、いくつかのデータを取得します。サイコロを500回転がします。
set.seed(1)
y <- rmultinom(1, size = 500, prob = c(1,1,1))
(公正なダイから始めています。実際には、これらのデータは観察されます。)
library(MCMCpack)
A <- MCmultinomdirichlet(y, alpha0 = c(1,1,1), mc = 5000)
plot(A)
summary(A)
最後に、ダイが各座標で0.05の範囲内にあるという事後確率(データを観察した後)を推定しましょう。
B <- as.matrix(A)
f <- function(x) all((x > 0.28)*(x < 0.38))
mean(apply(B, MARGIN = 1, FUN = f))
私のマシンでは、結果は約0.9486です。(実際、驚くことではありません。結局、私たちは公正なダイスから始めました。)
簡単な説明:この例では、情報量の少ない事前情報を使用したのはおそらく妥当ではありません。そもそもダイはおおよそバランスが取れているように見える質問もあるので、すべての座標で1/3近くに集中している事前分布を選択する方が良いかもしれません。これより上では、「公正に近い」と推定される事後確率がさらに高くなります。
カイ二乗適合度検定は、厳密な均一性からあらゆる種類の偏差を見つけることを目的としています。これは、d4またはd6では妥当ですが、d20では、各結果の下に転がる(または場合によっては超える)確率が本来あるべきものに近いかどうかをチェックすることにおそらく興味があります。
私が得ているのは、d20を使用しているものにほとんど影響を与えるフェアネスからのいくつかの種類の偏差とほとんど問題ではない他の種類の偏差があり、カイ2乗検定はパワーをより興味深いものに分割することですそして、あまり面白くない代替案。その結果、公平性からかなり中程度の偏差を拾うのに十分なパワーを得るには、膨大な数のロールが必要になります。
(ヒント:d20を使用している結果に最も大きな影響を与えるd20の不均一な確率のいくつかのセットを考え出し、シミュレーションとカイ2乗テストを使用して、それらに対してどのような力があるかを調べますさまざまな数のロールがあるので、必要なロールの数がわかります。)
「興味深い」偏差をチェックするさまざまな方法があります(d20の一般的な使用に実質的に影響を与える可能性が高い方法)
私の推奨事項は、ECDFテスト(Kolmogorov-Smirnov / Anderson-Darlingタイプのテストを実行することです-ただし、少なくとも公称アルファレベルを持ち上げることにより、分布が離散的であることから生じる保守性を調整する必要があります。分布をシミュレートして、d20の検定統計量の分布がどのようになるかを確認することで改善されます。
これらは依然としてあらゆる種類の逸脱を拾う可能性がありますが、より重要な種類の逸脱に比較的大きな重みを置きます。
さらに強力なアプローチは、最も重要な代替手段に特に敏感なテスト統計を具体的に構築することですが、それはもう少し作業を伴います。
ではこの回答私は、個々の偏差の大きさに基づいてダイをテストするためのグラフィカルな方法を提案します。カイ2乗検定のように、これはd4やd6のような辺の数が少ないサイコロにとってより意味があります。
各数値が表示される回数を確認するだけの場合は、カイ2乗検定が適しています。サイコロをN回振るとします。各値はN / 20倍になると予想されます。カイ二乗検定は、観察したものと得たものを比較するだけです。この差が大きすぎる場合、これは問題を示しています。
その他のテスト
ランダム性の他の側面に興味がある場合、たとえば、サイコロが次の出力をした場合:
1, 2, 3, 4...., 20,1,2,..
この出力には個々の値の正しい数が含まれていますが、明らかにランダムではありません。この場合、この質問をご覧ください。これはおそらく電子サイコロにのみ意味があります。
Rのカイ2乗検定
Rでは、これは
##Roll 200 times
> rolls = sample(1:20, 200, replace=TRUE)
> chisq.test(table(rolls), p = rep(0.05, 20))
Chi-squared test for given probabilities
data: table(rolls)
X-squared = 16.2, df = 19, p-value = 0.6439
## Too many 1's in the sample
> badrolls = cbind(rolls, rep(1, 10))
> chisq.test(table(badrolls), p = rep(0.05, 20))
Chi-squared test for given probabilities
data: table(badrolls)
X-squared = 1848.1, df = 19, p-value < 2.2e-16
おそらく、1つのロールセットにそれほど焦点を合わせるべきではありません。
6サイドのダイスを10回ローリングして、プロセスを8回繰り返します。
> xy <- rmultinom(10, n = N, prob = rep(1, K)/K)
> xy
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 3 1 0 0 1 1 2 1
[2,] 0 0 1 2 1 1 0 1
[3,] 1 3 6 0 1 3 2 4
[4,] 2 1 0 5 2 0 2 1
[5,] 3 2 0 2 1 3 3 0
[6,] 1 3 3 1 4 2 1 3
各繰り返しの合計が10になることを確認できます。
> apply(xy, MARGIN = 2, FUN = sum)
[1] 10 10 10 10 10 10 10 10
繰り返しごと(列ごと)にChi ^ 2検定を使用して適合度を計算できます。
unlist(unname(sapply(apply(xy, MARGIN = 2, FUN = chisq.test), "[", "p.value")))
[1] 0.493373524 0.493373524 0.003491841 0.064663031 0.493373524 0.493373524 0.669182902
[8] 0.235944538
スローが多ければ多いほど、偏りが少なくなります。これを多数でやってみましょう。
K <- 20
N <- 10000
xy <- rmultinom(100, n = N, prob = rep(1, K)/K)
hist(unlist(unname(sapply(apply(xy, MARGIN = 2, FUN = chisq.test), "[", "p.value"))))