位置参数检验 (LocationTests)

位置参数检验类提供了7种方法来比较不同组别或条件下的中心趋势(均值、中位数等)。这些检验在A/B测试、临床试验、质量控制等领域有广泛应用。

class LocationTests

位置参数检验类,包含参数和非参数方法来比较组间中心趋势。所有方法都返回 TestResult 对象。

主要方法:

检验方法详解

单样本t检验

one_sample_ttest(data: np.ndarray | List, popmean: float = 0, alpha: float = 0.05) TestResult

单样本t检验,检验样本均值是否等于给定的总体均值。

参数:

  • data: 输入数据,一维数组或列表

  • popmean: 假设的总体均值,默认为0

  • alpha: 显著性水平,默认0.05

适用条件:

  • 数据近似正态分布(大样本时可放宽)

  • 样本独立抽取

  • 连续型数据

原假设: 样本均值等于给定的总体均值

应用场景:

  • 质量控制:检验产品规格是否达标

  • 实验验证:检验处理效果是否为零

  • 基准比较:与历史标准或目标值比较

示例:

>>> from pywayne.statistics import LocationTests
>>> import numpy as np
>>>
>>> lt = LocationTests()
>>> data = np.random.normal(0.5, 1, 100)  # 均值偏移的数据
>>> result = lt.one_sample_ttest(data, popmean=0)
>>> print(f"t统计量: {result.statistic:.4f}, p值: {result.p_value:.4f}")

两样本t检验

two_sample_ttest(data1: np.ndarray | List, data2: np.ndarray | List, equal_var: bool = True, alpha: float = 0.05) TestResult

两独立样本t检验,比较两个独立组的均值差异。

参数:

  • data1: 第一个样本

  • data2: 第二个样本

  • equal_var: 是否假设方差相等,默认True

  • alpha: 显著性水平

适用条件:

  • 两组数据独立

  • 数据近似正态分布

  • equal_var=True时假设方差齐性

原假设: 两组均值相等

应用场景:

  • A/B测试:比较两种方案的效果

  • 临床试验:比较治疗组与对照组

  • 质量比较:比较不同供应商的产品

示例:

>>> # 比较两组数据
>>> group_a = np.random.normal(10, 2, 50)
>>> group_b = np.random.normal(12, 2, 50)
>>> result = lt.two_sample_ttest(group_a, group_b)
>>> print(f"两组均值差异显著: {result.reject_null}")

配对t检验

paired_ttest(data1: np.ndarray | List, data2: np.ndarray | List, alpha: float = 0.05) TestResult

配对样本t检验,比较同一对象在两种条件下的差异。

参数:

  • data1: 第一次测量结果

  • data2: 第二次测量结果

  • alpha: 显著性水平

适用条件:

  • 配对数据(同一对象的前后测量)

  • 差值近似正态分布

  • 测量值连续

原假设: 配对差值的均值为零

应用场景:

  • 治疗前后效果比较

  • 训练前后能力测试

  • 产品改进前后性能对比

示例:

>>> # 治疗前后数据
>>> before = np.random.normal(100, 10, 30)
>>> after = before + np.random.normal(5, 5, 30)  # 有改进效果
>>> result = lt.paired_ttest(before, after)
>>> print(f"治疗有效: {result.reject_null}")

单因素方差分析

one_way_anova(*groups: np.ndarray | List, alpha: float = 0.05) TestResult

单因素方差分析,比较三个或更多独立组的均值。

参数:

  • groups: 多个独立样本组

  • alpha: 显著性水平

适用条件:

  • 各组独立

  • 组内数据近似正态分布

  • 方差齐性(可用Levene检验验证)

原假设: 所有组的均值相等

应用场景:

  • 多组实验比较

  • 不同处理方式效果对比

  • 多因素实验的主效应分析

示例:

>>> # 三组数据比较
>>> group1 = np.random.normal(10, 2, 30)
>>> group2 = np.random.normal(12, 2, 30)
>>> group3 = np.random.normal(11, 2, 30)
>>> result = lt.one_way_anova(group1, group2, group3)
>>> print(f"F统计量: {result.statistic:.4f}, 组间有差异: {result.reject_null}")

Mann-Whitney U检验

