top of page
Search
Learn with Shin

A/B Testing

Updated: Sep 22, 2021

當人必須做出某個重要決策時,往往會根據幾個要素,譬如說個人經驗、直覺喜好、或是分析數據。


當然,經驗或直覺總是較主觀且難以量化。因此,現今在一定規模的企業或公司決策機關,自然會偏向利用數據來支撐決策,也就是所謂的讓數字說話。


在數據分析中,有一個蠻常會被用到的技巧叫做A/B Testing。


這個聽起來好像很厲害的術語,我們今天就來跟大家一起聊一聊何謂A/B Testing,以及我們可以如何利用它將我們的專業提升一個層次。



故事例


在解釋A/B Testing之前,我們來看一個簡單(純虛構)故事例吧~。




本人經營一家放款公司💰,透過各個管道收集到了很多的電話號碼。

我行銷的方式就是透過寄簡訊,讓人家打電話回來再進行銷售😈。

因此,客人的回撥率是最重要的。

為了增加客人的回撥率,我準備了一個新的簡訊版本。跟現行的唯一不同點是最後加了一個親親笑臉emoji:😘

現在我在意的是,新的版本到底是不是會比現行的版本有更好的回撥率?

-------------------------------------

為了知道這一點,我決定做一些測試。

我隨便選了200個電話號碼,將新的版本寄給其中100個,另外100個則用原本的版本。

過了幾天後,我把結果做了一個統計,發現新的版本有5個人回撥。而舊的版本有4個人回撥。

我心想:喔耶!新的版本有5%的回撥率,現行版本只有4%!看來新版本比較有用,測試成功!

於是我二話不說改成新的版本寄給清單上所有的電話號碼~😋
-------------------------------------

故事先到這裡暫時停一下。


以上的故事我們看到,為了證明版本A比版本B有更好的表現,我所做的測試,就是A/B Testing的基本概念。A/B Testing也稱為Split Testing,因為它就是把目標群隨機拆開並個別予以測試。


對,就是這麽單純!相信大家可以想到一些工作上或是生活中的類似經驗吧?


故事繼續,



我將新的版本寄給所有的電話號碼,

過了幾天後,我興高采烈的將結果整理一下,結果....


實際回撥率居然只有...3.5%?

這不是跟原本的版本差不多,搞不好還更差一點?

為什麼我的測試結果不準😢?!!

-------------------------------------


故事到這裡做個結束~。


我們看到,實際出現的數字跟測試的數字有差距,大家覺得是為什麼呢?


聰明的你可能有想到,因為我們是採樣本,是不是樣本太小(只有100)導致結果不可靠?只是這批測試碰巧運氣好一點點?


重點是,我要怎麼知道我測試出來的結果是可以信賴的?或者是怎麼樣去正確的解釋?


上述故事老闆的作法顯然相當的直覺,但是實際工作上,我們可以用稍微更科學的方式,並更精確的解釋測試結果!


接下來,我們跟大家來一起看看實作上,A/B Testing如何利用統計來處理這個問題,當中一些部分我們可以順便用Python來操作看看 😉。



1:設定好你的假設


做A/B Test的第一步,就是要知道我們今天的測試的目的是什麼,在統計學上稱為假設檢定(hypothesis testing)。


假設什麼?


就如同故事中的我:假設新的版本應該有比較好回撥率(反過來說,如果你不是這麼認為,那就沒有測試的必要了,對吧?)。


在hypothesis testing中,我們會用做出兩個假設,以下面的表現方式:


Null Hypothesis ( H₀):假設測試的對象並無顯著差異(Statistical significance)。(就算結果看起來有不同也純粹是碰巧)。在上述的故事中則表示新的版本沒有比較高的回撥率。


Alternative Hypothesis (H𝑎):假設新的版本有比較好的回撥率。


通常我們主要的測試目的,就是想要去拒絕(reject)null hypothesis,證明這兩個版本的效用確實是有差異的(而不是碰巧而已)。



2:決定樣本數&取樣本


