当前位置: 首页 > article >正文

数分基础(05)中心极限定理、假设检验与AB测试简介

文章目录

  • 1. 中心极限定理
    • 1.1 概念
    • 1.2 直观理解
    • 1.3 重要性
  • 2. 示例
    • 2.1 数据集
    • 2.2 验证思路
      • (1)获取一个样本均值
      • (2)假设抽取1000次
      • (3)增大样本容量
    • 2.3 实现
    • 2.4 结果
  • 2. 假设检验
    • 2.1 总体思路
    • 2.2 比较两种运输方式的平均销售额
      • (1)提出假设
      • (2)检验方法
      • (3)计算检验统计量
      • (4)结果解释
  • 3. A/B测试

1. 中心极限定理

1.1 概念

是统计学中的一个核心概念:当样本量足够大时,无论总体分布形状如何,样本均值的分布都会趋近于正态分布

1.2 直观理解

假设我们有一组数据,从中不断地抽取样本并计算每个样本的平均值,这些均值会形成一个分布。无论原始数据是什么分布,当样本足够大时,这些平均值的分布会接近于“钟形”的正态分布。

1.3 重要性

中心极限定理为我们提供了使用正态分布进行统计推断的依据,即使原始数据不是正态分布。

2. 示例

2.1 数据集

我们仍旧使用这个数据集,数分基础(01)示例数据集Global_Superstore

使用其中的“销售额”列数据,随机抽取不同样本大小的子集,并计算这些样本的均值,观察样本均值的分布变化。

2.2 验证思路

为了达到我们的设想,以终为始

(1)获取一个样本均值

从原始数据中随机抽取若干个数据点(样本),这些数据点的平均值。例如,我们从销售额这一列中随机抽取10个数值(样本量=10),就能够集散一个样本均值。

(2)假设抽取1000次

假设样本量=10,我们重复(1)1000次,每次都会获得10个样本的一个均值,这1000次的均值(每次10个)会是不同的值,将这些值绘制直方图,显示分布情况。

(3)增大样本容量

观察随着样本数量增加,均值分布是否趋于正态分布。来验证“当样本足够大时,这些平均值的分布会接近于“钟形”的正态分布”。

2.3 实现

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 加载数据集
file_path = 'Global_Superstore2.xlsx'
excel_data = pd.ExcelFile(file_path)
sheet_names = excel_data.sheet_names
data = pd.read_excel(file_path, sheet_name='Sheet1')

# 从数据集中提取销售额数据
sales_data = data['Sales']

# 设置不同的样本量
sample_sizes = [10, 50, 100, 500]

# 设置中文字体为 SimHei(黑体),在绘图前设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 绘制均值的分布
plt.figure(figsize=(12, 8))

for i, size in enumerate(sample_sizes):
    # 生成样本均值的分布
    sample_means = [np.mean(np.random.choice(sales_data, size, replace=False)) for _ in range(1000)]
    plt.subplot(2, 2, i + 1)
    plt.hist(sample_means, bins=30, color='skyblue', alpha=0.7)
    plt.title(f'样本数量 = {size}')
    plt.xlabel('样本均值') 
    plt.ylabel('频率')    
    plt.grid(True)

plt.tight_layout()
plt.show()

这行代码的意思是:

sample_means = [np.mean(np.random.choice(sales_data, size, replace=False)) for _ in range(1000)]

从销售额数据sales_data中随机抽取指定数量(‘size’)的数据,计算均指,并重复这个过程1000次。每次计算得到的均值存储在sample_means列表中

plt.hist()

plt.hist(sample_means, bins=30, color='skyblue', alpha=0.7)

绘制直方图,‘sample_means’作为输入,表示将列表中的1000个数值进行统计绘图
bins=30,将1000个值分成30个区间(柱子),每个柱子的宽度代表均值的范围,高度代表这个范围内的均指出现的次数(频率),并设置柱子的颜色和透明度。

  • 直方图的每个柱子(条形)代表一个样本均值区间的出现次数(频率)
  • 柱子的高度越高,该样本均值范围内的次数越多
  • 如果某个区间(例如,200-210)对应的柱子的高度为80,意味着在1000次抽样中,样本均值落在200-210之间的情况出现了80次

2.4 结果

在这里插入图片描述
当样本量较小时,左上角=10,样本均值的分布并不是正态分布,随着样本量增加到100,或者500,样本均值的分布逐渐趋向于“钟形”的正态分布

直观地验证了中心极限定理:无论总体分布是什么形状(偏态分布、均匀分布等),当样本量足够大时,样本均值的分布会趋近于正态分布。

也就意味着,即便我们面对的是非正态分布的原始数据,只要样本量大,样本均值就是正态分布的,就可以应用依赖正态分布的统计推断,z检验、t检验等。

2. 假设检验

利用数据集中的运输方式和销售额来看假设检验。我们在Ship Mode中可以看到有不同的运输方式,现在,我们验证两种运输方式:Same Day 和 Second Class 下的平均销售额是否存在显著差异。
在这里插入图片描述

2.1 总体思路

  1. 设定原假设(H0)和备择假设(H1)
  2. 选择合适的统计检验方法(如 t 检验)
  3. 从样本数据中计算相应的统计量
  4. 根据统计量和p值,判断是否拒绝原假设

2.2 比较两种运输方式的平均销售额

(1)提出假设

原假设(H0): Same Day 运输方式和 Second Class 运输方式的平均销售额无显著差异
备择假设(H1):Same Day 运输方式的平均销售额显著高于Second Class

(2)检验方法

使用独立样本T检验比较两组均指,两组数据相互独立,样本量较大。

T检验是一种统计检验方法,当样本量较小,或总体标准差未知时,用于检验样本均值与总体均值的差异,或比较两个样本均值。
在这里插入图片描述

