>

从 Facebook 的分析面试题来看如何正确地操作一个 A/B 测试

GIO 增长团队 2018-07-16
546

作者 | 常明,Google 高级商业分析师,前 PwC 咨询顾问。

公众号:米妮老师,知乎:米妮


数妹推荐语:

A/B 测试是增长环节中非常重要的一环,但是在面临一个具体的场景中我们如何将理论落地实践?今天推荐谷歌商业分析师常明先生的一篇文章,从 Facebook 的一道分析面试题切入,将 A/B 测试中会遇到的问题和相应的解决思路都完整剖析,深入浅出,希望给大家带来一些启发。


上周和 Uber 一个面试官聊天,ta 说最喜欢的问题就是 A/B test。为什么?相比于 SQL、case 等可以通过提前做题准备的题目,A/B 测试的很多操作基本上只有工作中做过才知道。所以, A/B 测试的问题可以更有效的筛掉那些简历写的很好看却没有相关经历的面试者。用 A/B 测试的话来说,问这类问题可以有效降低 false positive。

正好,这两天有朋友问我 Facebook 的一道 A/B 测试的面试题,就拿出来跟大家讨论一下。

问题如下:

Facebook 想测试一个新的产品功能。如何判断这个新功能是否能提升用户活跃



看图说话:新旧版本的唯一区别是,旧版本中,某一个 post 下面的所有 comment 都是靠左对齐;新版本中,对同一个 comment 的所有回复会向右缩进。

从产品的角度,我们容易做出如下假设:新版本中“对话”的结构更加清晰,提升了用户体验。用户体验的提升,意味着用户活跃度上升。

所以,我们如何设计一个 A/B 测试,去验证我们的假设是否成立?

首先,我们来回顾一下 A/B 测试设计的四步框架。


一、确定实验的样本单位(unit of diversion)


做A/B实验,我们首先要搞清楚,如何定义实验的样本。

最常用的样本单位是用户(user)。处理方法很简单,就是给每个用户取一个随机分配的学号(例如,00401014),然后规定:尾号为 5 的同学,你是实验组,尾号为 8 的同学,你是对照组。


source: smartinsights.com


二、选定实验观测指标(metric of measurement)


知道了样本是什么,我们接下来需要定义一个指标,来对每个样本进行观测。

对于 Facebook 这道面试题,我们可以选取任何描述“用户活跃”的数字当成指标。比如,用户日均回复数量,用户回复率等等。

在实际工作中,最好能多给几个指标进行备选。


三、确定实验运行周期(duration)


我们的实验需要跑多少天?一个实验不能跑半年,因为一年下来也做不了几次实验;实验也不能跑的太短,因为产品往往具有周期性。

如何判断产品的周期性?最简单的方法就是把用户的使用频率按天画个时间序列。比较下面两种不同的产品:

Facebook 用户每天都会大量使用,一周7天都没有显著区别。所以,Facebook 的产品周期是以天为单位。(注意,数据是假的)



UberEats 使用的高峰在周 1 到周 4 。这很有可能是因为该产品的主力用户在 SF 城里上班,平时没工夫吃饭只能点外卖,但一到周末都出去下馆子了。也就是说,用户在周中和周末的行为是不一样的。所以,UberEats 的产品应该以周为单位。如果实验只运行 3 天,显然无法确保实验能够考虑到周中和周末两种情况。


四、确定实验所需样本数量(sample size)


现在我们知道了实验的需要跑多少天,但我们仍然不知道每天需要选取多少个样本。理论上我们可以证明,样本数量越大越好。所以,最理想的做法当然是实验组、对照组各选取所有用户的 50%。但是在实际操作中,我们往往并不能这么做。原因有两个:

一旦出错,风险太大。假设 50% 的用户都被分进了实验组。实验跑了 2 天,工程师突然发现写了个 bug,这个 bug 导致实验组的用户无法登陆Facebook。然后,就没有然后了...

浪费资源。像 Google、Facebook 这种公司,对产品迭代的速率要求很快,每个月怎么也得跑 100 个实验吧。如果在每个实验中,都有 50% 的用户被选进实验组,这也就意味着大量用户会同时被选进不同的实验组。这会造成不同实验的数据互相污染,从而极大的增加数据分析的难度。

所以,到底怎么算这个样本数量?我们需要用到 power anlaysis 的方法,以后有机会展开讲讲。

这个框架比较简单,大家应该也比较熟悉了。但是具体在面试中,回答这道 Facebook 面试题的每一步都会遇到陷阱... 

今天只讲一个最重要的:选择样本单位(unit of diversion)。

为了便于理解,我们进行一个思维实验:

Facebook 一共只有两个用户:胖子和瘦子。巧的是,胖子和瘦子还是好朋友。

