假设检验和ABTEST(二)

参考:
从假设检验到AB实验——面试前你要准备什么?
一文入门A/B测试(含流程、原理及示例)
A/B testing(一):随机分配(Random Assignment)里的Why and How

AB测试的简介

我们都或多或少听说过A/B测试,即便没有听过其实也被动的参与过——作为受试者。AB实验是数据分析、产品运营、算法开发在工作中都时常接触到的工作。在网站和APP的设计、产品的运营中,经常会面临多个设计/运营方案的选择。小到按钮的位置、文案的内容、主题的颜色,再到注册表单的设计、不同的运营方案,都有不同的选择。A/B test可以帮助我们做出选择,消除客户体验(UX)设计中不同意见的争执。按钮颜色、广告算法、标签排序,这些互联网产品里常见的功能与展示都是在一次次AB实验中得到优化。

所谓A/B test,其实类似于初中生物说的对照试验。对用户分组,每个组使用一个方案(方案应遵从单变量前提),在相同的时间维度上去观察用户的反应(体现在业务数据和用户体验数据上)。需要注意的是各个用户群组的组成成分应当尽量相似,譬如新老用户很有可能表现出较大的偏好差异。最后根据假设检验的结果,判断哪些版本较之原版有统计意义上的差异,并根据效应量选出其中表现最好的版本。

一个完整的AB测试流程

  1. 分析现状,建立假设:分析业务,确定最高优先级的改进点,作出假设,提出优化建议。
  2. 设定指标:设置主要指标来衡量版本的优劣;设置辅助指标来评估其他影响。
  3. 设计与开发:设计优化版本的原型并完成开发。
  4. 确定测试时长:确定测试进行的时长。
  5. 确定分流方案:确定每个测试版本的分流比例及其他分流细节。
  6. 采集并分析数据:收集实验数据,进行有效性和效果判断。
  7. 给出结论:①确定发布新版本;②调整分流比例继续测试;③优化迭代方案重新开发,回到步骤1。

注意点

  1. 测试时长 : 测试时长不宜过短,否则参与实验的几乎都是该产品的高级用户(短时间新用户流入较少)。

  2. 分流(抽样):应该保持同时性、同质性、唯一性、均匀性。

  • 同时性:分流应该是同时的,测试的进行也应该是同时的。

  • 同质性:也可以说是相似性,是要求分出的用户群,在各维度的特征都相似。可以基于用户的设备特征(例如手机机型、操作系统版本号、手机语言等)和用户的其他标签(例如性别、年龄、新老用户、会员等级等)进行分群,每一个A/B测试试验都可以选定特定的用户群进行试验。 控制变量
    思考:如何判断是不是真的同质? 可以采用AAB测试。抽出两份流量进行A版本的测试,进行AA测试,并分别与B版本进行AB测试。通过考察A1和A2组是否存在显著性差异,就可以确定试验的分流是否同质了。

  • 唯一性: 即要求用户不被重复计入测试。

  • 均匀性: 要求各组流量是均匀的。希望把每一个用户随机分配到试验组(treatment group)和控制组(control group),但为什么我们要做随机分配(why we need to do random assignment),和应该怎么做随机分配(how to do random assignment)可以参考:随机分配里的Why and How。(统计学原理上,我没有找到均匀性这一要求的依据,其实双样本的假设检验并不要求两个样本的数量相等或相近。当然从直观上是可以理解,希望分出的用户组越相近越好,包括人数的相近。)

    • 1 现在有一个user,他有一个user_id
    • 2 每run一个实验,我们都有一个特定的salt,把这个user_id和这个salt拼接起来成一个长字符串;
    • 3 把2中得到的长字符串扔进一个哈希函数(可以是MD5或者SHA1),这里用MD5,然后生成一条哈希数据(Hashed data);
    • 4 取3中得到的哈希数据的头六位字符,转换成一个十六进制整数;
    • 5 拿4中得到的整数去除以最大的六位十六进制数字(0xffffff),注意用浮点数相除,会得到一个介于0和1之间的浮点数。
    • 6 根据第5步得到的浮点数是否大于预设阈值,决定这个用户的分组。举个例子,如果我们想得到50-50的平均分配,那么我们会预先设定一个阈值0.5,如果第5步得到的是0.4,那么这个用户被分到控制组,因为它小于0.5,如果第5步得到的是0.6,这个用户被分配到试验组。

