abtest多实验并行

abtest是用来做什么的呢?比如有一个商品详情页,我们有2种UI方案,想看看哪一种方案可以导致更高的购买率,这就需要abtest技术实现做客观的数据分析。

基本流程

上述就是一个a/b test,我们进一步描述要做的事情:假设商品详情页有2种UI方案,分别叫做a和b,一开始,我们可以指定2个流量各自占比50%,这个占比是什么意思呢?客户端启动后先请求服务端,携带自己的设备id:device_id,服务端通过计算hash(device_id)%100,如果<50就是a流,否则是b流。

客户端知道了自己属于a or b,那么就可以展现不同的UI方案。除此之外,可能a/b流需要的服务端数据结构也有所不同,所以服务端在返回数据时也需要根据device_id计算a/b流,然后返回流对应的数据结构。

我们把上述过程称为一个实验,这个实验有多个流,那么怎么得出哪个流更好的结论呢?

日志上报

仅仅是客户端展现出a/b两种效果不是目标,我们的目标是看一下在a和b流下,对所关注的业务指标有什么影响。

商品详情页,我们关注的就是加入购物车事件,怎么评估a和b哪个效果更好呢?以a流为例,我们关注的是:”加入购物车次数 / 浏览详情页的次数”,这个比例越高,说明a流效果越好。

所以呢,我们得要求客户端上报日志:

  • 进入详情页后,上报一次日志:event=详情页 实验名=ui实验 分流=a;
  • (如果)点击购物车,上报一次日志:event=购物车 实验名=ui实验 分流=a;

有了日志,我们就用大数据技术做统计,这个过程可以是实时的或者离线的,或者两种都有。

对于上述2条日志,大数据生成如下的key(实验名_流_事件),对counter做++累计,保存到K/V存储系统中:

  • ui实验_a_详情页
  • ui实验_a_购物车

那么就可以基于已有的event统计,计算出”ui实验”这个实验在a方案下的转化率  =  ui实验_a_购物车 / ui实验_a_详情页。

对于b流、c流…等流量,都可以很灵活的找到对应的counter,进行计算即可。

整个流程的思考是这样的:

  • 我要做什么实验?
    • 比如我要看一下哪个UI方案的转化率更好
  • 明确要统计什么指标?
    • 比如转化率指标
  • 明确指标需要统计什么event才能算出来?
    • 比如转化率,需要统计详情页的打开次数,以及购物车按钮的点击次数
  • 每个流的占比是多少?
    • 一般刚开始各个试验的占比是均分的
    • 随着指标的观测,可以逐步放大某个流量的占比
    • 注意,我们不是比较各个流量的上报次数决定谁好谁坏,而是评估单个流的业务指标来决定这个流好与坏。

多实验并行

仍旧以商品详情页为例,我们除了UI的实验外,可能还需要加一个实验,看看哪种优惠卷方案可以得到更高的转化率。

于是,我们的详情页就并存了2个实验,”ui实验”包含了2套UI的变化,”促销实验”包含了2套促销方案的变化,这两套实验可能是2个PM各自设计的,这时候就需要考虑一个关键问题了:”促销实验”的结论,会不会受到”ui实验”的左右呢?

好,这个问题还是得举个栗子,前提记住:

  • “ui实验”:包含50%的a流和50%的b流
  • “促销实验”:包含50%的a流和50%的b流

现在有一个device_id,我们假设hash(device_id)%100等于20,则可以确定device_id在两个实验中都属于a流,发现奇怪的地方了没有? 属于”ui实验”的a流,那么一定属于”促销实验”的a流,也就是两个实验的流具备了某种绑定关系,这对我们实验结果有什么影响呢?

很简单,”促销实验”的a流用户一定也应用了”ui实验”的a流,那么”促销实验”的PM就会觉得这个实验毫无意义,因为无法摆脱”ui实验”a流带来的影响嫌疑,到底是我的”促销a”好还是因为”ui a”好导致的指标变化?

怎么办呢?如果”促销a”的流量,均匀的来自于”ui实验”的a与b,那么就可以摆脱”ui实验”带来的影响了。

所以,分流算法需要改成:hash(device_id+实验名) % 100,这样的话:

  • hash(device_id+ui实验) % 100可能等于20
  • hash(device_id+促销实验) % 100可能等于70

经过实验名作为离散因子,我们就不会觉得”促销实验”的a流受到”ui实验”a流的固定影响了,这就是打散的效果,确保了并发实验可以彼此独立验证。

日志上报也略有变化:

  • 进入详情页后,上报一次日志:event=详情页 [{实验名=ui实验 分流=a}, {实验名=促销实验 分流=b}]
  • (如果)点击购物车,上报一次日志:event=购物车[{实验名=ui实验 分流=a}, {实验名=促销实验 分流=b}]

大数据计算时,产生如下的key进行counter++:

  • ui实验_a_详情页
  • 促销实验_b_详情页
  • ui实验_a_购物车
  • 促销实验_b_购物车

2个实验可以独立评估转化率指标:

  • “ui实验”的a流转化率: ui实验_a_购物车 / ui实验_a_详情页
  • “促销实验”的b流转化率:促销实验_b_购物车 / 促销实验_b_详情页

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~