当前位置:首页>python>Python代码 | 方差膨胀因子VIF+斯皮尔曼Spearman相关性分析

Python代码 | 方差膨胀因子VIF+斯皮尔曼Spearman相关性分析

  • 2026-10-11 08:42:29
Python代码 | 方差膨胀因子VIF+斯皮尔曼Spearman相关性分析

各位科研小伙伴们,大家好。今天我将和大家一起探讨一下方差膨胀因子VIF+斯皮尔曼Spearman相关性分析。今天分享的这段代码的主要功能是:读取Excel 中的多指标数据,计算各指标之间的 Spearman 相关性、显著性水平以及 VIF 方差膨胀因子,并最终绘制一张适合论文使用的综合分析图。这张图同时包含Spearman 相关性热力图、显著性气泡图和 VIF 棒棒糖图。

主要解决的是一个常见的数据分析问题:当我们有很多指标时,如何判断这些指标之间是否相关?相关关系是否显著?以及这些指标之间是否存在严重的共线性?

      比如,在生态环境研究中,我们可能会有温度、降水、植被覆盖度、土壤水分、碳通量等多个指标;在城市研究中,我们可能会有建设用地面积、人口密度、夜间灯光、GDP、绿地率等多个指标。面对这些变量,我们需要先弄清楚它们之间的关系。这段代码就是用来完成这个工作的。

它的输入文件是一个 Excel 表格,默认名称是:“示范数据.xlsx”。小伙伴们可自行输入其他名称。

这个 Excel 表格有一个特殊要求:第一行是指标分组,第二行是具体指标名称,第三行开始才是数据。

例如,第一行可以是“气候因子”“土地利用”“社会经济”等维度数据,第二行可以是“温度”“降水”“建设用地面积”“GDP”等具体指标。代码运行之后,会输出四个结果文件:

运行结果.png

运行结果.pdf

相关性矩阵输出结果.xlsx

VIF值输出结果.xlsx

其中,PNG 图片适合放进 Word 或 PPT,PDF 是矢量图,更适合论文投稿或期刊排版。两个 Excel 文件则分别保存相关性矩阵和 VIF 数值。

完整代码获取:回复“ VIF斯皮尔曼 ”即可获得通道

第一部分:计算 Spearman 相关性

      Spearman 相关性主要用于衡量两个变量之间是否存在单调变化关系。与 Pearson 相关系数相比,Spearman 相关性并不要求两个变量之间必须呈严格的线性关系,也不要求数据完全符合正态分布,因此更适合用于生态环境、土地利用、社会经济等复杂多指标数据分析。
      在实际解释中,Spearman 相关系数的取值范围为 -1 到 1。当相关系数大于 0 时,说明两个变量之间呈正相关,即一个变量增加时,另一个变量总体上也倾向于增加;当相关系数小于 0 时,说明两个变量之间呈负相关,即一个变量增加时,另一个变量总体上倾向于减少;当相关系数接近 0 时,则说明二者之间的相关关系较弱。
      例如,如果某一环境因子与植被指数之间的 Spearman 相关系数为 0.75,则可以说明二者之间存在较强的正相关关系;如果某一城市化指标与生态质量指数之间的相关系数为 -0.68,则可以说明二者之间存在较明显的负相关关系。

第二部分:计算  P 值和显著性星号

      不过,相关系数本身只能说明变量之间关系的方向和强弱,并不能直接说明这种关系是否可靠。因此,代码进一步计算了 P 值,用于判断相关关系是否具有统计学意义。通俗地说,P 值可以理解为:如果两个变量实际上并不存在真实相关关系,那么在当前样本中观察到这种相关结果的可能性有多大。P 值越小,说明当前相关结果越不可能只是由随机波动造成,相关关系也就越具有统计意义。为了使图表更加直观,代码没有直接在图中显示所有 P 值,而是使用显著性星号进行标注。
* 表示 P < 0.05,说明相关关系在 0.05 水平上显著;
** 表示 P < 0.01,说明相关关系在 0.01 水平上显著;
*** 表示 P < 0.001,说明相关关系具有更强的统计显著性。
如果某两个变量之间没有星号,则说明二者虽然可能存在一定相关系数,但未通过显著性检验,在解释时应更加谨慎。

第三部分:计算VIF 方差膨胀因子

      VIF 方差膨胀因子,用于判断变量之间是否存在多重共线性。多重共线性是指多个解释变量之间存在较高相关性,导致它们所包含的信息高度重复。例如,在城市化研究中,GDP、人口密度、夜间灯光强度和建设用地面积可能都在一定程度上反映区域发展水平,如果这些变量同时进入回归模型,就可能导致模型难以区分到底是哪一个变量真正发挥作用。VIF 值越高,说明该变量越容易被其他变量解释,也就意味着该变量与其他变量之间的信息重叠程度越高。一般而言,当 VIF 小于 5 时,说明共线性问题相对较弱;当 VIF 介于 5 和 10 之间时,说明变量之间存在一定共线性,需要在后续建模中加以关注;当 VIF 大于或等于 10 时,通常认为该变量可能存在较严重的多重共线性问题,需要考虑是否进行变量筛选、合并或降维处理。

