教你如何对产品做AB测试(abtest)

本文介绍了A/B测试的基本概念及其在客户端和服务端的应用场景。详细解释了两种不同的实验模型:一种是通过URL参数传递实验信息,另一种是通过客户端缓存实验策略并上报数据。对比了两种模型的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用链接:https://blog.youkuaiyun.com/weiguang_123/article/details/49203239


ABtest一个总的目的和意图是,判断哪种种UI或rerank策略更优,通过事实的依据( CTR或下单率)判断哪种策略更符合用户的习惯和需求。

一、需求驱使 

我们经常会面临多个设计方案的选择,比如app或pc端某个界面的某个按钮是用红色还是用蓝色,是放左边还是放右边。传统的解决方法通常是集体讨论表决,或者由某位专

家或领导或文青来拍板,实在决定不了时也有随机选一个上线的。虽然传统解决办法多数情况下也是有效的,但A/B 测试(A/B Testing)可能是解决这类问题的一个更好的方法。

所谓 A/B 测试,简单来说,就是为同一个目标制定两个方案(比如两个页面),让一部分用户使用 A 方案,另一部分用户使用 B 方案,记录下用户的使用情况,看哪个方案更符

合设计目标。

下面看一个例子:

在展示“格林秀上午酒店”这个poi时有客户端两种UI:

方案A:如左图,评分展示星状图片,消费人数再右边; 

方案B:如右图,只展示评分分数,后边添加消费人数;



       我们很难知道那种方案比较好,那我们可以做个实验,把a和B方案同时放到线上的生产环境,让一部分用户使用 A 方案,另一部分用户使用 B 方案,记录下用户的使用报表如下图,通过大自然的优胜劣汰法则,我们可以通过CTR或下单率等指标看哪个方案更符合设计目标。


二、系统模型

abtest实验可以分成两种,客户端client实验和服务端server实验,客户端实验一般来说只是UI上的实验,比如上面的例子,纯粹是展示端的策略;而服务端的实验是返回给client数据的内容做实验,比如推荐的策略,订单列表rerank策略等。下面通过client和服务端的实验分别做介绍。

(1)客户端实验:

方案1:


ABTest业务流程描述:

(1)客户端在需要获取ABTest策略的地方,通过RPC接口获取uuid在ABTest1这个实验下的规则:
[javascript] view plain copy
  1. {  
  2.     "data": [  
  3.         {  
  4.             "name""test1",//实验key  
  5.             "strategy""strategy1",      //策略key,客户端根据策略key选择策略方案  
  6.             "flow""flow1",      //流量组,用于上报。每个流量组只属于一个策略。  
  7.             "finished"false     //标识实验是否终止,如果已经终止,则不再向utm_compaign参数的F字段append该规则,但是不影响规则,原规则依然生效。  
  8.         }  
  9.     ]  
  10. }  
其中testkey参数可以是多个ABTest实验的key:abtest1,abtest2。
(2)之后客户端向server发起的全部请求,URL的utm_compaign参数中的F位添加字符串:Fabtest1__strategy1__flow1,Nginx将utm_compaign打印到access日志。
(3)客户端在另一个需要获取ABTest策略的地方,通过http接口/get/abtest/{testkey}/{uuid} 获取uuid在ABTest2这个实验下的规则:
[javascript] view plain copy
  1. {  
  2.     "data": [  
  3.         {  
  4.             "name""abtest2",//实验key,  
  5.             "strategy""strategy2",      //策略key,客户端根据策略key选择策略方案  
  6.             "flow""flow2",      //流量组,用于上报。每个流量组只属于一个策略。  
  7.             "finished"false     //标识实验是否终止,如果已经终止,则不再向utm_compaign参数的F字段append该规则,但是不影响规则,原规则依然生效。  
  8.         }  
  9.     ]  
  10. }  
(4)之后客户端向server发起的全部请求,URL的utm_compaign参数中的F位添加字符串:Fabtest1_strategy1__flow1___abtest2__strategy2__flow2,实验&策略&流量组采用两个下划线分隔,多个实验间采用三个下划线分隔。
(5)Nginx将URL中的utm_compaign打印到access日志,flume收集Nginx access 日志,同步到Hadoop,最后导入Hive。
(6)PM在报表系统,通过规则维度查询点击、转化报表。