使用条件:

  • 样本量较小( n < 30),且总体标准差未知
  • 数据近似正态分布或样本来自正态分布
  • 总体方差未知且需从样本数据中估计标准差

(3)计算检验统计量

提取 Same Day 和 Second Class 的销售额,并进行 t 检验

from scipy.stats import ttest_ind

# 提取不同运输方式的销售额数据
same_day_sales = data[data['Ship Mode'] == 'Same Day']['Sales']
second_class_sales = data[data['Ship Mode'] == 'Second Class']['Sales']

# 计算样本均值
mean_same_day = same_day_sales.mean()
mean_second_class = second_class_sales.mean()

# 执行独立样本t检验
t_stat, p_value = ttest_ind(same_day_sales, second_class_sales, equal_var=False)

# 打印结果
print(f"Same Day 平均销售额: {mean_same_day:.2f}")
print(f"Second Class 平均销售额: {mean_second_class:.2f}")
print(f"T统计量: {t_stat:.2f}")
print(f"p值: {p_value:.4f}")

运行结果为

Same Day 平均销售额: 247.02
Second Class 平均销售额: 248.88
T统计量: -0.18
p值: 0.8559

Scipy 科学计算库,ttest_ind函数,执行独立样本T检验,比较两组独立样本的均指是否存在显著差异,例如对比两组实验结果、两种方案的效果等。

常用于A/B测试、医学实验等,判断两组之间的均指差异是否是由随机误差引起,还是由于实际的显著差异引起。

ttest_ind主要参数:
ttest_ind(a, b, equal_var=True, nan_policy=‘propagate’, alternative=‘two-sided’)

a:第一组样本数据(数组或列表)
b:第二组样本数据(数组或列表)
equal_var:是否假设两组数据具有相等的方差
True(默认值):假设两组方差相等
False:不假设方差相等

nan_policy:处理缺失值的策略。
‘propagate’(默认):如果存在 NaN,则返回 NaN
‘omit’:忽略 NaN 值
‘raise’:遇到 NaN 值时报错

alternative:定义双尾或单尾检验类型
‘two-sided’(默认):双尾检验
‘less’:单尾检验,测试是否 a 的均值小于 b
‘greater’:单尾检验,测试是否 a 的均值大于 b

t_stat:T 统计量,用于衡量样本均值的差异程度。T 值越大,均值差异越明显。
p_value:p 值,用于判断差异的显著性。通常,如果 p 值小于显著性水平(例如 0.05),我们认为差异显著,拒绝原假设
通过判断 T 统计量和 p 值,可以评估两组数据的差异性,并为后续行动提供数据支持

(4)结果解释

平均销售额,Same Day 方式的平均销售额约为 247.02 Second Class 运输方式的平均销售额约为 248.88

Same Day 平均销售额: 247.02
Second Class 平均销售额: 248.88
T统计量: -0.18
p值: 0.8559

t 统计量 -0.18 ,接近于0 ,均值差异不明显
p 值 0.8559 ,远大于 0.05 ,差异不显著,不能拒绝原假设 —— Same Day 运输方式和 Second Class 运输方式的平均销售额无显著差异

意味着,在决策时,如果销售额是主要考虑的问题,选择“Same Day”运输方式,并不会带来显著的销售提升,或许可以考虑成本、运输效率。

3. A/B测试

简要说下A/B测试,是一种对比测试,通过对比两种方案的效果来评估哪种更优。常用于网站设计、广告优化、产品定价等。

例如希望评估两种运输方式对销售额的影响,看看是否有显著差异。那么可以将上面的 Same Day 运输方式设为 A 组, Second Class 运输方式设为 B 组。

测试的目标为,Same Day 运输方式是否能带来更高的销售额。

在实际中,可以随机将用户分配到不同的实验组。然后收集两组的销售额数据。对比两组表现。使用统计检验判断差异是否显著。

在这个数据集示例中,我们已有两组数据【假设是上述方案设计下收集来的】,且已经进行了分析,且判断了差异并不显著。

也就是说,我们可以根据测试结果,优化商业方案,例如这里,帮助我们评估运输方式对销售额的影响。假如运输方式对销售额的影响有显著的差异,就可以选择销售额高的运输方式。这样通过小规模的实验,能够降低全局实施的风险。


http://www.kler.cn/a/288591.html

相关文章:

  • SQL 注入详解:原理、危害与防范措施
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • Mysql数据库里的SSH连接
  • 树形dp总结
  • C++面试基础知识:排序算法 C++实现
  • Scala入门基础(17.1)Set集习题
  • 多线程并发性
  • 二叉树展开为列表(LeetCode)
  • 改进YOLO的群养猪行为识别算法研究及部署(小程序-网站平台-pyqt)
  • 【通俗理解】最优控制之旅——强化学习中的策略优化
  • 物业|基于SprinBoot+vue的物业管理系统(源码+数据库+文档)
  • 深入理解 CSS Flex 布局
  • Golang 字面量的表示
  • 【HarmonyOS 4.0】应用级变量的状态管理
  • 每天一个数据分析题(五百一十二)- 数据标准化
  • SprinBoot+Vue在线商城微信小程序的设计与实现
  • DZ主题模板 Discuz迪恩淘宝客购物风格商业版模板
  • Git和SVN了解
  • blender插件库
  • Unity URP支持多光源阴影
  • 解决windterm莫名其妙输入ctrl+c的问题
  • 【IC设计】跨时钟异步处理系列——单比特跨时钟
  • 时间序列的解密者:循环神经网络在时间序列分析中的应用
  • 【docker】docker 是什么
  • 为啥一定要考HCIE安全?这4个理由你不得不看
  • Docker 镜像构建