JavaEE鸿蒙应用开发HTML&JS+前端Python+大数据开发人工智能开发电商视觉设计软件测试新媒体+短视频直播运营产品经理集成电路应用开发(含嵌入式)Linux云计算+运维开发C/C++拍摄剪辑+短视频制作PMP项目管理认证电商运营Go语言与区块链大数据PHP工程师Android+物联网iOS.NET

一文带你搞懂AB测试

来源:黑马程序员

浏览23760人

2020.07.24

学习目标
  - 知道什么是AB测试
  - 知道AB测试的步骤
  - 知道AB测试原理
1595575558360995.png
让我们想象一下,在公司的某产品研发讨论会上……
“这个功能要不要上?”
“我觉得没问题,XX指标肯定能涨一大截。”
“我不这么想,XX指标说不定也会受到影响,你不能只想着可能的收益呀。”
blahblah无限循环争吵中……
“好啦,别吵了,让我们开个AB看一下效果吧。”
当现在越来越多的app都已经日活百万千万,新功能是绝对不敢、也绝无必要轻易上线的。(因为一旦全量上线引起用户反感,损失不可估计。)这个时候,AB实验就成为了大型功能上线前的必备利器——进行小流量的测试,利用测试的效果来预估上线后的效果。
### 1.什么是AB测试?
    随着移动互联网流量红利、人口红利的逐渐衰退,越来越多的产品运营开始关注数据驱动的精细化运营方法,期望通过精细化运营在一片红海中继续获得确定的用户增长,而A/B测试就是一种有效的精细化运营手段。
> **A/B测试** 是为 web 或 app 界面或流程制作两个(A/B)或多个版本,在同一时间维度,分别让组成成分相同(相似)的访客群组(目标人群)随机的访问这些版本,收集各群组的用户体验数据和业务数据,最后分析、评估出最好版本,正式采用。

1595575583474606.png

> 2008年奥巴马竞选美国总统的时候,有一个互联网团队专门负责竞选相关活动的线上产品,例如奥巴马的竞选募捐网站。这个网站最核心的目标是:让网站的访客完成注册并募捐竞选资金。这个团队当时做了一个非常成功的实验:通过对6个不同风格的主页进行AB测试,最优的版本将网站注册转化率提升了40.6%,而这40.6%的新增用户直接带来了额外的5700万美金募捐资金!
1595575600271346.png
### 2.AB测试举例
- **案例1:相机拍照类应用**
1595575625896067.png 

> 以Camera360为案例,它选用Testin A/B测试服务帮助其进行产品优化决策。该案例是其产品商业化过程中的一个尝试,希望提升商店中表情包或道具的付费比例,但要完成付费指标,首先要提升商店入口点击率。所以,他们设定了多个商店入口方案(更改图标样式、文案),通过A/B测试来验证哪个方案可以最大化提升商店入口点击率。在验证过程中,他们也针对人群目标做了相关定向测试,如日本、中国、韩国等区域,最终他们针对这一入口同时上线7~8个测试版本,通过A/B测试,将整体点击率提升了80%左右。
- **案例2**
1595575648563387.png   
  > 试验目标:期望通过更改签到按钮的文案提高签到的人数,从而提高留存率。
  >
  > 试验过程:签到按钮文案试验,流量第一天两个版本各5%,第二天无错误后调节成50%原始版,50%新版本
1595575681684375.png  
  > - 新版本签到按钮平均点击次数高于原始版本
  > - 新版本的签到次数比原始版本签到次数提高4.17%
  >
  > 95%置信区间结果显示小范围人群的试验结果推广到全量用户之后,有95%概率获得1.7% 至 6.6%的提升;p-value小于0.05,显示新老版本有显著统计差异。
