一、什么是A/B test

A/B-test,本质就是对照实验。为同一个目标和假设,设计A、B两个方案。从一波用户中,随机分为A、B两组,A组用A方案,B组用B方案。上线后,验收两组实验的数据情况,从而判断哪一组的效果更优。

A/B-test在国内互联网中的应用越来越普及,成为互联网进入精细化迭代和运营的核心方法论。

二、没有平台化的A/B-test 如何进行实践?

个人所在创业公司,在业务早期,没有平台化的时候,就开始粗暴地进行A/B-test。以一个简单case为例,阐述一个实验过程。

Step1. 确定实验内容

基于同一个目标,策划了①、②、③、④组实验内容。

Step2.放量策略

4组实验,分为9个实验组和1个实验组,针对某日注册的新用户,进行尾号0-9的分割,进行分流,由服务器控制版本下发。

Step3.上线收集数据

建立一张用户-实验组别的维度表,根据埋点日志 join 维度表,手动跑sql查询关于用户行为、次日留存、7日留存的数据。

Step4.根据结果判断next step

根据实验结果,判断相关的实验线下 或者 开放全量。比较难的问题是,如果测试的产品功能差异较大,如何进行版本兼容是个比较大的问题。

此外,客户端版本直接的管理,是根据各个独立版本进行服务器控制。没有进行用户版本记录和版本回滚,后续版本变多,可能会存在管理混乱的风险。

三、暴露的问题和平台产品解法

2.1 放量策略

现在使用的策略是这样的

对当日新增注册的用户,进行尾号0-9的分割,直接分配给10个实验组

当问到为什么这样的时候

UserID 是自增 ID,跟用户注册顺序有关,可以保证测试的随机性。

A/B-test的放量策略,一个重要原则就是随机无偏,不然会存在误差。

这样的实验做法,确实可以满足单个实验中的随机性。但如果考虑到长期繁杂的、交叉的、连续的实验,会出现问题:

第一,这种策略只能进行单层实验,对实验的流量分配的灵活变动非常不友好。

中途想要对某些实验扩容,对某些实验缩容都不可实现

其次,这种策略在长期会造成实验组间用户行为有偏。

刚开始因为其随机性,实验组间的用户行为差异很小。但第一次实验过后,某个尾号(某个实验组)就会产生行为差异,这种差异如果直接和某个尾号关联,可能直接会对后续的实验产生影响

那该如何设计用户分桶,才能满足A/B-test 的需求呢?

目前业内,对于A/B-test的流量策略,基本是基于google的论文Overlapping Experiment Infrastructure: More, Better, Faster Experimentation

总结来说,就是存在一个域和层的概念。不同域之间互斥,同一个域的不同层正交

具体来说,根据实验类型,从修改的系统参数到观察的产品指标上的相关性,将流量分成可重叠的多个Layer。例如 UI 层、推荐算法层、广告算法层。各个层之间的实验结果和观测指标独立,不存在相互影响的可能。

流量分层后,针对每个层中的流量,选用不同的随机算法,保证流量在不同层是重新打乱随机分发的。

用户分流,一般以用户维度分流,这样可以保证单一用户每次进来看到的是相同实验,不会造成体验上的不一致:

实验的 Hash 因子有用户唯一标示(通常是cookie,UID,手机号等)、策略ID、Layer ID,根据具体需求,可以选择多个因子组合后 Hash。

HashID=Hash(用户标示,策略 ID,Layer ID)%100+1

每个用户会分配唯一的 HashID,同时会落在[1,100]的范围内,让用户随机均匀散落在这个范围内。配置实验时,根据实际需求,为各个版本均匀切分流量。譬如A版本划分20%的流量,则 HashID 从 1-20 的用户被划分到 A 版本。

2.2 数据收集

现在在数据收集上,使用的方法是

用户和实验分组建立一张维度表,针对核心指标,基于系统日志跟用户-实验分组的维度表去 join

这种方式存在着明显的缺点:,一方面需要手动写sql取数,join的复杂程度比较高,对于业务方(通常是产品或运营)的要求太高。

另一方面,扩展性比较差,目前只针对新注册用户做实验,一个用户在生命周期内,只有一个实验分组。当后续实验拓展,用户和实验分组间按精确到秒的时间来分配,join的复杂程度更高。

再有一方面,用户中实验分组在产品上的生效往往不是实时的。尤其是在客户端上,用户正在用一个功能的时候,很难瞬间将该功能切换成另一种样式,往往是在用户在下一次重入初始化的时候才开启实验样式,否则很容易引起崩溃。

针对该问题,更友好的解法,是在日志上报时,都带上分组信息参数。这样虽然增加了一些冗余信息,但会使所有的关键数据记录都带上分组信息,作为筛选的参数更加便捷。

2.3 数据分析

在某个案例的实践中,业务方获得数据如下

一般的测试owner拿到数据后,直接算出各个实验组之间的转化率差距,然后就做决策。

但这样的做法,忽略了A/B-test的本质,是一个抽样实验,在统计学角度上,样本代表全体始终存在着统计显著性的问题。在一定程度内的数据差别是正常波动,并不能说明某个版本更优。通常A/B-test会进行显著性检验,计算P-value。

关于显著性检验的原理和方法,在之前的文章中介绍过了。

可以查看“一文解析:A/B-test里「显著性检验」的原理方法和实操案例”

2.4 版本回滚

