今天由优秀的萝卜同学给大家分享一篇AB测试干货~

本文会将原理知识穿插于代码段中,相关代码和数据集空降文末可以获取。

前言

在电商网站 AB 测试非常常见,是将统计学与程序代码结合的经典案例之一。尽管如此,里面还是有许多值得学习和注意的地方。

A/B 测试用于测试网页的修改效果(浏览量,注册率等),测试需进行一场实验,实验中控制组为网页旧版本,实验组为网页新版本,实验还需选出一个指标 来衡量每组用户的参与度,然后根据实验结果来判断哪个版本效果更好。

通过这些测试,我们可以观察什么样的改动能最大化指标,测试适用的改动类型十分广泛,上到增加元素的大改动,下到颜色小变动都可使用这些测试。

背景

在本次案例研究中,我们将为教育平台 “ 不吹牛分析网 ” 分析 A/B 测试的结果,以下是该公司网站的客户漏斗模型:浏览主页 > 浏览课程概述页面(课程首页) > 注册课程 > 付费并完成课程

越深入漏斗模型,不吹牛分析网就会流失越多的用户(正常现象),能进入最后阶段的用户寥寥无几。为了提高参与度,提高每个阶段之间的转化率,z哥试着做出一些改动,并对改动进行了 A/B 测试,我们将帮z哥分析相关测试结果,并根据结果建议是否该实现页面改版。

因为利用 Python 进行 A/B 测试在每个数据集上的使用大同小异,所以我们这里只展示课程首页的A/B测试过程,其余页面的数据集会一并提供给大家作为练习。

Python实战

  数据读入

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font',**{'family':'Microsoft YaHei, SimHei'})# 设置中文字体的支持
# 实现 notebook 的多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity ='all' #默认为'last'
course = pd.read_csv('course_page_actions.csv')
course.info(); course.sample(5)

参数说明:

  • timestamp:浏览时间

  • id:用户 id

  • group:用户所属组别

  • action:用户行为,view--仅浏览;enroll--浏览并注册

  • duration:浏览界面时长(浏览越久,可能越感兴趣,就越有可能注册)

  注册率分析

点击率 (CTR: click through rate)通常是点击数与浏览数的比例。因为网站页面会使用 cookies,所以我们可以确认单独用户,确保不重复统计同一个用户的点击率。为了进行该实验,我们对点击率作出如下定义:CTR: 单独用户点击数 /  单独用户浏览数,这一需要注意的点可以使用 pandas 中的 nunique() 函数来快捷完成

同理,实验组的计算方式相同,结果分析如下:

根据已有数据,我们通常会猜测会不会是新界面更加能够吸引用户停留并浏览,从而达到用户浏览时间越长,就越有可能注册课程

  浏览时长分析

可视化分析

这里的我们将使用 seaborn 结合 markdown 公式的方式来实现快捷又强大的数据可视化

结果分析

  • 新界面的注册率有所提高,而浏览时长方面均呈现轻微的右偏

  • 实验组的浏览时长平均值比控制组高 15mins 左右,方差差别不大

所以我们可以初步判断新改版的课程首页更吸引用户,后续将进行假设检验来进一步验证我们的猜想

  假设检验

我们将从控制组和实验组中各抽取一定数量的样本来进行假设检验,下面是置信水平 α 的选择经验:

样本量

α-level

≤ 100

10%

100 < n ≤ 500

5%

500 < n ≤ 1000

1%

n > 2000

千分之一

样本量过大,α-level 就没什么意义了。为了使假设检验的数据样本更加合理,我们可以使用分层抽样。Python 没有现成的库或函数,可以使用前人的轮子。

from mysampling import get_sample
# df: 输入的数据框 pandas.dataframe 对象# sampling:抽样方法 str## 可选值有 ["simple_random","stratified","systematic"]## 按顺序分别为: 简单随机抽样、分层抽样、系统抽样# stratified_col: 需要分层的列名的列表 list,只有在分层抽样时才生效# k: 抽样个数或抽样比例 int or float## (int, 则必须大于0; float,则必须在区间(0,1)中)## 如果 0< k <1, 则 k 表示抽样对于总体的比例## 如果 k >=1, 则 k 表示抽样的个数;当为分层抽样时,代表每层的样本量data =get_sample(df=course, sampling='stratified', stratified_col=['group'], k=300)
data.sample(4); data.info()

因为总体未知,所以我们可以使用两独立样本 T 检验,其实双样本 Z 检验也能达到类似的效果

# 总体未知,可采用两独立样本T检验
from scipy import statsexp_duration = data.query('group == "experiment"')['duration']
con_duration = data.query('group == "control"')['duration']print('两独立样本 T 检验...')
stats.ttest_ind(a=exp_duration, b=con_duration)
print('-'*45)
print('双样本 Z 检验...')
import statsmodels.  api as sm
sm.stats.ztest(x1=exp_duration, x2=con_duration)

不难发现,有时双样本 Z 检验同样可以达到两独立样本 T 检验的效果。

综述,我们将拒绝零假设,接受 “ 新界面的浏览时长显著不同于(高于)旧界面 ” 的这个假设。

AB测试的不足

但 A/B 测试也有不足之处。虽然测试能帮你比较两种选择,但无法告诉你你还没想到的选择,在对老用户进行测试时,抗拒改变心理、新奇效应等因素都可能使测试结果出现偏差。

  • 抗拒改变心理:老用户可能会因为纯粹不喜欢改变而偏爱旧版本,哪怕从长远来看新版本更好。

  • 新奇效应:老用户可能会觉得变化很新鲜,受变化吸引而偏爱新版本,哪怕从长远看来新版本并无益处。

