数学建模:数据相关性分析(Pearson和 Spearman相关系数)含python实现

相关性分析是一种用于衡量两个或多个变量之间关系密切程度的方法。相关性分析通常用于探索变量之间的关系,以及预测一个变量如何随着另一个变量的变化而变化。在数学建模中,这是常用的数据分析手段。

相关性分析的结果通常用相关系数来表示,相关系数的取值范围为-1到1,其中1表示完全正相关,-1表示完全负相关,0表示没有相关性。

我们常用的相关系数包括:

  1. Pearson相关系数:用于衡量两个连续变量之间的线性关系。取值范围在 -1 到 1 之间,其中 -1 表示完全负相关,1 表示完全正相关,0 表示无线性关系。
  2. Spearman等级相关系数:用于衡量两个变量之间的单调关系,不要求变量呈线性关系。对于等级或顺序数据更为适用。

在使用相关系数时,我们需要注意:样本越大,相关系数估计越稳定;有些相关系数对数据分布的假设比较敏感,确保你的数据满足相关方法的前提条件;相关性不代表因果关系,即使两个变量相关,也不能得出一个是因为另一个的结论。那么,对于这两种相关系数,我们如何选择呢?

Pearson相关系数

Pearson相关系数是一种用于度量两个连续变量之间线性关系强度和方向的统计量。它通常用字母 τ \tau τ 表示,取值范围在 -1 到 1 之间。

计算皮尔逊相关性时,要了解它要符合5个假设:连续变量;两个变量之间存在一定线性关系;两个变量应该大致符合正态分布;数据集中每个观测数据包括成对数据;数据集中不应包括极端异常值数据。

公式为: τ = ∑ ( x i − x ‾ ) ( y i − y ‾ ) ∑ ( x i − x ‾ ) 2 ⋅ ∑ ( y i − y ‾ ) 2 \tau=\frac {\sum(x_i-\overline x)(y_i-\overline y)}{\sqrt{\sum(x_i-\overline x)^2\cdot\sum(y_i-\overline y)^2}} τ=∑(xi−x)2⋅∑(yi−y)2 ∑(xi−x)(yi−y)  其中, x i x_i xi 和 y i y_i yi分别是两个变量的观察值, x ‾ \overline x x 和 y ‾ \overline y y分别是两个变量的均值。

Pearson相关系数假设两个变量之间的关系是线性的,因此它可能不适用于非线性关系的情况。在数据中存在异常值或数据不符合正态分布的情况下,Pearson相关系数的解释力也可能受到影响。在这些情况下,Spearman等级相关系数可能更为适用,因为它们对于非线性关系和异常值更具有鲁棒性。

Spearman等级相关系数

Spearman等级相关系数(Spearman's rank correlation coefficient),通常用符号 ρ \rho ρ表示,是一种用于度量两个变量之间的单调关系(不一定是线性关系)的统计量。Spearman相关系数基于变量的等级或秩次而不是具体的数值。这使得它对于数据的分布形状和是否满足正态分布的要求都相对较为鲁棒。

计算Spearman等级相关系数的步骤:对于每个变量,将其观察值按照大小进行排名,即从最小到最大依次排列,并用秩次表示;对于每一对观察值,计算其等级差(即秩次差);计算等级差的平方和;使用公式将等级差的平方和转换为Spearman相关系数。

设 D i D_i Di为变量X和Y对应的秩次差,n为样本大小,Spearman相关系数的计算公式为: ρ = 1 − 6 ∑ D i 2 n ( n 2 − 1 ) \rho=1-\frac{6\sum D_i^2}{n(n^2-1)} ρ=1−n(n2−1)6∑Di2  Spearman相关系数的取值范围在 -1 到 1 之间:当 ρ=1 时,表示存在完全的正单调关系,即一个变量的增加伴随着另一个变量的增加;当 ρ=−1 时,表示存在完全的负单调关系,即一个变量的增加伴随着另一个变量的减少;当 ρ=0 时,表示两个变量之间没有单调关系。

Spearman相关系数对于非线性关系和异常值的敏感性相对较低,因此在数据不满足正态分布、存在异常值或者存在非线性关系的情况。

python代码实现

c 复制代码
import pandas as pd

# 示例数据
df = pd.DataFrame({'data1': [1, 2, 3, 4, 5], 'data2': [5, 4, 3, 2, 1]})

# 计算 Pearson 相关系数
pearson_corr = df['data1'].corr(df['data2'])

# 计算 Spearman 等级相关系数
spearman_corr = df['data1'].corr(df['data2'], method='spearman')

print("Pearson 相关系数:", pearson_corr)
print("Spearman 等级相关系数:", spearman_corr)

# Pearson 相关系数: -0.9999999999999999
# Spearman 等级相关系数: -0.9999999999999999

相关系数热力图:

相关推荐
重生之我在20年代敲代码28 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文29 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
waterHBO2 小时前
python 爬虫 selenium 笔记
爬虫·python·selenium
编程零零七3 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286114 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py4 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy4 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
AIAdvocate5 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼5 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
C-SDN花园GGbond5 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法