在实际业务中,我们经常会遇到频率事件的假设检验,这类数据包括:留存率、点击率、转化率。我们甚至可以将大多数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)。定义问题其实在具体的工作中,我们都会遇到比例数据作为衡量一个数据的指标。这些指标大致可以抽象为三类数据:正面事件触发数/用户数、人数/正面事件触发数、正面事件触发数。事件触发器/事件发生总数。在本文中,我们将使用“平均计数”、“传输率”和“正率”来描述这三类指标。名称平均发生次数转化率发生率示例人均订单量、人均点击量留存率、订单转化率按钮点击率、流程退出率定义正面事件触发次数/用户数正面事件触发人数/用户数正面事件触发次数/总发生次数表明场景的单一触发具有实际意义;与收入相关的内容;更全面的产品衡量指标和用户运营相关指标;评估用户粘性来判断一个功能的好坏;与产品细节优化相关的数据分布以指数分布为主,小概率为泊松分布。二项分布(Beta分布)。二项分布(Beta分布)。两类问题,一种是“每个用户都有一个观察”,比例其实反映的是这个观察的平均值;另一个是“频率”,它反映了事件发生的概率(只有这个频率维度是基于事件或基于用户的)。在这篇文章中,我们将把自己局限在“频率”这个抽象问题上,考虑如何比较两组之间的频率差异。理解了这个抽象之后,我们就可以同时分析留存、转化率、AB测试的数据。特别是,当样本数据很少或极度不平衡时,我们使用的统计工具比直接比较两组的频率更有效。比如当产品刚处于冷启动期时,此时的流量比较小,简单的比较频率容易出现采样错误;在做出快速决定时,尤其是在需要决定何时终止比较时。例如,当单位时间的成本非常高时,如果进行AB测试,需要快速得到结果并终止测试。如果我们直接比较频率,往往无法判断何时结束测试。以下方法(尤其是基于贝叶斯的方法)可以在验证成功后快速终止测试。数学工具首先,我们可以假设一个事件的频率为$$f=X/N$$,其中$X$是阳性案例的数量,$N$是事件的总数。比如在留存率(二次留存)中,$X$表示第二天使用该产品的用户数,$N$表示计算当天的注册用户数。我们可以很容易地做出一个假设:$X$属于二项分布,即:$$X\simB(N,p)$$我们现在可以将其转化为两组二项式数据的比较。场景1:假设检验这是最简单的可以想象的场景。我们假设两组数据的参数分别为$p_1$和$p_2$。那么可以成立如下假设:H0:$p_1=p_2$H1:$$p_1\nep_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\simN(0,1)$,我们可以据此计算出对应的显着性值并进行比较.在Excel中可以看到这部分的结果,其中显着性分为0、*、**、、、***、****、*****五个级别,可以根据不同进行调整数据量判断标准。解法二:贝叶斯估计在大多数情况下,尤其是指数分布族内的分布,我们一般使用$Beta(\alpha,\beta)$分布作为先验分布。当然,选择这种方式有很多好处,首先:当$\alpha$,$\beta$足够大时,$$Beta(\alpha,\beta)\rightarrowB(\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\geA)$这两项),差异信息(包括均值,方差,中位数)。基于这些数量,我们可以很容易地做出两组数据哪个更好的AB测试的动态提升示例。可以参考这个:https://github.com/threecifan...在进行AB测试的时候,我们真的很想尽快知道测试结果,因为有些测试本身可能会影响到功能、收益等。这个时候,我们需要知道何时终止测试。上面的贝叶斯解可以为我们提供解决这个问题的思路。首先,我们需要将AB测试的数据结果看成两组(或多组)时间序列数据。在快速测试的时候,我们可能会用分分钟的维度来监控这两组数据。比如我们要测试两个按钮设计的点击率,我们需要统计每组中每个按钮的点击次数和未点击次数。比如生成如下数据,一个是0.62概率,一个是0.65。我们生成100个时间段的数据,故意让两个数据很接近,采样很不均匀。importnumpyasnpfromscipy.statsimportbinom,betafromplotnineimport*fromitertoolsimportaccumulateimportpandasaspdn1,p1=10000,0.62n2,p2=10000,0.65seed_a=binom.rvs(1,p1,size=200b=0)seed_binom.rvs(1,p2,size=10000)np.random.shuffle(a)np.random.shuffle(b)a=[(sum(i==1),sum(i==0))foriinnp.array_split(seed_a,100)]b=[(sum(i==1),sum(i==0))foriinnp.array_split(seed_b,100)]然后,我们主要通过$max(P(p_a>p_b),P(p_a\lep_b))$,判断是否存在显着差异。显然,当这个值越接近1,意味着采样数据中两组的数据越有可能不同,我们可以据此判断是否可以终止实验。核心采样算法实现如下,其中beta.rvs(a,b,size=n)表示生成n个beta分布的数据。然后,我们可以应用贝叶斯方法,根据每批数据和样本快速生成新的后验概率。defgenerate_avg(n=100000):defhelper(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))/nreturnresifres>=1-reselse1-resreturnhelper最后我们可以显示两张图片,动态判断是否确定可以终止实验,已经做出判断。第一张是数据进来后逐渐趋于稳定的两组点击率对比图,这张图主要展示了此时a组和b组点击率的变化。只有当a组和b组的点击率没有明显波动时,我们才能做出判断。这是为了防止我们过早地终止实验。其次这张图也在一定程度上直观的告诉我们,这两个点击率哪个大哪个小。第二张图是$$max(P(p_a>p_b),P(p_a\lep_b))$$的演化图,衡量的是两组数不同的可能性。我们可以添加我们可以容忍错误的可能性。比如下图中的绿线表示我们的容忍底线是0.999,也就是当我们保证99.9%的采样数据表明一组和另一组有差异的时候,我们就可以终止了。实验过。例如,在第二个例子中,我们可以在第60分钟左右终止实验,而无需积累大量数据。
