☰
Pearson相关系数实战:正态性检验、显著性检验与避坑指南
2026/10/15 16:27:58 网站建设 项目流程

简介:这份资源围绕Pearson相关系数展开,面向数据分析、统计学初学者及需要做相关性分析的科研人员,帮助解决线性相关度量、正态性检验与显著性判断等实际问题。压缩包内共1个docx文档,约42KB,内容涵盖模型简述、适用范围、分析步骤、计算公式及程序实现,并给出Matlab与R语言的具体函数示例。文档重点讲解Pearson相关系数的取值含义与相关强度判断标准,同时说明Jarque-Bera检验和Shapiro-Wilk检验的适用样本量与实现方式,还补充了气候科学、医学研究、金融分析等实践应用场景。目前已有4905人学习下载,适合希望系统掌握Pearson相关系数原理、检验流程与代码实现,并用于论文或项目数据分析的读者参考。

1. 从一张散点图说起:Pearson 相关系数到底在算什么

手头有两列数,一列是设备运行温度,一列是产出良率,你想知道它们之间到底有没有关系、关系有多强。最直接的做法是画一张散点图,横轴温度、纵轴良率,点如果大致沿着一条斜线排布,就说明两者存在线性关联。Pearson 相关系数就是把这根“斜线的倾斜程度和紧密程度”压缩成一个 [-1, +1] 之间的数字。它度量的是两个连续变量之间的线性相关程度,绝对值越接近 1,线性关系越强;越接近 0,线性关系越弱。这个指标在数据分析、统计学、自然科学和工程实验里被反复使用,原因很简单:它计算快、解释直观、有成熟的显著性检验配套。但它对数据有明确前提——成对观测、总体近似正态、无极端离群点,否则算出来的 r 会骗人。这篇笔记就按“先验前提 → 算系数 → 做检验 → 避坑”的顺序,把 Pearson 相关系数从公式落到可复现的代码。

2. 正态性检验:Pearson 相关系数的前置门槛

Pearson 相关系数的显著性检验依赖 t 分布,而 t 检验的前提是数据来自正态总体。所以正规流程里,算 r 之前先做正态性检验。样本量不同,选的检验方法也不同:小样本用 Shapiro-Wilk,大样本用 Jarque-Bera。这一步跳过,后面的 p 值就是空中楼阁。

2.1 样本量决定检验方法:S-W 与 JB 的分工

Shapiro-Wilk 检验(S-W)适用于样本量 3 到 50 的小样本场景。它的思路是把排序后的样本和正态分布的理论分位数做回归,看残差是否足够小。R 语言里一行就能跑:

# Shapiro-Wilk 正态性检验 # 原假设 H0:数据服从正态分布 # p 值小于 0.05 时,有 95% 置信度拒绝原假设,认为数据不服从正态分布 result <- shapiro.test(x) print(result$p.value)

参数说明:x是待检验的数值向量,长度建议在 3 到 50 之间。返回值里重点看p.value,小于 0.05 就说明数据偏离正态,这时候硬上 Pearson 相关系数就不合适了,应该转向 Spearman 或 Kendall。

Jarque-Bera 检验(JB)适用于样本量大于 30 的情况。它不直接比较分位数,而是用偏度(skewness)和峰度(kurtosis)构造统计量:

$$JB = \frac{n}{6}\left[Skew^2 + \frac{(Kurt-3)^2}{4}\right]$$

正态分布下偏度为 0、峰度为 3,JB 统计量服从自由度为 2 的卡方分布。Matlab 里用jbtest:

% Jarque-Bera 正态性检验 % x 为待检验数据,alpha 为显著性水平,常用 0.05 或 0.01 % h = 0 表示不拒绝原假设(认为服从正态分布) % h = 1 表示拒绝原假设(认为不服从正态分布) [h, p] = jbtest(x, 0.05); if h == 0 disp('数据通过正态性检验,可继续 Pearson 分析'); else disp('数据不满足正态分布,建议改用 Spearman 相关系数'); end

