斯皮尔曼相关(Spearman correlation)系数概述及其计算例

article/2025/9/20 13:09:25

目录

1. 什么是秩相关系数?

2. 单调性,monotonicity

3. 斯皮尔曼秩相关系数

4. 什么时候使用斯皮尔曼秩相关系数呢?

5. 斯皮尔曼秩相关系数计算公式

6. 斯皮尔曼秩相关系数计算例

6.1 手动计算

6.2 scipy函数

6.3 pandas corr() 

6.4 简易计算公式能够体现负相关系数?


1. 什么是秩相关系数?

        秩相关系数Coefficient of Rank Correlation),又称等级相关系数,反映的是两个随机变量的的变化趋势方向和强度之间的关联,是将两个随机变量的样本值按数据的大小顺序排列位次,以各要素样本值的位次代替实际数据而求得的一种统计量它是反映等级相关程度的统计分析指标,常用的等级相关分析方法有Spearman相关系数Kendall秩相关系数等。主要用于数据分析。斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数。关于皮尔逊相关系数介绍和计算示例请参考:皮尔逊相关(Pearson correlation)系数概述及其计算例https://chenxiaoyuan.blog.csdn.net/article/details/121576303

        另一种秩相关系数是肯德尔相关系数,可以参考:

肯德尔(Kendall)相关系数概述及计算例https://chenxiaoyuan.blog.csdn.net/article/details/126919019

        这里的秩是啥意思呢?我第一次看到这个词的时候第一感是它跟矩阵的秩(Rank)有啥关系,没有关系。这里是秩序的秩,或者说排名、顺序、等级的意思(写成ranked或者ranking的话就不容易误解了)。

        考虑两个随机变量XY,如果秩相关系数为正,则随着X的增加而增加;如果秩相关系数为负,则Y随着X的增加而减小;如果秩相关系数为0,则表示随着Y的增减变化跟X的增减变化没啥关系。当YX越来越接近严格单调的函数关系时,秩相关系数在数值上就越来越大。当秩相关系数为1或者-1时,就表明Y随着X的增加而严格单调增加或单调减小。

        在实际应用中,有时获得的原始资料没有具体的数据表现,只能用等级来描述某种现象,要分析现象之间的相关关系,就只能用秩相关系数。

2. 单调性,monotonicity

        为了理解斯皮尔曼相关系数,首先需要了解什么是单调性和单调函数。一个单调函数是指随着它的自变量(independent variable)增大,函数值(因变量)要么总是增大(单调递增)要么总是变小(单调递减),而不会有时变大、有时变小(不是单调函数)。

        如上图所示,左图代表的是一个单调递增函数,中间图代表的是一个单调递减函数,而右边的图所代表的函数则不是单调函数。 

