假设检验详解

一、基本概念

1. 假设检验的生活场景类比

想象你是一个法官:

  • 零假设(H₀):被告无罪(默认假设)
  • 备择假设(H₁):被告有罪(需要证明的假设)
  • 显著性水平(α):判决标准的严格程度
  • p值:证据的可信程度

2. 检验过程的四个步骤

  1. 提出假设

    • 零假设:现状或无差异
    • 备择假设:想要证明的观点
  2. 确定显著性水平

    • 通常选择 0.05 或 0.01
    • 类比:定罪需要的证据标准
  3. 收集数据并计算

    • 样本统计量
    • 检验统计量
    • p值
  4. 做出决策

    • 如果 p值 < α,拒绝零假设
    • 如果 p值 ≥ α,接受零假设

二、重要概念详解

1. p值的深入理解

生活场景类比:彩票中奖

想象你怀疑一个彩票系统作弊:

  • 零假设:系统公平
  • 备择假设:系统作弊
  • p值:在系统公平的情况下,出现这种中奖情况的概率
  • 如果p值很小(比如0.001),说明这种情况太不寻常了,系统可能真的有问题
# p值计算示例
from scipy import stats
import numpy as np

# 假设我们有一组彩票中奖数据
observed_wins = 30  # 观察到的中奖次数
expected_wins = 20  # 理论预期中奖次数
total_trials = 1000  # 总试验次数

# 进行二项检验
p_value = stats.binom_test(observed_wins, n=total_trials, p=expected_wins/total_trials)
print(f"p值为:{p_value:.4f}")

2. 显著性水平(α)的选择

为什么选择0.05?

  • 传统选择,来自Fisher的建议
  • 在大多数场景下是合理的平衡点
  • 可以根据具体情况调整:
    • 医学研究可能用0.01(更严格)
    • 初步探索可能用0.1(更宽松)

3. 两类错误

生活场景类比:法庭判决

  • 第一类错误(α错误):
    • 把无辜的人判有罪
    • 拒绝了本应接受的零假设
  • 第二类错误(β错误):
    • 把有罪的人判无罪
    • 接受了本应拒绝的零假设
# 错误类型示意
def error_simulation(n_simulations=1000):
    # 模拟实验
    true_null = np.random.normal(0, 1, n_simulations)  # 零假设为真的情况
    true_alternative = np.random.normal(0.5, 1, n_simulations)  # 备择假设为真的情况
    
    # 在α=0.05的情况下进行检验
    alpha = 0.05
    critical_value = stats.norm.ppf(1-alpha)
    
    # 计算两类错误
    type_1_error = np.mean(true_null > critical_value)
    type_2_error = np.mean(true_alternative <= critical_value)
    
    return type_1_error, type_2_error

type_1, type_2 = error_simulation()
print(f"第一类错误率:{type_1:.3f}")
print(f"第二类错误率:{type_2:.3f}")

三、常用检验方法

1. t检验

使用场景

  • 比较均值是否有显著差异
  • 样本量较小(小于30)
  • 数据近似正态分布

生活场景类比:新药测试

  • 比较服用新药和安慰剂的效果差异
  • 比较两种教学方法的成绩差异
# t检验示例
from scipy import stats

# 两组学生的考试成绩
group1_scores = [85, 88, 92, 78, 90]  # 新教学方法
group2_scores = [79, 82, 85, 75, 88]  # 传统方法

# 进行独立样本t检验
t_stat, p_value = stats.ttest_ind(group1_scores, group2_scores)
print(f"t统计量:{t_stat:.2f}")
print(f"p值:{p_value:.4f}")

2. 卡方检验

使用场景

  • 分类数据的独立性检验
  • 适合性检验
  • 分布的同质性检验

生活场景类比:广告效果

想象你要测试不同广告位置的点击率差异:

  • 首页广告
  • 侧边栏广告
  • 底部广告
# 卡方检验示例
import numpy as np
from scipy.stats import chi2_contingency

# 广告位置和点击数据
observed = np.array([
    [150, 50],  # 首页广告:点击,未点击
    [100, 100], # 侧边栏广告:点击,未点击
    [80, 120]   # 底部广告:点击,未点击
])

# 进行卡方检验
chi2, p_value, dof, expected = chi2_contingency(observed)
print(f"卡方统计量:{chi2:.2f}")
print(f"p值:{p_value:.4f}")

四、实践建议

1. 检验方法选择

  • t检验:比较均值
  • 卡方检验:分类数据
  • ANOVA:多组比较
  • 非参数检验:数据不满足正态分布

2. 注意事项

  • 样本量的影响
  • 多重检验的问题
  • 效应量的考虑
  • 实际显著性vs统计显著性

3. 常见误区

  • p值不是效应大小
  • 统计显著不等于实际重要
  • 没有考虑样本量的影响
  • 过度依赖p值

五、Python实践工具

1. 常用库

from scipy import stats  # 统计检验
import numpy as np      # 数值计算
import pandas as pd     # 数据处理
import matplotlib.pyplot as plt  # 可视化
import seaborn as sns   # 统计可视化

2. 结果可视化

# 检验结果可视化示例
def plot_test_result(data1, data2, test_result):
    plt.figure(figsize=(10, 6))
    
    # 箱线图
    plt.boxplot([data1, data2])
    plt.xticks([1, 2], ['组1', '组2'])
    
    # 添加检验结果
    plt.title(f'两组数据比较
p值 = {test_result[1]:.4f}')
    plt.show()