参数说明:alpha越小置信度越高,取 0.01 时 h=0 意味着有 99% 的把握认为数据服从正态分布。p是检验的 p 值,和 h 配合看更稳妥。注意 JB 检验本身依赖大样本渐近性质,样本量低于 30 时结果不可靠,这是血泪经验——小样本硬跑 JB,p 值波动大到没法用。

2.2 偏度和峰度:JB 检验背后的两个形状指标

JB 检验之所以能判断正态性,是因为它同时盯住了分布的两个形状特征。偏度衡量分布的不对称程度:标准正态分布是对称的,偏度为 0;如果“草帽尖”偏向 x 轴负方向,就是正偏斜,偏度大于 0;偏向正方向则是负偏斜。峰度衡量分布的陡峭或扁平程度:正态分布峰度为 3(Matlab 的kurtosis按此定义计算),大于 3 是尖峰、尾部厚,小于 3 是平峰、尾部薄。

Matlab 里可以直接算这两个量:

% 计算偏度和峰度,辅助判断分布形状 skew_val = skewness(x); % 标准正态分布偏度为 0 kurt_val = kurtosis(x); % 标准正态分布峰度为 3 fprintf('偏度: %.4f, 峰度: %.4f\n', skew_val, kurt_val);

参数说明:skewness和kurtosis都接受向量输入。偏度绝对值超过 1、峰度偏离 3 较远时,即使 JB 检验勉强通过,也要警惕——这时候散点图必须画,不能只看数字。

提示:正态性检验不是一次性的门禁,而是选方法的依据。S-W 拒绝正态就换 Spearman,JB 拒绝正态就检查是否有离群点或变量需要变换,别硬算 Pearson。

3. 算系数与做检验:从协方差到 t 统计量

正态性过关之后,核心计算分两步:先算 Pearson 相关系数 r,再对 r 做显著性检验。很多人只算 r 不看 p 值,这是典型的翻车点——r=0.3 在样本量 10 和样本量 1000 时的意义完全不同。

3.1 Pearson 相关系数的计算:R 与 Matlab 两条路径

Pearson 相关系数的定义是两个变量的协方差除以各自标准差的乘积:

$$\rho_{X,Y} = \frac{cov(X,Y)}{\sigma_X \sigma_Y}$$

样本估计式为:

$$r = \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}}$$

R 语言里用cor()一步到位:

# 计算 Pearson 相关系数 # use 参数处理缺失值: # "everything" 遇到缺失值返回 NA # "complete.obs" 行删除,整行有缺失就删 # "pairwise.complete.obs" 成对删除,只删当前配对中的缺失 # method 指定相关系数类型:pearson / spearman / kendall r <- cor(x, y, use = "complete.obs", method = "pearson") print(r)

参数说明:use的选择直接影响结果。行删除在缺失比例高时会损失大量样本,成对删除保留更多数据但可能导致相关系数矩阵不一致。我一般先看缺失比例,低于 5% 用行删除,高于 5% 用成对删除并记录影响。method默认就是"pearson",但显式写出来更清楚。

Matlab 里用corrcoef:

% 计算 Pearson 相关系数和 p 值 % X 和 Y 为等长列向量 [r, p] = corrcoef(X, Y); r_val = r(1,2); % 取非对角元素,即 X 与 Y 的相关系数 p_val = p(1,2); % 对应的显著性 p 值 fprintf('Pearson r = %.4f, p = %.4f\n', r_val, p_val);

参数说明:corrcoef返回的是矩阵,对角线是自相关(恒为 1),非对角元素才是我们要的互相关系数。p矩阵同理。注意corrcoef默认按行删除缺失值,如果数据里有 NaN,实际参与计算的样本量会减少,需要自己核对。

3.2 显著性检验:t 统计量与 p 值的计算逻辑

算出 r 之后必须做显著性检验。原假设 H0:总体相关系数等于 0(无线性相关);备择假设 H1:总体相关系数不等于 0。检验统计量构造为:

