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%、還有試驗人數五百萬人之後,會得到以下結果:

假設中獎機率真的如遊戲公司宣稱是 10%,在我們的 500 萬人模擬中,毫不意外地,最多數人集中在 45 ~ 49 次中獎之間。那麼,跟丁特一樣、或者比他運氣更差的人數呢?「抽獎 475 次,中獎次數少於或等於 11 次」的人數是 0!
還沒用上統計檢定,光是這樣的視覺化就讓我們更加懷疑 10% 不是真實的機率,等讀者讀完本文後,也會發現這項視覺化跟 P-value 的意義息息相關。
事實上,丁特遭遇到的「抽獎 475 次,只中獎次數 11 次」的慘案,這項事件機率是可以算出來的!我們下一個小節就來算算看。
(註:丁特與遊戲公司爭論的當時,臉書粉絲專頁 生活中的程式 做的模擬相當火紅,讀者也可以參考他的模擬方法與程式碼。)
機率怎麼手動計算?
稍早我們提過抽獎是二項式分佈,給定母體參數機率 p,我們可以算出 n 次抽獎之中恰好得到 k 次中獎的 機率質量函數 (PMF)如下:
\(P(X = k) = {n \choose k} p^k (1-p)^{n-k}\)看到數學就頭痛嗎?筆者在此用一個簡單的範例來說明。假設小明抽獎 4 次,結果只中獎 1 次,中獎的排列總共有 \({4 \choose 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.1
、n=475
、k=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) = {475 \choose 11} 0.1^{11} (1-0.1)^{475-11} = 0.00000000004\)
\(P(X = 10) = {475 \choose 10} 0.1^{10} (1-0.1)^{475-10} = 0.000000000008\)
\(P(X = 9) = {475 \choose 9} 0.1^{9} (1-0.1)^{475-9} = 0.0000000000015\)
…
\(P(X = 3) = {475 \choose 3} 0.1^{3} (1-0.1)^{475-3} = 0.00000000000000000448\)
\(P(X = 2) = {475 \choose 2} 0.1^{2} (1-0.1)^{475-2} = 0.00000000000000000026\)
\(P(X = 1) = {475 \choose 1} 0.1^{1} (1-0.1)^{475-1} = 0.00000000000000000001\)
\(P(X = 0) = {475 \choose 0} 0.1^{0} (1-0.1)^{475-0} = 0.00000000000000000000\)
把以上這些加起來的 0.000000000046
,就是二項式檢定的 P-value 了!既然這個 P-value 小於 0.05,我們就拒絕虛無假設,認為機率並不是 >= 10%。

這個 P-value 告訴我們:如果 10% 的中獎機率為真,我們得到手上這項「475 抽獎只中獎 11 次」資料、再加上比它更極端狀況的機率總和,小於百億分之一,因為 P-value 小於 5% 所以我們拒絕虛無假設。
結語
筆者好豪在 2021 年面試過許多個 資料科學家職缺 後,有機會跟多位資深面試官聊天,其中不只一人告訴我:「有不少人連 P-value 的意思都解釋不清楚,這種人直接拒絕錄取!」。
P-value 是假設檢定的必備觀念,這篇文章從視覺化與模擬介紹資料直覺,導引出二項式檢定如何手動算出各項機率與 P-value,並在 我的 GitHub 分享計算過程的所有 Python 程式碼,希望幫助各位讀者在親手算出 P-value 之後,能更理解它的意義。
正在研讀統計學的讀者,我相信以下幾篇文章分享也能幫助到你,推薦你繼續閱讀:
文末也再次簡短聲明,我對遊戲公司以及實況主之間的爭論毫無個人評論,單純是透過此事件多練習一點統計學而已 (˚∀˚) 。
參考資料:
- 工具書《資料科學家的實用統計學》:示範 Python 的 Scipy 套件進行模擬與統計檢定
- YouTube:遊戲開發者分享事件觀點
- YouTube:李祥數學 用信賴區間的方式來做此事件的統計檢定
- YouTube:StatQuest Binomial Test Explained
- 生活中的程式 模擬方法分享
如果這篇文章有幫助到你,歡迎追蹤好豪的 Facebook 粉絲專頁,我會繼續分享資料科學與統計學;也可以點選下方按鈕,把這篇文章分享給想進一步搞懂 P-value 的朋友們。