4.1 实验参与单元的选择
实验参与单元的选择在实验设计中至关重要,它关系到用户体验,也会影响用来衡量实验影响的指标选择。一旦选择好实验参与单元,在整个实验过程中,就会按照选定的实验参与单元进行实验标记,以及实验数据的计算和分析。
4.1.1 常见的实验参与单元
在互联网产品的AB实验中,有以下几种比较常见的实验参与单元。
●元素级别(item-level):指对实验元素,比如一篇文章、一首歌曲等进行随机分流并标识实验id的随机过程。在Interleaving实验方法中就采用了类似的方法,Interleaving最初被Netflix用来进行视频内容的推荐。如图4-1所示,其基本过程是,用户不进行随机分组,所有用户会收到算法A和算法B的推荐内容交替混合后的结果。这使得用户可以同时看到算法A和算法B的推荐结果,却不知道内容是由算法A还是算法B推荐的。实验通过计算不同算法推荐内容的用户观看时长等实验指标,来比较算法A和算法B。这种方法主要用于用户无感知的搜索算法中的搜索结果或者推荐算法中的推荐结果。
图4-1 元素级别的随机对象
●页面级别(page-level):产品页面被视为实验参与单元,进行实验的页面每打开一次,就会被随机函数分配到不同的实验组中。如图4-2所示,不同的用户打开相同的页面,相同的用户在不同的时间打开多次页面,都会分别算作一次实验参与,进而被分配实验id和实验组。页面级别实验在Web端比较常用,一般不用于App端。
图4-2 页面级别的随机对象
●会话级别(session-level):会话的概念在Web端和App端都存在,基本含义是用户在网站的一次访问时查看的一组页面或是启动一次App后在App内的行为,通常从启动App到退出App定义为一个会话,需要考虑前后台切换、时间限制、刷新机制等问题。比如一般采用App切到后台30分钟,用户再启动就算一个新会话,如果30分钟内启动且进程没有被杀掉,仍然算作同一个会话;切换到后台不管多少分钟,只要进程被杀掉,再启动就算新会话。这往往和机型、品牌和用户操作习惯相关,因而也可能会给实验统计带来一些偏差。如图4-3所示,同样不对用户进行分组,用户形成了1、2、3、1、4、2的会话序列,同一个用户不同会话被视为不同的会话,这些会话被随机分到不同的实验id,分别进入实验组A、B,最后统计实验组A、B的数据进行实验效果分析。
图4-3 会话级别的随机对象
●用户级别(user-level):用户级别相对容易理解,就是以用户为实验参与单元。在实验过程中,一旦用户被分到A组,直到实验结束,该用户都一直属于实验组A,而不会被分到同一个实验的B组中,有可能被分到其他层的实验中。这里的用户是一个虚拟的概念,它既可能是一台设备,也可能是一个账号,用来代表背后的用户。如图4-4所示,用户被随机分为A、B两组,分别体验不同的策略A、B,然后计算A、B两组用户的各项实验指标并分析实验效果。
以上4个级别的实验参与单元的粒度从小到大,粒度越小,可以使用的分割单元越多,所能同时进行的实验量也越大。从用户体验的角度来看,粒度越小,用户体验的连续性越差。如何平衡这个关系,选择合适的实验参与单元呢?主要有两个关键考虑因素:1)实验所需要的流量以及实验检测精度;2)用户体验的连续性。
一般在流量足够的情况下,为了保证体验的稳定性和连续性,最好采用用户级别。在不影响用户体验的前提下,采用更细粒度的随机单元,能更精准、快速地获取实验效果。什么类型的实验会影响用户体验呢?简单来说,就是看策略A和策略B切换时,用户能不能明显感知这个变化。比如实验的内容是字体大小、界面颜色等,如果采用文章、页面、会话粒度,用户显然会明显感知变化,如果在A页面看到蓝色字体,在B页面看到绿色字体,这些变化会干扰用户的行为和决策,从而影响实验对于字体颜色这一特征的评估,实验结果的可信度也就降低了。如果是推荐类、搜索结果类的实验,用户无法感知一篇文章究竟是A算法推荐的还是B算法推荐的,这种情况下,可以用文章、页面、会话等粒度进行随机分流。
图4-4 用户级别的随机对象
选择小粒度的实验参与单元,除了可以增加实验流量外,还有一个好处是可以增加实验效果评估精度。一方面随机化的粒度越细,产生的实验单元越多,使得指标平均值的方差越小,实验将具有更强的统计能力来检测较小的变化。另一方面,实验标记将会更精准地作用在实验区域上,而不会纳入更多非实验范围的数据淹没实验效果。比如以用户为实验参与单元,可能会存在用户分布不均的问题。
以人均时长指标为例,因为非常活跃的用户是少数,他们贡献的观看时长却占较大的比例,所以在将用户分组的AB实验中,多数活跃用户被分在A组还是B组,将对结果产生较大影响。因为这些活跃用户整体占比较少,在随机分配过程中分配不够均匀的概率也很高,从而影响实验结果的概率也较高,所以在不影响体验连续性的前提下,从实验效果评估的角度,应该尽可能选择较小粒度的随机单元进行分流。
需要注意的是,如果实验特征的粒度跨越实验参与单元的粒度起了作用,则不能使用该粒度的实验参与单元进行分流。举个例子,要测试产品页面上一个交互界面的颜色用红色好还是蓝色好。如果这个交互界面只在产品的这一个页面出现,那么可以选择页面级别的实验参与单元,因为这个情况下,页面级别就已经包含了这个实验特征。如果这个交互界面同时还在其他多个页面出现,就不能选择页面级别的实验参与单元。因为如果按照页面进行随机化,就会出现用户在A页面看到红色交互界面,在B页面看到蓝色交互界面的情况,从而影响用户产品体验一致性。
4.1.2 实验参与单元粒度与实验评估
在实验评估的时候需要注意粒度匹配的问题,即实验随机分流的粒度和评估指标的粒度相匹配。粗粒度的随机分流实验可以往下兼容评估指标,比如一个用户级别的随机分流实验,能往下细分评估会话、页面、元素级别的指标。细粒度的随机分流实验不能往上兼容,一个页面级别的实验,不能评估用户时长、用户留存等用户级别的指标。
通常建议随机化单元与分析单元相同,或者随机化单元比分析单元粒度更粗。当分析单元与随机化单元相同时,由于单元之间的独立性假设在实践中是合理的,因此更容易正确地计算指标的方差。例如,由于按页面随机化意味着每个页面上的点击是独立的,因此计算平均点击率(点击/页面浏览量)的方差是标准的。如果随机化单元是用户,并且指标分析单元也是用户,例如每用户会话数、每用户点击数和每用户页面浏览量,则分析相对简单。
如果随机化单元比分析单元粒度粗,例如按用户随机化,分析页面点击率是可行的,只是需要更细微的分析方法,如bootstrap或delta方法。在这种情况下,使用同一个用户id的作弊机器人可能会歪曲实验结果。例如,拥有10000个页面浏览量的机器人全部使用相同的用户id完成。如果需要考虑这种类型的场景,可以限制单个用户对更细粒度指标的贡献,或者切换到基于用户级别的指标(例如每用户的平均点击率)。
相反,当在用户级别(例如,每用户会话数或每用户收入)计算指标并且随机化是在更精细的粒度(例如页面级别)时,用户体验可能包含各种特征体(同时来自实验组、对照组的特征体)的混合,这时在用户级别计算指标是没有意义的。当随机化按页面进行时,不能使用用户级别的指标来评估实验。如果这些指标是OEC的一部分,那么就不能使用更精细的粒度进行随机化。
4.1.3 用户级别的实验参与单元
综合来看,选择用户级别的实验参与单元颗粒度仍是最主要的一种方式。它具有体验稳定性,同时可以对用户进行长期观察。因为有一些用户行为可能会随着时间推移而发生变化,所以需要更长期的实验观察。比如一些UI方面的改变,用户从不喜欢逐渐变得喜欢;一些具备自适应能力的算法,用户从一开始不太习惯使用到逐渐接受等。如果采用非用户级别的随机化单元,就无法追踪用户的这种变化过程。采用用户级别的随机化单元时,常见的用户标识有如下两类。
●登录账户类,比如账号、手机号等,这类用户id稳定性最好,跨平台,跨设备之后都可以识别,从而保持了对同一个用户行为实验数据采集的稳定性。同时也存在一些小问题,比如一些产品的账号体系(比如视频App的会员账号)允许同时运行在多个设备中,一个家庭的多个用户在同一账号下观看的是不同的视频内容,这样的账号对于实验的分析评估其实会存在一定的干扰。
●设备id类,指绑定到某一个设备号,虽然设备id不具跨设备或跨平台一致性,但这类用户id在一定时间内也具备一定的稳定性,对于短期实验来说影响相对较小。从更长周期来看,也会存在设备更新等情况。对于iOS设备来说,一般设备id指广告标示符,对于安卓设备来说,一般设备id指国际移动设备识别码。
在应用中,出于各种实际的限制或者需求,AB实验中用户随机分组的方式会变得更加复杂。比如一些含收费项目的产品,有时就不能对全量用户进行随机分组,因为有一些功能只有一部分付费用户才能体验,所以在优化这个付费功能的时候,就只能对订阅了这些功能的付费用户进行随机分组。这种针对一部分用户进行AB实验的情况非常常见。
●客户端版本实验只对最新版本的用户生效。
●基于用户静态特征的实验,比如只对三四线城市的用户生效。
●针对用户行为、状态特征的实验,只对新用户、高活跃用户生效。
这种定向实验对一部分用户群体进行随机分流,会涉及如何处理用户中另一部分未被选择进行实验的用户的问题。一般有两种处理定向用户群流量下发的方法。
●先锁定全部流量,然后从流量中筛选符合条件的进行实验打标,其余不符合条件的流量虽然不进行实验,但这部分流量也被实验占用。这种方法的优点是可以避免后面的实验用户分布不均匀,缺点是会造成比较大的流量浪费。
●直接从流量中选取符合条件的用户进行实验,不符合条件的回归流量池。这种方法的优点是可以尽可能充分地使用流量,缺点是可能会造成同层级后续开启实验用户的分布和大盘用户分布不一致,从而导致无法很好地评估这些实验全量后对于大盘指标的提升效果。
下面通过一个具体的例子来说明这两种方法的差异。一个产品有100万个用户,其中新用户20万个,老用户80万个,新用户人均使用时长为10min,老用户人均使用时长为20min,大盘人均使用时长为18min。现在需要对10万个新用户进行实验,有如下两种实验方案。
方案一:如图4-5所示,实验1锁定10万个新用户,分为A1、B1两组进行实验。剩下的90万个用户(10万个新用户和80万个老用户)进行实验2,不区分新老用户,对用户整体进行随机分流,分为A2、B2两组进行实验。实验2对新用户使用时长提升2min,对老用户使用时长提升1min。
实验组A2的人均使用时长为[80×(20+1)+10×(10+2)]/(80+10)=20min。
对照组B2的人均使用时长为(80×20+10×10)/(80+10)=18.89min。
实验组A2提升:(20-18.89)/18.89≈5.87%。
实际上对产品来说,整体新老用户的构成是2∶8而不是1∶8,修正后实验2的影响如下。
修正后实验组A2的人均使用时长为[80×(20+1)+20×(10+2)]/(80+20)=19.2min。
修正后对照组B2的人均使用时长为大盘平均时长18min。
实验组A2提升:(19.2-18)/18=6.67%。
可以看到,修正后的实验组A2对于大盘提升了6.67%,高于没有修正时的5.87%。也就是说这种方式可能给大盘实验效果估计带来偏差。
图4-5 只锁定参与实验用户的分流方法
方案二:如图4-6所示,实验1需要10万个新用户,按照新老用户比例抽取大盘中的50万个用户,将其中的10万个新用户分为A1、B1两组进行实验,其余40万个被抽取的老用户不参与实验且被锁定,不再参与其他实验的分流。剩下的50万个用户(10万个新用户和40万个老用户)进行实验2,不区分新老用户,对用户整体进行随机分流,分为A2、B2两组进行实验。此时实验2的结果和大盘预估是一致的,因为用户比例和大盘是一致的。
实验组A2的人均使用时长为[40×(20+1)+10×(10+2)]/(40+10)=19.2min。
对照组B2的人均使用时长为18min。
实验组A2提升:(19.2-18)/18=6.67%。
在流量够用的情况下,建议使用方案二。如果流量比较紧张,采用方案一时需要特别注意正确评估实验对于大盘的影响。方案二还有一种情况是,40万个用户也参与实验指标的计算。这样虽然实验分流处理更简单,但是这40万个不参与实验的用户会稀释实验效果,影响实验评估的精度。
图4-6 锁定全部分流用户的分流方法