$$t = r \cdot \sqrt{\frac{n-2}{1-r^2}}$$

该统计量服从自由度为 n-2 的 t 分布。R 里cor.test()直接给出检验结果:

# Pearson 相关系数显著性检验 # alternative 指定备择假设方向: # "two.sided" 双侧检验,总体相关系数不等于 0(默认) # "greater" 单侧,总体相关系数大于 0 # "less" 单侧,总体相关系数小于 0 test_result <- cor.test(x, y, alternative = "two.sided", method = "pearson") print(test_result$estimate) # 相关系数 r print(test_result$p.value) # p 值 print(test_result$conf.int) # 置信区间

参数说明:alternative的选择取决于研究假设。如果你事先假设两者正相关,用"greater"检验功效更高;不确定方向就用默认双侧。conf.int给出相关系数的置信区间,比单看 p 值信息量更大。

Matlab 里可以手动算 t 和 p:

% 手动计算 t 统计量和 p 值 n = length(X); r_val = r(1,2); t_stat = r_val * sqrt((n - 2) / (1 - r_val^2)); p_val = (1 - tcdf(t_stat, n - 2)) * 2; % 双侧检验乘以 2 fprintf('t = %.4f, p = %.4f\n', t_stat, p_val);

参数说明:tcdf是 t 分布的累积分布函数,n-2是自由度。双侧检验要乘以 2,单侧不用。p 值小于 0.01 说明在 99% 置信水平上显著,小于 0.05 说明在 95% 置信水平上显著。0.05 这个阈值虽然有争议,但绝大多数场景还是以它为准。

注意:r 大不代表显著,r 小也不代表不显著。样本量足够大时,r=0.1 也可能显著;样本量很小时,r=0.8 也可能不显著。必须结合 p 值和置信区间一起判断。

4. 避坑与排查:Pearson 相关系数最容易翻车的五个地方

Pearson 相关系数的公式简单,但前提条件多,实际项目里翻车往往不是因为算错,而是因为用错场景。下面五条是我踩过或见别人踩过的坑,按“现象 → 原因 → 解决”整理。

4.1 相关系数很高但散点图是弯的

现象:算出 r=0.85,兴冲冲下结论说线性关系强,结果画散点图发现点排成一条抛物线。

原因:Pearson 相关系数只度量线性关系,非线性关系(如二次、指数)也可能产生较高的 r 值。公式里的协方差和标准差对弯曲趋势不敏感。

解决:永远先画散点图。散点图是 Pearson 分析的后悔药,数字再好看也要用图验证。如果发现非线性,考虑对变量做变换(取对数、开方)后再算,或者改用 Spearman 秩相关系数。

4.2 一个离群点把 r 从 0.9 拉到 0.3

现象:剔除某个点前后,相关系数剧烈变化,结论完全反转。

原因:Pearson 相关系数对离群点极其敏感。公式里每个点对协方差的贡献是 $(X_i-\bar{X})(Y_i-\bar{Y})$,离群点的偏差乘积远大于正常点,会主导整个计算。

解决:算 r 之前先做离群点检测。常用做法是用箱线图的 1.5 倍四分位距规则标记异常值,或者用马氏距离。确认是记录错误就修正或剔除,确认是真实极端值就保留并在报告中说明。剔除前后各算一次 r,对比差异。

4.3 样本量小于 30 却用了 JB 检验

现象:小样本跑 JB 检验,p 值忽大忽小,换个样本结论就变。

原因:JB 检验基于大样本渐近理论,样本量低于 30 时卡方近似不成立,检验结果不可靠。

解决:样本量 3 到 50 用 Shapiro-Wilk,大于 50 用 Jarque-Bera。这是硬性分界,不要混用。如果样本量刚好在 30 到 50 之间,两种都跑一遍,结论一致才继续。

4.4 缺失值处理方式不同导致结果对不上

现象:两个人用同一份数据算 Pearson 相关系数,结果不一样。