这样导致的问题是url中utm_compaign的F字段过长,当实验到达一定数量的时候会出现,url过长,抓包会发现。实际上,客户端只关心我在某个界面中这次请求(uuid+ci+platform)命中的实验及策略,连utm_campaign都懒得拼接。
如URL中有utm_campaign= Fab_homepagewebview0717__b__d___ab_b_food_57_purepoilist_extinfo__a__a___ab_b_selectlist_paidui__a__leftflow___ab_i550poi_ktv__d__leftflow___ab_i_5_9_travelpoidetail__b__a___ab_i550poi_xxyl__d__d___ab_mingdiangexinghua0707__j__j___ab_waimaiwending__b__b___ab_b_travelsearchhot__a__a___ab_ifoodadvert__b__b___ab_pindaoqugexinghua0708__e__e___ab_itriphotpoi__b__leftflow___ab_i_6_0_webview__a__a___ab_b_travelpoilistrank__b__b2___ab_i_group_5_7_search_chunpoi__b__b1___ab_i_group_5_8_spdy__b__b___ab_ihotelqianzhi__b__b___i_group_5_2_deallist_poitype__d__d___ab_i550poi_shfw__d__leftflow___ab_ihotelpoilist__b__b___ab_itravelsearch0814__b__leftflow___ab_i_group_6_0_search_hotword__b__leftflow___ab_sieve_multiple_staticscore__base__base___ab_h_hotel_search_hot__b__b___ab_i_group_5_9_onsite__a__leftflow___ab_i_group_pingjiapush__a__a___ab_b_catesearchreplace__b__b___ab_b_deal_sieve_migrate__b__b___ab_i_group_travelhomepage0630__a__a___ab_i550poi_lr__d__leftflow___ab_b_searchmaiton__c__c___ab_groupcontext__a__a___ab_maidan_distance_first__smartfirst__smartfirst___ab_i_group_5_9notificationtest__a__a___ab_dealzhanshi__a__a1___ab_i_group_5_8_dns__a__leftflow___ab_ihotelbkdetail__a__a___ab_v1_po1_sieve_migrate__search__search
基于这个痛点,我们采用另一种上报方式;

方案二


流程:

  1. (1)(客户端的工作):app启动或切换城市,会请求abtest服务后台,获得所有的实验的以及命中的策略缓存在app中。
  2. (2)(abtest后台的工作):abtest接收一个uuid+ci+pt的请求,返回给app所有的实验的以及命中的策略,同时将这次请求和结果通过flume_agent收集日志,同步到Hadoop,最后导入Hive。
  3. (3)(客户端的工作):在第1步的请求中的获得的所有的实验的以及命中的策略缓存在app中。
  4. (4)(客户端的工作)  : 进入到一个做ab实验的界面,按照第3步命中的实验的策略+展示的业务数据处理展示逻辑。
  5. (5)(客户端的工作:):会把第4步这个界面的信息和埋点信息上传到数据中心的原始日志,异步步少重试的方式上报埋点,

HTTP GET/POST 日志收集方式,MGE,MGP,MPT的信息定义可以。移动页面流跟踪事件,这些事件封装为MPT事件,具体格式如下:

[javascript] view plain copy
  1. </pre><pre name="code" class="javascript">"nm":"MPT",//页面流跟踪事件(PageTrack)  
  2. "val":{  
  3.     "root":    //层级前缀  
  4.     "name":    //页面名/组件名/弹窗名  
  5.     "content"//数据请求URL内容/弹窗内容  
  6.     "type":    //page/alert  
  7. }  
  8. "nm":"MGE",//Event跟踪,需要客户端手工埋点,用于解决临时统计需求  
  9. "val":{  
  10.     "cid":    //页面名 ||||类别 category id  
  11.     "act":    //动作名 ||||动作 action  
  12.     "lab":    //动作描述 ||||注释 label  
  13.     "val":    //页面描述 ||||权值 value  
  14. }  
  15.   
  16. "nm":"MGP",//页面跟踪,需要客户端手工埋点,用于解决临时统计需求  
  17. "val":{  
  18.     "root":    //层级前缀(非必需)  
  19.     "name":    //页面名/组件名/弹窗名(必须)  
  20.     "content"//数据请求URL内容/弹窗内容(必须)  
  21.     "type":    //page/alert  
  22. }  

(6)(数据组的工作):应用系统可以通过flume,将原始日志同步到Hadoop,最后导入Hive表,通过关联的条件将两个hive表关联,同时关联一些点击下单等数据,清洗数据成报表。


方案一和方案二的比较:

(1)方案一的缺点是会添加客户端RD的URL拼接工作,致命的是实验到达一定个数,访问页面过深URL过长导致被截断(sa控制http的url的长度和header大小)
(2)方案一的有点是,数据组RD清洗数据比较方便,只需收集ngixn日志,对url进行清洗即可产生报表,只需要关联点单点击等报表。
(3)方案二的优点是,通过各自打埋点成原始日志到hadoop平台方式,客户端只关心自己命中的策略以及处理的业务逻辑,与业务无关的事情切入较少。
(4)方案二的缺点是,客户打的埋点需要跟abtest后台的表进行关联,关联的逻辑不固定,添加了清洗数据的复杂度。
最后基于系统长期的发展,采取了方案二,前期使用的方案一将在app的新版本中废弃。

(2)服务端实验:



其实服务端的实验跟客户端的实验的是类似的,只需要添加额外的工作: 在服务端请求abtest后台,需要知道本次请求以及实验命中的策略,并将结果返回给客户端。



