0

0

Python中循环进行统计比较:Wilcoxon符号秩检验的自动化实现

DDD

DDD

发布时间:2025-09-09 17:00:02

|

706人浏览过

|

来源于php中文网

原创

Python中循环进行统计比较:Wilcoxon符号秩检验的自动化实现

本教程介绍如何在Python中高效地对多组数值向量进行成对统计比较,特别以Wilcoxon符号秩检验为例。通过将相关向量组织成列表或字典,并利用循环结构自动化执行统计测试,可以避免大量重复代码,提升数据分析的效率和可维护性。

在数据分析中,我们经常需要对多组相似的数据进行重复的统计检验。例如,在比较不同处理组或不同区域的测量值时,可能会有数十甚至上百对数据需要进行配对比较。如果每次都手动编写代码来执行检验,不仅效率低下,而且极易出错。本教程将展示如何利用python的循环结构和合理的数据组织方式,自动化这一过程,以wilcoxon符号秩检验为例进行说明。

数据组织与准备

假设我们有两组相关的数值向量,每组包含多个子向量,它们之间存在一一对应的关系。例如,hc_mcp 与 tw_mcp 构成一对,hc_pct 与 tw_pct 构成另一对,依此类推。

原始数据可能以独立变量的形式定义:

hc_mcp = [0.45, 0.43, 0.46, 0.46, 0.45, 0.39, 0.48, 0.47, 0.50, 0.45, 0.47, 0.47, 0.46]
hc_pct = [0.44, 0.48, 0.45, 0.46, 0.47, 0.37, 0.56, 0.46, 0.49, 0.53, 0.46, 0.47, 0.48]
hc_gcc = [0.51, 0.56, 0.57, 0.54, 0.55, 0.58, 0.51, 0.54, 0.55, 0.54, 0.55, 0.53, 0.54]
hc_bcc = [0.56, 0.62, 0.64, 0.63, 0.60, 0.65, 0.60, 0.64, 0.64, 0.61, 0.63, 0.58, 0.63]
hc_scc = [0.68, 0.73, 0.74, 0.71, 0.72, 0.73, 0.70, 0.72, 0.72, 0.72, 0.71, 0.67, 0.73]

tw_mcp = [0.47, 0.46, 0.44, 0.48, 0.45, 0.45, 0.46, 0.44, 0.47, 0.46, 0.50, 0.49, 0.48]
tw_pct = [0.46, 0.48, 0.45, 0.48, 0.47, 0.45, 0.46, 0.43, 0.43, 0.49, 0.49, 0.47, 0.44]
tw_gcc = [0.56, 0.56, 0.55, 0.57, 0.52, 0.56, 0.53, 0.55, 0.55, 0.55, 0.56, 0.55, 0.56]
tw_bcc = [0.62, 0.63, 0.60, 0.63, 0.61, 0.63, 0.62, 0.63, 0.63, 0.62, 0.63, 0.61, 0.65]
tw_scc = [0.71, 0.70, 0.70, 0.71, 0.68, 0.74, 0.72, 0.73, 0.70, 0.68, 0.69, 0.70, 0.71]

当向量数量较少时,这种方式尚可接受。但面对大量(例如,每组48个,总共144个)向量时,手动编写 wilcoxon(hc_mcp, tw_mcp) 等代码将变得非常繁琐。

解决此问题的关键在于将相关联的向量组织到更高级的数据结构中,例如列表。我们可以将所有 hc_ 开头的向量放入一个列表,所有 tw_ 开头的向量放入另一个列表。最重要的是,要确保这两个列表中对应位置的元素(即相同索引的元素)构成一个待比较的配对。

立即学习Python免费学习笔记(深入)”;

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载
# 将向量组织成列表
list_hc = [hc_mcp, hc_pct, hc_gcc, hc_bcc, hc_scc]
list_tw = [tw_mcp, tw_pct, tw_gcc, tw_bcc, tw_scc]

循环执行统计检验

一旦数据被结构化为列表,我们就可以使用 for 循环来自动化执行Wilcoxon符号秩检验。Wilcoxon符号秩检验是一种非参数检验,用于比较两个相关的(配对的)样本,适用于数据不服从正态分布的情况。在Python中,scipy.stats 模块提供了 wilcoxon 函数来实现此检验。

from scipy.stats import wilcoxon

# 用于存储P值和统计量的列表
p_values = []
statistic_values = []

# 遍历列表进行成对比较
# 通过索引确保每次循环都取到正确的配对
for i in range(len(list_hc)):
    # 获取当前配对的向量
    data_hc = list_hc[i]
    data_tw = list_tw[i]

    # 执行Wilcoxon符号秩检验
    # wilcoxon函数返回一个包含统计量和P值的对象
    result = wilcoxon(data_hc, data_tw)

    # 存储P值和统计量
    p_values.append(result.pvalue)
    statistic_values.append(result.statistic)

print("计算得到的P值列表:", p_values)
print("计算得到的统计量列表:", statistic_values)

通过这种方式,无论有多少对向量需要比较,我们只需编写一次循环逻辑,即可批量处理,大大提高了代码的效率和可维护性。

完整示例代码

以下是结合数据定义和循环处理的完整示例:

from scipy.stats import wilcoxon

