案例实战 | 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 转化率提高带来的效益);
  • 对照组和实验组的测试对象要有一致性(两组样本数失衡会造成辛普森悖论等现象的发生)。
相关文章
|
12天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
34 2
|
7天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
26 6
基于Python访问Hive的pytest测试代码实现
|
8天前
|
前端开发 机器人 测试技术
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
18 6
【RF案例】Web自动化测试弹窗处理
|
10天前
|
存储 算法 安全
Python案例分享:如何实现信息的加解密
Python案例分享:如何实现信息的加解密
22 10
|
10天前
|
安全 JavaScript 前端开发
自动化测试的魔法:如何用Python编写你的第一个测试脚本
【8月更文挑战第41天】在软件的世界里,质量是王道。而自动化测试,就像是维护这个王国的骑士,确保我们的软件产品坚不可摧。本文将引导你进入自动化测试的奇妙世界,教你如何使用Python这把强大的魔法杖,编写出能够守护你代码安全的第一道防护咒语。让我们一起开启这场魔法之旅吧!
|
10天前
|
Java 数据安全/隐私保护 Python
Python案例分享:如何实现文件的解压缩
Python案例分享:如何实现文件的解压缩
37 8
|
10天前
|
存储 缓存 安全
Python案例分享:如何实现文件的上传下载
Python案例分享:如何实现文件的上传下载
48 6
|
11天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
25 2
|
7天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:如何用Selenium和Python打造高效测试脚本
【9月更文挑战第13天】在软件开发的海洋中,自动化测试是那抹不可或缺的亮色。它不仅提升了测试效率,还保障了产品质量。本文将带你领略使用Selenium和Python构建自动化测试脚本的魅力所在,从环境的搭建到脚本的编写,再到问题的排查,每一步都是对软件质量把控的深刻理解和实践。让我们开始这段探索之旅,解锁自动化测试的秘密吧!
8 0
|
7天前
|
jenkins 测试技术 持续交付
自动化测试的高效之路:如何利用Python进行Web应用测试
【9月更文挑战第13天】在软件开发的快节奏中,自动化测试是确保质量和效率的关键。本文将引导你了解如何使用Python语言及其强大的测试框架来提升Web应用的测试效率。我们将一起探索编写简洁而强大的测试脚本的技巧,以及如何通过持续集成(CI)实现自动化测试流程。准备好让你的测试工作飞一般的感觉!