當人必須做出某個重要決策時,往往會根據幾個要素,譬如說個人經驗、直覺喜好、或是分析數據。
當然,經驗或直覺總是較主觀且難以量化。因此,現今在一定規模的企業或公司決策機關,自然會偏向利用數據來支撐決策,也就是所謂的讓數字說話。
在數據分析中,有一個蠻常會被用到的技巧叫做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)等。話說,決定樣本數本身就是一門學問,在這裡不會更深入討論。
決定好樣本數後,我們就可以開始隨機取樣。
我們需要兩個樣本群來做比較:
Control Group:我們會對這個群組使用版本A(現行版本)
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