所以在设计 A/B 测试、基于测试结果得出结论时都需要考虑诸多因素。下面总结了一些常见考虑因素:

  • 老用户第一次体验改动会有新奇效应和改变抗拒心理;

  • 要得到可靠的显著结果,需要有足够的流量和转化率;

  • 要做出最佳决策,需选用最佳指标(如营收 vs 点击率);

  • 应进行足够的实验时长,以便解释天/周/季度事件引起的行为变化;

  • 转化率需具备现实指导意义(推出新元素的开支 vs 转化率提高带来的效益);

  • 对照组和实验组的测试对象要有一致性(两组样本数失衡会造成辛普森悖论等现象的发生)。

今天的案例就到这里,相关代码和数据集,数据不吹牛后台回复“AB测试”即可获取。

●10万条弹幕,发现战神终极奥义!

●12000+字超详细 SQL 语法速成!

后台回复“入群”即可加入小z数据干货交流群

干货????

案例实战 | Python 玩转 AB 测试中的分层抽样与假设检验!(附代码和数据集)...相关推荐

  1. python 数据逐个验证_案例实战 | Python 实现 AB 测试中常见的分层抽样与假设检验 (附代码和数据集)...

    在这里插入图片描述 作者 l 萝卜 本文会将原理知识穿插于代码段中,相关代码和数据集可在公众号 " 数据分析与商业实践 " 后台回复 " AB测试 " 获取. ...

  2. 手把手教你在Python中实现文本分类(附代码、数据集)

    作者: Shivam Bansal 翻译:申利彬 校对:丁楠雅 本文约2300字,建议阅读8分钟. 本文将详细介绍文本分类问题并用Python实现这个过程. 引言 文本分类是商业问题中常见的自然语言处 ...

  3. Python中实现文本分类(附代码、数据集)

    本文将详细介绍文本分类问题并用Python实现这个过程. 引言 文本分类是商业问题中常见的自然语言处理任务,目标是自动将文本文件分到一个或多个已定义好的类别中.文本分类的一些例子如下: 分析社交媒体中 ...

  4. 【数据分析与挖掘实战】金融风控之贷款违约预测详解2(有代码和数据集)

    本文接着上一篇博客,如果您未阅读上篇博客,请点击[数据分析与挖掘实战]金融风控之贷款违约预测详解1(有代码和数据集) 七.建模和调参 7.1模型相关原理介绍 由于相关算法原理篇幅较长,本文推荐了一些博 ...

  5. VAE逻辑整理及VAE在异常检测中的小实验(附代码)

    VAE逻辑整理及VAE在异常检测中的小实验(附代码) Variance和control variate 两种常见的分类器 相应代码 Minst数据集的训练和重构 KDD99数据  本文主要讲解一下整个 ...

  6. 个人作业项目报告(三)输出结果及测试样例的结果(附代码)

    代码调用图 代码调用图的图例:(感谢刘泽@kfk的vs2015企业版的强大功能) 输出结果 因为助教给的程序是在WIndows平台上运行代码得到的结果,所以主要放出的是Windows平台下的结果,Li ...

  7. 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)

    实现 WiFi 断线自动重连,原理是用 Python 监测网络是否断线,如果断线则重启网络服务.接下来给大家分享实现代码,需要的朋友参考下 1.Python 代码 autowifi.py,放在 /ho ...

  8. Web集群案例实战 -- Nginx 反向代理根据URL中的目录地址实现代理转发 -- 案例实战

    Nginx 反向代理根据URL中的目录地址实现代理转发 -- 案例实战 前言 一.需求背景 前言 本环境是基于 Centos 7.8 系统构建Nginx学习环境 具体构建,请参考 Nginx-1.18 ...

  9. 算法效果AB测试中的PV-UV不对称性

    算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果.通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比.为了表述简单,我们假设参与对比的算法有两个,比较的指 ...

最新文章

  1. a java runtime envi_认识java
  2. asp.net开发 网络硬盘[转贴+删节]
  3. 2017蓝桥杯省赛---java---C---1(外星日历)
  4. secret sharing;拉格朗日插值,shamir秘密分享,peterson秘密分享
  5. msp430入门编程46
  6. Matlab验证dtft共轭性质,数字信号处理实验4重点.docx
  7. php安装扩展写kafca,安装PHP的kafka扩展
  8. ar开发 ue4_UE4 和 ARKit 入门
  9. PHP_APC+Ajax实现的监视进度条的文件上传
  10. jquery学习之事件委派
  11. 鸿蒙升级最佳时间,鸿蒙升级时间确定,17款华为优先,荣耀或成遗珠!
  12. android 版本更新下载进度框,Android版本更新(Service下载 Notification进度条)
  13. wps linux版本支持vba,Wps vba安装包
  14. 解决steam无法启动gta5报错msvcp140.dll丢失
  15. 计算机论文投tmc期刊,无线网络会议与期刊档次划分一览
  16. 优盘突然显示无法在此计算机,复制文件到U盘时突然无法复制提示磁盘被写保护该如何修复...
  17. android版本内存多少,内存大小决定Android系统版本?
  18. 伦敦金走势图与顾比均线
  19. 中国国内驾照在韩国换驾照的经过
  20. linux之awk基础

热门文章

  1. ATSAMA5D3X学习
  2. 批处理bat Windows脚本实现获取本机所有MAC地址
  3. java 数组取接近值_java – 获取数组中最接近的数值
  4. C语言考前附加经典题目(偶然看到的、题库题目)
  5. 1、列表推导式、字典推导式
  6. Fortran学习笔记(5)
  7. JAVASCRIPT 正则表达式学习--基础与零宽断言(转自司徒正美)
  8. 如何做好一场演讲?思维导图助你成为“超级演说家”
  9. 微软CRM 商机实体赢单
  10. 分享一本微软CRM2011标准功能介绍书籍