3. 斯皮尔曼秩相关系数

        斯皮尔曼秩相关系数(The Spearman’s rank coefficient of correlation),简称斯皮尔曼相关系数,是秩相关(rank correlation)的一种非参数度量(nonparametric measure)。得名于英国统计学家Charles Spearman,通常记为希腊字母‘ρ’ (rho)( often called Spearman's rho)或者

        在讨论斯皮尔曼相关系数之前,首先要理解皮尔逊相关(Pearson’s correlation),斯皮尔曼相关可以看作是皮尔逊相关的非参数版本(nonparametric version)。皮尔逊相关是关于两个随机变量之间的线性关系强度的统计度量(statistical measure),而斯皮尔曼相关考察的是两者单调关系(monotonic relationship)的强度,通俗地说就是两者在变大或变小的趋势上多大程度上保持步调一致,哪怕没有保持比例关系。计算皮尔逊相关系数时使用的是数据样本值本身,而计算斯皮尔曼相关系数使用的是数据样本排位位次值(有时候数据本身就是位次值,有时候数据本身不是位次值,则在计算斯皮尔曼相关系数之前要先计算位次值)。

        这里"非参数"有两层含义。首先,当X和Y的关系是由任意单调函数描述的,则它们是完全皮尔逊相关的。与此相应的,皮尔逊相关系数只能给出由线性方程描述的X和Y的相关性。其次,斯皮尔曼不需要先验知识(也就是说,除了数据本身不需要知道其它参数,比如说关于数据的分布的先验信息)便可以准确获取X和Y的采样概率分布之间的相关性。

4. 什么时候使用斯皮尔曼秩相关系数呢?

        能够适用皮尔逊相关的场合当然是优先使用皮尔逊相关,但是在有些场合,皮尔逊相关所需要的前提假设不能得到满足,这是就可以考虑使用斯皮尔曼相关,比如说以下一些情况下:

  1. 如果你的数据展现的是非线性关系,或者不是正态分布的。
  2. 如果至少有一方数据是序数类型(ordinal)而非数值类型。比如说,如果数据的赋值为"第一、第二、第三、... "你就是在处理序数类型数据。更具具体一点的例子就是,比如说你考察两个球队在历年联赛中的战绩之间的关系,那么你得到的数据可能是这样的:A队在2010~2020年间的联赛排名为{1,2,4,5,...,2}, B队在2010~2020年间的联赛排名为{2,1,3,6,...,4}。这两个数据就是序数类型的数据,考察它们的相关性你使用皮尔逊相关系数就不妥当
  3. 如果数据中有明显的异常值(outliers)。与皮尔逊相关不同,斯皮尔曼相关对于异常值不太敏感,因为它基于排序位次进行计算,实际数值之间的差异大小对于计算结果没有直接影响

比如说,你可以利用斯皮尔曼相关来寻找针对以下一些问题的答案:

  1. 受教育水平更高的人更关心环境吗?
  2. 患者的症状数与他们服药的意愿有关系吗?
  3. 球队的联赛成绩(名次)与他们所在城市的经济发展水平有关系吗?

5. 斯皮尔曼秩相关系数计算公式

      全版本的计算公式:

        其中:

  • R(x) 和 R(y) 分别是x和y的位次
  •  和  分别表示平均位次

       更简单易行的计算公式如下所示:

        其中:

  • d_i 表示第i个数据对的位次值之差
  • n 总的观测样本数

6. 斯皮尔曼秩相关系数计算例

        在很多软件工具或者工具库里都有各种相关系数的计算。在以下Ref1中介绍了在Excel中如何计算斯皮尔曼相关系数,有兴趣的小伙伴可以参考。

6.1 手动计算

        在Ref2中给出了一个手动计算例(最低限度的手动计算对于掌握一个新的概念是绝对必要的,手动计算能帮助更加深刻地理解本质),如下表所示:

        这是9个学生的历史和地理的成绩和排名,每一行从左到右分别历史科目的分数、历史成绩中的排名、地理科目的分数、地理成绩中的排名,排名位次之差、排名位次的平方。由于数据中没有位次相同的数据,所以可以用简单版本的公式进行计算,如下所示: 

         这个结果意味着这9个学生历史成绩排名和地理成绩呈现出很强的单调关系,即历史成绩好非常大概率地理成绩也非常好,反之依然。其实目测上表也基本上可以得出这个印象。只不过斯皮尔曼相关系数把这种印象进行精确的量化。

6.2 scipy函数

        以下介绍scipy中计算斯皮尔曼相关系数的函数scipy.stats.spearmanr的使用例。

        scipy.stats.spearmanr(ab=Noneaxis=0nan_policy='propagate'alternative='two-sided')

        函数调用接口请参阅scipy文档,这里只介绍一些要点。

        该函数返回的结果除了相关系数外,还包含一个p值,大致来说就是表示由完全不相关系统所生成的数据能够计算得出跟当前待测数据对所计算结果相当的斯皮尔曼相关系数的概率有多大。P值不是完全可靠的,但是对于大于500的数据集其估计结果基本还是合理的。

        计算例1:调用scipy函数计算以上数据的斯皮尔曼相关系数。

import numpy as np
from scipy import statsstats.spearmanr([3,5,1,6,7,2,8,9,4], [5,3,2,6,8,1,7,9,4])

        结果:SpearmanrResult(correlation=0.9, pvalue=0.0009430623223403293)

        得到了跟手动计算相同的结果,安心ing^-^。

        另外p-value仅为0.0009,这说明历史成绩和地理成绩几乎不可能是不相关,反过来说就是它们是非常相关的。

        计算例2:两个随机数序列的斯皮尔曼相关系数

rng = np.random.default_rng()
x2n = rng.standard_normal((100, 2))
stats.spearmanr(x2n)

         结果:SpearmanrResult(correlation=-0.00876087608760876, pvalue=0.931061841564777)

        嗯,相关度极低。。。诚不欺我^-^

6.3 pandas corr() 

        Pandas也提供了计算斯皮尔曼相关系数的函数,事实上是提供了一个通用的相关系数计算函数接口,通过method参数可以指定是需要计算那种相关系数。如下例所示:

import pandas as pd
import numpy as np
X=pd.Series([3,5,1,6,7,2,8,9,4])
Y=pd.Series([5,3,2,6,8,1,7,9,4])
rho = X.corr(Y,method='spearman')
print(rho)

        同样得到结果为0.9,只不过没有像scipy函数那样提供一个p-value。

6.4 简易计算公式能够体现负相关系数?

        根据一个读者的提问,追加了本节计算例。

import numpy as np
from scipy import statsx = [3,5,1,6,7,2,8,9,4]
y = [5,3,2,6,8,1,7,9,4]def simpleSpearman(x,y)-> float:"""Assuming np array as input"""d = x - yn = len(x)rho = 1 - 6 * np.sum(np.square(d))/n/(n**2-1)return rho
x0 = np.array(x)
y0 = np.array(y)
print(simpleSpearman(x0,y0))
print(stats.spearmanr(x,y ))# 颠倒x中的排序
x = [3,5,1,6,7,2,8,9,4]
x = [(len(x)+1) - x[k] for k in range(len(x))] # Reverse the x ranking
y = [5,3,2,6,8,1,7,9,4]
print(stats.spearmanr(x,y ))
x0 = np.array(x)
y0 = np.array(y)
print(simpleSpearman(x0,y0))

        运行以上代码可以发现,将x中的排序值颠倒以后,计算所得的相关系数也变成的负的了。也就是说,简易计算公式中虽然取得是每对秩的差值的平方,但是并不妨碍它能反映相关的方向(相关系数的正负) 。

        关于皮尔逊相关系数介绍和计算示例有兴趣的话可以参考:

皮尔逊相关(Pearson correlation)系数概述及其计算例https://chenxiaoyuan.blog.csdn.net/article/details/121576303

[Reference]

[1] https://www.ablebits.com/office-addins-blog/2019/01/30/spearman-rank-correlation-excel/

[2] Spearman correlation coefficient: Definition, Formula and Calculation with Example | QuestionPro

[3] https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html


http://chatgpt.dhexx.cn/article/KSlKAlDn.shtml

相关文章

一文数学数模-相关性分析(二)斯皮尔曼相关(spearman)相关性分析一文详解+python实例代码

前言 相关性分析算是很多算法以及建模的基础知识之一了,十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性系数就有三种:person相关系数,spearman相关系数,Kendalls tau-b等级相关系数。各有各自的用法和使用场景。当然关于这以…

斯皮尔曼(spearman)相关系数python代码实现

简介 斯皮尔曼等级相关系数(简称等级相关系数,或称秩相关系数,英语:Spearmans rank correlation coefficient或Spearmans ρ)。一般用或者表示。它是衡量两个变量的相关性的无母数指标。它利用单调函数评价两个统计变量…

数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)

