当前位置: 首页 > article >正文

手把手教你用Python计算斯皮尔曼相关系数:从手动推导到scipy一键调用

深入掌握Python中的斯皮尔曼相关系数从数学原理到实战应用在数据分析领域理解变量之间的关系是至关重要的。斯皮尔曼相关系数作为一种非参数统计量能够揭示数据间的单调关联而不仅仅是线性关系。本文将带你从基础概念出发通过Python代码实现最终掌握这一强大的分析工具。1. 理解斯皮尔曼相关系数的本质斯皮尔曼相关系数Spearmans rank correlation coefficient衡量的是两个变量之间单调关系的强度和方向。与皮尔逊相关系数不同它不要求数据满足正态分布假设也不局限于线性关系的检测。核心特点基于数据的排名而非原始值计算取值范围在-1到1之间对异常值具有较强的鲁棒性适用于定序尺度及以上级别的数据在实际应用中我们经常会遇到这样的场景两个变量之间的关系明显存在但不符合线性模式。例如用户满意度与产品价格的关系广告曝光次数与转化率的变化温度与空调能耗的关联这些情况下斯皮尔曼相关系数往往能比皮尔逊系数更准确地反映真实关系。2. 手动实现斯皮尔曼相关系数计算为了深入理解其计算原理我们先从纯Python实现开始。假设我们有以下两组数据X [56, 75, 45, 71, 62, 64, 58, 80, 76, 61] Y [66, 70, 40, 60, 65, 56, 59, 77, 67, 63]2.1 数据排名的处理计算斯皮尔曼系数的第一步是为每个数据点分配排名。当存在相同值时我们需要使用平均排名def rank_data(data): # 创建(value, original_index)元组列表 indexed [(value, i) for i, value in enumerate(data)] # 按值排序 sorted_data sorted(indexed, keylambda x: x[0]) # 初始化排名 ranks [0] * len(data) i 0 n len(sorted_data) while i n: # 查找相同值的范围 j i while j n and sorted_data[j][0] sorted_data[i][0]: j 1 # 计算平均排名 avg_rank (i 1 j) / 2 # 分配排名 for k in range(i, j): original_index sorted_data[k][1] ranks[original_index] avg_rank i j return ranks2.2 计算排名差和平方差获得排名后我们可以计算每对数据的排名差及其平方def calculate_spearman(X, Y): rank_X rank_data(X) rank_Y rank_data(Y) n len(X) if n ! len(Y): raise ValueError(X和Y的长度必须相同) # 计算排名差平方和 d_squared_sum sum((rx - ry)**2 for rx, ry in zip(rank_X, rank_Y)) # 应用斯皮尔曼公式 spearman 1 - (6 * d_squared_sum) / (n * (n**2 - 1)) return spearman2.3 处理实际数据示例让我们用前面的数据测试我们的实现X [56, 75, 45, 71, 62, 64, 58, 80, 76, 61] Y [66, 70, 40, 60, 65, 56, 59, 77, 67, 63] manual_spearman calculate_spearman(X, Y) print(f手动计算的斯皮尔曼相关系数: {manual_spearman:.4f})输出结果将显示约为0.6727表明两组数据之间存在中等强度的正相关关系。3. 使用SciPy进行高效计算虽然手动实现有助于理解原理但在实际工作中我们通常会使用成熟的科学计算库。SciPy提供了spearmanr函数可以一键计算斯皮尔曼相关系数及其p值。3.1 基本使用方法from scipy.stats import spearmanr # 计算斯皮尔曼相关系数和p值 corr, p_value spearmanr(X, Y) print(fSciPy计算的斯皮尔曼系数: {corr:.4f}) print(fP值: {p_value:.4f})3.2 理解输出结果spearmanr函数返回两个值相关系数范围在-1到1之间表示关系的强度和方向p值用于评估统计显著性注意p值小于0.05通常被认为具有统计显著性意味着我们有足够证据拒绝无相关性的零假设。3.3 处理多维数据SciPy的spearmanr还可以计算矩阵中所有变量两两之间的相关系数import numpy as np # 创建一个3变量的数据集 data np.array([ [56, 66, 72], [75, 70, 68], [45, 40, 55], [71, 60, 58], [62, 65, 63] ]) # 计算相关矩阵 corr_matrix, p_matrix spearmanr(data, axis0) print(斯皮尔曼相关矩阵:) print(corr_matrix)4. 实际应用案例分析4.1 时间序列数据分析斯皮尔曼相关系数在时间序列分析中特别有用因为它能捕捉到趋势关系而不受数据尺度的影响。import pandas as pd import matplotlib.pyplot as plt # 创建示例时间序列数据 dates pd.date_range(start2023-01-01, periods100) series1 np.cumsum(np.random.randn(100)) 10 series2 np.cumsum(np.random.randn(100)) 5 0.5 * np.arange(100) # 计算滚动相关性 window_size 20 rolling_corr pd.Series(series1).rolling(window_size).corr(pd.Series(series2), methodspearman) # 可视化 plt.figure(figsize(12, 6)) plt.plot(dates, series1, label系列1) plt.plot(dates, series2, label系列2) plt.plot(dates, rolling_corr, labelf{window_size}天滚动斯皮尔曼相关性) plt.legend() plt.title(时间序列数据及其滚动斯皮尔曼相关性) plt.show()4.2 特征相关性分析在机器学习特征工程中斯皮尔曼相关系数可以帮助我们识别与目标变量有单调关系的特征from sklearn.datasets import load_boston # 加载数据集 boston load_boston() X boston.data y boston.target feature_names boston.feature_names # 计算各特征与目标变量的斯皮尔曼相关系数 correlations [] for i in range(X.shape[1]): corr, _ spearmanr(X[:, i], y) correlations.append((feature_names[i], corr)) # 按绝对值排序 correlations.sort(keylambda x: abs(x[1]), reverseTrue) # 显示结果 print(特征与目标变量的斯皮尔曼相关系数:) for name, corr in correlations: print(f{name:10}: {corr:.4f})4.3 异常值影响对比为了展示斯皮尔曼相关系数对异常值的鲁棒性我们比较皮尔逊和斯皮尔曼系数在有/无异常值时的表现# 创建无异常值的数据 clean_X np.random.normal(50, 10, 100) clean_Y 2 * clean_X np.random.normal(0, 5, 100) # 添加异常值 outlier_X np.append(clean_X, [150, 160]) outlier_Y np.append(clean_Y, [-30, -40]) # 计算相关系数 pearson_clean np.corrcoef(clean_X, clean_Y)[0, 1] spearman_clean spearmanr(clean_X, clean_Y)[0] pearson_outlier np.corrcoef(outlier_X, outlier_Y)[0, 1] spearman_outlier spearmanr(outlier_X, outlier_Y)[0] # 结果对比 print(无异常值情况:) print(f皮尔逊系数: {pearson_clean:.4f}) print(f斯皮尔曼系数: {spearman_clean:.4f}) print(\n有异常值情况:) print(f皮尔逊系数: {pearson_outlier:.4f}) print(f斯皮尔曼系数: {spearman_outlier:.4f})5. 高级应用与注意事项5.1 处理大规模数据对于大型数据集我们可以使用更高效的计算方法def fast_spearman(X, Y): 适用于大数据集的近似计算方法 n len(X) rank_X pd.Series(X).rank() rank_Y pd.Series(Y).rank() # 使用皮尔逊公式计算排名相关性 return np.corrcoef(rank_X, rank_Y)[0, 1] # 生成大数据集 big_X np.random.uniform(0, 100, 1000000) big_Y np.log(big_X) np.random.normal(0, 0.5, 1000000) # 比较两种方法的结果和速度 %timeit spearmanr(big_X, big_Y) %timeit fast_spearman(big_X, big_Y)5.2 统计显著性检验理解p值的含义对于正确解释结果至关重要def interpret_spearman(corr, p_value, alpha0.05): 解释斯皮尔曼相关系数的统计显著性 strength 无 if abs(corr) 0.3 else \ 弱 if abs(corr) 0.5 else \ 中等 if abs(corr) 0.7 else 强 direction 正 if corr 0 else 负 significance 显著 if p_value alpha else 不显著 print(f发现{strength}的{direction}相关关系({corr:.3f})统计{significance}(p{p_value:.4f})) # 示例解释 corr, p_value spearmanr(X, Y) interpret_spearman(corr, p_value)5.3 常见误区与解决方案误区1认为高相关系数意味着因果关系解决方案始终记住相关性不等于因果性需要结合领域知识和其他分析方法误区2忽略数据的单调性假设解决方案先通过散点图直观检查数据关系模式误区3忽视重复值对排名的影响解决方案使用平均排名法正确处理重复值误区4在小样本情况下过度解读相关系数解决方案考虑置信区间或进行功效分析确定所需样本量def plot_data_relationship(X, Y): 可视化数据关系 plt.figure(figsize(10, 5)) plt.subplot(1, 2, 1) plt.scatter(X, Y) plt.title(原始数据散点图) plt.subplot(1, 2, 2) plt.scatter(pd.Series(X).rank(), pd.Series(Y).rank()) plt.title(排名数据散点图) plt.tight_layout() plt.show() plot_data_relationship(X, Y)

