Python 数学建模——Pearson/Spearman 相关系数

文章目录

前言

相关系数尝尝用来衡量两个数值变量之间是否存在某种关系 。我们常说的"正相关""负相关"就是这种相关关系。而相关系数的绝对值大小体现了相关关系的强弱。本文将介绍两种相关系数(Pearson 相关系数和 Spearman 相关系数)以及它们的 Python 求取。
区别 :Spearman 相关系数判定两个变量之间的趋势关系,即"同增同减"的趋势程度。相比而言,Pearson 相关系数判定两个变量之间的线性关系,囊括"趋势"的同时还衡量"线性关系"。

原理

Pearson 相关系数评估两个连续变量之间的线性关系,仅当 x , y x,y x,y 服从正态分布时该相关系数才具有一定意义。计算依据是:
ρ = C o v ( x , y ) σ x σ y = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 \rho=\frac{Cov(x,y)}{{{\sigma }{x}}{{\sigma }{y}}}=\frac{\sum_{i=1}^{n}{(}{{x}{i}}-\bar{x})({{y}{i}}-\bar{y})}{\sqrt{\sum_{i=1}^{n}{(}{{x}{i}}-\bar{x}{{)}^{2}}}\sqrt{\sum{i=1}^{n}{(}{{y}_{i}}-\bar{y}{{)}^{2}}}} ρ=σxσyCov(x,y)=∑i=1n(xi−xˉ)2 ∑i=1n(yi−yˉ)2 ∑i=1n(xi−xˉ)(yi−yˉ)

Spearman 相关系数是一种秩相关系数 ,又称等级相关系数,反映的是两个随机变量的的变化趋势方向和强度之间的关联,是将两个随机变量的样本值按数据的大小顺序排列位次,以各要素样本值的位次代替实际数据而求得的一种统计量。计算方式是:
r = C o v ( x , y ) σ x σ y = ∑ i = 1 n ( x ^ i − x ^ ˉ ) ( y ^ i − y ^ ˉ ) ∑ i = 1 n ( x ^ i − x ^ ˉ ) 2 ∑ i = 1 n ( y ^ i − y ^ ˉ ) 2 r=\frac{Cov(x,y)}{{{\sigma }{x}}{{\sigma }{y}}}=\frac{\sum_{i=1}^{n}{(}{{\hat x}{i}}-\bar{\hat x})({{\hat y}{i}}-\bar{\hat y})}{\sqrt{\sum_{i=1}^{n}{(}{{\hat x}{i}}-\bar{\hat x}{{)}^{2}}}\sqrt{\sum{i=1}^{n}{(}{{\hat y}_{i}}-\bar{\hat y}{{)}^{2}}}} r=σxσyCov(x,y)=∑i=1n(x^i−x^ˉ)2 ∑i=1n(y^i−y^ˉ)2 ∑i=1n(x^i−x^ˉ)(y^i−y^ˉ)

其中, x ^ i \hat x_i x^i 是 x i x_i xi 在 x x x 中从小到大的排名。例如 x = [ 1 , 1 , 4 , 5 , 1 , 4 ] x=[1,1,4,5,1,4] x=[1,1,4,5,1,4],则 x ^ = [ 1 , 1 , 2 , 3 , 1 , 2 ] \hat x=[1,1,2,3,1,2] x^=[1,1,2,3,1,2]。

参考文献:Pearson 相关方法和 Spearman 相关方法的比较 - Minitab

关于 p p p 值

在获取到相关系数 后,还需要看对应的 p p p 值。当 p p p 值异常时,相关系数 r r r(或者 ρ \rho ρ) 再大也不能认为两个变量具有明显的相关关系,因为相关系数大可能是偶然性引起的。

这个 p p p 值的含义是相关关系的不显著性水平 ,是基于假设检验方法计算出来的,接受"两变量之间不存在线性关联"这一假设的概率。通常取 0.05 0.05 0.05 为阈值,当 p < 0.05 p<0.05 p<0.05 时即可认为两个变量存在显著的线性关系。

Pearson 相关系数代码实例

这里直接放求相关系数矩阵的代码:

py 复制代码
import numpy as np
import pandas as pd

data = np.array([[1, 2, 3], [4, 5, 6],[11, 25, 346], [734, 48, 49]])

print(np.corrcoef(data)) # 返回一个浮点矩阵,好像没有 p 值

实际上,scipy.stats.pearsonr貌似也可以求 Pearson 相关系数,还能给出 p p p 值。感兴趣的读者可以试试看,使用方法和下文求取 Spearman 相关系数的代码实例类似。

Spearman 相关系数代码实例

求相关系数

两个维度的观测数据 x 1 , x 2 x_1,x_2 x1,x2 的相关系数求取:

py 复制代码
import numpy as np
from scipy import stats

X1 = [3, 5, 1, 6, 7, 2, 8, 9, 4]
X2 = [5, 3, 2, 6, 8, 1, 7, 9, 4]

corr, p_value = stats.spearmanr(X1,X2) # 返回两个浮点值
print(corr,p_value)

结果是corr = 0.9p_value = 0.0009430623223403293

求相关系数矩阵

如果是多个维度的观测数据 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,⋯,xn,其中每个维度的数据均有多个观测值 x i = [ x i 1 , x i 2 , ⋯   , x i m ] {x_i}=[{{x}{i1}},{{x}{i2}},\cdots ,{{x}_{im}}] xi=[xi1,xi2,⋯,xim],可以按照下面的用法得到两两之间的 Spearman 相关系数 r ( x i , x j ) r(x_i,x_j) r(xi,xj):

py 复制代码
import numpy as np
import pandas as pd
from scipy import stats

df = pd.DataFrame({
    '第一维': [1, 1, 4, 5, 1, 4],
    '第二维': [1, 9, 1, 9, 8, 1],
    '第三维': [1, 3, 1, 4, 0, 0]
})

corr_matrix, p_value_matrix = stats.spearmanr(df) # 返回两个浮点矩阵
print(corr_matrix, p_value_matrix)

结果如下所示,这里第二维与第三维之间的相关系数达到了0.63564173,但是 p p p 值为0.17494988,不认为他们之间具有显著相关性。

复制代码
[[1.         0.03333333 0.31782086]
 [0.03333333 1.         0.63564173]
 [0.31782086 0.63564173 1.        ]]

[[0.00000000e+00 9.50018519e-01 5.39320264e-01]
 [9.50018519e-01 0.00000000e+00 1.74949881e-01]
 [5.39320264e-01 1.74949881e-01 1.84889275e-32]]
相关推荐
冷雨夜中漫步9 分钟前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴30 分钟前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再32 分钟前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手2 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934732 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy2 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威4 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ4 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha4 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy4 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法