第四部分:图表组成

01

中间相关性矩阵

      中间矩阵右上角显示的是各指标之间的 Spearman 相关系数。颜色越红,说明两个指标之间正相关越强;颜色越蓝,说明两个指标之间负相关越强;颜色接近白色,说明相关性较弱或接近无相关。
例图解读:
      从图中可以看出,城市交通类指标之间存在明显相关性。例如,Railway 与 Motorway 的相关系数达到 0.94,说明铁路和高速公路指标之间高度正相关,二者可能都反映了区域交通基础设施水平。Railway、Motorway 与 US 也呈中等正相关,相关系数均约为 0.52,说明交通设施较发达的区域,城市建设或城市化相关指标也相对较高。
      Society 组内部的相关性非常强。PD、GDP、RLD 和 NL 之间均表现出高度正相关,例如 PD 与 GDP 的相关系数为 0.90,PD 与 RLD、NL 的相关系数均为 0.92,RLD 与 NL 的相关系数达到 0.93。这说明人口密度、经济水平、道路密度和夜间灯光之间具有很强的一致性,它们可能共同反映了区域社会经济发展水平或城市化强度。
       生态组内部也存在几组非常强的相关关系。例如,NDVI 与 AAP 的相关系数为 0.95,说明二者高度正相关;PM2.5 与 CO2 的相关系数也为 0.95,说明空气污染或排放相关指标之间具有高度一致性;DEM 与 Slope 的相关系数同样达到 0.95,说明海拔和坡度在研究区内可能具有明显的空间耦合关系。

      从跨组关系来看,Society 组中的 PD、GDP、RLD、NL 与 NDVI、AAP 大多呈负相关,相关系数大约在 -0.36 到 -0.48 之间。这说明社会经济和城市化水平较高的区域,植被或生态相关指标往往较低。与此同时,PD、GDP、RLD、NL 与 PM2.5、CO2 多呈正相关,相关系数大约在 0.44 到 0.47 左右,说明社会经济活动强度较高的区域,污染或排放水平也相对较高。

       EC 与 NDVI、AAP 呈中等正相关,相关系数均为 0.42,说明 EC 指标可能与生态质量或植被状况有一定一致性;但 EC 与 PM2.5、CO2 分别呈 -0.27 和 -0.26 的负相关,说明 EC 较高的区域可能污染或排放水平相对较低。

02

左下角显著性气泡

      矩阵左下角的气泡与右上角的相关系数是一一对应的,但它用更加直观的方式展示相关性强弱和显著性。气泡的大小代表相关系数绝对值大小。气泡越大,说明两个指标之间的相关性越强;气泡越小,说明相关性越弱。气泡颜色仍然表示相关方向,红色表示正相关,蓝色表示负相关。

例图解读:

      从左下角气泡可以看出,Railway 与 Motorway、PD 与 GDP/RLD/NL、GDP 与RLD/NL、RLD 与 NL、NDVI 与 AAP、PM2.5 与 CO2、DEM 与 Slope 等关系不仅相关系数高,而且基本都达到 *** 显著水平,说明这些强相关关系具有较高统计可靠性。同时,Society 组与部分 Ecology 指标之间的负相关也具有较强显著性。例如 PD、GDP、RLD、NL 与 NDVI、AAP、EC 之间出现了较多蓝色显著气泡,说明城市化或社会经济发展强度与部分生态指标之间存在显著负相关关系。不过,也有一些变量之间相关系数接近 0,气泡很小甚至没有明显星号,例如 CNBH 与多数变量、DEM 与 PM2.5/CO2、Slope 与多数社会经济指标之间的关系较弱,说明这些指标之间没有明显的单调相关关系。

03

左侧分组大括号

      左边的大括号是根据 Excel 第一行的分组信息自动生成的。将所有变量分成了三大类,这个设计的作用是帮助读者快速判断:哪些相关关系属于组内关系,哪些属于组间关系。

例图解读:

      从组内关系来看,Society 组内部相关性最强,说明社会经济类指标之间高度耦合。Ecology 组内部也存在几组非常强的相关关系,例如 NDVI-AAP、PM2.5-CO2、DEM-Slope。City 组内部则表现为 Railway 与 Motorway 高度相关,但 CNBH、SR 与其他城市指标的相关性相对较弱。从组间关系来看,City 和 Society 之间总体呈正相关,尤其是 Railway、Motorway、US 与 PD、GDP、RLD、NL 之间相关性较明显,说明交通基础设施和城市建设水平往往与社会经济发展水平同步提升。Society 与 Ecology 之间则表现出更复杂的关系:社会经济发展指标与 NDVI、AAP、EC 等生态相关指标多为负相关,而与 PM2.5、CO2 等污染或排放指标多为正相关。

04

右侧 VIF 棒棒糖图

      右侧的 VIF 棒棒糖图用于判断各变量之间是否存在多重共线性。横轴是 VIF 值,圆点越靠右,说明该变量与其他变量之间的信息重叠程度越高。图中的红色虚线表示 VIF = 10,一般可作为判断严重共线性风险的参考阈值。