下一步,就是取樣本。樣本的大小在統計測試中是相當重要的。樣本數過小會產生所謂under coverage bias,導致結果不準確。當然,樣本越大準確性會越高,但是測試的成本也會增加。網路上有一些工具可以幫助我們決定樣本的大小🙂,你只需要給他一些參數,像是期望的信賴度(confidence level)等。話說,決定樣本數本身就是一門學問,在這裡不會更深入討論。


決定好樣本數後,我們就可以開始隨機取樣。


我們需要兩個樣本群來做比較:

  1. Control Group:我們會對這個群組使用版本A(現行版本)

  2. Test Group:我們會對這個群組使用版本B(新版本)


3:收集樣本結果


接著,就是實際將不同的版本用在不同的群組。並將結果做一個統計。為了方便Demo,直接使用以下的虛構資料吧。




資料本身非常的單純,只有兩的欄位 -- 群組名跟是否有回撥率。Control Group和Test Group各一千筆資料。



我們可以同時看一下基本的統計數據,像是平均數以及標準差:


4:測試假設


接著,就是利用這些數字來測試我們的假設。


參考以下的Code:

這裡我們會用到statsmodels這個library來幫助我們建立計算。proportions_ztest是我們會用到的測試模型。詳細可以參考這裡


首先第一步是將Control Group(現行版本的群組)跟Test Group(新版本的群組)分開來。

然後用proportions_ztest來算出P-value。



這裡來稍微解釋一下很重要的P-value。


P-value代表結果只是「碰巧」的機率。P-value越小代表你越有機會去拒絕null hypothesis。舉例來說,如果P-value為0.1,就代表我們有10%的機率,你的結果(譬如說,新的版本表現的比現行版本好這項測試結果)只是碰巧。理想上我們希望P-value低於0.05,代表我們有95%以上的信心它不是巧合,而是真的有差異。


還有一個很重要的概念,我們必須要去設定一個門檻(threshold)來決定是否可以拒絕null hypothesis。這個門檻稱作⍺(唸作alpha。代表顯著程度:significance level)。


如果P-value低於⍺,我們就可以去拒絕null hypothesis。這通常是我們想要的結果。


一般常用的⍺設定值為0.05,意思就是P-value必須低於0.05,我們才能夠拒絕null hypothesis。


在上面的例子中,我們算出的P-value為0.041,表示我們成功的拒絕新版本不會比現行版本好的假設(successfully reject null hypothesis)


另外,在這個例子中,我們用的是單尾(one-sided/tailed)的檢定,因為我們是比較新的版本是否會有較高的回撥率。如果是單純測試新版本是否有不同(可能較高或較低),那就會使用雙尾(two-sided/tailed)測試。詳細可參考wiki




除了P-value,我們還可以利用proportion_confit,來算出信賴區間:



信賴區間(confidence interval)代表我們在某種信心程度下,結果會落在的範圍。譬如說,上述的例子來看我們有95%的信心,新的版本回撥率會介於0.033 ~ 0.058。


5:解釋結果


最後我們把結果整理一下:


由於P-value(0.041)小於設定的⍺(0.05),我們成功的拒絕掉null hypothesis,證明新版本有較高的回撥率。而且我們有95%的信心,新版本的回撥率會落在0.33 ~ 0.059,相較於現行版本落在0.020 ~ 0.042。



小結


A/B Testing在各個領域都有被廣泛的利用,譬如行銷上測試網頁促銷廣告的Titile,按鈕的大小,顏色等,任何一個小變化都是測試的對象。理論上,能夠盡量縮小測試的項目(element)越能夠精準的找出最佳的配置。關於A/B Testing的作法與心法也有許多參考的資料。


實做測試時,有相當多的變數我們會去考量。上述的例子中,如果我們設定⍺為0.01的話,其實就無法拒絕null hypothesis。如果這是我們的決定,那case就很難進行下去,如果我們堅決⍺最少一定要0.01,那可能就得回去重來一次寫新的版本了😅。



Commentaires


Post: Blog2_Post
bottom of page