Bayesian Data Analysis and Modeling (with R code)
貝氏定理(Bayes' Theorem), 這個過去我們在研讀統計學的條件機率時,才會被稍微帶過的統計理論, 在近年來越來越受各界的重視與關注, 甚至在歐美國家有學者建議傳統以"Frequentist"
statistics為基礎的統計教學,應該改用貝氏統計理論取代!
會重新關注並開始學習Bayesian Statistics, 是翻閱了Nate Silver的The Signal and the Noise : Why So
Many Predictions Fail--but Some Don't (中文書名: 精準預測:如何從巨量雜訊中,看出重要的訊息?)
Google這本書,就會看到非常多中英文評論大力推薦, 就不在這贅述, 而當初會翻閱的原因, 是想看看書裡面有沒透露甚麼不一樣的預測模型? 這是一本非技術性的商業文章, 書中提到大量的想法和案例故事, 但是對於如何進行預測與模型建立的細節, 其實是付之闕如的, 而唯一提到的一個方法論, 就是Bayesian Statistics 也因如此, 開始了我Bayesian Data Analysis的學習旅程。
Machine Learning vs. Bayesian Statistics
機器學習(Machine Learning)技術的一個核心概念是,透過不斷地累積對資料的觀察, 電腦可以透過演算法, 自動演進對於學習標的的理解; 而在傳統程式開發上, 若要對新的資訊進行處理, 則是需要透過程式碼的修改, 才能讓電腦處理之前系統程式中沒有考慮到的部分。在這一個部分, Bayesian Statistics有著相似的概念。以統計學中最常使用的丟銅板為例, 推算一個銅板出現正面的機率, 是依照累積觀察每次丟銅板出現正面的次數, 計算在觀察到的實際資訊下銅板出現正面的機率:
上圖是Bayesian updating of probability distributions using the Beta-Binomial
Model: 一開始[銅板出現正面的機率]是Uniform distribution, 接下來丟2次銅板,均出現正面, 因此我們調整了[銅板出現正面的機率]傾向- biased towards heads. 隨著丟銅板的次數不斷增加累積, 我們也不斷根據新的資料調整機率資訊, 經過了500次的丟擲, 銅板出現正面的probability density接近於中間50%的位置。(詳細推導可參考這篇文章)
個人很喜歡下面這段, 節錄自Doing
Bayesian Data Analysis一書中, 對Bayesian Statistics的核心邏輯所下的定義:
隨著電腦運算能力的大幅進步, 使得過去Bayesian Statistics十分難以處理的複雜運算過程得以獲得解決,而能夠開始運用在各種實際案例分析中, 這也是近來為何Bayesian analysis獲得熱門關注的原因之一。接下來我將舉一個實際例子來闡釋Bayesian analysis, 並介紹貝氏統計中一個非常重要的基礎, 但是卻很少有詳細解說的Beta分配。
Introduction to Beta Distribution
以下的內容與程式碼主要翻譯自David Robinson的這篇post, 本篇文章主要為研讀之後的整理和其他個人發想。
在學習統計分配(Distribution)時, 一般通常都能看到像是the Normal, the Binomial, and the Poisson distribution的架構和應用, 但是Beta distribution? 我第一次看到它是在Bayesian Statistics的書籍。Beta distribution在貝氏統計中主要扮演著prior probability的角色:
In short, the beta distribution can be understood as representing a probability distribution of probabilities- that is, it represents all the possible values of a probability when we don’t know what that probability is.
這段話的重點就在於Beta Distribution代表的是某件未知事件發生機率的機率分配。
平常應用上, 我們其實不太會care未知事件發生機率的機率, 因為用起來意義不大。舉氣象預報來說, 目前的氣象APP, 除了預報未來天氣狀況外, 通常還會附帶提供機率數值, 例如預報週二是雨天, 旁邊還會加個80%這樣的一個數字。看到這樣的訊息, 我們就會直覺解讀明天八成要下雨了。只是我們一般不會再進一步關心, 80%下雨的機率是多少? 甚或是0%或100%下雨的發生機率又會是多少? 那麼Beta distribution的應用會是甚麼?? 讓我們回到原Post中的棒球賽案例。
在棒球比賽中, 打擊率是一個用來評估打者成績的指標, 打擊率 = 選手擊出的安打數除以打數, 所以打擊率介於0~1之間。一般職業棒球選手的平均打擊率大約為0.26, 打擊率在0.3以上的就是一名出色的打者。
現在,我們要進行預測某一位棒球選手這一季的打擊率。可能的作法是 - 採用球員到目前為止的打擊表現, 但這方法在球季的一開始會是個很差的評估指標! 如果打擊者本季第一次上場打擊就擊出了安打, 那他的打擊率=1, 反之就為0. 這個現象即使經過5,6次上場打擊之後依然不會有很大的改善, 球員有可能非常幸運連續6次都擊出安打 - 打擊率依然=1, 或是連6次登板都揮不到球而一直抱鴨蛋。這兩種狀況計算出來的打擊率都讓我們無法有效的預測評估出這位棒球選手這一季的打擊表現。
為何我們認為打者前幾次的打擊狀況, 對於球員整季的打擊表現來說, 不會是一個好的預測數值? 為何當一個打者連續6次登板都無法擊出安打時, 我們不會就斷定他整季都無法擊出一支安打? 因為我們對於這個球員有prior expectations. 我們知道, 以過去歷史經驗來看, 大部分球員的平均打擊率大約落在0.215~0.360之間, 只有極少部份的例外狀況會落在極端邊界值。若打者一開始幾次上場打擊不佳, 我們或許會推斷這位球員本季的打擊率可能低於平均打擊率, 但不大可能脫離平均區間太多。
我們可以使用Binomial distribution(a series of successes and failures- N個獨立的成功/失敗試驗中成功的次數的機率分布)來處理上列的打擊率問題。而能夠表達這個prior expectations(在貝氏統計稱之為prior)的最佳選項, 就是Beta distribution. 也就是說, 在球季一開始球員還未進行他的第一次揮擊前, 我們對於打者的打擊率粗略估計。我們不在此詳細地解說此適用性的數學推導過程(請自行google “bayes beta binomial”), 我們只要知道的是, Beta distribution和機率(probability)一樣介於0~1之間 ,然後,我們就可以繼續進行接下來的分析預測。
我們預期球員A本季的打擊率介於0.21~0.35之間, 並且最有可能=0.27. 我們可以使用Beta distribution(參數α=81 and β=219)來表示這個推測:
基於下列兩個原因選定參數α=81 and β=219:
關於如何計算α 和 β, 可參考另一篇讀者詢問的session, David Robinson有一個較為簡單的答覆。另外在Doing Bayesian DataAnalysis的Chapter 6, 有詳加說明如何利用beta density 的mean和variance推算出α 和 β.在學習統計分配(Distribution)時, 一般通常都能看到像是the Normal, the Binomial, and the Poisson distribution的架構和應用, 但是Beta distribution? 我第一次看到它是在Bayesian Statistics的書籍。Beta distribution在貝氏統計中主要扮演著prior probability的角色:
In short, the beta distribution can be understood as representing a probability distribution of probabilities- that is, it represents all the possible values of a probability when we don’t know what that probability is.
這段話的重點就在於Beta Distribution代表的是某件未知事件發生機率的機率分配。
平常應用上, 我們其實不太會care未知事件發生機率的機率, 因為用起來意義不大。舉氣象預報來說, 目前的氣象APP, 除了預報未來天氣狀況外, 通常還會附帶提供機率數值, 例如預報週二是雨天, 旁邊還會加個80%這樣的一個數字。看到這樣的訊息, 我們就會直覺解讀明天八成要下雨了。只是我們一般不會再進一步關心, 80%下雨的機率是多少? 甚或是0%或100%下雨的發生機率又會是多少? 那麼Beta distribution的應用會是甚麼?? 讓我們回到原Post中的棒球賽案例。
在棒球比賽中, 打擊率是一個用來評估打者成績的指標, 打擊率 = 選手擊出的安打數除以打數, 所以打擊率介於0~1之間。一般職業棒球選手的平均打擊率大約為0.26, 打擊率在0.3以上的就是一名出色的打者。
現在,我們要進行預測某一位棒球選手這一季的打擊率。可能的作法是 - 採用球員到目前為止的打擊表現, 但這方法在球季的一開始會是個很差的評估指標! 如果打擊者本季第一次上場打擊就擊出了安打, 那他的打擊率=1, 反之就為0. 這個現象即使經過5,6次上場打擊之後依然不會有很大的改善, 球員有可能非常幸運連續6次都擊出安打 - 打擊率依然=1, 或是連6次登板都揮不到球而一直抱鴨蛋。這兩種狀況計算出來的打擊率都讓我們無法有效的預測評估出這位棒球選手這一季的打擊表現。
為何我們認為打者前幾次的打擊狀況, 對於球員整季的打擊表現來說, 不會是一個好的預測數值? 為何當一個打者連續6次登板都無法擊出安打時, 我們不會就斷定他整季都無法擊出一支安打? 因為我們對於這個球員有prior expectations. 我們知道, 以過去歷史經驗來看, 大部分球員的平均打擊率大約落在0.215~0.360之間, 只有極少部份的例外狀況會落在極端邊界值。若打者一開始幾次上場打擊不佳, 我們或許會推斷這位球員本季的打擊率可能低於平均打擊率, 但不大可能脫離平均區間太多。
我們可以使用Binomial distribution(a series of successes and failures- N個獨立的成功/失敗試驗中成功的次數的機率分布)來處理上列的打擊率問題。而能夠表達這個prior expectations(在貝氏統計稱之為prior)的最佳選項, 就是Beta distribution. 也就是說, 在球季一開始球員還未進行他的第一次揮擊前, 我們對於打者的打擊率粗略估計。我們不在此詳細地解說此適用性的數學推導過程(請自行google “bayes beta binomial”), 我們只要知道的是, Beta distribution和機率(probability)一樣介於0~1之間 ,然後,我們就可以繼續進行接下來的分析預測。
我們預期球員A本季的打擊率介於0.21~0.35之間, 並且最有可能=0.27. 我們可以使用Beta distribution(參數α=81 and β=219)來表示這個推測:
library(ggplot2)
library(dplyr)
sim <- data.frame(a = c(81, 82, 81 + 100),
b = c(219, 219, 219 + 200)) %>%
group_by(a, b) %>%
do(data.frame(x = seq(0, 1, .001), y = dbeta(seq(0, 1, .001), .$a, .$b))) %>%
mutate(Parameters = paste0("alpha = ", a, ", beta = ", b)) %>%
ungroup %>%
mutate(Parameters = factor(Parameters, levels = unique(Parameters)))
sim %>% filter(a == 81) %>%
ggplot(aes(x, y, color = Parameters)) + geom_line() +
xlim(0, .5) + ylab("Density of beta")
圖一 |
基於下列兩個原因選定參數α=81 and β=219:
- Beta distribution的平均值(mean)= α/(α+β) = 81/(81+219) = 0.27
- 從上圖可以發現, 大部分的分佈面積介於0.21~0.35之間
我們可以用R檢驗推算出的α 和 β其mean是否為0.27, 以及其相對應的variance
上圖一的X軸代表該名球員的打擊率, Y軸為probability density; X軸的打擊率, 其實也可以稱之為安打的機率(a probability of a hit), 因此回到文章一開始對於Beta distribution的定義, 就可以了解這段文字的內容所表達的意義了:
The beta distribution is representing a probability distribution of probabilities.
接下來,我們將使用此Beta distribution來進行本季打者的打擊率預估。假設球員A
本季第一次上場打擊並成功擊出了安打; 此時, 我們可以根據此紀錄更新我們的Beta distribution – 我們將移動圖一中的曲線以反映我們新取得之資訊。背後的數學推演些許繁複(請參考: Conjugate prior), 但是結果卻相當簡單. 更新後的Beta distribution =Beta(α0 + hits,β0 + misses)
α0 和 β0就是一開始計算出來的81和219, 在第一次上場打擊例子中, hits=1, misses=1, 因此新的Beta distribution = Beta(81+1,219+0):
sim %>% filter(a < 100) %>%
ggplot(aes(x, y, color = Parameters)) + geom_line() +
xlim(0, .5) + ylab("Density of beta")
圖二: Beta distribution after 1 hit |
然而,隨著球員A上場的打擊次數增加, Beta distribution曲線除了會不斷地移動以反映新的打擊紀錄之外, 曲線還會漸漸地變窄 – 表示我們漸漸地確定球員A本季的打擊率會落在甚麼位置。假設到了球季中期, 球員A已經上場打擊了300次, 並擊出了100支安打, 此時的Beta distribution 將變成= Beta(81+100,219+200):
sim %>% ggplot(aes(x, y, color = Parameters)) + geom_line() +
xlim(0, .5) + ylab("Density of beta")
圖三: Beta distribution after 300 bats |
圖三中300次打擊的曲線(alpha=181)相對初始的曲線(alpha=81), 往右移動了一段距離 – 反應較高的打擊率, 而且形態上也變得更高窄 - 反應出我們對於球員A打擊率的預測精準度和信心的提升。
最後, 我們來看看更新後的Beta distribution預估打擊率期望值。如上所述, Beta distribution的期望值(expected value) = α/(α+β) ,因此After 300次打擊後取得之Beta distribution,它的預估值= (81+100) / ((81+100) + (219+200)) = 0.302. 這個數字小於只用實際本季打擊資訊計算得出的0.333(100/300), 但卻高於初期我們對於球員A的打擊率預估0.27 (81/(81+219)).
結論, Beta distribution最佳應用, 是在機率分配問題上的方法 – 我們一開始並不清楚未知事件發生的機率是多少, 但我們根據過往的經驗,有一些合理的猜測或經驗數值。
在這篇post我們也清楚地看到了Bayesian Statistics的特性 – 根據不斷產生的新資訊, 持續更新我們對於不確定事物的預估推測。
by J.D.