文章目录 引述一、斯皮尔曼相关系数(spearman)1.定义12.定义23.使用MATLAB计算spearman相关系数4. 斯皮尔曼相关系数的假设检验 二、斯皮尔曼相关系数与皮尔逊相关系数的比较 引述 经过之前几节的学习,我们了解并掌握了皮尔逊相关系数。在学…

Spearman相关系数的含义及适用场景

斯皮尔曼相关系数计算工具: https://geographyfieldwork.com/SpearmansRankCalculator.html斯皮尔曼相关系数的解释:https://statisticsbyjim.com/basics/spearmans-correlation/ 统计中,斯皮尔曼相关系数是皮尔逊相关系数的非参数替代方法。对遵循曲线、…

SPSS——相关分析——Spearman秩相关系数

简介 斯皮尔曼等级相关(Spearman’s correlation coefficient for ranked data)主要用于解决称名数据和顺序数据相关的问题。适用于两列变量,而且具有等级变量性质具有线性关系的资料。由英国心理学家、统计学家斯皮尔曼根据积差相关的概念推…

ML之Spearman:Spearman相关系数(斯皮尔曼等级相关系数)的简介、案例应用之详细攻略

ML之Spearman:Spearman相关系数(斯皮尔曼等级相关系数)的简介、案例应用之详细攻略 目录 Spearman相关系数(斯皮尔曼等级相关系数)的简介 (1)、Spearman相关系数(斯皮尔曼等级相关系数)的计算逻辑 Spearman相关系数(斯皮尔曼等级相关系数)的的案例应用 Spearman相…

斯皮尔曼spearman相关系数

斯皮尔曼spearman相关系数 斯皮尔曼相关系数定义: X和Y为两组数据,其斯皮尔曼(等级)相关系数: r s 1 − 6 ∑ i 1 n d i 2 n ( n 2 − 1 ) r_s1-\frac{6\sum\limits_{i1}^nd_i^2}{n(n^2-1)} rs​1−n(n2−1)6i1∑n​di2​​ …

