在理论业务中,咱们常常会遇到频率类事件的假设检验,这类数据包含:留存率、点击率、转化率。咱们甚至能够把大多数 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)。
定义问题
其实,在具体工作中,咱们都会遇到比例数据来作为指标掂量一个数据,能够大抵将这些指标形象成三类数据:正事件触发次数 / 用户数 , 触发正事件的人数 / 人数 , 正事件触发次数 / 总事件产生次数 。咱们在文章中将以「均匀产生次数」(Average Count)、「转化率」(Transfer Rate)、「发生率」(Positive Rate) 来表述这三类指标。
名称 | 均匀产生次数 | 转化率 | 发生率 |
---|---|---|---|
例子 | 人均成单量、人均点击量 | 留存率、成单转化率 | 按钮点击率、流程退出率 |
定义 | 正事件触发次数 / 用户数 | 触发正事件的人数 / 用户数 | 正事件触发次数 / 总工夫产生次数 |
倡议场景 | 单次触发具备实际意义; 和支出相干的内容; 较为综合的掂量产品的指标 |
与用户经营相干的指标; 评估用户粘性 |
判断某个性能好坏; 与产品细节优化相干 |
数据分布 | 指数分布为主,小概率为泊松散布 | 二项分布(Beta 散布) | 二项分布(Beta 散布) |
问题形象
事实上,咱们单纯从数学形象上说,下面的比例数据,事实上能够形象为两类问题,一个是「每个用户具备一个观测量」,比例事实上反馈的是这个观测量的平均值;另一类则是「频率」,反馈的是一个事件产生的概率(只是这个频率的维度是以事件为主还是用户为主)。咱们本文就限定在「频率」这个形象问题的范畴内,思考如何比拟两组频率的差别。了解了这个形象,咱们能够同时剖析次留、转化率、AB 测试的数据。特地的,咱们采纳的统计工具在以下场合,会比间接比拟两组的频率更无效:
- 当抽样 数据过小 时或极度 不均衡 时。譬如在产品仅在冷启动期间,这时候的流量绝对较小,单纯比拟频率容易有抽样误差;
- 疾速决策的时候,特地地,须要 决定何时终止 比拟的时候。譬如,在每单位工夫老本极大的时候,如果进行 AB 测试,须要很快失去后果,终止测试。如果应用间接比拟频率,咱们往往无奈做出何时终止测试的判断,上面的办法(特地是基于贝叶斯的办法)能够很快地在验证胜利之后终止测试。
数学工具
首先,咱们能够假如一个事件的产生频率为
$$f = X/N$$
其中,$X$ 为正例产生次数,$N$ 则为事件产生总次数。譬如,在留存率(次留)中,$X$ 示意第二日应用产品的用户数,$N$ 示意计算当日的注册用户数。
咱们很容易地能够做出假如:$X$ 属于二项分布,即:
$X \sim B(N, p)$
咱们当初能够将其转化为两组二项数据的比拟。
计划一:假设检验
这是最简略能够想到的计划。咱们假如两组数据其参数别离为 $p_1$,$p_2$。则能够建设如下假如:
- H0: $p_1 = p_2$
- H1: $p_1 \ne 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)$ 散布作为先验散布,当然这么抉择会有很多益处,首先:
- 当 $\alpha$,$\beta$ 足够大时,$Beta(\alpha, \beta) \rightarrow B(\alpha + \beta, \frac{\alpha}{\alpha + \beta})$。这样咱们就能够刻画出以二项分布扩大的任何散布。
- 其次,当先验散布为 $Beta(\alpha, \beta)$,且新的察看量 $N$ 中,有 $k$ 个正例。则其后验散布能够算出为 $Beta(\alpha + k, \alpha + N – k)$,计算非常简单。
- $Beta(1, 1)$ 为均匀分布,十分不便的能够作为无信息的先验散布。
接下来,咱们能够基于两组数据,来求出两个 $Beta$ 散布,而后基于这两个 $Beta$ 散布进行抽样,抽样的具体后果在 Excel 的这个地位:
而后抽样后果的汇总数据,包含,每个例子的值还有散布,展现在这里:
最初咱们能够在这里看后果,这里提供以下指标,就是两个比例的抽样均值,还有就是给出两组数据之间差值正负的比例($P(A>B)$、$P(B \ge A)$ 这两项),差值的相干信息(包含平均数、方差、中位数)。基于这些量,咱们就能很容易做出两组数据何者更好的
AB 测试的一个动静推广
示例能够参考这里: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 分钟时,就能够终止试验,而不须要积攒大量数据。