【数分】7. AB实验篇

0. 常考问题

1. 什么场景用AB test,什么场景不能用AB test?

适用场景:
	1. 产品迭代:比如页面优化、功能增加、流程增加,这些都可以使用AB实验测试产品改版是否成功。
	2. 策略优化:运营、算法策略都可以都可以使用AB实验验证策略是否达到预期目标。
必要条件:
	1. 存在实验单元,且能被分配到不同的组且互不影响或影响很小;
	2. 需要有足够多的实验单元;
	3. 核心指标需要能被观测并被正确评估;
	4. 新增加的功能或改动的开发成本可以接受。
不适用场景:
	1. 用户体验制约:一些较为敏感的策略,如价格调整、激励变化等,往往需要顾及用户间的体验公平性与用户长期体验的一致性,如美团配送费不一致策略;
	2. 样本数量制约:部分场景由于天然不可抗力因素导致样本量非常小,无法达到统计学大样本的要求,如防止侵害的安全性事件;
	3. AB组间存在干扰:要求AB组间相互独立,若相互影响则不适用,如滴滴司机激励策略,司机有互通群,未激励司机会认为受到不公平待遇从而对策略产生影响。

2. 底层逻辑是什么?

随机化:AB实验通过随机化的处理,使全部的外在干扰因素都失效了,策略成为了差异的唯一来源
假设检验:
	1.提出假设:原假设和备择假设,两者互斥且并集为全集;
	2.构建统计量:常用的如T检验、Z检验和F检验等;
	3.确定拒绝域并判断:计算样本统计量,判断是否接受原假设。

3. 需要多大的样本,如何确定实验时间?
n = 2 σ 2 ( z 1 − α / 2 + z 1 − β ) 2 Δ 2 n = \frac{2\sigma^2(z_{1 - \alpha/2} + z_{1-\beta})^2}{\Delta^2} n=Δ22σ2(z1α/2+z1β)2

公式解读:

  1. α \alpha α为第一类错误,也叫弃真错误,一般取0.05; β \beta β为第二类错误,也叫取伪错误,一般取0.2;
  2. Δ \Delta Δ指预期指标的绝对变化量, σ 2 \sigma^2 σ2为指标的方差。
注意:
1. 计算出的样本量是每个组的最低样本量;
2. 样本量可以累积,实验时间可以用需要样本量/每日产生样本量来计算。
3. 周末、节假日、季节效应等与时间相关的效应;
4. 好奇效应

4. 如何选择实验城市?

部分城市实验原因:
	1. 实验可能存在负向影响;
	2. 每个城市特性差异性较大。
选择原则:
	1. 尽量选择大体量城市;
	2. 选择不同类型城市。

5. 如何确定分流时机,并举例说明?

实验分流的触发点是且只能是策略的生效点。

6. 做AB实验时,判定为效果显著,但是上线后效果不好,为什么?

 AB实验的科学性:
 	1. 样本量不足:样本太少,结果是随机波动导致的,结果并不置信;
 	2. 实验时间太短:实验初期用户可能受新奇效应表现出不可持续性行为,应等试验结果稳健后观测结果;
 	3. 实验人群 != 上线人群:实验城市、实验对象不同,肯跟会引起策略差异,所以实验样本应与总体保持一致
 检查外部环境:是否发生大变化,如重大节日等。

7. 统计上显著,但是业务觉得没有上涨,为什么?

统计显著:是一个统计学概念,指的是数据差异随机产生的难度有多大,当样本量足够大时,任何策略都会在统计上显著;
业务显著:指的是策略是否有足够的增长,是否具有商业价值,是一个业务上的判断。

总结:应前置解决,在实验开始前设定好预计提升量,在此基础上计算所需样本,然后再去计算实验设计。

1. A/B测试的基础知识

1.1 总体流程

标准的ab实验在数据层面至少要有两个对照组,一个实验组,对两个对照组做aa实验,若不显著进行ab实验,否则可能是实验层面出现问题,可以修改实验或者选择做did分析
在这里插入图片描述

1.2 数据准备

  • 实验至少要有3个分流池,两个base组,一个exp组;
  • 一个user一条数据,包括组label,user_id,对比的 y y y变量;
  • 如果base组和实验组数据量过大,可以随机采样;如果还要做交互项分析,随机采样时可以根据交互项groupby采样。

1.3 aa实验

aa实验是保证ab实验可靠性的前提,aa实验通常用来辅助观察指标在产品不做改变时的偏差范围,而如果这个偏差很大,通常ab实验也容易结果不置信。

aa实验显著差异的原因及应对方法:

  1. 统计层面:一般样本较少时候容易出现,即容易出现数据波动,解决方法:扩量、去掉异常数据;
  2. 埋点层面:埋点侧出现问题,导致实验数据异常;
  3. 实验层面:比如实验重叠导致的base组之间配置不相等;滞后效应导致的base组还在受上一个实验的后续影响等等,解决方案:需要重新设计实验

aa实验检验方法:独立样本t检验

