從《天堂 M》手遊機率爭議學會二項式檢定與 P-value 解讀

by 好豪
Published: Last Updated on

2021 年八月,實況主丁特在《天堂 M》手遊中製作機率性寶物,遊戲公司宣稱成功率 10%,結果在直播中萬名觀眾的共同見證下,475 次花費製作只有 11 次成功!引發所有人懷疑,官方公告的 10% 成功率是不是假的?

資料科學的愛好者們,我們可以用統計檢定來回答這個問題!

這篇文章主要是寫給正在學習如何做二項式檢定、以及還不熟悉 P-value 解讀的讀者,本文將會讓你透過這項有趣的爭議,讓你學會以下三件事:

  • 使用資料視覺化模擬抽獎成功率分佈
  • 算出此事件丁特的中獎率
  • 進行二項式檢定、了解 P-value 到底怎麼算

本篇也分享 Python 的分析與視覺化程式碼,放在 好豪的 Google Colab Notebook,給熱愛實作的朋友參考。

聲明:筆者撰文的 2022 年 2 月此時,爭論已暫告一段落,本文旨在探討統計學問題、而不是針對此爭議評論,對遊戲爭議有興趣的讀者請另行追蹤新聞進度 (˚∀˚)

故事背景

「實況主丁特日前豪砸 200 萬鑽石拼《天堂 M》紫布製作,認為該道具實際機率比官方提供的 10% 機率還要更低,多次喊話要求官方出面回應。」
「前後累積進行 471 次製作,卻只有成功 11 個,製作機率僅 2.3%,比韓版官方公告的 10% 還低。」
來源:4Gamers 網站

我們姑且用「抽獎」與「中獎」來代稱此事件中的紫布製作機制,丁特參與抽獎 475 次,總共中獎 11 次、成功率 2.3%,但是遊戲公司卻宣稱中獎機率是 10%,差異這麼大讓人難以相信。該怎麼用統計學來探討大家的懷疑呢?

首先,抽獎是二項式分佈,每次抽獎是只有中獎或沒中獎兩種可能的 伯努利試驗,而且每次抽獎都是獨立事件,不管你前幾次抽獎結果為何、下一次再抽獎中獎機率仍是 10% 不會變。

並且,此新聞爭議點在於,丁特懷疑實際機率比官方聲稱的機率更低,這就可以用二項式檢定(Binomial Test)來處理了。這項爭議用統計檢定來描述會變成:

  • 虛無假設 H0:中獎機率 p >= 10%
  • 對立假設 H1:中獎機率 p < 10%

值得一提的是,丁特懷疑的是實際機率比遊戲公司機率「更低」,所以我們採用單尾檢定;如果丁特的懷疑是機率「不同」,則可以改用雙尾檢定。

怎麼做數據模擬?

在我們開始算數學之前,我們先試試看模擬抽獎數據以及資料視覺化,初步理解抽獎結果的數據分佈。在此我們想看到的問題是:

如果很多人都跟丁特一樣進行「抽獎 475 次」這個動作
大多數人會中獎幾次?

我們可以用 10% 這個母體參數機率去模擬,得到結果會像是:

  • 玩家 A 抽獎 475 次,中獎 45 次
  • 玩家 B 抽獎 475 次,中獎 52 次
  • 玩家 C 抽獎 475 次,中獎 57 次
  • 以此類推

在 Python 的 numpy 套件,np.random.binomial() 這個函式會幫我們簡單地達成這項模擬,我們在函式引數內設定每人抽獎 475 次、母體參數機率 10%、還有試驗人數五百萬人之後,會得到以下結果:

製圖:好豪的 Python Notebook (以 Colab 開啟)

假設中獎機率真的如遊戲公司宣稱是 10%,在我們的 500 萬人模擬中,毫不意外地,最多數人集中在 45 ~ 49 次中獎之間。那麼,跟丁特一樣、或者比他運氣更差的人數呢?「抽獎 475 次,中獎次數少於或等於 11 次」的人數是 0!

還沒用上統計檢定,光是這樣的視覺化就讓我們更加懷疑 10% 不是真實的機率,等讀者讀完本文後,也會發現這項視覺化跟 P-value 的意義息息相關。

事實上,丁特遭遇到的「抽獎 475 次,只中獎次數 11 次」的慘案,這項事件機率是可以算出來的!我們下一個小節就來算算看。

(註:丁特與遊戲公司爭論的當時,臉書粉絲專頁 生活中的程式 做的模擬相當火紅,讀者也可以參考他的模擬方法與程式碼。)

機率怎麼手動計算?

稍早我們提過抽獎是二項式分佈,給定母體參數機率 p,我們可以算出 n 次抽獎之中恰好得到 k 次中獎的 機率質量函數 (PMF)如下:

P(X = k) = \binom{n}{k} p^k (1-p)^{n-k}

