在實際業務中,咱們常常會遇到頻率類事件的假設檢驗,這類數據包括:留存率、點擊率、轉化率。咱們甚至能夠把大多數AB測試類的場景都理解爲「頻率的假設檢驗」。本文試圖建立一個通常性的頻率假設檢驗工具的EXCEL實現,並介紹其工做原理。文件參考這裏(https://github.com/threecifanggen/data-science-tools/blob/master/excel/%E4%BA%8C%E9%A1%B9%E5%88%86%E5%B8%83%E6%A3%80%E9%AA%8C.xlsx)。python
其實,在具體工做中,咱們都會遇到比例數據來做爲指標衡量一個數據,能夠大體將這些指標抽象成三類數據:正事件觸發次數/用戶數,觸發正事件的人數/人數,正事件觸發次數/總事件發生次數。咱們在文章中將以「平均發生次數」(Average Count)、「轉化率」(Transfer Rate)、「發生率」(Positive Rate)來表述這三類指標。git
名稱 | 平均發生次數 | 轉化率 | 發生率 |
---|---|---|---|
例子 | 人均成單量、人均點擊量 | 留存率、成單轉化率 | 按鈕點擊率、流程退出率 |
定義 | 正事件觸發次數/用戶數 | 觸發正事件的人數/用戶數 | 正事件觸發次數/總時間發生次數 |
建議場景 | 單次觸發具備實際意義; 和收入相關的內容; 較爲綜合的衡量產品的指標 |
與用戶運營相關的指標; 評價用戶粘性 |
判斷某個功能好壞; 與產品細節優化相關 |
數據分佈 | 指數分佈爲主,小几率爲泊松分佈 | 二項分佈(Beta分佈) | 二項分佈(Beta分佈) |
事實上,咱們單純從數學抽象上說,上面的比例數據,事實上能夠抽象爲兩類問題,一個是「每一個用戶具備一個觀測量」,比例事實上反應的是這個觀測量的平均值;另外一類則是「頻率」,反應的是一個事件發生的機率(只是這個頻率的維度是以事件爲主仍是用戶爲主)。咱們本文就限定在「頻率」這個抽象問題的範圍內,考慮如何比較兩組頻率的差別。理解了這個抽象,咱們能夠同時分析次留、轉化率、AB測試的數據。特別的,咱們採用的統計工具在如下場合,會比直接比較兩組的頻率更有效:github
首先,咱們能夠假設一個事件的發生頻率爲算法
$$f = X/N$$dom
其中,$X$爲正例發生次數,$N$則爲事件發生總次數。譬如,在留存率(次留)中,$X$表示第二日使用產品的用戶數,$N$表示計算當日的註冊用戶數。工具
咱們很容易地能夠作出假設:$X$屬於二項分佈,即:測試
$X \sim B(N, p)$優化
咱們如今能夠將其轉化爲兩組二項數據的比較。spa
這是最簡單能夠想到的方案。咱們假設兩組數據其參數分別爲$p_1$,$p_2$。則能夠創建以下假設:設計
則統計量$z$ 知足
$$z = \frac{\hat{p_1} - \hat{p_2}}{\sqrt{\hat{p}(1 - \hat{p})(\frac{1}{N_1} + \frac{1}{N_2})}}$$
其中,$\hat{p} = \frac{N_1\hat{p_1} + N_2\hat{p_2}}{N_1 + N_2}$
由於$z \sim N(0, 1)$,咱們就能夠基於這個計算出相應的顯著性值並進行比較。
能夠在Excel的這部分看到結果,其中顯著性大小咱們這裏分爲0,, , *,***,****, *****五檔,能夠基於不一樣的數據量調整判斷標準。
在大多數場合下,特別是指數分佈族內的分佈中,咱們通常會使用$Beta(\alpha, \beta)$分佈做爲先驗分佈,固然這麼選擇會有不少好處,首先:
接下來,咱們能夠基於兩組數據,來求出兩個$Beta$分佈,而後基於這兩個$Beta$分佈進行抽樣,抽樣的具體結果在Excel的這個位置:
而後抽樣結果的彙總數據,包括,每一個例子的值還有分佈,展現在這裏:
最後咱們能夠在這裏看結果,這裏提供如下指標,就是兩個比例的抽樣均值,還有就是給出兩組數據之間差值正負的比例($P(A>B)$、$P(B \ge A)$這兩項),差值的相關信息(包括平均數、方差、中位數)。基於這些量,咱們就能很容易作出兩組數據何者更好的
示例能夠參考這裏: https://github.com/threecifan...
AB測試的時候,咱們很想很快知道測試結果,由於某些測試自己可能會影響到功能、收入等狀況,這時候,咱們就須要知道什麼時候終止測試。而上面的貝葉斯的方案,能夠給咱們提供一個解決這一問題的發想。
首先,咱們要把AB測試的數據結果當作兩(或多)組時間序列數據,在快速測試時,咱們可能使用按分鐘的維度來監控這兩組數據。譬如咱們如今要測試兩個按鈕設計的點擊率,則須要統計每一分組內,每一個按鈕點擊次數和未點擊次數,譬如生成下列數據,一個是0.62機率一個0.65,咱們生成100個時間段的數據,且故意讓兩個數據很接近並且抽樣很是不平均。
import numpy as np from scipy.stats import binom, beta from plotnine import * from itertools import accumulate import pandas as pd n1, p1 = 10000, 0.62 n2, p2 = 10000, 0.65 seed_a = binom.rvs(1, p1, size=2000) seed_b = binom.rvs(1, p2, size=10000) np.random.shuffle(a) np.random.shuffle(b) a = [(sum(i==1), sum(i==0)) for i in np.array_split(seed_a, 100)] b = [(sum(i==1), sum(i==0)) for i in np.array_split(seed_b, 100)]
而後,咱們主要經過$max(P(p_a > p_b), P(p_a \le p_b))$,來判斷是否是具備顯著的差別。顯然,當這個值越接近於1,表示這抽樣數據裏面兩個組的數據有差異的可能性越大,咱們就能夠基於此來判斷是否能夠終止實驗。核心的抽樣算法實現以下,其中beta.rvs(a, b, size=n)
就表示生成n
個beta分佈的數據。而後咱們能夠應用貝葉斯的方法,很快地隨着每批數據進來快速地產生新的後驗機率並基於此抽樣。
def gennerate_avg(n=100000): def helper(row): res = np.sum( beta.rvs(row['a_x'] + 1, row['a_y'] + 1, size=n) > beta.rvs(row['b_x'] + 1, row['b_y'] + 1, size=n) ) / n return res if res >= 1 - res else 1 - res return helper
最後,咱們就能夠實時地展現兩幅圖,來動態判斷是否是有把握能夠終止實驗,作出判斷了。第一幅是兩個點擊率隨數據進來後,漸漸趨於穩定的比較圖,這張圖主要展現,此時a、b組點擊率的變化。只有當a、b組點擊率不發生明顯波動時,咱們才能作出判斷。這個是防止咱們過早地終止實驗。其次,這張圖也必定程度直觀告訴咱們,兩個點擊率哪一個大哪一個小。
第二幅圖則是$max(P(p_a > p_b), P(p_a \le p_b))$的演化圖,它衡量的是兩組數具備差別的可能性。咱們能夠添加咱們能容忍錯誤的可能性,好比下圖的綠線表示咱們的容忍底線0.999,即咱們保證抽樣的99.9%的數據都顯示出有一組大於另外一組的差別時,咱們就能夠終止實驗了。好比次例子中,咱們大體在第60分鐘時,就能夠終止實驗,而不須要積累大量數據。