理由:

  • 我之前做随机的时候都是取随机数和阈值进行比较,超过阈值一组,低于阈值的是另一组。 但是如果发生了错误,对用户精准定位就会比较麻烦(随机数是随机的,需要靠随机数种子控制,而且每次试验取不同的随机数种子)。这种方法是可以对每次试验的用户的分组进行实现的(每个用户的id是确定的,每个试验的salt也是确定的),不仅方便精确定位用户,而且实验出问题了也方便debugging。
  • 一个实验对应一个salt,每个实验不一样,这样保证不同实验有完全不一样的随机分配。因为一家公司一天可能做很多实验,如果一个用户老是被分到试验组,他用户体验会比较差
  • 最后得到的随机分配结果还是比较'Random'的,虽然本质上都是假Random。

A/B测试只能有两个版本么?

A/B test不是只能A方案和B方案,实际上一个测试可以包含A/B/C/D/E/……多个版本,但是要保证单变量,比如按钮的颜色赤/橙/黄/绿/青/蓝/紫,那么这七个方案是可以做A/B测试的;但如果某方案在旁边新增了另一个按钮,即便实验结果产生了显著差异,我们也无法判断这种差异的成因究竟是谁。

同一段时间内可以做不同的A/B测试么?

比如一个test抽取总体20%的流量做按钮颜色的实验,另一个test也抽取总体20%的流量做布局样式的实验。是否可行?

我认为是可行的。但要求多个方案并行测试同层互斥。如果从总体里,先后两次随机抽取20%流量,则很有可能会有重叠的用户,既无法满足控制单变量,又影响了用户的使用体验。

  • 同层指的是在同一流量层中创建实验,在此层中创建的实验共享此层中的100%流量。
  • 互斥指的是在此层中,一个设备有且只能分配到此层多个实验中的某一个实验。

假设检验的示例

数据:对web新旧页面的A/B测试结果,来自Udacity的示例案例

  • 用户id
  • 时间戳
  • 分组(实验组还是对照组)
  • 展示页面的新旧版本(新版本还是旧版本)
  • 该用户是否发生了转化(0-未转化、1-转化)
    ab测试目的:判断新旧两版页面在用户的转化情况上是否有显著区别
数据清洗
  1. 查看总的数据行数 和 (去重后)的独立用户进行比较
  2. 发现上述不一致(出现了重复统计的用户)
  3. 利用duplicated考察重复数据
  4. 分组group和展示页面的新旧版本landing_page应当是匹配的(treatment-new_page、control-old_page),但是发现存在不匹配的情况。 去掉不匹配的记录。
  5. 去掉不匹配的记录之后利用drop_duplicates去掉重复值(发现此时只有一条重复值)。
    6.检查缺失值,若存在缺失值可以进行直接删除、填充等处理。
  6. 比较收到新页面的用户占比和老页面的用户占比。
假设检验

1.给出零假设和备择假设:
记旧页面的转化率为p_1,新页面的转化率为p_2
我们的目标是为了说明p_2 > p_1, 因此作出如下假设:
H_0: p_1 >= p_2p_1 - p_2 >= 0
H_1: p_1 < p_2p_1 - p_2 < 0

  1. 这个业务可以抽象为:X是否被转化,也就是两点分布X _ i\sim b(1,p)。对于n个个体则为二项分布X \sim b(n,p)
    因此有:
    EX = npDX = np(1-p)
    Dp = D(1/n*EX) = 1/n^2*n*D(X_1) = 1/n*D(X_1)
    由于X_1满足两点分布
    Dp = p(1-p)/n
    有以上的铺垫下面求D(p_1 - p_2)
    D(p_1 - p_2) = D(p_1) + D(p_2) = p_1(1-p_1)/n_1 + p_2(1-p_2)/n_2
    此刻p_1p_2都是未知的,所以要通过样本成数进行估计,即设p=p_1=p_2,其中\hat{p} = (n_1\hat{p_1}+n_2\hat{p_2})/(n_1 + n_2)
    因此:D(p_1 - p_2) = D(p_1) + D(p_2) = \hat{p}(1-\hat{p})/n_1 + \hat{p}(1-\hat{p})/n_2

  2. 确定检验类型和检验统计量
    独立双样本。样本大小n>30,总体的均值和标准差未知,用Z检验。检验统计量为:


    p_c为转化率的联合估计,p_c=p_1=p_2,其中\hat{p} = (n_1\hat{p_1}+n_2\hat{p_2})/(n_1 + n_2)

  3. 给定显著性水平
    \alpha = 0.05

方法一、直接根据公式计算检验统计量Z

旧版总受试用户数: 145274 旧版转化用户数: 17489 旧版转化率: 0.1204
新版总受试用户数: 145310 新版转化用户数: 17872 新版转化率: 0.1230
转化率的联合估计: 0.12169
检验统计量z: -2.1484