例图解读:

      从图中可以看出,不少变量的 VIF 值接近或超过 10,说明这些变量之间存在较明显的共线性风险。尤其是 RLD、NL、NDVI、AAP、PM2.5、CO2 等指标,VIF 值明显较高,部分已经超过红色虚线。这与相关性矩阵中的结果是一致的。例如 RLD 与 NL 高度相关,NDVI 与 AAP 高度相关,PM2.5 与 CO2 高度相关,因此它们在 VIF 图中也表现出较高共线性。此外,Railway 与 Motorway 之间相关系数达到 0.94,因此二者的 VIF 值也偏高;DEM 与 Slope 的相关系数为 0.95,也会导致这两个地形变量存在较强共线性风险。PD、GDP、RLD、NL 之间高度相关,因此如果后续将这些变量同时放入回归模型,可能会导致模型不稳定,变量解释能力相互干扰。相比之下,CNBH、SR、US、EC 等变量的 VIF 值较低,说明它们与其他变量之间的信息重叠程度相对较弱,在后续建模中共线性风险较小。

第五部分:适用场景

这段代码适合很多多指标分析场景。

比如在生态环境研究中,可以用于分析气温、降水、土壤水分、植被指数、碳通量之间的关系。

在土地利用研究中,可以用于分析建设用地、林地、耕地、景观格局指数和城市热岛之间的关系。

在经济研究中,可以用于分析 GDP、人口密度、产业结构、投资水平、创新能力之间的关系。

在医学和生物统计研究中,也可以用于分析临床指标、行为学指标、影像学指标、生化指标之间的关系。

所以,这段代码特别适合放在论文的变量关系分析、相关性分析、建模前诊断或者结果可视化部分。

如果论文后续还要做回归模型、随机森林模型、结构方程模型或者其他机器学习模型,那么这张图可以作为前期变量筛选和共线性检查的依据。

第六部分:Python操作流程

1)安装 Python 环境,推荐使用3.11~3.13版本。

      首先,需要在你的计算机上安装 Python。推荐使用3.11~3.13版本。具体安装过程我在这里就不详细说明,网上教程很多,小伙伴们可自行上网查找安装教程。不会的小伙伴可以寻求专业人士的帮忙。不同电脑安装过程出现的问题不同。

官网网址:https://www.python.org/downloads/

2)安装 Python编辑器

推荐使用PyCharm 、VS Code、Anaconda等编辑器,可根据喜好选择。编辑器安装也是需要去官网下载,可以去网上查找安装教程。

3)安装必要的库

你可以直接在终端(命令行)或代码编辑器的控制台中运行以下命令来进行批量安装:

pip install numpy pandas matplotlib seaborn scipy statsmodels openpyxl

如果你使用的是国内网络,下载速度比较慢,建议加上清华大学的镜像源,这样安装会快很多:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pandas matplotlib seaborn scipy statsmodels openpyxl

4)准备数据

我们首先要整理好数据文件,通常以Excel格式存储。确保数据是数值型,且每一列代表一个变量。

第一行是特征变量的分组或者维度

第二行是特征/变量名称(注意要正式的名称)

其他行为特征/变量对应的数值(需要多行,也就是我们常说的样本量)。

注意:Excel数据文件需要和代码放在同一个文件内

示范数据如下:

5)替换您自己的Excel数据,点击运行。

选择适合Python编辑器使用的格式文件。我这里有两个格式的文件,包括:.ipynb 和.py

找到代码中输入文件路径的地方。输入你的Excel文件名+后缀。可以参考我的示范。

注意:不要删除双引号

输出内容包括PDF和png格式的图

自定义设置:

下面这里可以设置字体大小、颜色等内容。(可以自己设置,不会的就不用设置)

★代码运行常见报错问题:

1.出现:FileNotFoundError: [Errno 2] No such file or directory: '示例数据.xlsx'

原因是当前文件夹代码默认去找 示例数据.xlsx。而这个文件和代码不在同一个文件夹内。解决办法:你需要替换为你自己的数据,然后和代码放在一个文件夹内。

2.出现:ModuleNotFoundError: No module named 'shap'

或者:ModuleNotFoundError: No module named 'xgboost'

其他:ModuleNotFoundError: No module named '     '

解决办法就是补安装对应模型库:例如:

pip install shap

pip install xgboost

3.出现:警告:系统缺失中文字体 'SimSun',中文可能无法正常显示。

代码里设置了英文字体 Times New Roman,中文字体 SimSun,并且会先检查系统里有没有这些字体;如果缺失,会打印警告。

解决方法:改成您电脑里实际有的中文字体

5. 运行很慢,像“卡住了一样”

所以如果特征很多、样本很多,程序可能要跑很久,这不是死机,是正常现象。

出现其他运行问题可添加V详细咨询:zhouysh001(八宝粥加油)

第七部分:不同配色效果展示

THE END

完整代码获取:回复“ VIF斯皮尔曼 ”即可获得通道

最新文章

随机文章