十几年来,作者对棋盘游戏还是保有极高的热情。每过几个月,就会用BoardGameGeek("BGG")下载当时深受好评的游戏。其中,最喜欢的游戏是"暮光城的斗争"(Twilight Struggle)

大家对游戏有什么常见误解(从游戏引发的思考)(1)

"暮光城的斗争"(下面简称TS)是一款以"冷战"为主题的两人战略纸牌游戏。从某些方面来说,这就像是国际象棋和扑克的结合。一方扮演美国,另一方扮演苏联。游戏有着和真正的冷战一样的偏执感,因为你必须不断地猜测你的对手可能有哪些牌,以及他们如何用这些牌伤害你。

大家对游戏有什么常见误解(从游戏引发的思考)(2)

卡牌技能在TS中是非常重要的,运气在结果中也起着重要的作用。游戏的变数包括政变、突发战争和空间竞赛等等,所有这些都是由Die Roll Data决定的。

几年前,TS发布了在线版。在玩了几百个网络游戏之后,作者决定尝试创建一个运气测量系统来评估结果。在这个过程中,收集了"政变"和"突发战争"上的Die Roll Data结果。有了一个惊人的发现。

大家对游戏有什么常见误解(从游戏引发的思考)(3)

理解卡方测试

不过,我们首先得了解什么是卡方测试。

卡方测试通常用来确定预期分布与实际分布之间是否存在显著差异。它通常与教育程度、肤色或性别等分类数据一起使用。

骰子是一个非常适合卡方测试的例子。如果我们把骰子扔1000次,我们知道每个数字(朝上的概率)应该是大约1/6次(即16.66667%)。卡方检验可以帮助我们确定模具(骰子)是否"公平",或者根据骰子(模具)产生的结果是否"随机"。

然而,骰子中的"预期分布"是已知的。但现实中情况并不总是如此。有时,我们的"预期分布"是通过数据来估计的。

假设我们不知道我们"预期分布"的频率。我们必须通过数据样本来做出估计。作者决定手工做4个(卷数据模具)样本,前3个样本每个35卷,最后一个样本为45卷。四个样品用字母'a','b','c'和'd'表示。

大家对游戏有什么常见误解(从游戏引发的思考)(4)

总共有150卷,我们现在把它"放"入骰子中,也就是说每个数字的概率大约是25次(即1/6的150)。我们可以看到,4超出了25次,而2和3的次数则有所不足。这可能是由于我们的样本相对较少的原因。

让我们运行一个独立卡方测试用于此数据集上表中的变量。

大家对游戏有什么常见误解(从游戏引发的思考)(5)

然后,我们使用SciPyStats库运行测试

大家对游戏有什么常见误解(从游戏引发的思考)(6)

但提供的结果并不令人满意

大家对游戏有什么常见误解(从游戏引发的思考)(7)

这里需要补充的是,第一个值(16.49)是卡方统计量。输出中的第三个数字表示'自由度',这可以通过将行数减1并将该结果乘以列数减1来计算。

具体操作:

行=6[卷数据模具1-6]

栏=4[样本]

所以我们取(6-1)乘以(4-1)得到15"自由度"。

有了卡方统计量和自由度,我们就可以找到p值。根据测试的不同,我们通常希望p值在0.05或0.01阈值。如果我们得到的p值低于我们的阈值,则证明我们的检验是有意义的(即我们拒绝零假设)。

为了我们的计算,我们使用0.01作为阈值。在这个特殊的例子中,p值(输出中的第二个数字:0.3502)远大于0.01,因此我们没有达到我们的阈值。

我们已经了解了它的含义,我们可以在SciPyStats中创建更容易阅读的输出代码。

大家对游戏有什么常见误解(从游戏引发的思考)(8)

输出为

大家对游戏有什么常见误解(从游戏引发的思考)(9)

这里需要强调的是,我们的结果可能会与我们的"预期分布"有所差异,这是因为我们样本太小的原因。

运行一个大样本以获得预期的分布

我们可以运行一个更大的样本来了解这种方法是如何更好发挥作用的。这里我们将使用Python来执行此操作。我们需要np.random.randint和np.unique。在这里,作者做了5个样本,每个样本为1000个Die Roll Data。

大家对游戏有什么常见误解(从游戏引发的思考)(10)

然后通过np.unique保存结果。

大家对游戏有什么常见误解(从游戏引发的思考)(11)

现在,我们将我们的数组组合起来运行stats.chi2_contingency

大家对游戏有什么常见误解(从游戏引发的思考)(12)

让我们来做个测试。

大家对游戏有什么常见误解(从游戏引发的思考)(13)

这是结果。

大家对游戏有什么常见误解(从游戏引发的思考)(14)

可以看到,这次的结果更加接近我们的预测。

作者决定再做一次测试。这次测试为5个样本,每个样本为10000个Die Roll Data。

大家对游戏有什么常见误解(从游戏引发的思考)(15)

可以看到,样本数据已经极其接近了。

用卡方测试验证TS

现在,让我们回到这个游戏。

大家对游戏有什么常见误解(从游戏引发的思考)(16)

我们有两个样本:作者自己的Die Roll Data和他的对手Die Roll Data。我们的零假设是,它是随机分布的(即均匀分布)。

对于作者的数据,作者运行了279次。我们除以6求出预期分布(每个数为46.5)。在运行sciy.stats.chisquare时,要注意使参数的顺序正确;否则,将得到不准确的结果。第一个参数(F_Obs)用于"实际结果",而第二个参数(F_Exp)用于"预期结果"。

大家对游戏有什么常见误解(从游戏引发的思考)(17)

运行这个测试,我们得出p值为0.0037。

大家对游戏有什么常见误解(从游戏引发的思考)(18)

结果低于0.01。这意味着,如果骰子真的是随机的,那么我们看到这个结果的几率只有0.4%。

接下来让我们来看看作者对手的结果。作者的对手掷了303次。再一次,我们除以6,得到了50.5的预期分布。

大家对游戏有什么常见误解(从游戏引发的思考)(19)

我们发现了类似的结果。

大家对游戏有什么常见误解(从游戏引发的思考)(20)

我们的p值是0.0097,这表明,如果骰子是真正随机的,我们观察这种分布的可能性小于1%。

结论

卡方是比较分类数据结果的一个很好的工具。我们可以看到样本是如何偏离预期分布的。Python的SciPyStats库为运行卡方测试提供了很好的工具。

,