<think>嗯,用户想要找AB测试相关的实战项目案例或者实现程。他们可能是在学习如何实施或优化AB测试,需要具体的例子来参考。首先,我应该回顾一下之前提供的引用内容,看看有没有相关的案例或者方法可以借鉴。 引用[4]提到了一个中型电商公司的案例,背景是UI设计更新以提高转化率,目前的转化率是13%,目标是15%。他们通过AB测试来验证新页面的效果。这个案例可以作为实战项目的一个例子,详细描述实验设计、样本量计算、结果分析等步骤。用户可能需要这样的详细流程,所以可以展开说明。 另外,引用[1]提到了Evan's Awesome A/B Tools这个网站,可以用来计算样本大小和测试结果。这可能对用户有用,特别是如果他们需要实际操作的工具,可以推荐这个资源。同时,引用[2]和[3]讨论了假设检验的基本原理,包括小概率事件和显著性水平的选择,这些理论部分可能需要结合到案例中,帮助用户理解背后的统计原理。 用户的问题是关于实战项目和程的,所以除了案例之外,可能需要分步骤的实现程,比如如何设计实验、计算样本量、进行随机分流、数据收集和分析等。同时,可能还需要提到一些常见的工具和平台,比如Google Optimize、Optimizely,或者Python中的相关库,比如statsmodels,这些都能帮助用户实际动手操作。 另外,考虑到用户可能对结果分析中的统计方法不太熟悉,应该解释p值、置信区间等概念,并结合案例中的数据进行演示。例如,在电商案例中,如何计算Z值,得到p值,并判断是否拒绝原假设。同时,还要注意实际效果评估,比如提升的转化率是否具有实际意义,而不仅仅是统计显著。 可能用户还需要了解常见的陷阱和优化方法,比如样本量的充足性、测试时长的影响、多变量测试等。这些内容可以作为程的一部分,帮助用户避免常见错误,优化他们的AB测试流程。 最后,生成的相关问题需要覆盖用户可能进一步关心的内容,比如样本量计算、统计原理、结果分析工具、常见错误等,这样他们可以按需深入了解更多细节。</think>### AB测试实战案例与实现程 以下结合电商行业典型案例及实现步骤进行说明,包含完整的实验设计、统计验证和代码实现环节: --- #### **案例1:电商产品页改版优化(参考引用[4])** **背景**:原产品页转化率$CVR_0=13\%$,新设计页面目标$CVR_1=15\%$,需通过AB测试验证效果。 **实现步骤**: 1. **假设建立** - 原假设$H_0$:新旧页面转化率无差异($CVR_1 - CVR_0 = 0$) - 备择假设$H_1$:新页面转化率更高($CVR_1 - CVR_0 > 0$) - 显著性水平$\alpha=0.05$(参考引用[3]中第一类错误控制) 2. **样本量计算** 使用引用[1]提到的样本量计算工具,输入参数: - Baseline转化率:13% - 最小可检测效应(MDE):2%(15%-13%) - 统计功效(Power):80% - 显著性水平:5% 输出结果:每组需至少$n=3,892$用户(总样本量约7,784) 3. **流量分配与实验执行** - 随机分流:50%用户进入对照组(旧页面),50%进入实验组(新页面) - 数据收集:记录用户访问时长、点击购买按钮次数、最终转化结果 4. **统计检验** ```python from statsmodels.stats.proportion import proportions_ztest # 实验组:4000用户,520人转化(13% → 实际观测值) # 对照组:4000用户,560人转化(14% → 实际观测值) count = np.array([560, 520]) nobs = np.array([4000, 4000]) z_stat, p_value = proportions_ztest(count, nobs, alternative='larger') print(f"Z值:{z_stat:.3f}, P值:{p_value:.4f}") # 输出:Z值:-1.789, P值:0.9632 → 不拒绝H0(新页面未达显著提升) ``` **结论**:$p=0.9632 > \alpha=0.05$,新页面未达到预期效果,需分析原因(例如UI设计未触达核心痛点)[^4]。 --- #### **案例2:APP推送文案优化** **背景**:优化推送文案以提高用户点击率(CTR),对照组文案A点击率2%,实验组文案B目标提升至2.5%。 **关键技术点**: 1. **多重检验校正** - 若同时测试多个文案(B/C/D),需使用Bonferroni校正,调整$\alpha$值为$\alpha/m$($m$为实验组数量)[^3] 2. **结果可视化** ```python import matplotlib.pyplot as plt plt.errorbar(x=['A','B'], y=[0.02,0.025], yerr=[1.96*np.sqrt(0.02*0.98/5000), 1.96*np.sqrt(0.025*0.975/5000)]) plt.title('CTR置信区间对比') ``` ![置信区间重叠时说明差异不显著](https://via.placeholder.com/300x200/EFEFEF/000?text=示例图表) --- #### **实战工具推荐** 1. **开源库** - Python:`scipy.stats`(T检验)、`statsmodels`(比例检验、方差分析) - R:`pwr`(功效分析)、`PowerUpR`(样本量计算) 2. **可视化平台** - Google Optimize(免费)、Optimizely(企业级) 3. **样本量计算器** - [Evan's Awesome A/B Tools](https://www.epubit.com/)(引用[1]) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值