介绍数据驱动时代,无论是产品功能迭代,还是战略决策,都需要数据支持。那么,当我们要推出一个新的功能或策略时,如何评估新旧版本的优劣,即数据的量化就成了一个问题。这时候就需要引入A/BTest。1.什么是A/B测试?A/BTest的概念来源于生物医学的双盲测试。在双盲试验中,患者被随机分为两组,分别在不知情的情况下给予安慰剂和试验药物。经过一段时间的实验,将两组进行比较。两组患者的表现是否存在显着差异决定了受试药物是否有效。互联网行业,在产品正式迭代发布前,在Web或App界面或流程上针对同一目的制定两个或多个解决方案,将流量在同一时间维度分成几组,保证每一个一组用户在相同(相似)特征的前提下,向用户展示不同的设计方案,收集各组用户体验数据和业务数据,最终分析评估最佳版本,做出科学决策。2.AB系统设计与实现2.1系统介绍ABTest系统的核心功能主要包括五个部分:实验管理:实验配置、在线和离线操作。指标管理:按业务线创建和管理数据指标。数据指标分为“事件指标”和“复合指标”。白名单管理:创建和管理各种导流标识的白名单。数据报表:实验用户总数、流量概况、注意力指标图和实验结论数据。分发服务:业务方调用获取实验分组结果的RPC服务。2.2系统架构2.3系统实现2.3.1实验管理实验列表:是所有实验的集合,整个实验列表分为三个区域:“筛选/查询区”、“新建实验”、“列表区”.新建一个实验:需要填写三个部分:基本信息、实验配置信息、实验策略配置。默认状态是测试。实验基本信息实验配置信息实验策略配置2.3.2指标管理指标分为“事件指标”和“复合指标”两种。事件指标通过嵌入事件进行配置和统计,对基本事件指标进行四次运算生成复合指标。2.3.3白名单管理白名单功能提供了统一的白名单创建和管理,用于在实验配置时为相关实验组添加白名单。测试组。2.3.4数据报表实验报表是对单次实验、配置的核心指标及相关指标的统计数据报表说明。基本信息实验ID:实验的实验ID。实验名称:此实验的实验名称。开始时间:实验正式上线的时间。运行天数:自实验上线/结束以来的运行天数。操作记录:记录本次实验的操作变化记录,包括流量分配、核心指标修改、实验暂停/上线等。查看配置:查看本次实验的配置信息。整体核心数据-实验用户总数:实验启动后/结束前参与实验的用户数,按导流标识统计。Group-总实验用户数:每组实验上线/结束前参与实验的用户数,按导流标识统计。总实验用户比例:“组-总实验用户”/“总体-总实验用户”*100%。流量分配:创建实验时,流量的分配比例。核心指标值:创建实验时,此处会根据【指标管理】中配置的数值方法和小数位数显示配置的“核心指标”对应的数值。统计验证:用于描述实验组指标与对照组相比的改善幅度。随着参与实验的样本量逐渐增加,数据指标波动趋于平稳,置信区间逐渐缩小。通常,选择95%的置信区间。统计功效:统计功效用来描述一个测试能够检测出测试结果真实可靠的概率;一般用于衡量当实验不显着时是否需要继续扩大样本继续实验。一般当差异不显着时,统计功效小于80%,需要继续实验;当差异不显着时,统计功效大于80%,说明基础对照组与实验组无差异。实验结论:实验结论以“核心指标”和“统计疗效”为依据。流量概览的主要目的是衡量流量分布是否均匀。指标为“新用户数”:当天首次参与实验的用户数。关注指标(含核心指标)实验UV:同“组-实验总用户数”,按导流统计每组实验启动后/结束前参与实验的用户数标记。指标名称:所选指标对应的名称。差值绝对值:本组对应于对照组在该指标上的差值。例如:如果对照组的订单数是50,而实验组是100,那么这里差异的绝对值就是100-50=50。差异的相对值:组对应差异的百分比本指标为对照组。例如:如果对照组的订单数是50,而实验组是100,那么这里差值的绝对值为(100-50)/50=100%。Confidenceinterval:核心指标通过实验配置的置信度统计计算得出。2.3.5分发服务分发逻辑分发服务实时同步已经上线的实验配置。业务调用方通过实验ID+分布标识获取实验分组结果。具体实现逻辑如下:if(白名单判断){return"白名单组";}if(测试离线判断){return"判定组";}if(进组出组){if(cache结果判断){return"缓存结果组";}}//bucket分组,使用experimentid+shuntidentifier进行hash取模100得到bucket号,同一用户在不同实验中的bucket号不完全相同,保证实验间的独立性intbucketNum=BucketNumUtil.getBucketNum(testId+"_"+tokenId);//根据桶号获取对应的实验组StringgroupName=getGroupName(test,bucketNum);if(入群出群){redisCache.set(testId,tokenId,groupName,exAt);}returngroupName;业务特点采用无分层方案。所谓无层是指每个实验都是一个单独的层,以实验id为seed对1-100的桶号进行shuffle,具体实现方法如下://generatebucketnumbersfrom1-100,并使用testId作为seedshufflingdisorder(相同的seedshuffling结果相同,从而保证同一个ABTest的桶号List不变,并且可以根据testId进行预测,桶号分布的随机性不同实验确保实验之间的独立性)List
