乐趣区

关于python:比例类数据的差异性检验与AB测试的终止点

在理论业务中,咱们常常会遇到频率类事件的假设检验,这类数据包含:留存率、点击率、转化率。咱们甚至能够把大多数 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 测试的数据。特地的,咱们采纳的统计工具在以下场合,会比间接比拟两组的频率更无效:

  1. 当抽样 数据过小 时或极度 不均衡 时。譬如在产品仅在冷启动期间,这时候的流量绝对较小,单纯比拟频率容易有抽样误差;
  2. 疾速决策的时候,特地地,须要 决定何时终止 比拟的时候。譬如,在每单位工夫老本极大的时候,如果进行 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)$ 散布作为先验散布,当然这么抉择会有很多益处,首先:

  1. 当 $\alpha$,$\beta$ 足够大时,$Beta(\alpha, \beta) \rightarrow B(\alpha + \beta, \frac{\alpha}{\alpha + \beta})$。这样咱们就能够刻画出以二项分布扩大的任何散布。
  2. 其次,当先验散布为 $Beta(\alpha, \beta)$,且新的察看量 $N$ 中,有 $k$ 个正例。则其后验散布能够算出为 $Beta(\alpha + k, \alpha + N – k)$,计算非常简单。
  3. $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 分钟时,就能够终止试验,而不须要积攒大量数据。

退出移动版