Z_\alpha = -1.6449, 拒绝域为{Z < -1.6449}
z=-2.15落入拒绝域。在显著性水平\alpha = 0.05时,拒绝零假设。

假设检验并不能真正的衡量差异的大小,它只能判断差异是否比随机造成的更大cohen-s-d,因此,我们在报告假设检验结果的同时,给出效应的大小。对比平均值时,衡量效应大小的常见标准之一是Cohen's d,中文一般译作科恩d值:


这里的标准差,由于是双独立样本的,需要用合并标准差(pooled standard deviations)代替。也就是以合并标准差为单位,计算两个样本平均值之间相差多少。双独立样本的并合标准差可以如下计算:

Cohen's d的值约为-0.00797,绝对值很小。两者虽有显著性水平5%时统计意义上的显著差异,但差异的效应量很小。可以简单地理解为显著有差异,但差异的大小不显著

利用python进行计算:

statsmodels.stats.proportion.proportions_ztest
第一个参数为两个概率的分子
第二个参数为两个概率的分母
第三个参数alternative[‘two-sided’, ‘smaller’, ‘larger’]分别代表[双侧,左尾,右尾]

import statsmodels.stats.proportion as sp
# alternative='smaller'代表左尾
z_score, p_value = sp.proportions_ztest([convert_old, convert_new], [n_old, n_new], alternative='smaller')

可以同时得到检验统计量和P值,得到的z值和前面计算的完全相同,落在拒绝域,故拒绝零假设。同时我们也得到了p值,用p值判断与用检验统计量z判断是等效的,这里p值约等于0.016,p<\alpha ,同样也拒绝零假设。

在python中一般的z检验是这样做的statsmodels.stats.weightstats.ztest
直接输入两组的具体数值即可,同样有alternative参数控制检验方向。

蒙特卡洛模拟

蒙特卡罗法其实就是计算机模拟多次抽样,不过感觉好强啊,结果直观又容易理解,能够很好的帮助初学者理解分布、p值、显著性\alpha、分位数等概念。

在零假设成立的前提下(H_0: p_1 >= p_2p_1 - p_2 >= 0),p_1 = p_2为临界情况(零假设中最接近备择假设的情况)。如果连临界的情况都可以拒绝,那么剩下的部分更可以拒绝(p_1 > p_2)。

可以利用样本数据求得整体的总转化率p_c,下面考察临界情况,以p_c为新旧版共同的转化率,即取p_c = p_1= p_2,分别进行n_old次和n_new次二项分布的抽样。

重复抽样多次,每次抽样之后,都可以得到:旧版本与新版本之间的转化率差值diff。而此数据的转化率差值为:-0.0026。

可以观测模拟得到转化率差值的分布(由于概率相等,应该接近于正态分布)和此数据的转化率差值的位置关系。

在diffs列表的数值中,有多大比例小于ab_data.csv中观察到的转化率差值?此次模拟的结果为0.0155,每次模拟的结果都不太相同,但都在p值(0.016)上下浮动,且随着样本量的增大,更加接近p值。

上图的含义是,在p_c = p_1= p_2时进行的10000次随机模拟得到的差值中,只有1.55%比数据集中的差值更极端,说明我们这个数据集在p_c = p_1= p_2的前提下是小概率事件。如果p_1 > p_2则得到的差值的分布仍然近似于正态分布但是其均值会右移,此时数据中的差值会更加极端。因此,此数据的结果是零假设中的极端情况,零假设很有可能是不成立的。

若diffs的分布就是标准正态(这里只是近似),则竖线左侧的面积占比其实就是p值(左侧or右侧or双侧要根据备择假设给定的方向

p值到底要多小才算真的小

这需要我们自己给定一个标准,这个标准其实就是\alpha,是犯第一类错误的上界,常见的取值有0.1、0.05、0.01。

所谓第一类错误,即拒真错误,也就是零假设为真,我们却拒绝了。在这个例子里就是——新旧版转化率明明相等,只不过我们很非酋,得到的样本正好比较极端,以至于我们错误地认为新旧版转化率不等。所以要取定一个\alpha时,认为原假设在该显著性水平下被拒绝。(如果我们取的是0.01而不是0.05,则这个例子里就拒绝不了零假设了。)

\alpha并不是越小越好,这与第二类错误的概率有关,\alpha越小,则\beta就越大,而第二类错误的概率也需要控制在一定的范围,因此不能一味地取极小的\alpha

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342