案例实战 | Python 玩转 AB 测试中的分层抽样与假设检验!(附代码和数据集)...
今天由优秀的萝卜同学给大家分享一篇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 测试中的分层抽样与假设检验!(附代码和数据集)...相关推荐
- python 数据逐个验证_案例实战 | Python 实现 AB 测试中常见的分层抽样与假设检验 (附代码和数据集)...
在这里插入图片描述 作者 l 萝卜 本文会将原理知识穿插于代码段中,相关代码和数据集可在公众号 " 数据分析与商业实践 " 后台回复 " AB测试 " 获取. ...
- 手把手教你在Python中实现文本分类(附代码、数据集)
作者: Shivam Bansal 翻译:申利彬 校对:丁楠雅 本文约2300字,建议阅读8分钟. 本文将详细介绍文本分类问题并用Python实现这个过程. 引言 文本分类是商业问题中常见的自然语言处 ...
- Python中实现文本分类(附代码、数据集)
本文将详细介绍文本分类问题并用Python实现这个过程. 引言 文本分类是商业问题中常见的自然语言处理任务,目标是自动将文本文件分到一个或多个已定义好的类别中.文本分类的一些例子如下: 分析社交媒体中 ...
- 【数据分析与挖掘实战】金融风控之贷款违约预测详解2(有代码和数据集)
本文接着上一篇博客,如果您未阅读上篇博客,请点击[数据分析与挖掘实战]金融风控之贷款违约预测详解1(有代码和数据集) 七.建模和调参 7.1模型相关原理介绍 由于相关算法原理篇幅较长,本文推荐了一些博 ...
- VAE逻辑整理及VAE在异常检测中的小实验(附代码)
VAE逻辑整理及VAE在异常检测中的小实验(附代码) Variance和control variate 两种常见的分类器 相应代码 Minst数据集的训练和重构 KDD99数据 本文主要讲解一下整个 ...
- 个人作业项目报告(三)输出结果及测试样例的结果(附代码)
代码调用图 代码调用图的图例:(感谢刘泽@kfk的vs2015企业版的强大功能) 输出结果 因为助教给的程序是在WIndows平台上运行代码得到的结果,所以主要放出的是Windows平台下的结果,Li ...
- 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)
实现 WiFi 断线自动重连,原理是用 Python 监测网络是否断线,如果断线则重启网络服务.接下来给大家分享实现代码,需要的朋友参考下 1.Python 代码 autowifi.py,放在 /ho ...
- Web集群案例实战 -- Nginx 反向代理根据URL中的目录地址实现代理转发 -- 案例实战
Nginx 反向代理根据URL中的目录地址实现代理转发 -- 案例实战 前言 一.需求背景 前言 本环境是基于 Centos 7.8 系统构建Nginx学习环境 具体构建,请参考 Nginx-1.18 ...
- 算法效果AB测试中的PV-UV不对称性
算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果.通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比.为了表述简单,我们假设参与对比的算法有两个,比较的指 ...
最新文章
- torch量化其他功能(量化、反量化)
- C/C++获得当前系统时间
- C++智能指针简单剖析
- 在线阅读计算机组成,计算机组成原理RAM.pdf
- BADI中Filter Dependent和Multiple Use
- python如何读取字典的关键字_python提取字典key列表的方法
- Apache PDFbox快速开发指南
- sublime text3设置空格和tab键
- ASP.NET页面跳转
- Mysql Workbench中EER Diagram逆向生成表
- Antenna Placement(二分图的最大匹配)
- ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
- 【Google】谷歌搜索高级用法:包括指定文件类型
- android 私密空间,安卓手机怎么开启隐私空间功能
- pca 累积方差贡献率公式_SPSS主成分分析时,是不是得到的方差百分比就是贡献率,累计百分比就是累计贡献率??...
- 软件系统分析模型文档
- Java智能卡基础篇
- Win11如何设置系统还原点?
- intellij idea实现代码实时翻译的插件开发
- 努比亚Z11miniRoot及真机调试常见问题