用Python进行AB测试之T检验的案例学习【文末源码地址】

news2024/11/19 2:34:15

文章目录

  • 案例背景
  • 假设检验解读
    • 一、提出假设
    • 二、检验统计量
    • 三、代码实现
    • 四、结论
  • 源码地址

案例背景

产品经理对APP做了许多改动,想要通过AB测试评估一下改动后的效果如何?

其中有一项评估是:签到按钮从蓝色改为红色后,客户点击的次数有没有发生变化。

于是,随机向200名客户投放测试连接,进行了一个月的内测体验。

内测结果数据如下:

在这里插入图片描述

userid:参与内测的用户id

group:参与内测用户使用的版本,分为A版本和B版本

click:参与内测用户点击签到按钮的次数

根据以上200条数据,通过AB测试的方法进行评估。

假设检验解读

假设检验的基本思想:在少量的实验中,小概率事件几乎不可能发生。

一、提出假设

**原假设:**在本次测试中,A版本与B版本的平均点击次数在统计学中没有显著性差异

**备择假设:**在本次测试中,A版本与B版本的平均点击次数在统计学中有显著性差异

我在查找资料时,一直在思考一个问题:

什么是小概率事件?

以下是我的一些想法,不足之处还请各位指出,不胜感激!

假设我们做了 10000 组测试,每组都有200人参与测试,将每一组实验中的AB版本的签到按钮点击数分别求均值得到,在用A版本的平均值减去B版本的平均值,这样会得到 10000 个平均值差的数据比如:【-20,-14,0,1,2,3,,…】

然后自定义划分一些区间,比如【-30,-28】、…【0,2】、【2,4】等,统计一下每个区间的有多少数据,绘制出的频数直方图,如下图所示:

在这里插入图片描述

用曲线拟合后,如下图所示:

在这里插入图片描述

在曲线图中画了一部分阴影,我们设定阴影部分的面积占全部曲线面积的5%,即:0.05。在统计学中,我们把这个值称为显著性水平

小概率事件就是指我们计算的平均值差值落入阴影部分中。

继续思考一个问题:

那我们应该如何计算这次测试的结果是不是小概率事件呢?

二、检验统计量

经过很多人的研究后,发明了一种T检验统计量,公式如下:

在这里插入图片描述

经过该公式计算出对应的T值后,经过查表就能得到对应的P值。即:我们这次测试的结果在曲线图中,对应的面积占比有多大。

如果P值大于0.05,图像可能如下所示:

在这里插入图片描述

说明我们本次的测试的结果在统计学上并不是一个小概率事件,而是大概率会出现的。即原假设中A版本与B版本没有显著性差异是大概率会出现的事件,A版本与B版本没有太大差异。

如果P值小于0.05,图像可能如下所示:

在这里插入图片描述

说明我们本次测试的结果是一个小概率事件,根据假设检验的基本思想:在少量的实验中,小概率事件几乎不可能发生。 但是我们这次的测试发生了小概率事件,所以我们的原假设有问题,需要拒绝。即假设中A版本与B版本没有显著性差异是小概率事件。A版本与B版本有差异。

三、代码实现

import random
import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_excel("./AB测试数据.xlsx")

a = df[df["group"]=="A"]["click"]
b = df[df["group"]=="B"]["click"]

print(a.mean(),b.mean())
# 15.22 15.96

# 检验方差齐次性
print(stats.levene(a, b))

# 独立样本T检验
# 如果LeveneResult中的pvalue<0.05,equal_var=False,否则equal_var=True
print(stats.ttest_ind(a, b, equal_var=True))
print(stats.ttest_ind(a, b, equal_var=False))

运行结果如下:

LeveneResult(statistic=0.19467268623024872, pvalue=0.6595371210000016)
Ttest_indResult(statistic=-0.6277510508489583, pvalue=0.5308903548838031)
Ttest_indResult(statistic=-0.6277510508489583, pvalue=0.5308924610673192)

四、结论

检验方差齐次性结果pvalue>0.05,说明两组数据方差同质性。

使用独立同方差样本T检验,结果pvalue为0.53>0.05,所以接受原假设,即:A版本与B版本没有太大差异。

源码地址

链接:https://pan.baidu.com/s/14EU6EK3FnfM_MovvasjGeg?pwd=4b3i
提取码:4b3i

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 成员变量与局部变量有什么区别?

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符…

Smart HTML Elements Crack