- **案例3:文案修改提升购买率**
1595575705568725.png
> **A/B测试目的**:提升购买率指标
>
> **A/B测试实验设计:**
>
> 1. 对用户来说,核心触发是预期收益率后边的引导按钮。
> 2. 经过团队头脑风暴,认为用户在感知“理财”、“存入”两者之间会有不同考量。一部分团队成员倾向于理财文案,另一部分提出新的想法,“存入”文案更能降低用户对“理财”本身的风险意识。
> 3. 设计了两个版本,用立即理财,与立即存入两个文案。
> 4. 实验进行2周,并得出显著性结果。
1595575728769363.png 
> 可见,实验存在显著性差异。同时转化率提升15.45%,并且置信区间在客户能接受范围内。该实验,取得成功。
### 3.A/B测试的好处
- 消除客户体验(UX)设计中不同意见的纷争,根据实际效果确定最佳方案;
- 通过对比试验,找到问题的真正原因,提高产品设计和运营水平;
- 建立数据驱动、持续不断优化的闭环过程;
- 通过A/B测试,降低新产品或新特性的发布风险,为产品创新提供保障。
### 4.AB测试的基本步骤
AB测试是一个反复迭代优化的过程,它的基本步骤如下图所示可以划分为:
1595575757674171.png
1)**现状分析并建立假设**:分析业务数据,确定当前最关键的改进点,作出优化改进的假设,提出优化建议;比如说我们发现用户的转化率不高,我们假设是因为推广的着陆页面带来的转化率太低,下面就要想办法来进行改进了
2)**设定目标,制定方案**:设置主要目标,用来衡量各优化版本的优劣;设置辅助目标,用来评估优化版本对其他方面的影响。
3)**设计与开发**:制作2个或多个优化版本的设计原型并完成技术实现:
1595575777743788.png
4)**分配流量**:确定每个线上测试版本的分流比例,初始阶段,优化方案的流量设置可以较小,根据情况逐渐增加流量。
1595575799437696.png 
5)**采集并分析数据**:收集实验数据,进行有效性和效果判断:统计显著性达到95%或以上并且维持一段时间,实验可以结束;如果在95%以下,则可能需要延长测试时间;如果很长时间统计显著性不能达到95%甚至90%,则需要决定是否中止试验。
1595575818737446.png 
> **北极星指标(North Star Metric),也叫作第一关键指标(One Metric That Matters)**,是指在产品的当前阶段与业务/战略相关的绝对核心指标,一旦确立就像北极星一样闪耀在空中,指引团队向同一个方向迈进(提升这一指标)。
6)**做出决策**:根据试验结果确定发布新版本、调整分流比例继续测试或者在试验效果未达成的情况下继续优化迭代方案重新开发上线试验
### 5.A/B测试的原理——假设检验
1595575843841888.jpg
> 因为AB测试是检验来自两个组样本平均数的差异性,从而判断它们各自代表的总体的差异是否显著,因此使用的是**两个总体均值之差的检验**
统计量:
1595575867533556.png
### 6.AB测试案例
#### 6.1 案例背景
某公司给网站投放广告的时候,一开始给用户看到的落地页是**访问课程资料**,现在公司又推出了**开始免费试学**这个落地页,现在需要检验新落地页是否优于旧的落地页。
**假设**:新落地页的**转化率**优于旧落地页
**制定方案、设计开发**:已完成
**分配流量:**通过对userid进行hash,将用户分成两组old_page和new_page
**采集数据**:下面是测试的24天数据:
1595575894887723.png
> user_id是用户的id;
>
> timestamp 是用户访问页面的时间;
>
> group 表示把新的落地页分到treatment组、把旧的落地页分到了control组;
>
> landing_page表示的是落地页;
>
> converted 表示的是否转化,1表示转化;

#### 6.2 代码实现
- 导包
  ```python
  import pandas as pd
  ```
- 加载数据
  ```python
  # 读取数据,查看前5行
  df = pd.read_csv("ab_test.csv")
  df.head()
  ```
  ```python
  # 数据预览,查看数据有多少行、多少列
  df.shape
  ```
  ```python
  # 查看数据中是否有空值
  df.isnull().any()
  df.info()
  ```
- 去掉错误行
  treatment和new_page对应,control和old_page对应,如果不对应,就是错误数据,需要去掉。
  ```python
  # 下面这句代码,展示的就是group=treatment且landing_page=old_page和group=control且landing_page=new_page,这样的错误行;
  num_error = df[(df.group == "treatment")!=(df.landing_page == "new_page")].shape[0]
  num_error

  ```
  ```python
  # 去掉错误行后,再次查看是否还存在错误行
  print("没有删除错误行之前的记录数:", df.shape[0])
  df2 = df[(df.group == "treatment")==(df.landing_page == "new_page")]
  print("删除错误行之后的记录数:", df2.shape[0])
  print("错误行共有",str(df.shape[0]-df2.shape[0]),"条记录")
  num_error2 = df2[((df2.group == "treatment")!=(df2.landing_page == "new_page"))].shape[0]
  num_error2
  ```
- 去除重复数据
  ```python
  # 查看是否有重复行
  print("数据的记录数为:", df2.user_id.shape[0])
  print("将user_id去重计数后的记录数为:", df2.user_id.nunique())
  ```
  ```python
  #  去除重复的行
  df3 = df2.drop_duplicates(subset=["user_id"],keep="first")
  df3.shape[0]
  ```
- 观察两组的转化率
  ```python
  A = df3.query('group=="control"').converted#对照组
  B = df3.query('group=="treatment"').converted#实验组
  print('策略A的均值是:',A.mean())
  print('策略B的均值是:',B.mean())
  ```

1595575944797582.png 
  > 思考一下:根据上述结果,老页面的转化率比新页面的转换率好,是不是就可以说明老页面好呢?
- 假设检验
  - **建立原假设和备择假设**
    由于我们期望的是新方案由于旧方案,故建立如下假设
    原假设:$$bar{X}_B-bar{X}_Aleq0$$
    备择假设:$$bar{X}_B-bar{X}_A>0$$
  - 选择统计量
    由于$$n_A$$和$$n_B$$都大于30,故为大样本,选择Z统计量做Z检验
  - 使用scipy.stats完成检验
  ```python
  import scipy.stats
  z, pval = scipy.stats.ttest_ind(B,A)  #表示B-A
  print(z,pval)#-1.3109235634981506 0.18988462498742617
  ```
  > 根据 **scipy.stats.ttest_ind(x, y)** 文档的解释,这是双边检验的结果。为了得到单边检验的结果,需要将 计算出来的 pvalue 除于2 取单边的结果(这里取阈值为0.05)。
- 做出决策
  求得pvalue=0.18988462498742617,p/2 > alpha(0.05),所以不能够拒绝假设,暂时不能够认为新落地页能带来多的用户转化。
  > 我们需要再延长观测时间或是修改新的页面再进行测试了