未记录事实核验 · 状态:维护中
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 本文适用范围与待维护项
本文成绩、广告点击与购买人数均为教学模拟数据,不代表真实业务或教学效果验证。代码块按顺序执行,共用首段导入的依赖;列表语法和置信区间输出已修正,可用于基础练习;本轮未运行示例,不声称执行结果已验证。单样本示例检验的是均值与75分是否不同,不能据此证明教学方法导致成绩提高;未显著不等于原假设成立。推荐器中的sample_count表示组数或样本组数,不是观测数量,仅供初步筛选:实际选型还需检查独立性、配对差值的分布、符号秩检验的对称性条件、方差及分类表期望频数;二元点击数据的t检验只作大样本近似演示,正式比例比较需选择适当的比例检验。检验力示例针对单样本或配对t检验,效应量阈值仅是经验参考,检验力目标需结合效应大小、错误成本和研究设计确定。
🔬 假设检验 - 科学决策的统计基础
info 💡 **术语速览**
假设检验 = 利用样本数据对总体参数假设进行检验的统计方法,通过计算p值判断观察到的差异是否具有统计学意义。
🗣️ 沟通障碍
开会时同事提到假设检验,自己一脸懵逼,插不上话,很尴尬。
在数字化工作环境中,这样的场景每天都在发生。掌握相关知识不是为了应付考试,而是为了更好地解决实际问题。
💡 核心概念解释
abstract 🎯 什么是假设检验?
假设检验是利用样本数据对总体参数提出的假设进行检验的统计方法
通过概率论判断观察到的差异是否具有统计学意义
📐 基本要素
- 原假设 (H₀): 通常表示"没有差异"或"没有效果"
- 备择假设 (H₁): 与原假设相对的待检验假设
- 显著性水平 (α): 容许的第一类错误概率,常用0.05
- p值: 在原假设为真的条件下,观察到当前结果或更极端结果的概率
🎯 检验流程
- 提出假设
- 选择检验统计量
- 确定拒绝域
- 计算统计量值
- 做出统计决策
🔍 实际演示
📊 单样本t检验
import numpy as np
import pandas as pd
from scipy import stats
# 案例:验证新的教学方法是否提高了学生成绩
np.random.seed(42)
# 历史平均成绩为75分
historical_mean = 75
# 使用新教学方法的30名学生成绩
new_method_scores = np.random.normal(78, 8, 30)
print("📊 新教学方法效果检验")
print(f"样本大小: {len(new_method_scores)}")
print(f"样本均值: {new_method_scores.mean():.2f}")
print(f"历史均值: {historical_mean}")
# 进行单样本t检验
t_statistic, p_value = stats.ttest_1samp(new_method_scores, historical_mean)
print(f"\n🔍 假设检验结果")
print(f"H₀: 新方法平均成绩 = {historical_mean}分")
print(f"H₁: 新方法平均成绩 ≠ {historical_mean}分")
print(f"t统计量: {t_statistic:.4f}")
print(f"p值: {p_value:.4f}")
# 判断结果
alpha = 0.05
if p_value < alpha:
print(f"✅ 拒绝原假设 (p < {alpha})")
print("📊 模拟样本均值与75分存在统计显著差异;这不证明教学方法导致成绩提高")
else:
print(f"❌ 未拒绝原假设 (p ≥ {alpha})")
print("📊 没有足够证据表明新方法有效")
# 计算置信区间
confidence_interval = stats.t.interval(
0.95, len(new_method_scores)-1,
loc=new_method_scores.mean(),
scale=stats.sem(new_method_scores)
)
print(f"95%置信区间: [{confidence_interval[0]:.2f}, {confidence_interval[1]:.2f}]")
🎯 独立样本t检验 - A/B测试应用
# 案例:比较两个广告创意的点击率
np.random.seed(42)
# 广告A和广告B的点击率数据
ad_a_clicks = np.random.binomial(1, 0.05, 1000) # 5%点击率
ad_b_clicks = np.random.binomial(1, 0.07, 1000) # 7%点击率
# 计算点击率
ctr_a = ad_a_clicks.mean() * 100
ctr_b = ad_b_clicks.mean() * 100
print("🎯 A/B测试:广告创意对比")
print(f"广告A点击率: {ctr_a:.2f}%")
print(f"广告B点击率: {ctr_b:.2f}%")
print(f"差异: {ctr_b - ctr_a:.2f}个百分点")
# 独立样本t检验
t_stat, p_val = stats.ttest_ind(ad_a_clicks, ad_b_clicks)
print(f"\n🔍 假设检验结果")
print(f"H₀: 两个广告点击率相等")
print(f"H₁: 两个广告点击率不等")
print(f"t统计量: {t_stat:.4f}")
print(f"p值: {p_val:.4f}")
if p_val < 0.05:
print("✅ 拒绝原假设,两个广告效果存在显著差异")
winner = "广告B" if ctr_b > ctr_a else "广告A"
print(f"🏆 {winner} 表现更好")
else:
print("❌ 未拒绝原假设,没有足够证据证明差异显著")
# 效应量计算 (Cohen's d)
pooled_std = np.sqrt(((len(ad_a_clicks)-1)*np.var(ad_a_clicks, ddof=1) +
(len(ad_b_clicks)-1)*np.var(ad_b_clicks, ddof=1)) /
(len(ad_a_clicks) + len(ad_b_clicks) - 2))
cohens_d = (ad_b_clicks.mean() - ad_a_clicks.mean()) / pooled_std
print(f"效应量 (Cohen's d): {cohens_d:.4f}")
📈 卡方检验 - 分类数据分析
# 案例:分析不同用户群体的购买偏好
purchase_data = np.array([[120, 380], # 年轻用户:购买120,未购买380
[200, 300], # 中年用户:购买200,未购买300
[80, 220]]) # 老年用户:购买80,未购买220
groups = ['年轻用户', '中年用户', '老年用户']
behaviors = ['购买', '未购买']
# 创建DataFrame
df = pd.DataFrame(purchase_data, index=groups, columns=behaviors)
print("📊 用户群体购买行为交叉表")
print(df)
# 计算购买率
purchase_rates = df['购买'] / (df['购买'] + df['未购买']) * 100
print(f"\n📈 各群体购买率")
for group, rate in purchase_rates.items():
print(f"{group}: {rate:.1f}%")
# 卡方检验
chi2, p_value, dof, expected = stats.chi2_contingency(purchase_data)
print(f"\n🔍 卡方检验结果")
print(f"H₀: 用户群体与购买行为独立")
print(f"H₁: 用户群体与购买行为有关")
print(f"卡方统计量: {chi2:.4f}")
print(f"p值: {p_value:.4f}")
if p_value < 0.05:
print("✅ 拒绝原假设")
print("📊 用户群体与购买行为存在显著关联")
else:
print("❌ 未拒绝原假设")
print("📊 没有足够证据证明关联性")
📊 假设检验类型选择指南
def recommend_test(data_type, sample_count, is_paired=None, is_normal=None):
"""推荐合适的假设检验方法"""
print(f"🎯 数据类型: {data_type}")
print(f"📊 样本组数: {sample_count}")
if data_type == '连续':
if sample_count == 1:
if is_normal:
return "✅ 单样本t检验"
else:
return "✅ Wilcoxon符号秩检验"
elif sample_count == 2:
if is_paired:
if is_normal:
return "✅ 配对样本t检验"
else:
return "✅ Wilcoxon符号秩检验"
else:
if is_normal:
return "✅ 独立样本t检验"
else:
return "✅ Mann-Whitney U检验"
else:
return "✅ 方差分析(ANOVA) 或 Kruskal-Wallis检验"
elif data_type == '分类':
if sample_count == 1:
return "✅ 二项式检验 或 卡方拟合优度检验"
else:
return "✅ 卡方独立性检验 或 Fisher精确检验"
# 示例推荐
print("🎯 假设检验方法推荐示例")
examples = [
("连续", 1, None, True, "比较样本均值与已知值"),
("连续", 2, False, True, "比较两组独立样本均值"),
("连续", 2, True, False, "比较前后测量结果"),
("分类", 2, None, None, "分析两个分类变量关系")
]
for data_type, samples, paired, normal, description in examples:
print(f"\n📋 场景: {description}")
recommendation = recommend_test(data_type, samples, paired, normal)
print(f"推荐方法: {recommendation}")
📊 检验力分析
# 检验力计算示例
from statsmodels.stats.power import ttest_power
print("📊 检验力分析:不同效应量和样本量的检验力")
print("效应量 样本量 检验力")
print("-" * 25)
effect_sizes = [0.2, 0.5, 0.8] # 小、中、大效应
sample_sizes = [30, 50, 100]
for effect in effect_sizes:
for n in sample_sizes:
power = ttest_power(effect, n, 0.05)
print(f"{effect:>6.1f} {n:>6d} {power:>6.3f}")
print("\n📋 检验力解释:")
print("0.8: 常见检验力规划目标之一,并非通用质量标准")
print("检验力需结合目标效应量、显著性水平和研究设计解释")
print("检验力不足时可评估增加样本量或改进研究设计")
⚠️ 注意事项
🎯 常见误区
- p值万能论: p值不代表效应大小,只代表统计显著性
- 多重检验: 多次检验需要调整显著性水平(如Bonferroni校正)
- 样本量忽视: 大样本容易得到显著结果,但不一定有实际意义
- 实际意义: 统计显著≠实际意义,需要结合业务场景判断
📊 第一类和第二类错误
- 第一类错误(α): 错误地拒绝真的原假设(误报)
- 第二类错误(β): 原假设为假时未拒绝原假设(漏报);β表示发生这种错误的概率
- 检验力(1-β): 正确拒绝假原假设的概率
🎯 效应量的重要性
# 效应量解释
def interpret_effect_size(d):
"""解释Cohen's d效应量"""
if abs(d) < 0.2:
return "低于小效应参考阈值"
elif abs(d) < 0.5:
return "小效应"
elif abs(d) < 0.8:
return "中等效应"
else:
return "大效应"
print("📏 效应量参考标准:")
for d in [0.1, 0.3, 0.6, 0.9]:
print(f"Cohen's d = {d}: {interpret_effect_size(d)}")
✅ 掌握检查
- [ ] 理解假设检验的基本原理和流程
- [ ] 掌握不同情况下检验方法的选择
- [ ] 能够正确解释p值和统计显著性
- [ ] 了解效应量和检验力的重要性
- [ ] 能够在实际业务中应用假设检验