相关文章:

手把手教你用Python计算斯皮尔曼相关系数:从手动推导到scipy一键调用

深入掌握Python中的斯皮尔曼相关系数:从数学原理到实战应用 在数据分析领域,理解变量之间的关系是至关重要的。斯皮尔曼相关系数作为一种非参数统计量,能够揭示数据间的单调关联,而不仅仅是线性关系。本文将带你从基础概念出发&am…...

别再硬编码了!用注解+工厂模式,5分钟为你的Java应用扩展一个新PLC协议(ModbusTCP/S7为例)

工业物联网中Java协议扩展的优雅实践:注解驱动与工厂模式深度整合 工业物联网(IIoT)平台的开发者们经常面临一个棘手问题:如何在不重构核心代码的情况下,快速接入各种PLC设备协议?想象一下这样的场景:你的系统已经稳定…...

新手也能看懂!5分钟搞懂图像频谱图:用MATLAB的fft2和fftshift分析图片细节

图像频谱图解析:用MATLAB透视照片的隐藏密码 想象一下,如果每张照片都能像X光片一样被"透视",让我们看到它内部隐藏的结构特征,那会怎样?这就是图像频谱图的魔力所在。不同于我们日常看到的像素排列&#xf…...

别再只盯着虚短虚断!运放设计必须掌握的6个非理想参数(附MCP6N16实测数据)