mann_whitney_u(x: np.ndarray | List, y: np.ndarray | List, alpha: float = 0.05, alternative: str = 'two-sided') TestResult

Mann-Whitney U检验(Wilcoxon秩和检验),比较两独立样本的分布位置。

参数:

  • x: 第一个样本

  • y: 第二个样本

  • alpha: 显著性水平

  • alternative: 备择假设类型(’two-sided’, ‘less’, ‘greater’)

适用条件:

  • 两组独立

  • 数据至少为序数水平

  • 无需正态性假设

原假设: 两组数据来自相同分布

应用场景:

  • 非正态数据的组间比较

  • 小样本比较

  • 序数数据分析

示例:

>>> # 非正态数据比较
>>> group1 = np.random.exponential(2, 50)
>>> group2 = np.random.exponential(3, 50)
>>> result = lt.mann_whitney_u(group1, group2)
>>> print(f"U统计量: {result.statistic:.4f}, 分布不同: {result.reject_null}")

Wilcoxon符号秩检验

wilcoxon_signed_rank(x: np.ndarray | List, y: np.ndarray | List = None, alpha: float = 0.05) TestResult

Wilcoxon符号秩检验,配对样本的非参数检验。

参数:

  • x: 第一个样本或差值数据

  • y: 第二个样本(可选)

  • alpha: 显著性水平

适用条件:

  • 配对数据或单样本检验

  • 差值分布对称

  • 无需正态性假设

原假设: 中位数差值为零

应用场景:

  • 配对数据的非参数比较

  • 对称分布的单样本检验

  • 小样本配对分析

Kruskal-Wallis检验

kruskal_wallis(*groups: np.ndarray | List, alpha: float = 0.05) TestResult

Kruskal-Wallis检验,多组独立样本的非参数检验。

参数:

  • groups: 多个独立样本组

  • alpha: 显著性水平

适用条件:

  • 各组独立

  • 数据至少为序数水平

  • 无需正态性和方差齐性假设

原假设: 所有组的分布相同

应用场景:

  • 非正态数据的多组比较

  • 序数数据分析

  • ANOVA的非参数替代

示例:

>>> # 多组非正态数据比较
>>> group1 = np.random.exponential(1, 30)
>>> group2 = np.random.exponential(1.5, 30)
>>> group3 = np.random.exponential(2, 30)
>>> result = lt.kruskal_wallis(group1, group2, group3)
>>> print(f"H统计量: {result.statistic:.4f}, 组间有差异: {result.reject_null}")

使用建议

方法选择指南

  1. 数据类型考虑:

    • 正态数据: t检验、ANOVA

    • 非正态数据: Mann-Whitney U、Kruskal-Wallis

    • 序数数据: 非参数方法

  2. 样本数量:

    • 两组比较: t检验或Mann-Whitney U

    • 多组比较: ANOVA或Kruskal-Wallis

  3. 数据关系:

    • 独立样本: 两样本t检验、ANOVA

    • 配对样本: 配对t检验、Wilcoxon符号秩

  4. 样本量考虑:

    • 小样本 (n < 30): 优先非参数方法

    • 大样本: 参数方法更有效

数据准备建议

  1. 数据清洗: - 识别和处理异常值 - 检查数据完整性 - 确保数据类型正确

  2. 假设检验: - 正态性检验(Shapiro-Wilk等) - 方差齐性检验(Levene检验) - 独立性验证

  3. 样本量评估: - 进行功效分析 - 确保足够的检验功效 - 考虑效应量大小

结果解释指南

  1. 统计显著性: - p < α: 拒绝原假设 - p ≥ α: 不能拒绝原假设

  2. 效应量: - Cohen’s d: 标准化效应量 - eta-squared: 方差解释比例 - 实际意义评估

  3. 置信区间: - 均值差异的置信区间 - 效应量的置信区间 - 不确定性评估

典型应用示例

A/B测试分析

from pywayne.statistics import LocationTests, NormalityTests
import numpy as np

# 模拟A/B测试数据
control_group = np.random.normal(2.5, 0.8, 1000)    # 对照组转化率
treatment_group = np.random.normal(2.8, 0.8, 1000)  # 实验组转化率

lt = LocationTests()
nt = NormalityTests()

# 检查数据分布
norm_control = nt.shapiro_wilk(control_group[:50])  # 抽样检验
norm_treatment = nt.shapiro_wilk(treatment_group[:50])

