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

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

文章目录

    • 前言
    • 原理
    • 关于 p p p
    • 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(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

  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^ix^ˉ)2 i=1n(y^iy^ˉ)2 i=1n(x^ix^ˉ)(y^iy^ˉ)

  其中, 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 相关系数代码实例

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

import numpy as np
import pandas as pddata = 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 的相关系数求取:

import numpy as np
from scipy import statsX1 = [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)

import numpy as np
import pandas as pd
from scipy import statsdf = 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]]

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux高级
  • 磁光阱的原理与搭建操作
  • 海康威视相机在QTcreate上的使用教程
  • pycharm 安装对应python版本的pip
  • Linux C高级 day1
  • SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理
  • WPF动画
  • Vue学习记录之一(介绍及脚手架的使用)
  • spark学习笔记
  • 微信小程序页面制作——婚礼邀请函(含代码)
  • netstat和ss命令用法
  • 鹰眼降尘系统怎么样
  • SpringBoot 消息队列RabbitMQ使用延迟消息插件 接收延迟消息
  • 【MATLAB GUI 设计第一篇 】
  • JavaScript ES6特性(var let const、function=>、增强表达赋值、类与对象)
  • 收藏网友的 源程序下载网
  • 【5+】跨webview多页面 触发事件(二)
  • CSS中外联样式表代表的含义
  • JavaScript 一些 DOM 的知识点
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • maya建模与骨骼动画快速实现人工鱼
  • PHP变量
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SSH 免密登录
  • zookeeper系列(七)实战分布式命名服务
  • 分布式事物理论与实践
  • - 概述 - 《设计模式(极简c++版)》
  • 简析gRPC client 连接管理
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 驱动程序原理
  • 入口文件开始,分析Vue源码实现
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 追踪解析 FutureTask 源码
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ## 基础知识
  • #git 撤消对文件的更改
  • %check_box% in rails :coditions={:has_many , :through}
  • (1)(1.13) SiK无线电高级配置(六)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (转)德国人的记事本
  • (转)四层和七层负载均衡的区别
  • .net wcf memory gates checking failed
  • .py文件应该怎样打开?
  • /boot 内存空间不够
  • ?