运算放大器非理想特性实战指南:从理论到MCP6N16实测 在嵌入式系统设计中,运算放大器如同精密仪器中的齿轮,其微小偏差可能导致整个测量系统的崩溃。许多工程师在初期学习阶段被"虚短虚断"的理想模型所束缚,直到实际项目…...

Windows 11本地Ollama大模型部署实战指南

1. Windows 11本地部署Ollama大模型的前期准备 最近在折腾本地大模型部署,发现Ollama这个工具确实挺适合新手入门的。相比其他复杂的部署方案,Ollama在Windows平台上的安装过程简单明了,而且支持多种主流开源大模型。不过在实际操作中&#x…...

省钱方案:用NAT主机+Frpc实现高速内网穿透(避坑指南)

低成本内网穿透实战:NAT主机与Frpc的高效组合方案 引言:为什么选择NAT主机Frpc方案? 对于需要远程访问家庭NAS、搭建私有云盘或部署开发测试环境的用户来说,内网穿透是刚需。传统方案要么成本高昂(独立IP服务器&#x…...

OpenModScan:免费开源的Modbus调试工具完整指南

OpenModScan:免费开源的Modbus调试工具完整指南 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan 在工业自动化领域,Modbus通讯协议的调试和测试是…...

5步精通Trilium中文版:构建高效个人知识管理系统

5步精通Trilium中文版:构建高效个人知识管理系统 【免费下载链接】trilium-translation Translation for Trilium Notes. Trilium Notes 中文适配, 体验优化 项目地址: https://gitcode.com/gh_mirrors/tr/trilium-translation 认识Trilium:重新定…...

我试了opencli,3秒拿到知乎热榜——手把手教你把200+网站变成命令行

前言: 坦白说,我第一次看到opencli的时候,心想:"又一个给程序员用的 命令行工具 ,跟我没关系。" 然后我随手试了一条命令—— opencli bilibili hot 3秒钟,B站条直接出现在我眼前。标题、热度、排名,整整齐齐。 那一刻我意识到 这玩意儿不是给程序员用的,是…...

告别发热!用TPS54360改造你的LM317线性电源(效率提升300%)

告别发热!用TPS54360改造你的LM317线性电源(效率提升300%) 在电子设计领域,线性稳压电源因其简单可靠而广受欢迎,但效率低下导致的发热问题始终困扰着工程师们。以LM317为代表的经典线性稳压器,在输入输出电…...

利用Cosmos-Reason1-7B进行Java面试题智能解析与答案生成

利用Cosmos-Reason1-7B进行Java面试题智能解析与答案生成 最近在帮朋友准备Java面试,发现一个挺普遍的问题:网上的面试题答案要么太零散,要么太浅显,很难找到一个能讲透原理、还能分析源码的深度解析。自己整理吧,费时…...

3个维度玩转League-Toolkit:从入门到精通的实战指南

3个维度玩转League-Toolkit:从入门到精通的实战指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是…...

从噪音到宁静:5种高级风扇控制策略深度解析

从噪音到宁静:5种高级风扇控制策略深度解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanContro…...

《AI Money Hunter:智能财务侦探,你的理财新助手》

《AI Money Hunter:智能财务侦探,你的理财新助手》 【免费下载链接】aimoneyhunter ai副业赚钱大集合,教你如何利用ai做一些副业项目,赚取更多额外收益。The Ultimate Guide to Making Money with AI Side Hustles: Learn how to …...

旧Mac如何重获新生?开源工具实现系统升级完整指南

旧Mac如何重获新生?开源工具实现系统升级完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着苹果不断推出新的macOS版本,许多…...

全球首届具身智能开发者大会深圳落幕,真机实战引领产业跃迁,重新定义具身智能新坐标

3月30日,由深圳市人工智能产业办公室指导,自变量机器人、深圳市人工智能行业协会与广东省具身智能训练场联合主办的全球首届具身智能开发者大会(Embodied AI Developers Conference,简称EAIDC 2026)暨「具亮计划」黑客…...

Java记录模式安全边界警告:3类不可序列化场景、2种反编译泄露风险(Oracle安全白皮书节选)

第一章:Java记录模式安全边界警告:3类不可序列化场景、2种反编译泄露风险(Oracle安全白皮书节选)不可序列化的三类典型场景 Java记录(Record)类型在设计上强调不可变性与透明性,但其默认序列化行…...

Redis持久化:从AOF到RDB,如何实现数据不丢失?

Redis属于内存数据库,但为了防止宕机等导致的数据丢失,也有对应的数据持久化技术。持久化主要作用就是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。 AOF持久化 Append Only File 类似于Mysql的binlog日志类似&…...

springboot+vue基于web的社区养老服务系统的设计系统

目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析服务预约模块社区互动模块后台管理模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户…...

轻量级跨平台桌面应用开发:Tauri零门槛实战指南

轻量级跨平台桌面应用开发:Tauri零门槛实战指南 【免费下载链接】tauri Build smaller, faster, and more secure desktop and mobile applications with a web frontend. 项目地址: https://gitcode.com/GitHub_Trending/ta/tauri 在桌面应用开发领域&#…...

Claude Code性能优化实战:如何让AI编程助手在大型项目中飞起来

Claude Code性能优化实战:如何让AI编程助手在大型项目中飞起来 大型代码库就像一座迷宫,而Claude Code则是你手中的智能地图。但当项目规模膨胀到数十万行代码时,这张地图的加载速度可能会让你抓狂。本文将分享一系列经过实战验证的性能优化技…...

B站视频下载神器:3分钟学会用BilibiliDown轻松保存喜欢的视频

B站视频下载神器:3分钟学会用BilibiliDown轻松保存喜欢的视频 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mi…...

Windows资源管理器HEIC缩略图:让iPhone照片在Windows上“活“起来

Windows资源管理器HEIC缩略图:让iPhone照片在Windows上"活"起来 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails …...

终极指南:深度解锁联想拯救者Y7000系列Insyde BIOS隐藏选项

终极指南:深度解锁联想拯救者Y7000系列Insyde BIOS隐藏选项 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具,例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirr…...

vector常见接口的模拟实现

因为vector的很多接口与string的用法差不多,而我已经写过string常见接口的用法了,所以我这里只会简短的介绍一下vector和string某些接口的不同之处以及实现所有的常见接口。 vector的所有接口:接口 一.了解vector vector就是顺序表&#x…...

3步掌握KillWxapkg:微信小程序逆向工程全流程解析

3步掌握KillWxapkg:微信小程序逆向工程全流程解析 【免费下载链接】KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持Hook&#x…...

Node.js——util工具模块

util工具模块1、util模块概述2、util模块的使用2.1、格式化输出字符串2.2、将对象转换为字符串(调试)2.3、实现对象间的原型继承2.4、转换异步函数的风格2.5、判断是否为指定类型的内置对象2.6、其它方法1、util模块概述 util模块是Node.js的内置模块&a…...

Spring Cloud集成Nacos配置中心常见问题解析

1. Spring Cloud集成Nacos配置中心常见问题解析 在微服务架构中,配置中心是必不可少的基础组件。Nacos作为阿里巴巴开源的一款集服务发现、配置管理于一体的中间件,凭借其轻量级、高可用等特性,已经成为Spring Cloud生态中配置中心的热门选择…...

Android Framework开发工程师深度解析与技术指南

引言 在移动智能设备普及的今天,Android系统作为全球主流的操作系统,其Framework层开发是支撑整个生态的核心。Android Framework开发工程师负责系统架构设计、深度定制与兼容性优化,确保设备高效运行。本文将基于职位描述的核心要素,系统解析Android Framework开发的技术…...

Cursor 2.2的Visual Editor实战:如何像改Figma一样,5分钟重构一个Vue/React页面布局

Cursor 2.2的Visual Editor实战:如何像改Figma一样,5分钟重构一个Vue/React页面布局 重构老旧前端页面就像给老房子翻新——既要保留主体结构,又要让外观焕然一新。传统方式下,我们不得不在代码编辑器与浏览器之间反复切换&#x…...