1.4 ab实验

ab实验是假设base组和exp组无显著差异,并做检验的假设实验,零假设为无显著差异,备选假设为有显著差异,最后根据接受零假设的概率p值来确定结果。

我们做ab实验的时候主要分两步计算:

  1. 通过独立样本t检验,计算base组合exp组之间是否存在显著差异。如果差异不显著,则证明实验组的策略没有带来显著变化,则实验结束;
  2. 如果差异显著,那么说明得到的p值<0.05,那么我们可以进一步分析政策的影响是正向还是负向,变化量为多大。可以通过对y变量做回归的方式得到X为实验组的时候与X为对照组的差异,对y取log再做回归可以得到差异的百分比;除了回归也可以直接对比两组之间y的总体均值进行分析。

1.5 独立样本t检验

独立样本t检验是t检验的一种,一般的总体标准差未知且满足正态分布,或者近似于正态分布的总体数据都可以用t检验。ab实验中,由于base组和exp组都是随机分流,是独立样本,并且是对比两个样本之间的差异显著性,因此适用独立样本t检验,业界内,大部分ab实验都采用了独立样本t检验进行差异显著性假设检验。

t值和自由度d.f.的计算方法:

  • 方差齐性检验不显著差异:
    在这里插入图片描述

根据计算出的t值和自由度,可以在t值边界表中查询到p值得大小,进而得到差异显著性。

  • 方差齐性检验显著差异:
    在这里插入图片描述
    如果方差齐性检验显著差异,则t检验变为修正的Welch’s t-test,t值的计算和自由度的计算如上所述。

1.6 简单的ab实验代码

数据源截图:
在这里插入图片描述
基础AB实验案例:

#导入路径内的DID包和需要的pandas包
import sys
sys.path.append('/home/public/benyuansong')
from DID import preprocessing
from DID import ttest
import pandas as pd       
                             
#读取分析文件
file = pd.read_csv('文件path')   
                          
#对file进行预处理,参数从左到右依次为dataframe数据、分析的y变量、组别字段名、user字段名、group_name字段中base组的值(因为至少有两个base组,所以是列表形式表示)、group_name中exp组的值
# 此预处理一个目的是面板数据转化为用户粒度的截面聚合数据;
# 再一个目的是处理缺失值。如果这两组已经满足,则可以不用做预处理,直接做后面的ttest。
base1,base2,exp = preprocessing.ttest_preprocessing(file, 'A', treatment_col = 		'group_name', name_col = 'user_id',basename=['base','base1'],expname='exp')

# 打印ttest结果,包括差异是否显著,如果显著,那么差异是多少(base-base1)。
# 参数从左到右依次为:base1数据源、base2数据源、exp数据源、分析的y变量
ttest.ttest(base,base1,exp,'A')

结果示例:
A: ab_pvalue:0.0,difference(exp-base):0.007144186774656516,Percentage of increase:7.96%
结果解读:因为pvalue为0,因此相对于base组,实验组的A指标显著增长0.007,相对显著提升7.96%

2. A/B测试的进阶教程

低渗透率:一般指分流实验后,实验组中的策略影响的user只有很小的一部分比例,比如说实验组中开放了一个新功能,而通过接口使用功能的人只是很小一部分,那么往往不会很大程度影响大盘的变化,导致整体上做ab实验得到的结果差异一般都是不显著的,无法客观评价产品功能上或者策略的好坏,仅仅有可能是入口做的糟糕,所以我们这里需要一些方法可以评价使用产品或者策略的用户与其他用户的对比,从而得到渗透率低的情况的分析结果。

解决思路:筛选使用功能的人,看一下他们的分布情况,如果依然符合正态分布或者近似正态分布,那么可以接着用ab实验的方法,即实验组筛选使用功能的人,两个base组做一下随机采样,按照前面提到的ab实验标准流程作分析即可。

如果使用功能的人不符合正态分布,那么我们需要进行matching,通过匹配控制变量,从base组中找到与使用功能相似的人,然后进行did分析。

2.1 split sample

split sample实现的是相当于一个filter的作用,ab实验除了分析总体的变化情况,我们可能也会关心不同的群体有什么影响,这就是交互项分析回答的问题。举个例子,主播连麦功能实验中,a是开放功能的样本,b是为开放功能的群体,那么除了前面基础分析中,我们得到的总体的差异,我们还想得知:男主播开放功能会有什么影响、年纪较大的主播开放功能会有什么影响、粉丝量比较少的主播开放功能会有什么影响等等。这个就是通过split sample的方式进行分析,顾名思义就是通过划分筛选样本的方式来计算子样本的t检验。

causal inference package中的实现——class filter
工具包中可以通过filter类中的filter_ttest函数来进行分析,这其中filter类可以支持多种方式的筛选,比如

  1. filter=‘gender’:代表既要看男性的变化影响,又要看女性的变化影响。
  2. filter=[‘gender’,‘age’,‘fans_range’]:先后分别查看性别、年龄以及粉丝范围带来的影响。
  3. filter={‘gender’:‘F’,‘age’:‘18-23’,‘fans_range’:‘1w+’}:以字典形式给出时,代表这三个条件同时满足的群体开放功能有什么影响。

