tldr: 以轉換率為評估指標,介紹使用貝式測試的過程與場景
Q. A/B Testing ?
A/B Testing (也稱 Split testing) 是一個基於統計學的測試方法,先把用戶分成兩個組別 (A / B) 後,再分別給這兩群人不同的體驗,來觀察觀測指標後續的變化,進而評估哪個體驗 ( A / B) 較佳。常見的測試項目包含換了按鈕顏色是否能否提升網頁點擊率、增加一些刺激性文案 (e.g. 折扣倒數 30 分鐘) 是否能提升商品的購買率以及減少一些廣告是否能加用戶閱讀時間等等。我們可以用一個常見的測試流程和情境來說明一下什麼是 A/B Testing?
Step 1. 發想要測試的假設
設想一下自己是一個賣公仔的電商網站 PM,我們猜如果在每個公仔購買頁面上,加上一個新的指標 — 「同時瀏覽人數」,用戶就會因為怕別人搶走自己準備下單的老婆,而增加購買的機率。但我們其實不確定這個猜想是否成立,這時我們就可以透過「A/B testing」的來幫我們判斷結果。
Step 2. 開始實驗,蒐集結果:
首先如果我們現在要做一個測試時,我們就要確保用戶可以看到兩種不同頁面,一個是原先的 A 頁面 ,另一個則是加了新指標的 B 頁面 。當 A 組頁面被 10,000 人瀏覽產生 1,000 個訂單時,購買率為 10%,而 B 頁面被 10,000 人瀏覽產生 1,100 個訂單時,購買率為 11%。
Step3. 判斷結果:
而我們判斷實驗是否成功的條件就是 B 頁面的 11% 購買率是否明顯地比 A 頁面的 10% 購買率來得好,A 和 B 頁面中的 1% 差異是否足夠大到讓我們判斷結果。
而因為一個用戶只會看到一個頁面 ( A or B ),所以 A 和 B 頁面的購買率應該是完全獨立的。而「兩者獨立」這個性質可以讓我們拿來應用到一些統計學上的假設過程 (e.g. t 檢定)。進而去檢定上面這個「 1% 差異」是否已經足夠大到能判斷 B 頁面較好。
而我們常聽到的一些名詞如最小樣本需求、p-value、power 和 MDE 都是假設檢定過程出現會需要用到的參數或是條件。如果你還是不太清楚或是想瞭解更多的的話,可以參考 Lucas 大大寫過的測試介紹及注意事項。
https://medium.com/3pm-lab/how-to-select-metrics-for-your-ab-test-1c0be1e8e273
Q. Bayesian A/B Testing ?
在上高中數學時,我們應該在機率課上都接觸過「貝氏定理 Bayes’s Theorem*」,這邊就不提具體數學和公式 (多說多錯),但核心概念就是「有幾分證據說幾分話」,過去每一件事情都能用來累積經驗,有了這些經驗後,我們就能優化後續的判斷,也就是所謂的條件機率。而「Bayesian」就是在形容套用貝氏定理的概念所延伸出的方法。
Note: 如果你沒聽過或是已經忘記什麼是貝式定理的話,可以先右轉看一下李孟之前寫過的優質文章「從經驗中學習 — 直觀理解貝氏定理及其應用」。
從名字可以看到,所謂的 Bayesian A/B Testing 就是一般的 A/B Testing 加上貝式定理。傳統 A/B Testing 認為轉換率其實是一個固定值,之所以會有差異其實是來自於抽樣造成的誤差,所以我們可以透過更多的樣本數,來降低用樣本「轉換率」推估母體的誤差。而 Bayesian A/B Testing 算是打破這個概念,認為「轉換率」本身其實也是一個隨機數*。
我們可以透過一個數學式 (統計分配) 來描述我們現要評估的指標,這個例子是購買頁面的轉換率,而因為轉換率本身介於 0–1 之間,故我們常利用 Beta Distribution 這個較通用的分配來描述他,即轉換率 Conversion, CVR~Beta(a,b)。
Note: 想知道更多關於 Bayesian A/B Testing (Bayesian)和一般 A/B Testing (Frequentist) 的差別,可以參考 Quora 相關的討論串。
Note: 兩者轉換率的差異是我讀了幾篇文章後的理解,如果有任何錯誤的地方,求指教
Q. Bayesain A/B Testing 的好處 ?
在實作前,先來聊聊為什麼我們不用一般的 A/B 測試呢,而要換種方法呢?
- 實驗反饋更即時:在一般 A/B 測試的過程中,為了滿足「95 % 顯著」的設定,我們需要先設定「最小差異值」來推估我們所需要的樣本量 (最小樣本量)。而在實驗數量尚未滿足前,不論當前結果是 A 和 B 已經有明顯差異或無明顯差異,你都不能確定實驗的結果。而 Bayesain 沒有這個限制,若前期兩組的差異已經大到足夠你判斷的話,可以提前終止實驗決定結果,甚至用既有結果來更換事前機率,來迭代你的判斷。
- 流量較小的產品也能用:因為的「最小樣本數」的限制,流量不夠的公司在這種情況就會讓實驗週期拉得很長,進而產生各種干擾因素,影響實驗結果。但在 Bayesain 下,不論在小的樣本,都能持續拿來累積經驗,差別只是反應的速度,所以就不會受流量的限制。
- 更清楚差異到底是差多少:在一般 A/B 測試的過程中,如果實驗結果顯著,我們常會說 95% 機率下兩組確實有差異,但到底差異多大,而這個差異是否又有個範圍,就不容易知道。而在 Bayesain 下,因為沒有判斷假設的過程,所以不用分別討論 H0 (A 組) 和 H1 (B 組) 為真下的轉換率,而是直接比較兩組轉換率分配的差值,可以快速的產出容易溝通的結論 (e.g. 95% 的情況下,兩組轉換率差異會在 5–9 % 之間)
Q. 怎麼用 Bayesian A/B Testing ?
1. Why Beta distribution ?
上面我們提到可以用 Beta 分配來描述轉換率,除了是因為轉換率本身介於 0–1 之間這個性質外,也因為在 Bayesian 裡面有個概念叫做共軛分配(conjugate distributions),他假設了「轉換率」在實驗前和實驗後,都屬於相同的分配 。如果我們使用的事前分配剛好符合這個假設的話,我們就可以簡單的透過參數調整,將事前機率轉換成事後機率,進而計算出事前和事後轉換率的差異程度。而 Beta distribution 剛好符合這個性質,可以幫助我們更快的計算事後機率。
Note1: 如果你對為什麼事前轉換率屬於 Beta 分配,事後轉換率也屬於 Beta 分配的話,可以參考鐵人賽的一篇計算教學。
Note2: 又如果你現在要檢測的指標不是轉換率 (binary),而是一個用戶點擊次數( count ) 的話,可以參考連結裡的推導過程
2. Prior Beta distribution 的 a/b 參數怎麼選 ?
如果不知道怎麼調參數,或是沒有任何事前資訊的話,你可以讓 Beta(a,b) 裡面的 a == b == 1,這時候的 Beta 分配會等於 Uniform 分配,也就「轉換率」為任意數值的可能性都相同,用來表示你毫無事前資訊。
當然如果你有一個歷史的轉換率基準,也就是用戶購買率大概是 10%,也就是說用戶 10 次裡面有 1 次會去購買,這時候我們可以把參數 a 調成 1 (成功次數),參數 b 調成 9 (失敗次數)。
3. Python 實作
下面是上面例子的實作過程,分別用 A 和 B 的來區分兩個組別,從毫無過去經驗出發 ( beta(1,1) ),分別計算了兩個組別的轉換率分佈,最後透過一個簡單隨機過程比較兩個組別的大小以及差異程度。
4. 迭代
上面的實作的部分算是一次性實驗的計算過程,當我們已經做過一次實驗後,我們已經變得更聰明了,如果我們又想做一個基於組別 B 的優化過程,可能猜想會是除「同時瀏覽人數」外,我們也想加上「限時搶購」這個說法,進而產生新的實驗。
這時候我們的已經有了事前資訊,也就是上次實驗的結果,則我們可以設定我們的先驗機率為 beta(1,8),也就是 9 個人裡面就有 1 個人會購買,再往下評估新實驗的好壞。
感謝你的閱讀,如有問題,歡迎各種指教 :)
參考資料
- Nora Neumann — Usable A/B testing — A Bayesian approach
- 上面講者的投影片
- Easy as ABC: A Quick Introduction to Bayesian A/B Testing in Python (Will Barker)
- 五分鐘機率論-Beta 分布
- 2018 鐵人賽 — 機器學習你也可以 — 文組帶你手把手實做機器學習聖經
- The Power of Bayesian A/B Testing
- Bayesian A/B Testing with Python: the easy guide
- Probabilistic Programming & Bayesian Methods for Hackers