# 选择适当的检验方法
if norm_control.p_value > 0.05 and norm_treatment.p_value > 0.05:
    # 数据正态,使用t检验
    result = lt.two_sample_ttest(control_group, treatment_group)
    test_type = "两样本t检验"
else:
    # 数据非正态,使用非参数检验
    result = lt.mann_whitney_u(control_group, treatment_group)
    test_type = "Mann-Whitney U检验"

print(f"A/B测试结果 ({test_type}):")
print(f"统计量: {result.statistic:.4f}")
print(f"p值: {result.p_value:.4f}")
print(f"结论: {'实验组效果显著' if result.reject_null else '无显著差异'}")

临床试验分析

# 模拟治疗前后数据
np.random.seed(42)
n_patients = 50

# 治疗前的症状评分
before_treatment = np.random.normal(70, 15, n_patients)

# 治疗后的症状评分(假设有改善)
treatment_effect = np.random.normal(-10, 8, n_patients)
after_treatment = before_treatment + treatment_effect

lt = LocationTests()

# 配对t检验
result = lt.paired_ttest(before_treatment, after_treatment)

print("临床试验结果:")
print(f"治疗前均值: {np.mean(before_treatment):.2f}")
print(f"治疗后均值: {np.mean(after_treatment):.2f}")
print(f"均值差异: {np.mean(after_treatment - before_treatment):.2f}")
print(f"t统计量: {result.statistic:.4f}")
print(f"p值: {result.p_value:.4f}")
print(f"治疗效果: {'显著' if result.reject_null else '不显著'}")

多组质量比较

# 模拟不同供应商的产品质量数据
supplier_a = np.random.normal(95, 5, 40)
supplier_b = np.random.normal(92, 6, 40)
supplier_c = np.random.normal(98, 4, 40)
supplier_d = np.random.normal(94, 7, 40)

lt = LocationTests()

# 单因素方差分析
anova_result = lt.one_way_anova(supplier_a, supplier_b, supplier_c, supplier_d)

print("供应商质量比较 (ANOVA):")
print(f"F统计量: {anova_result.statistic:.4f}")
print(f"p值: {anova_result.p_value:.4f}")
print(f"结论: {'供应商间存在显著差异' if anova_result.reject_null else '供应商间无显著差异'}")

# 如果ANOVA显著,可进行事后比较
if anova_result.reject_null:
    print("\n事后比较 (两两比较):")
    suppliers = [supplier_a, supplier_b, supplier_c, supplier_d]
    names = ['A', 'B', 'C', 'D']

    for i in range(len(suppliers)):
        for j in range(i+1, len(suppliers)):
            result = lt.two_sample_ttest(suppliers[i], suppliers[j])
            print(f"供应商{names[i]} vs {names[j]}: p={result.p_value:.4f}, "
                  f"显著={'是' if result.reject_null else '否'}")

非参数多组比较

# 模拟非正态分布的数据(如反应时间)
group1 = np.random.exponential(2, 30)
group2 = np.random.exponential(2.5, 30)
group3 = np.random.exponential(3, 30)

lt = LocationTests()

# Kruskal-Wallis检验
kw_result = lt.kruskal_wallis(group1, group2, group3)

print("非参数多组比较 (Kruskal-Wallis):")
print(f"H统计量: {kw_result.statistic:.4f}")
print(f"p值: {kw_result.p_value:.4f}")
print(f"结论: {'组间分布有显著差异' if kw_result.reject_null else '组间分布无显著差异'}")

# 计算各组中位数
medians = [np.median(group1), np.median(group2), np.median(group3)]
print(f"各组中位数: {medians}")

注意事项

  1. 假设验证: - 参数检验需要验证正态性假设 - 方差分析需要检验方差齐性 - 独立性假设通常由实验设计保证

  2. 多重比较: - 多次比较时考虑α水平校正 - 使用Bonferroni校正或FDR控制 - 计划比较 vs 事后比较

  3. 效应量报告: - 不仅报告统计显著性 - 计算和报告效应量 - 提供置信区间

  4. 实际应用考虑: - 大样本时微小差异也可能显著 - 结合专业知识解释结果 - 考虑统计功效和检验效能