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

简介: 在电商网站 AB 测试非常常见,是将统计学与程序代码结合的经典案例之一。尽管如此,里面还是有许多值得学习和注意的地方。 A/B 测试用于测试网页的修改效果(浏览量,注册率等),测试需进行一场实验,实验中控制组为网页旧版本,实验组为网页新版本,实验还需选出一个指标 来衡量每组用户的参与度,然后根据实验结果来判断哪个版本效果更好。 通过这些测试,我们可以观察什么样的改动能最大化指标,测试适用的改动类型十分广泛,上到增加元素的大改动,下到颜色小变动都可使用这些测试。

浏览时长分析


可视化分析


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


image.png

image.png


结果分析


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


  • 实验组的浏览时长平均值比控制组高 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()


image.png


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


# 总体未知,可采用两独立样本T检验
from scipy import stats
exp_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 检验的效果。


image.png


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


AB测试的不足


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


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


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


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


  • 老用户第一次体验改动会有新奇效应和改变抗拒心理;
  • 要得到可靠的显著结果,需要有足够的流量和转化率;
  • 要做出最佳决策,需选用最佳指标(如营收 vs 点击率);
  • 应进行足够的实验时长,以便解释天/周/季度事件引起的行为变化;
  • 转化率需具备现实指导意义(推出新元素的开支 vs 转化率提高带来的效益);
  • 对照组和实验组的测试对象要有一致性(两组样本数失衡会造成辛普森悖论等现象的发生)。
相关文章
|
8月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
958 7
|
8月前
|
数据采集 JSON JavaScript
Cypress 插件实战:让测试更稳定,不再“偶尔掉链子”
本文分享如何通过自定义Cypress插件解决测试不稳定的痛点。插件可实现智能等待、数据预处理等能力,替代传统硬性等待,有效减少偶发性失败,提升测试效率和可维护性。文内包含具体实现方法与最佳实践。
|
8月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
8月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
242 12
|
8月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
659 1
|
8月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
747 0
|
8月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
737 0
精心整理python测试小技巧:第十六节
精心整理python测试小技巧:第十六节
精心整理python测试小技巧:第十五节
精心整理python测试小技巧:第十五节
精心整理python测试小技巧:第十四节
精心整理python测试小技巧:第十四节

推荐镜像

更多