十幾年來,作者對棋盤遊戲還是保有極高的熱情。每過幾個月,就會用BoardGameGeek("BGG")下載當時深受好評的遊戲。其中,最喜歡的遊戲是"暮光城的鬥争"(Twilight Struggle)
"暮光城的鬥争"(下面簡稱TS)是一款以"冷戰"為主題的兩人戰略紙牌遊戲。從某些方面來說,這就像是國際象棋和撲克的結合。一方扮演美國,另一方扮演蘇聯。遊戲有着和真正的冷戰一樣的偏執感,因為你必須不斷地猜測你的對手可能有哪些牌,以及他們如何用這些牌傷害你。
卡牌技能在TS中是非常重要的,運氣在結果中也起着重要的作用。遊戲的變數包括政變、突發戰争和空間競賽等等,所有這些都是由Die Roll Data決定的。
幾年前,TS發布了在線版。在玩了幾百個網絡遊戲之後,作者決定嘗試創建一個運氣測量系統來評估結果。在這個過程中,收集了"政變"和"突發戰争"上的Die Roll Data結果。有了一個驚人的發現。
理解卡方測試
不過,我們首先得了解什麼是卡方測試。
卡方測試通常用來确定預期分布與實際分布之間是否存在顯著差異。它通常與教育程度、膚色或性别等分類數據一起使用。
骰子是一個非常适合卡方測試的例子。如果我們把骰子扔1000次,我們知道每個數字(朝上的概率)應該是大約1/6次(即16.66667%)。卡方檢驗可以幫助我們确定模具(骰子)是否"公平",或者根據骰子(模具)産生的結果是否"随機"。
然而,骰子中的"預期分布"是已知的。但現實中情況并不總是如此。有時,我們的"預期分布"是通過數據來估計的。
假設我們不知道我們"預期分布"的頻率。我們必須通過數據樣本來做出估計。作者決定手工做4個(卷數據模具)樣本,前3個樣本每個35卷,最後一個樣本為45卷。四個樣品用字母'a','b','c'和'd'表示。
總共有150卷,我們現在把它"放"入骰子中,也就是說每個數字的概率大約是25次(即1/6的150)。我們可以看到,4超出了25次,而2和3的次數則有所不足。這可能是由于我們的樣本相對較少的原因。
讓我們運行一個獨立卡方測試用于此數據集上表中的變量。
然後,我們使用SciPyStats庫運行測試
但提供的結果并不令人滿意
這裡需要補充的是,第一個值(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中創建更容易閱讀的輸出代碼。
輸出為
這裡需要強調的是,我們的結果可能會與我們的"預期分布"有所差異,這是因為我們樣本太小的原因。
運行一個大樣本以獲得預期的分布
我們可以運行一個更大的樣本來了解這種方法是如何更好發揮作用的。這裡我們将使用Python來執行此操作。我們需要np.random.randint和np.unique。在這裡,作者做了5個樣本,每個樣本為1000個Die Roll Data。
然後通過np.unique保存結果。
現在,我們将我們的數組組合起來運行stats.chi2_contingency
讓我們來做個測試。
這是結果。
可以看到,這次的結果更加接近我們的預測。
作者決定再做一次測試。這次測試為5個樣本,每個樣本為10000個Die Roll Data。
可以看到,樣本數據已經極其接近了。
用卡方測試驗證TS
現在,讓我們回到這個遊戲。
我們有兩個樣本:作者自己的Die Roll Data和他的對手Die Roll Data。我們的零假設是,它是随機分布的(即均勻分布)。
對于作者的數據,作者運行了279次。我們除以6求出預期分布(每個數為46.5)。在運行sciy.stats.chisquare時,要注意使參數的順序正确;否則,将得到不準确的結果。第一個參數(F_Obs)用于"實際結果",而第二個參數(F_Exp)用于"預期結果"。
運行這個測試,我們得出p值為0.0037。
結果低于0.01。這意味着,如果骰子真的是随機的,那麼我們看到這個結果的幾率隻有0.4%。
接下來讓我們來看看作者對手的結果。作者的對手擲了303次。再一次,我們除以6,得到了50.5的預期分布。
我們發現了類似的結果。
我們的p值是0.0097,這表明,如果骰子是真正随機的,我們觀察這種分布的可能性小于1%。
結論
卡方是比較分類數據結果的一個很好的工具。我們可以看到樣本是如何偏離預期分布的。Python的SciPyStats庫為運行卡方測試提供了很好的工具。
,