数据库知识及数据库编程

数据库的概念 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数…

数据库编程与设计—SQL语言

一、SQL语言基础 1 什么是SQL 结构化查询语言结构化查询语言(Structured Query Language)简称 SQL(发音:sequal[si:kwəl]),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本…

JDBC --- Java的数据库编程

目录 🍈一、数据库编程的必备条件 🍉二、什么是 JDBC JDBC 的优势 🍊三、JDBC 使用流程 以及 常用接口和类的讲解 🍡0. 前置工作 🍭1. 引入依赖 🍬2. 数据库连接Connection 🍬3. 创建操…

数据库—mysql、数据库编程(API)

1. Linux平台准备 &#xff08;1&#xff09;安装SDK开发包的命令 sudo apt-get install libmysqlclient-dev &#xff08;2&#xff09;编译时需要链接的库:-lmysqlclient 2. mysql 的初始化和清理 #include <mysql/mysql.h> MYSQL mysql1; //创建句柄 mysql_init(&…

8.数据库编程

一、思维导图 二、基础梳理 1.游标的使用步骤 ① 声明游标。 用DECLARE语句为一条SELECT语句定义游标 EXEC SQL DECLARE<游标名> CURSOR FOR <SELECT语句>;使用T-SQL语句生成一个结果集&#xff0c;并且定义游标的特征&#xff0c;如游标中的记录是否可以修改。…

数据库编程----Mysql简介

数据库编程----Mysql简介 文章目录 一、什么是Mysql二、Mysq的l特点三、总结 一、什么是Mysql Mysql是一个关系型数据库管理系统二、Mysq的l特点 三、总结 Mysql是一个关系型的数据管理系统

6.数据库编程

PL-SQL编程 1.PL/SQL的特点 PL(Procedure Language)/SQL&#xff09;是Oracle在数据库中引入的一种过程化的编程语言。 PL/SQL是对SQL的扩充&#xff1a;具有为程序开发而设计的特性&#xff1b; 在PL/SQL 中可以使用变量&#xff0c;进行流程控制&#xff0c;来实现比较复杂…

编程语言与数据库

从新近的TIOBE编程语言排名可看到&#xff0c;Java、C依然稳定地在最受欢迎前列。 因具备图灵完备性&#xff0c;2018年才重新被纳入清单的SQL语言已快速出现在第9位置&#xff08;7月&#xff09;——这似乎意味着&#xff0c;传统的RDBMS(关系数据库系统)仍然是应用的主流&am…

java数据库编程入门

一、JDBC概述 1、JDBC是Java数据库连接技术的简称&#xff0c;提供连接各种常用数据库的能力。 2、JDBC模型 JAVA程序一般通过调用JDBC所定义的类和接口来处理数据库中的数据&#xff0c;也就是通过调用JDBC的驱动程序实现对数据库的操作。 3、JDBC操作数据库过程 基于JDBC…

Python之数据库编程

目录 一、MySQL数据库的使用 数据库相关操作 二、数据库增删改查 增加 修改 删除 三、数据库标准写法 一、MySQL数据库的使用 建表 CREATE TABLE py_student( id INTEGER primary key auto_increment, name INTEGER not null, gender varchar(11) default 男 , birthday d…

Java-数据库编程技术(MySQL)

初识MySQL 数据库简介 什么是数据库 数据库&#xff08;Database&#xff0c;DB&#xff09;就是存放数据的仓库&#xff0c;为了实现一定目的&#xff0c;按照某种规则组织起来的数据的集合。当然数据有多种形式&#xff0c;如文字、数码、符号、图形、声音等。从广义的角度…

【数据库系统】数据库编程

嵌入式SQL的处理过程&#xff1a; 嵌入式SQL是将SQL语句嵌入程序设计语言中&#xff0c;被嵌入的设计语言为主语言。 当主语言为C语言时&#xff0c;语法格式为&#xff1a; EXEC SQL <SQL语句> 嵌入式SQL语句与主语言之间的通信&#xff1a; 将SQL嵌入到高级语言中混…

数据库应用(mysql)数据库编程

第1关&#xff1a;创建存储过程1 任务描述 本关任务&#xff1a; 1.新建一个没有参数的存储过程p1&#xff0c;显示product表中所有数据。 2.调用p1。 USE petstore; create procedure p1() #新建一个没有参数的存储过程 select * from product; call p1(); …