原因:R 的cor()里use参数有四种取值,行删除和成对删除保留的样本不同,算出的 r 自然不同。Matlab 的corrcoef默认行删除,和 R 的默认行为也不一致。

解决:分析前统一缺失值处理策略,并在报告中写明。我一般用成对删除(pairwise.complete.obs),因为它保留更多配对信息,但要在结果里注明实际参与计算的样本量。

4.5 只报 r 不报 p 值和置信区间

现象:报告里写“两变量显著相关,r=0.45”,审稿人或同事问显著在哪,答不上来。

原因:r 只是效应量,是否显著需要 p 值判断,估计精度需要置信区间判断。三者缺一不可。

解决:cor.test()的输出里estimate、p.value、conf.int全部提取,报告时三个数字一起写。样本量、缺失值处理方式、正态性检验结果也一并附上,形成完整的分析链条。

5. 进阶技巧:用 corrplot 和置换检验把结论钉死

基础流程跑通之后,有两个进阶做法能让 Pearson 分析更稳。第一个是可视化相关系数矩阵,第二个是用置换检验交叉验证 p 值。

5.1 相关系数矩阵的可视化:corrplot 快速定位强相关变量对

当变量多于两个时,逐个算 Pearson 相关系数效率太低。R 的corrplot包可以把相关系数矩阵画成热图,颜色深浅表示相关强弱,一眼就能找到强相关变量对。

# 安装并加载 corrplot 包 # install.packages("corrplot") library(corrplot) # 计算相关系数矩阵 # use 参数统一指定缺失值处理方式 cor_matrix <- cor(data_frame, use = "pairwise.complete.obs", method = "pearson") # 绘制相关系数热图 # method 可选 "circle"、"square"、"color" 等 # type 可选 "full"、"upper"、"lower" corrplot(cor_matrix, method = "circle", type = "upper", tl.cex = 0.8, addCoef.col = "black", number.cex = 0.7)

参数说明:data_frame是包含所有数值变量的数据框。method = "circle"用圆圈大小和颜色同时表示相关强度,type = "upper"只画上三角避免重复。addCoef.col = "black"在图上叠加相关系数数值,number.cex控制数字大小。这张图适合放在分析报告开头,快速展示变量间的整体关联结构。

5.2 置换检验:不依赖正态假设的 p 值验证

Pearson 相关系数的 p 值依赖 t 分布和正态假设。如果数据只是近似正态、或者样本量偏小,可以用置换检验(permutation test)做交叉验证。思路是:把其中一个变量的顺序随机打乱,重新算 r,重复上千次,看实际 r 在随机分布中的位置。

# 置换检验验证 Pearson 相关系数的显著性 # 不依赖正态假设,适合小样本或分布存疑的场景 set.seed(42) # 固定随机种子,保证结果可复现 n_perm <- 1000 r_perm <- numeric(n_perm) r_obs <- cor(x, y, method = "pearson") for (i in 1:n_perm) { y_shuffled <- sample(y) # 打乱 y 的顺序 r_perm[i] <- cor(x, y_shuffled, method = "pearson") } # 计算双侧置换 p 值 p_perm <- mean(abs(r_perm) >= abs(r_obs)) cat(sprintf("观测 r = %.4f, 置换检验 p = %.4f\n", r_obs, p_perm))

参数说明:set.seed(42)固定随机种子,保证每次运行结果一致。n_perm取 1000 到 10000 之间,越大越稳定但耗时越长。sample(y)是置换操作的核心,只打乱一个变量的顺序,破坏两变量的对应关系但保留各自的分布形态。p_perm是双侧检验,如果要单侧就把abs()去掉,按方向比较。

置换检验的 p 值和 t 检验的 p 值通常接近,如果差异很大,说明正态假设可能不成立,这时候以置换检验为准更稳妥。我一般会在正式报告里同时给出两个 p 值,让结论更扎实。

从那以后我每次做 Pearson 相关分析,都强制走一遍“散点图 → 正态性检验 → 算 r → 显著性检验 → 置换检验交叉验证”的完整流程,少一步都不放心。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询