# 原始数据
hc_mcp = [0.45, 0.43, 0.46, 0.46, 0.45, 0.39, 0.48, 0.47, 0.50, 0.45, 0.47, 0.47, 0.46]
hc_pct = [0.44, 0.48, 0.45, 0.46, 0.47, 0.37, 0.56, 0.46, 0.49, 0.53, 0.46, 0.47, 0.48]
hc_gcc = [0.51, 0.56, 0.57, 0.54, 0.55, 0.58, 0.51, 0.54, 0.55, 0.54, 0.55, 0.53, 0.54]
hc_bcc = [0.56, 0.62, 0.64, 0.63, 0.60, 0.65, 0.60, 0.64, 0.64, 0.61, 0.63, 0.58, 0.63]
hc_scc = [0.68, 0.73, 0.74, 0.71, 0.72, 0.73, 0.70, 0.72, 0.72, 0.72, 0.71, 0.67, 0.73]

tw_mcp = [0.47, 0.46, 0.44, 0.48, 0.45, 0.45, 0.46, 0.44, 0.47, 0.46, 0.50, 0.49, 0.48]
tw_pct = [0.46, 0.48, 0.45, 0.48, 0.47, 0.45, 0.46, 0.43, 0.43, 0.49, 0.49, 0.47, 0.44]
tw_gcc = [0.56, 0.56, 0.55, 0.57, 0.52, 0.56, 0.53, 0.55, 0.55, 0.55, 0.56, 0.55, 0.56]
tw_bcc = [0.62, 0.63, 0.60, 0.63, 0.61, 0.63, 0.62, 0.63, 0.63, 0.62, 0.63, 0.61, 0.65]
tw_scc = [0.71, 0.70, 0.70, 0.71, 0.68, 0.74, 0.72, 0.73, 0.70, 0.68, 0.69, 0.70, 0.71]

# 将向量组织成列表,确保顺序对应
list_hc = [hc_mcp, hc_pct, hc_gcc, hc_bcc, hc_scc]
list_tw = [tw_mcp, tw_pct, tw_gcc, tw_bcc, tw_scc]

# 用于存储P值和统计量的列表
p_values = []
statistic_values = []
pair_names = ["mcp", "pct", "gcc", "bcc", "scc"] # 可选:用于标识每对结果的名称

# 遍历列表进行成对比较
for i in range(len(list_hc)):
    data_hc = list_hc[i]
    data_tw = list_tw[i]

    # 执行Wilcoxon符号秩检验
    result = wilcoxon(data_hc, data_tw)

    # 存储P值和统计量
    p_values.append(result.pvalue)
    statistic_values.append(result.statistic)

    # 打印每对结果,方便查看
    print(f"配对 {pair_names[i]}:")
    print(f"  统计量 = {result.statistic:.4f}")
    print(f"  P值 = {result.pvalue:.4f}\n")

print("所有P值列表:", p_values)
print("所有统计量列表:", statistic_values)

注意事项与最佳实践

  1. 数据对齐的严谨性: 确保 list_hc 和 list_tw 中相同索引位置的向量确实是需要进行配对比较的数据。任何顺序上的不一致都将导致错误的统计结果。在实际应用中,如果数据量庞大且命名规则复杂,建议在构建列表时进行严格的检查或使用更具鲁棒性的方法(如基于名称匹配)。

  2. 更灵活的数据结构: 对于更复杂的场景,例如当向量名称本身包含有意义的信息,或者需要动态地选择配对时,可以考虑使用字典或Pandas DataFrame来存储数据。

    • 字典: 可以将每个向量存储在字典中,键为向量的名称。然后通过遍历键来获取配对。
      data_dict_hc = {'mcp': hc_mcp, 'pct': hc_pct, ...}
      data_dict_tw = {'mcp': tw_mcp, 'pct': tw_pct, ...}
      for key in data_dict_hc:
          res = wilcoxon(data_dict_hc[key], data_dict_tw[key])
          # ... 存储结果
    • Pandas DataFrame: 对于结构化数据,Pandas DataFrame提供了强大的数据管理和操作能力。可以将所有数据加载到一个DataFrame中,然后通过列名或分组进行操作。
  3. 结果的结构化存储: 除了简单地将P值和统计量存储在列表中,还可以考虑将结果存储为字典(键为配对名称,值为P值和统计量的元组/字典)、Pandas DataFrame(包含配对名称、P值、统计量等列)或自定义对象,以便于后续的分析、筛选和报告。这有助于提高结果的可读性和可追溯性。

  4. 通用性: 这种循环处理的模式不仅适用于Wilcoxon符号秩检验,也适用于其他需要对多组数据进行批量处理的统计测试,例如配对t检验(scipy.stats.ttest_rel)、Mann-Whitney U检验(scipy.stats.mannwhitneyu)等,只需替换 wilcoxon 函数即可。

  5. 统计假设的考量: 在应用任何统计检验之前,务必理解其背后的统计假设。Wilcoxon符号秩检验适用于配对样本,且不要求数据服从正态分布,但要求差异值对称分布。根据您的数据特性和研究问题选择合适的检验至关重要。

总结

通过将数据结构化并结合Python的循环机制,我们能够高效地自动化执行批量统计比较,极大地提升了数据分析的效率和代码的可维护性。这种方法是处理大规模重复性统计任务的强大工具,使研究人员能够将更多精力投入到结果的解释和科学发现中。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

80

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

32

2026.01.31

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

550

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

45

2026.01.06

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

67

2025.12.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

136

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

47

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号