代码示例

import sys
sys.path.append('/home/public/benyuansong')
from DID import preprocessing
import pandas as pd
from DID import filter
    
#读取数据
file = pd.read_csv('文件path')
  
#数据预处理
base1,base2,exp = preprocessing.ttest_preprocessing(file,'total_watching_duration', treatment_col = 'treatment', name_col = 'user_id',basename=['base1','base2'],expname='exp1')
  
#自定义filter
myfilter = filter('gender')
  
#输出各个base组与实验组的filter后的sample size
filter.filter_sample_size(base1,myfilter)
filter.filter_sample_size(base2,myfilter)
filter.filter_sample_size(exp,myfilter)
  
#输出filter后的交互项分析
filter.filter_ttest(base1,base2,exp,myfilter,'total_watching_duration')

2.2 交互项interaction

跟split sample不同,interaction分析的是不同群体之间的差异,打个比方split sample是开发功能后,男性的差异变化;而interaction分析的是开放功能后,男性相对于女性的差异变化。split sample就是根据简单的样本筛选后再做基础分析得到;而interaction需要用到交互项回归,具体原理如下:

假设我们分析的变化量为y,X为组别差距即treatment,在ab实验中,令X=1为exp组,X=0为base组,那么根据最小二乘法ols线性回归,可以做如下回归,其中a为自变量的系数,b为截距,a就是反应变化量的parameter,则 y = a X + b y = aX+b y=aX+b

而如果我们加入交互项,比如说female,那么female=1代表是女性,female=0代表不是女性(在gender没有’未知’的值的情况下,就代表是男性),那么回归变为如下表示,这里c就是我们要求的系数,d是截距,则 y = a X + b f e m a l e + c X ∗ f e m a l e + d y = aX+bfemale+cX*female+d y=aX+bfemale+cXfemale+d
原因如下面的矩阵表示:

treatment=1treatment=0
female=1 a + b + c + d a+b+c+d a+b+c+d b + d b+d b+d
female=0 a + d a+d a+d d d d

interaction想求得就是开放功能后,女性相对于男性的变化量的差距,即 ( ( a + b + c + d ) − ( b + d ) ) − ( ( a + d ) − d ) = c ((a+b+c+d)-(b+d))-((a+d)-d)=c ((a+b+c+d)(b+d))((a+d)d)=c

用案例来说明:即开放连麦功能后,女性开播时长提升5% 男性提升10%,那么交互项得到的就是: 相对于男性,女性提升-5%

import sys
sys.path.append('/home/public/benyuansong')
from DID import preprocessing
import pandas as pd
from DID import ttest
 
#读取数据
file = pd.read_csv('文件path')
 
#数据预处理
base1,base2,exp = preprocessing.ttest_preprocessing(file, 'total_watching_duration', treatment_col = 'treatment', name_col = 'user_id',basename=['base1','base2'],expname='exp1')
 
#交互项分析,第4个参数只支持字典,代表交互项的选择,method='log',返回变化百分比,默认是None,返回变化绝对值
ttest.inter_ttest(base1,exp,'total_watching_duration',{'gender':'F'},method=None)

结果示例:
gender id F: param is -300.2654, p_value is 0.92768654

解读:表示的是相对于M, F的指标降低了300.2654, 而由于p_value是0.9>0.05,因此差异不显著。

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity的.ab资源是一种在游戏开发中常用的资源打包方式。.ab是Asset Bundle的缩写,意为资源包。它的作用是将游戏中的各种资源,如纹理、模型、声音等打包成一个个资源包,方便在游戏运行时进行加载和管理。 使用.ab资源有以下几个优点。首先,它可以有效地减小游戏的安装包大小。由于游戏中的资源往往占据了大量的空间,将这些资源打包成.ab文件后,可以减少安装包的大小,降低玩家下载游戏的时间和流量消耗。 其次,.ab资源可以实现资源的按需加载。游戏中的资源往往是按照场景或关卡进行划分的,在游戏运行时,只需要加载当前场景或关卡所需的资源,可以提高游戏的加载速度和运行效率。 第三,通过使用.ab资源,还可以实现资源的动态更新和替换。在游戏发布后,如果需要更新或修复某些资源,只需要替换相应的.ab文件即可,无需重新发布整个游戏。这样不仅方便了开发者的维护工作,还可以提供更好的用户体验。 最后,.ab资源还可以实现资源的共享和重复利用。不同的场景或关卡可能会使用到相同的资源,使用.ab资源可以避免资源的重复加载和占用过多的内存,提高游戏的性能和效率。 总之,Unity的.ab资源是一种在游戏开发中非常有用的资源打包方式。它可以减小安装包大小、按需加载资源、实现动态更新和替换,以及实现资源的共享和重复利用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值