【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

news2025/1/20 7:24:56

一、背景:当“审判”成为科学

1.1 虚拟场景——法庭审判

想象这样一个场景:有一天,你在王国里担任“首席审判官”。你面前站着一位嫌疑人,有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的,还是他是被冤枉的?你需要做出审判。

• 如果只是听到“民众都说他很可疑”,就随便判有罪,也许冤枉了一个无辜的人;

• 如果因为证据不够充分,放任他走了,而真凶恰好就是他?那可怎么办?

这时候,作为审判官,你要收集证据(证人证言、现场线索),并进行理性分析。你不会轻易下结论,而是先假设他无罪(原假设),然后看证据有多强。若证据足够强大,说明在“嫌疑人无罪”的情况下,这么极端的指纹、目击等线索出现简直是“小概率事件”,于是你认定他“极可能有罪”,就推翻了无罪假设。

这便是“假设检验”的核心思想:我们总是先假设“没有差异”“没有效应”(就像嫌疑人无罪),然后让数据“自己说话”,看要不要推翻这个假设。


1.2 假设检验的现代发展

• 过去:统计学家费雪(Fisher)等人在 20 世纪初确立了这套“原假设 vs. 备择假设 + p 值 + 显著性水平”的理论框架。

• 现在:在大数据时代,我们依然需要这种方法来对数据做严谨推断,比如互联网产品的A/B 测试、医药领域的疗效分析、金融风控决策等等。

• 原因:不论数据多庞大,随机性和噪声总在,所以我们要有一把“判定差异是否超越随机”的尺子,这就是假设检验


二、假设检验:原理、角色与流程

2.1 原假设、备择假设