看到數學就頭痛嗎?筆者在此用一個簡單的範例來說明。假設小明抽獎 4 次,結果只中獎 1 次,中獎的排列總共有 \binom{4}{1} = 4 種可能:

  • 中獎、沒中、沒中、沒中,機率是 0.1 * 0.9 * 0.9 * 0.9
  • 沒中、中獎、沒中、沒中,機率是 0.9 * 0.1 * 0.9 * 0.9
  • 沒中、沒中、中獎、沒中,機率是 0.9 * 0.9 * 0.1 * 0.9
  • 沒中、沒中、沒中、中獎,機率是 0.9 * 0.9 * 0.9 * 0.1

於是 P(X = 1) 就是上面 4 種可能各自機率的加總。


現在我們以丁特新聞中的資訊來代入 p=0.1n=475k=11

P(X = 11) = \binom{475}{11} 0.1^{11} (1-0.1)^{475-11}

會算出結果是 0.00000000004,機率小於百億分之一

然而,統計方法並不是只算出這項機率就能做結論的,以下我們將看到 P-value 如何給出更完整的答案。

P-Value 怎麼算?怎麼解讀?

回顧丁特的故事背景,抽獎是二項式分佈,而我們使用 二項式檢定(Binomial Test)來檢驗:

  • 虛無假設 H0:中獎機率 p >= 10%
  • 對立假設 H1:中獎機率 p < 10%

檢驗方法與大家學過的大多統計檢定一樣,我們設定顯著水準 5%,P-value < 0.05 的話,就拒絕虛無假設,說明中獎機率實際上不到 10%。

筆者好豪認為,二項式檢定可以簡單手動算出 P-value,因此對理解 P-value 的意義特別有幫助!

我們先來複習一下 P-value 的正式定義:

假設虛無假說為真時,觀測到至少與實際觀測樣本相同極端的樣本的機率
來源:維基百科

相當拗口,對吧?如果你用丁特的這則新聞來想,就超級簡單:

  • 假設虛無假設為真:如果中獎機率真的是 10%
  • 與實際觀測樣本相同極端的樣本:475 次抽獎,中獎 11 次

我們在上一小節已經算出這項機率是 0.00000000004,但是這裡希望讀者特別注意的關鍵字是「至少」,P-value 並不是要算出觀測到我們手上資料的機率,還要包含比觀測樣本更極端的機率

丁特 475 抽獎之中只中獎 11 次,更極端的狀況就是中獎 10 次、9 次、一直到 0 次,換句話說,要計算 P-Value,我們需要計算以下這 12 個機率值:

P(X = 11) = \binom{475}{11} 0.1^{11} (1-0.1)^{475-11} = 0.00000000004
P(X = 10) = \binom{475}{10} 0.1^{10} (1-0.1)^{475-10} = 0.000000000008
P(X = 9) = \binom{475}{9} 0.1^{9} (1-0.1)^{475-9} = 0.0000000000015

P(X = 3) = \binom{475}{3} 0.1^{3} (1-0.1)^{475-3} = 0.00000000000000000448
P(X = 2) = \binom{475}{2} 0.1^{2} (1-0.1)^{475-2} = 0.00000000000000000026
P(X = 1) = \binom{475}{1} 0.1^{1} (1-0.1)^{475-1} = 0.00000000000000000001
P(X = 0) = \binom{475}{0} 0.1^{0} (1-0.1)^{475-0} = 0.00000000000000000000

把以上這些加起來的 0.000000000046,就是二項式檢定的 P-value 了!既然這個 P-value 小於 0.05,我們就拒絕虛無假設,認為機率並不是 >= 10%。

製圖:好豪的 Python Notebook (以 Colab 開啟)

這個 P-value 告訴我們:如果 10% 的中獎機率為真,我們得到手上這項「475 抽獎只中獎 11 次」資料、再加上比它更極端狀況的機率總和,小於百億分之一,因為 P-value 小於 5% 所以我們拒絕虛無假設。

結語

筆者好豪在 2021 年面試過許多個 資料科學家職缺 後,有機會跟多位資深面試官聊天,其中不只一人告訴我:「有不少人連 P-value 的意思都解釋不清楚,這種人直接拒絕錄取!」。

P-value 是假設檢定的必備觀念,這篇文章從視覺化與模擬介紹資料直覺,導引出二項式檢定如何手動算出各項機率與 P-value,並在 我的 GitHub 分享計算過程的所有 Python 程式碼,希望幫助各位讀者在親手算出 P-value 之後,能更理解它的意義。

正在研讀統計學的讀者,我相信以下幾篇文章分享也能幫助到你,推薦你繼續閱讀:

文末也再次簡短聲明,我對遊戲公司以及實況主之間的爭論毫無個人評論,單純是透過此事件多練習一點統計學而已 (˚∀˚) 。

參考資料:


如果這篇文章有幫助到你,歡迎追蹤好豪的 Facebook 粉絲專頁,我會繼續分享資料科學與統計學;也可以點選下方按鈕,把這篇文章分享給想進一步搞懂 P-value 的朋友們。

推薦閱讀