Smart HTML Elements Crack Smart HTML Elements是一个现代的Vanilla JS和ES6库以及下一代前端框架。企业级Web组件包括可访问性功能(WAI-ARIA&#xff0c;第508/WTAG法规遵从性)、本地化、从右到左键盘导航和主题化。与Angular、ReactJS、Vue.js、Bootstrap、Meteor和任何其他…

vue编写组件 根据指定日期获取一周内所有 日期与农历日期展示 并标记当天

首先 我们要引入一下对应的第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader这里 我们需要 chinese-lunar-calendar 将日期变成农历日期的工具 sass是因为 我这里为了方便 用了 sass写样式 组件代码如下 <template><headerclass "ske…

学习自动化这3个坏习惯要你命,90%测试人躺枪!

将自动化测试当成很了不起的资本&#xff0c;源于国内对Coding的崇拜 盲目的学习自动化&#xff0c;不光对你的工作没有帮助&#xff0c;可能对你的测试之路还会起反作用&#xff01; 1,为什么说盲目学习自动化可能会让你一无是处&#xff1f; 没有全面理解软件测试的基本原理…

让自己再认识一下分区吧

在上个博客中&#xff0c;我们讨论了复制 —— 即数据在不同节点上的副本&#xff0c;对于非常大的数据集&#xff0c;或非常高的吞吐量&#xff0c;仅仅进行复制是不够的&#xff1a;我们需要将数据进行 分区&#xff08;partitions&#xff09;&#xff0c;也称为 分片&#…

【Proteus仿真】| 51单片机——MAX7219 驱动数码管

系列文章 todo: 文章目录 前言1. 简单了解MAX72191.1 引脚说明1.2 寄存器说明1.2.1 选位寄存器1.2.2 BCD译码器设置寄存器1.2.3 亮度寄存器1.2.4 扫描限制寄存器1.2.5 显示测试寄存器1.2.6 关停寄存器 1.3 spi总线通信时序1.4 数据格式 2. 使用MAX7219驱动数码管2.1 驱动数码管…

【2023/05/18】TPU

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第13天。 Share The waterfall sings,"I find my song,when I find my freedom." 译文&#xff1a; 瀑布歌唱到&#xff1a;“我得到自由时便有了歌声。” I cannot tell why this heart la…

精彩直击 | 迅镭激光参展CIBF2023年电池技术盛会

5月16日&#xff0c;全球规模最大的电池、能源行业盛会——CIBF2023第十五届中国国际电池技术展览会(以下简称2023CIBF电池展)&#xff0c;在深圳国际会展中心(宝安新馆)隆重开幕! 迅镭激光携一系列新能源自动化解决方案亮相9T263展位&#xff0c;与客户分享创新技术及自动化产…

【Jmeter第四章】Jmeter添加断言(捕捉自定义错误信息)

文章目录 1、断言介绍2、Jmeter使用断言3、效果展示 1、断言介绍 前言&#xff1a;关于Jmeter中的断言&#xff0c;其实可以理解为对返回信息&#xff0c;返回代码的一种处理&#xff0c; 因为对应HTTP状态200而言&#xff0c;但我们会定义不同的返回值&#xff0c;例如 code…

【数据结构<顺序表>】C语言

前言 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…

linux swap交换区满了怎么办(已解决)

swap交换区满了怎么办 一、不增加交换区的方法 free -m 或free -h查看占用情况 使用如下指令来查看占用swap的前十进程 for i in $( cd /proc;ls |grep "^[0-9]"|awk $0 >100) ;do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i…

仓库信息管理系统设计与实现

一、数据库设计 1.数据库模型设计概览 2.数据库表设计 ①depository 描述&#xff1a; 该表存储仓库的信息&#xff0c;比如仓库名称&#xff0c;仓库地址和仓库介绍 表结构&#xff1a; 序号 字段名 数据类型 主键 非空 默认值 描述 1 id INT(10) 是 是 2…

LlamaIndex 联合创始人下场揭秘:如何使用私有数据提升 LLM 的能力?

ChatGPT 的爆火证明了大型语言模型&#xff08;LLM&#xff09;在生成知识和推理方面的能力。不过&#xff0c;ChatGPT 是使用公共数据集进行预训练的模型&#xff0c;因此可能无法提供与用户业务相关的特定答案或结果。 那么&#xff0c;如何使用私有数据最大化发挥 LLM 的能力…

SpringMVC第三阶段:源码解析SpringMVC如何调用Controller目标方法

源码解析SpringMVC如何调用Controller目标方法&#xff1a; 浏览器如何访问到Controller目标方法. 1、所有请求进入时候,会先进入org.springframework.web.servlet.DispatcherServlet前端控制器的doDispatch() 方法 2 、在 1016 行 getHandler() 方法中,会通过请求的资源路径…

【51单片机】万年历功能的数字时钟+倒计时 Proteus仿真 普中板子可用

// 硬件&#xff1a;DS1302、按键、LCD1602、无源蜂鸣器 // 1、具有万年历功能的数字时钟 (本世纪100年通用)&#xff0c;能够正确的显示年、月、日、时、分、秒 // 2、按键设置时间(校时) // 3、24小时内至少可设置3个闹钟&#xff0c;并具有不同的闹钟铃声。每个闹钟可以选择…

[链表OJ题 7] 环形链表

目录 题目来源&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 实现过程&#xff1a; 题目来源&#xff1a; 力扣 141. 环形链表 题目描述 代码实现&#xff1a; bool hasCycle(struct ListNode* head) {struct ListNode* fast head, * slow head;while (fas…

为什么更新了 DNS 记录不生效?

我们在上网时如果想要访问到另一台机器上的内容&#xff0c;通常只需要直接输入一串地址&#xff0c;例如&#xff1a;www.upyun.com&#xff0c;就能够准确访问到自己想要访问的网站。但是实际上这只是方便我们记忆的字符形式网络标识&#xff0c;真正让我们的机器和另一台机器…

C语言深度解析--函数

函数 函数的定义&#xff1a; 函数&#xff0c;又称为子程序&#xff0c;是一个大型程序中的某部分代码&#xff0c;由一个或多个语句块组成。它负责完成某项特定任务&#xff0c;而且相较于其他代码&#xff0c;具备相对独立性。 一般会有输入参数并有返回值&#xff0c;提供…

关于江苏专转本的十大真相,值得一看

【真相1】专转本考试题主要是大学相关科目的骨干老师出的。他们较长时间从事相应课程教学&#xff0c;专业领域较宽&#xff0c;学术造诣较高。具有副高及以上职称&#xff0c;年龄—般在55周岁以下。VX:hhkb5200【真相2】专转本考试题"紧扣《考试大纲》&#xff0c;大家要…

C++11 新特性

文章目录 &#x1f36a;统一列表初始化&#x1f36a;左值引用&#xff0c;右值引用&#x1f95b;概念和作用&#x1f95b;使用场景 &#x1f36a;完美转发&#x1f36a;可变参数模板 C11是C的一次大更新&#xff0c;出现了很多实用的语法和特性&#xff0c;所以我们很有必要学习…