数分基础(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 总体思路
- 设定原假设(H0)和备择假设(H1)
- 选择合适的统计检验方法(如 t 检验)
- 从样本数据中计算相应的统计量
- 根据统计量和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 运输方式是否能带来更高的销售额。
在实际中,可以随机将用户分配到不同的实验组。然后收集两组的销售额数据。对比两组表现。使用统计检验判断差异是否显著。
在这个数据集示例中,我们已有两组数据【假设是上述方案设计下收集来的】,且已经进行了分析,且判断了差异并不显著。
也就是说,我们可以根据测试结果,优化商业方案,例如这里,帮助我们评估运输方式对销售额的影响。假如运输方式对销售额的影响有显著的差异,就可以选择销售额高的运输方式。这样通过小规模的实验,能够降低全局实施的风险。