1. 原假设(Null Hypothesis

默认都是原假设,即罪人没有罪,需要p值低于阈值的时候我们才会推翻(拒绝)我们的原假设

• 嫌疑人无罪;

• 两个方案无差异;

• 新药无显著疗效……

一般总是表示“没有改变、没有差异、没有效果”。


2. 备择假设(Alternative Hypothesis 

• 嫌疑人有罪;

• 两个方案的确有差异;

• 新药确实起了作用……


2.2 p 值:出现极端证据的概率

• p 值(p-value)是指:在原假设为真的前提下,获得我们这么极端(或更极端)观测结果的概率。

• 如果 p 值很小,比如 < 0.05(这就是显著性水平 的常用阈值 0.05),就意味着:

• “在没有差异的情况下,居然还能看到这么极端的数据,太小概率了吧?!”

• 所以我们倾向于说,“估计是原假设不对”,即拒绝原假设

就是他是好人的情况下,出现这些不利(极端)证据,概率也太小了吧,所以我们认为他是坏人


2.3 Type I 与 Type II 错误

Type I 错误:错把一个无罪的人判了死刑(原假设其实对,但被我们拒绝)

Type II 错误:把真正的罪犯当好人放了(原假设其实不对,但我们没拒绝)

• 做实验或统计分析时,我们也要小心平衡:(Type I 错误率)和 (Type II 错误率),别因极度谨慎而漏掉真差异,也别因过度敏感而冤枉“无差异”的情况。


三、A/B 测试:让你的产品决策更像“法庭审判”

3.1 你在做的,正是“统计审判”!

互联网里,每当你想更换按钮颜色、重新设计界面布局,或者改进推荐算法时,却不确定是不是更好——就能用A/B 测试来模拟“法庭审判”流程:

1. 原假设:新方案和老方案在关键指标(点击率、转化率等)上“无差异”;

2. 备择假设:新方案有更好的表现;

3. 随机分配:把用户随机分成两组,一部分看 A,另一部分看 B;

4. 观察结果:收集一段时间数据,看 B 组指标是否明显高于 A 组;

5. 检验:若差异明显到“原假设难以成立”,就说明新方案的确优于旧方案,推翻原假设。


3.2 常见陷阱

样本量过小:就好比证据太少,判案没把握;

多重测试:一次试验比较很多方案,就像同时审好几个案子,可能在某个案件里意外得到“极端证据”;

外部干扰:如果不是随机分组、A/B 组用户画像差别太大,就像找了一群偏见法官,对审判结果会有偏颇。


四、t 检验:如何量化“均值上的差异”?

4.1 t 检验的来龙去脉

场景:我想知道“两个组的平均值”到底差多少,比如“男性与女性的平均身高差异”,或者“A 组人群的日均观看时长 vs. B 组人群的日均观看时长”。

原理

• 分子是“两个平均值之间的差”,分母是“这俩差值可能出现的标准误(综合了方差和样本量)”。

• 若这个 t 值很大,表明相对随机波动而言,均值差距太明显,p 值就会小。


4.2 适合场合

1. 数据近似正态分布,或者样本量足够大(中心极限定理可以帮忙);

2. 数值型指标,且你关心“平均值”本身的差异;

3. 如果两组是独立样本,就用“独立样本 t 检验”;若是一组人自己前后对比,则用“配对 t 检验”。


4.3 t 检验代码

案例分析

案例1:独立样本t检验

问题描述:比较男性和女性的平均身高是否存在显著差异。

import numpy as np
from scipy import stats

# 生成模拟数据
np.random.seed(0)
male_heights = np.random.normal(175, 7, 100)  # 男性身高(cm)
female_heights = np.random.normal(165, 6, 100)  # 女性身高(cm)

# 进行独立样本t检验
t_stat, p_value = stats.ttest_ind(male_heights, female_heights)

print(f't统计量: {t_stat:.2f}')
print(f'p值: {p_value:.4f}')

# 结果解读
alpha = 0.05
if p_value < alpha:
    print("拒绝原假设,认为男性和女性的平均身高存在显著差异。")
else:
    print("无法拒绝原假设,认为男性和女性的平均身高无显著差异。")

输出: 


案例2:独立样本t检验

问题描述: 在A/B测试中,评估新版本(B)是否显著提升了转化率。

import numpy as np
from scipy import stats

# 生成模拟数据
np.random.seed(0)
control = np.random.binomial(1, 0.10, 1000)  # 控制组转化率10%
treatment = np.random.binomial(1, 0.12, 1000)  # 试验组转化率12%

# 计算转化率
control_rate = np.mean(control)
treatment_rate = np.mean(treatment)

print(f'控制组转化率: {control_rate:.2%}')
print(f'试验组转化率: {treatment_rate:.2%}')

# 进行独立样本t检验
t_stat, p_value = stats.ttest_ind(treatment, control)

print(f't统计量: {t_stat:.2f}')
print(f'p值: {p_value:.4f}')

# 结果解读
alpha = 0.05
if p_value < alpha:
    print("拒绝原假设,认为新版本显著提升了转化率。")
else:
    print("无法拒绝原假设,认为新版本未显著提升转化率。")

输出:


案例3:药物疗效的配对样本t检验

问题描述: 评估某药物在治疗前后患者的血压变化,判断药物是否有效。

import numpy as np
from scipy import stats

# 生成模拟数据
np.random.seed(0)
pre_treatment_bp = np.random.normal(150, 10, 30)  # 治疗前血压
post_treatment_bp = pre_treatment_bp - np.random.normal(10, 5, 30)  # 治疗后血压

# 进行配对样本t检验
t_stat, p_value = stats.ttest_rel(post_treatment_bp, pre_treatment_bp)

print(f't统计量: {t_stat:.2f}')
print(f'p值: {p_value:.4f}')

# 结果解读
alpha = 0.05
if p_value < alpha:
    print("拒绝原假设,认为药物显著降低了血压。")
else:
    print("无法拒绝原假设,认为药物未显著降低血压。")

输出:


五、卡方检验:处理“分类变量”就靠它

5.1 当你的证据是“频数”而非“均值”

• 如果你拿到的是“买 or 不买”这样的分类标签,或者“一共投票给 A/B/C 的人数分别是多少”,就不能简单地比较平均值。

• 这时要用卡方检验(Chi-Square),因为它专门对“观察到的频数”和“期望的频数”做比较。


5.2 原理简述


5.3 卡方检验代码

import numpy as np
from scipy.stats import chi2_contingency

# 构建列联表
# 行:性别(男、女),列:购买(是、否)
data = np.array([[30, 10],
                 [20, 20]])

# 进行卡方检验
chi2, p, dof, expected = chi2_contingency(data)

print(f'卡方统计量: {chi2:.2f}')
print(f'p值: {p:.4f}')
print('期望频数:')
print(expected)

# 结果解读
alpha = 0.05
if p < alpha:
    print("拒绝原假设,认为性别与购买决策存在关联。")
else:
    print("无法拒绝原假设,认为性别与购买决策无关联。")

输出: 


六、再回到法庭:如何让判决更高效?

1. 注意样本量:别审太少证据就想定罪,也别没完没了地搜证耽误时间。

2. 明确检验方法:是要比较数值平均?还是比较分类频数?选对 t 检验 or 卡方检验。

3. 控制误差率: 设多少?怎么平衡漏判与冤判?

4. 多重比较调整:若你要审好几件案子(或 A/B 测试好多种版本),要做相应方法调整,避免“捡到极端结果就说差异大”。


七、总结:只要有决策,就可能需要假设检验

从审判一个嫌疑人是否有罪,到互联网 A/B 测试中判断“新老方案孰优孰劣”,再到科研里探讨“实验组与对照组”效果差异,我们都能看到假设检验的身影。它让我们在随机干扰中保持理性,用t 检验检查数值均值,用卡方检验衡量分类差异,用A/B 测试来做商业产品优化。


文章小结

1. 假设检验:就像法庭审案,“无罪”假设先行,数据若够极端就能推翻;

2. A/B 测试:互联网“快速试验”神器;

3. t 检验:比较“两组均值”时最常用;

4. 卡方检验:用来判断分类/频数的差异或关联度。


希望通过这个“法庭审判”比喻,让你更好理解为何需要假设检验,以及如何把它用在各种实际场景上。本文若能带给你启发或快乐,请不吝在 一键三连(点赞、收藏、关注)并评论分享哦!让更多人知道,“统计思维”才是我们在复杂世界里做出理性决策的秘密武器。


参考阅读

• Fisher, R. A. (1925). Statistical Methods for Research Workers.

• Montgomery, D. C. (2017). Design and Analysis of Experiments.

• Pearson, K. (1900). On the criterion… (The seminal paper on Chi-Square test).

—— 全文完 ——

感谢阅读,期待你的点赞 + 关注 + 评论 + 收藏 + 转发,我们下期见!

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

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

相关文章

SpringMVC 实战指南:打造高效 Web 应用的秘籍

第一章&#xff1a;三层架构和MVC 三层架构&#xff1a; 开发服务器端&#xff0c;一般基于两种形式&#xff0c;一种 C/S 架构程序&#xff0c;一种 B/S 架构程序使用 Java 语言基本上都是开发 B/S 架构的程序&#xff0c;B/S 架构又分成了三层架构三层架构&#xff1a; 表现…

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…

二、点灯基础实验

嵌入式基础实验第一个就是点灯&#xff0c;地位相当于编程界的hello world。 如下为LED原理图&#xff0c;要让相应LED发光&#xff0c;需要给I/O口设置输出引脚&#xff0c;低电平&#xff0c;二极管才会导通 2.1 打开初始工程&#xff0c;编写代码 以下会实现BLINKY常亮&…

搭建一个基于Spring Boot的数码分享网站

搭建一个基于Spring Boot的数码分享网站可以涵盖多个功能模块&#xff0c;例如用户管理、数码产品分享、评论、点赞、收藏、搜索等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的数码分享平台。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …

迅为RK3576开发板Android 多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…

gather算子的CUDA编程和算子测试

知乎介绍参考添加链接描述 完整测试框架参考本人仓库 添加链接描述 gather算子的onnx定义参考添加链接描述,该算子的主要变换参考下图: 这里我们不妨以input = [A, dimsize, D], indices = [B,C], axis = 1举例子,此时对应的output形状是[A,B,C,D],并且根据gather算子定…

深度学习 Pytorch 张量的线性代数运算

pytorch中并未设置单独的矩阵对象类型&#xff0c;因此pytorch中&#xff0c;二维张量就相当于矩阵对象&#xff0c;并且拥有一系列线性代数相关函数和方法。 在实际机器学习和深度学习建模过程中&#xff0c;矩阵或者高维张量都是基本对象类型&#xff0c;而矩阵所涉及到的线…

Linux下构建OpenEuler22.03+Nginx的Docker镜像

1. 制作OpenEuler22.03的Docker镜像 首先&#xff0c;下载OpenEuler20.03的镜像压缩包&#xff1a; 下载链接为&#xff1a; https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS/docker_img/x86_64/openEuler-docker.x86_64.tar.xz 这里我们可以顺便下载一下对应的…

Coder星球-测试用例设计

项目介绍 Coder星球是一个前后端分离的开源技术交流平台&#xff0c;包括管理后台和web前端&#xff0c;旨在打造一个互相交流技术并共同进步的平台。 项目功能结构图 测试用例 1.登录 2.注册 3.文章发布 4.点赞 5.评论

wow-agent---task2使用llama-index创建Agent

一&#xff1a;创造俩个函数&#xff0c;multiply和add作为fuction calling被LLM当做工具来使用&#xff0c;实现计算一个简单的计算题&#xff1a; from llama_index.llms.ollama import Ollama from llama_index.core.agent import ReActAgent from llama_index.core.tools …

React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目

在 React 企业级应用开发中&#xff0c;Next.js、Modern.js 和 Blitz 是三个常见的框架&#xff0c;它们提供了不同的特性和功能&#xff0c;旨在简化开发流程并提高应用的性能和扩展性。以下是它们的详解与比较&#xff1a; Next、Modern、Blitz 1. Next.js Next.js 是由 Ve…

Git - 将指定文件夹或文件忽略(无论添加缓存区或提交都不会显示)

前言 有些时候&#xff0c;我们 不希望 项目有些文件夹被 Git “监控” 起来&#xff0c;而是与 Git 毫无关系。 第一步 注意&#xff1a;touch 与 . 之间有空格。 在 Gitbash 命令窗口中&#xff0c;输入以下命令&#xff1a; touch .gitignore此时&#xff0c;你的项目文件…

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…

C++:bfs解决多源最短路与拓扑排序问题习题

1. 多源最短路 其实就是将所有源头都加入队列&#xff0c; 01矩阵 LCR 107. 01 矩阵 - 力扣&#xff08;LeetCode&#xff09; 思路 求每个元素到离其最近0的距离如果我们将1当做源头加入队列的话&#xff0c;无法处理多个连续1的距离存储&#xff0c;我们反其道而行之&…

Java基础--类和对象

目录 什么是类&#xff1f; 什么是对象 为什么java会设计对象 Java对象该怎么用 程序执行流程 类的加载顺序 什么是类&#xff1f; 类是构建对象的模板&#xff0c;一个类可以创建多个对象&#xff0c;每个对象的数据的最初来源来自对象 public class Student{public in…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目&#xff0c;安装Microsoft.AspNetCore.Authentication.JwtBearer包&#xff0c;将之前JwtBearer测试项目中的初始化函数&#xff0c;jwt配置类、token生成类全部挪到项目中。   重新编写login函数&#xff0c;之前测试Cookie和Session认证时用的函数适合m…

Electron实践继续

文章目录 前言一、知识储备前提二、开发工具集&#xff08;一&#xff09;代码编辑器之选&#xff08;二&#xff09;命令行工具运用&#xff08;三&#xff09;Git 与 GitHub 协作利器&#xff08;四&#xff09;Node.js 与 npm 核心环境 你的第一个Electron应用程序 前言 上…

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

和组合导航一样&#xff0c;也可以通过预积分 IMU 因子加上雷达残差来实现基于预积分和图优化的紧耦合 LIO 系统。一些现代的 Lidar SLAM 系统也采用了这种方式。相比滤波器方法来说&#xff0c;预积分因子可以更方便地整合到现有的优化框架中&#xff0c;从开发到实现都更为便…

【CSS】---- CSS 实现超过固定高度后出现展开折叠按钮

1. 实现效果 2. 实现方法 使用 JS 获取盒子的高度&#xff0c;来添加对应的按钮和样式&#xff1b;使用 CSS 的浮动效果&#xff0c;参考CSS 实现超过固定高度后出现展开折叠按钮&#xff1b;使用容器查询 – container 语法&#xff1b;使用 clamp 函数进行样式判断。 3. 优…

【C语言】_字符串拷贝函数strcpy

目录 1. 函数声明及功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版&#xff1a;基本功能判空const修饰 4.2 第二版&#xff1a;优化对于\0的单独拷贝 4.3 第三版&#xff1a;仿strcpy的char*返回值 1. 函数声明及功能 char * strcpy ( char * destination, cons…