Jogando Dois Dados 1200 Cada Para Dizer Que Eles São Justos
English version here.
Eu tenho esses dois dados que me foram oferecidos por um amigo, e eu adorei eles. Mas eu queria saber se esses dados são justos o suficiente para jogar alguns jogos de tabuleiro e mostrar às pessoas que estou usando-os porque gosto deles, não porque quero alguma maneira obscura de ganhar mais jogos.
Então, eu comecei a rolar! Eu usei a mesma mesa para rolar, tentando fazer isso da mesma maneira, porque enquanto dados verdadeiramente justos devem ser justos em qualquer superfície, alguns tipos de viés podem aparecer apenas em algumas superfícies.
Dados ideais
Quando você rola um dado, idealmente você está selecionando aleatoriamente uma das faces do dado. Cada rolagem também é independente da rolagem anterior, ou seja, as chances de obter uma face em particular não devem depender do que você rolou no passado. E a distribuição de probabilidade das faces deve ser igual, ou seja, a probabilidade de obter qualquer face deve ser 1/6, ou mais geralmente 1/f, onde f é o número de faces no dado.
Então, se você jogar um dado honesto muitas vezes, contar quantas vezes cada face aparece e colocar tudo em um histograma, seu gráfico deve ficar plano, assim:
Mas quando você realmente rola o dado, seu histograma acaba mais ou menos assim:
A questão é: quantas vezes precisamos jogar o dado para ter certeza de que o histograma real está próximo o suficiente do histograma ideal para ver a imparcialidade do dado ou a face superior mais comum?
Testes Estatísticos
Para o teste estatístico χ² de Pearson, uma regra prática comum é ter pelo menos cinco vezes mais rolagens do que os lados do dado. Assim, para um dado de seis faces, você precisa de pelo menos 30 jogadas para que o teste seja válido.
Agora, para o teste Anderson-Darling, você deve ter apenas 20 rolagens para ver resultados.
Obviamente, mais rolagens não vão doer se você tiver paciência para isso, e quanto mais rolagens você contabilizar, melhor o teste detectará vieses sutis, e podemos melhorar o poder estatístico do teste, que não determina a precisão do teste em si, mas como o resultado do teste é útil.
Então, para melhorar a usabilidade dos meus testes, rolei cada dado 30 vezes e escrevi assim:
# Sample 0plus[0] = [2, 6, 6, 5, 4, 3, 6, 6, 4, 3, 6, 4, 1, 5, 3, 2, 6, 6, 4, 4, 5, 4, 6, 3, 5, 4, 3, 2, 4, 5]minus[0] = [3, 1, 6, 6, 6, 5, 2, 2, 1, 3, 2, 3, 5, 5, 6, 3, 1, 6, 6, 1, 4, 1, 5, 5, 2, 2, 1, 4, 3, 3]
Repeti isso 40 vezes, juntei tudo e começou a testar!
É assim que meus histogramas ficaram:
Resultados dos Testes
Para o teste χ² de Pearson, queremos ver se tenho um histograma próximo o suficiente do ideal, ou seja, se as frequências de cada lado são iguais, portanto temos a seguinte hipótese:
- H0: As frequências de cada lado do dado são igualmente prováveis.
- H1: Um ou mais lados do dado tem frequência significativamente diferente dos outros lados.
O código para o teste:
critical = [0.85, 0.9, 0.95, 0.975, 0.99]
statistic, p_value = stats.chisquare(freq_plus)
print(f'Χ² = {statistic}')for crit in critical:
print('')
if statistic < stats.chi2.ppf(crit, 5):
print(f'Fail to reject H0 by critical value with {100*crit}% confidence.')
else:
print(f'Reject H0 by critical value with {100*crit}% confidence.')
if p_value < (1-crit):
print(f'Reject H0 by p-value with {100*crit}% confidence.')
else:
print(f'Fail to reject H0 by p-value with {100*crit}% confidence.')
Dado Plus:
Χ² = 5.92
Fail to reject H0 by critical value with 85.0% confidence.
Fail to reject H0 by p-value with 85.0% confidence.
Fail to reject H0 by critical value with 90.0% confidence.
Fail to reject H0 by p-value with 90.0% confidence.
Fail to reject H0 by critical value with 95.0% confidence.
Fail to reject H0 by p-value with 95.0% confidence.
Fail to reject H0 by critical value with 97.5% confidence.
Fail to reject H0 by p-value with 97.5% confidence.
Fail to reject H0 by critical value with 99.0% confidence.
Fail to reject H0 by p-value with 99.0% confidence.
Dado Minus:
Χ² = 4.74
Fail to reject H0 by critical value with 85.0% confidence.
Fail to reject H0 by p-value with 85.0% confidence.
Fail to reject H0 by critical value with 90.0% confidence.
Fail to reject H0 by p-value with 90.0% confidence.
Fail to reject H0 by critical value with 95.0% confidence.
Fail to reject H0 by p-value with 95.0% confidence.
Fail to reject H0 by critical value with 97.5% confidence.
Fail to reject H0 by p-value with 97.5% confidence.
Fail to reject H0 by critical value with 99.0% confidence.
Fail to reject H0 by p-value with 99.0% confidence.
Para o teste Anderson-Darling, queremos ver se a soma das faces superiores são normalmente distribuídas, uma vez que a probabilidade de cada soma das faces superiores são diferentes. O teste padroniza os valores, então esperamos uma média 0 e desvio padrão 1. Portanto, temos a seguinte hipótese:
- H0: A soma padronizada dos valores para cada amostra de rolagens tem distribuição normal.
- H1: A soma padronizada dos valores para cada amostra de rolagens segue outra distribuição.
O código para o teste:
statistic, crit, sign = stats.anderson(Z_plus, 'norm')
print(f"A² = {'%.4f' % statistic}")
print('')for i in range(len(sign)):
if statistic < crit[i]:
print(f'Fail to reject H0 with {100-sign[i]}% confidence.')
else:
print(f'Reject H0 with {100-sign[i]}% confidence.')
Dado Plus:
A² = 0.4785
Fail to reject H0 with 85.0% confidence.
Fail to reject H0 with 90.0% confidence.
Fail to reject H0 with 95.0% confidence.
Fail to reject H0 with 97.5% confidence.
Fail to reject H0 with 99.0% confidence.
Dado Menos:
A² = 0.3270
Fail to reject H0 with 85.0% confidence.
Fail to reject H0 with 90.0% confidence.
Fail to reject H0 with 95.0% confidence.
Fail to reject H0 with 97.5% confidence.
Fail to reject H0 with 99.0% confidence.
Conclusão
Com o poder da Estatística, agora posso usar meus adoráveis dados em meus jogos de tabuleiro e seções de RPG sem que as pessoas pensem que estou trapaceando!
Você pode ver um notebook com todos as rolagens, gráficos e testes aqui.