在我们的实验里,瘦子被分进了实验组(看到的是新界面),胖子被分进了对照组(看到的旧界面)。



如果我们的假定成立,那么瘦子会比以前更加积极的回复。观察数据,我们发现:瘦子以前平均每天回复 10 条,现在平均每天回复 15 条。换句话说:实验组的用户活跃度上升 50%。

很快,胖子看到了瘦子回复频率变高,非常感动,也更积极的参与到对话之中。于是,胖子的回复率也上升了 - 以前平均每天回复8条,现在平均每天回复12条。换句话说:对照组的用户活跃度也上升 50%。

对比下来,我们发现实验组和对照组并没有区别!

这个结论是不合理的。

很显然,瘦子(实验组)回复变多是因为产品做的好;但胖子(对照组)回复变多,纯粹是因为瘦子回复变多,并不是因为对照组的产品本身有多好。

立刻上升到理论的高度,我们可以引出选取样本的一个重要原则:

样本互相独立。概率上来讲,样本 A 的行为,和样本 B 的行为不应该有任何关系。

上面分析的那种情况,我们无法 100% 保证实验组的人一定不会认识对照组的人。人和人一旦认识,就有可能互相发生关系;于是,样本独立的原则就不满足了。

我们把这种产品属性叫做网络效应(network effect),简单理解,就是整个用户群体的行为在局部范围内互相影响。社交类产品比如 Facebook,平台类产品比如 Uber 都有网络效应。

不同的产品,也会有不同的网络效应:

Facebook:用户和用户之间正向影响(A 变大了,B 也变大),实验组和对照组的对比结果会比真实的差别要小(under estimate)。



Uber:用户和用户之间是逆向影响(乘客 A 搭的车多了,乘客 B 搭的车会表少,假设司机数量一定)。这就导致了,实验组和对照组的对比结果会比真实存在的影响要大(over estimate)。



所以,对于 Facebook 这道面试题,我们应该如何选择样本单位,来减少网络效应的影响?

这里我提供一种思路,一共有四步:

第一步

找出这么互相不认识的两群人,分别标记为 A 和 B。一种靠谱的操作方式是按照地区进行筛选,比如,A 组是阿拉巴马州(阿甘老家)用户,B 组是加州(米妮老巢)用户。基本上可以认为 A 组和 B 组用户由于隔的远,老死不相往来。由于两组用户无法交流,我们消除了两组之间的网络效应。



第二步

测量 A 组和 B 组用户的 default 行为。在实验开始之前,两组用户看到的是完全一样的体验。假设我们确定是实验指标是平均每个用户的日均回复数量,我们可以对这两组用户分别做出统计。假定我们得到了如下结果:

实验开始前,A 组人均回复数量=10

实验开始前,B 组人均回复数量=11

虽然 A 组和 B 组目前的体验完全一样,但是两组用户的数据不一定一样,因为两组用户作为独立的两个人群,用户行为是不同的。比如,B 组人均回复数量本身较高,是因为加州人更习惯线上社交。

第三步

把 A 组用户作为实验组,B 组用户作为对照组,进行实验。试验运行一段时间后,再次对两组的指标分别作出统计。假定我们得到了如下结果:

实验开始后,A 组人均回复数量=14

实验开始后,B 组人均回复数量=14

这里注意,A 组看到的是新版本,B 组看到的旧版本。



第四步

分别计算出两组用户前后的差别:

A 组+40% (从 10 涨到 14)

B 组+28% (从 11 涨到 14)

什么造成了前后变化?

新旧版本的区别。如果新版本好,A 组的变化应该比 B 组大一些。这个是我们想要找到的那个增长。

时间的影响。如果在实验开始运行的第二天,特朗普对北朝鲜宣战,那美国人民的 FB 活跃度一定增长 400%。这 400% 是我们的实验造成的?不太可能。所以,这类外部因素会错误的影响到我们的实验结果。

第五步

如何消除时间的影响?通过计算两组用户前后差别的差别:

A 组前后变化 +40%

B 组前后变化 +28%

A 组的前后变化比 B 组增加了43%

这个增长的百分比(43%),便是我们的实验的真实影响。第一次做减法,我们得到了两组用户各自的的前后变化;第二次做减法,我们抵消了时间前后的影响。

在工作中,这种处理方法叫做 difference of difference,老司机都叫做 diff-n-diff,一般人我不告诉他。




关于 GrowingIO


GrowingIO 是基于用户行为的新一代数据分析产品

首推国内领先的“分析工具+运营咨询+持续增长”数据服务体系,帮助企业构建数据运营闭环

依托于快速部署无埋点技术,实时采集全量行为数据,搭建完整的数据监控体系

高效管控与运营核心业务指标,帮助企业挖掘更多商业价值