客户端版本直接的管理,是根据各个独立版本进行服务器控制。没有进行用户版本记录和版本回滚,一般的参数配置回滚都是单值的回滚,但是存在多个表的情况下没有办法这么简单地去回滚,后续版本变多,可能会存在管理混乱的风险。

针对此问题,以美团为例,设计一套回滚模型如下:

  1. 首先在配置发布时,会将所有修改的表名、列名、列类型、列新旧值、修改类型存入表中。
  2. 回滚时获取上次发布的所有修改的表名、列名、列类型、列新旧值、修改类型,反向操作数据库,达到回滚的目的。
回滚模型

四、总结

从A/B-test的功能模块来看,大概有以下三个:用户分流服务、A/B test 配置、数据统计、(版本回滚非必要)。实现流程图如下:

针对此,平台产品重点需要策划的核心在于:

  1. 实验创建和人群分组管理
  2. 流量分配管理
  3. 实验绑定指标和指标上报逻辑
  4. 统计指标和显著性指标

参考资料:

Overlapping Experiment Infrastructure: More, Better, Faster Experimentation

ABTest 平台设计 - 如何进行流量分桶

ABTest 平台设计 - 实验开关和分组信息传递

ABTest 平台设计 - 灰度发布和早鸟用户

ABTest 平台设计 - 流量分布问题

沪江ABTest测试平台实践

a*算法流程图_如何从0开始,搭建A/B test平台产品?相关推荐

  1. a*算法流程图_单片机常用的13个C语言算法,看过的据说都晋级高手了

    点击箭头处 "蓝色字" ,关注我们哦!! 问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 推荐阅读 单片机基础汇编语言编程实例 自制 ...

  2. a*算法流程图_光伏逆变器MPPT基本算法介绍李星硕

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 905723370 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢迎 ...

  3. python枚举算法流程图_算法-枚举

    本章我们进入算法的学习,我们会通过比较经典的例题去讲解一些常用的算法思想,常用的算法思想包括:枚举.递归.分治.贪心.试探.动态迭代和模拟等,本节我们来学习一下枚举算法. 1. 枚举思想 枚举算法我们 ...

  4. a*算法流程图_学好流程控制结构轻松应对高考数学程序算法题

    近年来高考数学题目中出现了越来越多的程序框图(程序算法)相关题目,一方面使用流程分析进行计算,另一方面需要将计算结果使用数学公式进行求解.高考数学程序题,基本都属于简单类型题目,主要考察考生多流程控制 ...

  5. 选择排序算法流程图_常用排序算法之选择排序

    前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...

  6. rrt算法流程图_基于采样的路径搜索算法代码实现(RRT和PRM)

    1.采样法 利用网格法可以得到对特定离散化后C-space的最优解.但网格法的缺点是计算复杂度高,适用于自由度较低的机器人.本文简要介绍另一种基于采样的规划器,它涉及以下函数,通过这些函数构建一个图( ...

  7. rrt算法流程图_基于RRT的运动规划算法综述

    基于 RRT 的运动规划算法综述 1. 介绍 在过去的十多年中, 机器人的运动规划问题已经收到了大量的关注, 因为机器人开始成 为现代工业和日常生活的重要组成部分. 最早的运动规划的问题只是考虑如何移 ...

  8. swapidc不能连接到主机_利用SWAPIDC与Kangle搭建虚拟主机销售平台

    释放双眼,带上耳机,听听看~! 又名:利用SWAPIDC与Kangle搭建"跑路互联"或"跑路云".站长最开始建站的时候也是和许多初学者一样,购买一些非常便宜的 ...

  9. 机器学习算法 拟合曲线_制定学习曲线以检测机器学习算法中的错误

    机器学习算法 拟合曲线 机器学习 (Machine Learning) The learning curve is very useful to determine how to improve th ...

最新文章

  1. Sql2008R2 日志无法收缩解决方案
  2. Python tips(
  3. Oracle 段区块 分配 (1)
  4. linux——系统排错之引导恢复shell
  5. python编码规范简单总结
  6. 008-Shell 流程控制
  7. 奇怪,勒索软件Ryuk 新版本把这些 *UNIX 文件夹列入了黑名单
  8. java做校园一卡通技术_基于jsp的校园一卡通管理系统-JavaEE实现校园一卡通管理系统 - java项目源码...
  9. 重访火星时代网_huadingjin_新浪博客
  10. 数字电路基础知识(一) 复位设计-同步复位与异步复位
  11. 使用abd工具查看安卓设备cpu处理器是32位或64位
  12. 怎么让模糊的数字变清楚_为什么有的数字视频看起来很清晰 有的却很模糊
  13. C语言中mac是什么意思,CMAC是什么意思
  14. java中测长度的方法,java获取文件大小的几种方法
  15. pfs游戏识别 穿越火线、apex、csgo、吃鸡
  16. 2020七月实训GUI学生信息管理系统
  17. leveldb Arena 分析
  18. 芯片测试术语 ,片内测试(BIST),ATE测试
  19. 安卓开发-Android系统起源
  20. 鼎捷软件即将亮相工博会 与制造业共赢智造未来

热门文章

  1. 【51CTO/BBS】请教: SQL里有没有字符串组合Join的函数??
  2. asp.net性能优化
  3. vue elementUI表单输入时触发事件@input
  4. linux centos7开启IP转发、路由转发解决docker 端口映射 及外部无法访问问题
  5. linux fedora设置开机自动挂载win磁盘
  6. pyspark randomSplit代码示例
  7. goland开启go mod管理
  8. Go gin框架:helloworld
  9. helm部署minio
  10. scala为什么需要函数