相关性分析简介
在统计学中,相关性分析是一种用来度量两个变量之间关系的强度和方向的技术。对于不同的数据类型和假设,选择不同的相关性检验方法是非常重要的。常用的相关性分析方法有 皮尔逊(Pearson)相关系数、斯皮尔曼(Spearman)相关系数 和 肯德尔(Kendall)相关系数。这三种方法各自有不同的假设条件和适用场景。
1. 皮尔逊相关系数(Pearson Correlation)
适用情况:
- 皮尔逊相关系数是最常见的相关性分析方法之一,适用于线性关系的情况。
- 适合用于连续变量之间的关系分析,尤其当数据符合正态分布时,皮尔逊相关系数能够提供准确的结果。
计算公式:
皮尔逊相关系数的计算公式为:
r
=
∑
(
X
i
−
X
ˉ
)
(
Y
i
−
Y
ˉ
)
∑
(
X
i
−
X
ˉ
)
2
∑
(
Y
i
−
Y
ˉ
)
2
r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2 \sum (Y_i - \bar{Y})^2}}
r=∑(Xi−Xˉ)2∑(Yi−Yˉ)2∑(Xi−Xˉ)(Yi−Yˉ)
其中 (X) 和 (Y) 是两个变量,(\bar{X}) 和 (\bar{Y}) 是它们的均值。
特点:
- 假设: 数据应该是正态分布的,且两者之间存在线性关系。
- 输出值: 结果在 -1 到 +1 之间,表示从负相关(-1)到正相关(+1)。0 表示没有线性相关性。
适用场景:
- 当你想要分析两个变量之间是否存在线性关系时使用皮尔逊相关系数。
- 例如,在你的数据中,如果你希望检查 “温度” 和 “发电功率” 之间是否存在线性关系,使用皮尔逊相关系数是合适的。
代码部分:
rho1 = corr(data, 'type', 'pearson');
这行代码通过皮尔逊方法计算数据集中的变量之间的相关性。
2. 斯皮尔曼相关系数(Spearman Correlation)
适用情况:
- 斯皮尔曼相关系数是一种秩相关系数,适用于单调关系的情况。它不要求数据满足正态分布,并且可以处理非线性关系。
- 适合用于有序变量或数据非线性的情况,尤其在变量间关系不完全是线性时,斯皮尔曼系数能够提供更加稳健的结果。
计算公式:
斯皮尔曼相关系数通过比较两个变量的秩次(排名)来计算。计算步骤是将每个变量的值转换为秩次,然后计算秩次之间的皮尔逊相关系数。
ρ
s
=
1
−
6
∑
d
i
2
n
(
n
2
−
1
)
\rho_s = 1 - \frac{6\sum d_i^2}{n(n^2-1)}
ρs=1−n(n2−1)6∑di2
其中 (d_i) 是第 (i) 个观测值的秩次差,(n) 是样本数量。
特点:
- 假设: 斯皮尔曼相关系数对数据分布没有要求,适合用于单调但不一定是线性关系的数据。
- 输出值: 结果也在 -1 到 +1 之间,表示从负单调相关(-1)到正单调相关(+1)。0 表示没有单调相关性。
适用场景:
- 当你想要分析两个变量之间是否存在单调关系(即随着一个变量的增加,另一个变量的变化也是单向的,但不一定是线性关系)时使用斯皮尔曼相关系数。
- 例如,如果你怀疑"气压"和"湿度"之间的关系不是线性的,但它们可能是单调增加或减少的,斯皮尔曼相关系数就很合适。
代码部分:
rho2 = corr(data, 'type', 'Spearman');
这行代码通过斯皮尔曼方法计算数据集中的变量之间的相关性。
3. 肯德尔相关系数(Kendall Correlation)
适用情况:
- 肯德尔相关系数也是一种秩相关系数,类似于斯皮尔曼,但它的计算方法略有不同,更加稳健,尤其适用于样本较小或数据含有异常值的情况。
- 适合处理有序的类别数据,特别是在样本量小或数据含有较多平局时,肯德尔系数比斯皮尔曼更稳定。
计算公式:
肯德尔相关系数通过计算所有数据对之间的相对顺序一致性来评估两个变量之间的关系。具体的计算方法基于所有观测对的比较,统计"一致性"(即两个变量排序相同的对)与"不一致性"(即两个变量排序不同的对)。
τ
=
P
−
Q
(
P
+
Q
+
T
)
(
P
+
Q
+
U
)
\tau = \frac{P - Q}{\sqrt{(P + Q + T)(P + Q + U)}}
τ=(P+Q+T)(P+Q+U)P−Q
其中 (P) 是一致对数,(Q) 是不一致对数,(T) 和 (U) 分别是平局对数。
特点:
- 假设: 和斯皮尔曼类似,对数据分布没有要求。
- 输出值: 结果也在 -1 到 +1 之间,表示从负相关到正相关,0 表示没有相关性。
适用场景:
- 当你希望处理含有较多重复值(平局)的数据时,肯德尔相关系数比斯皮尔曼更加稳健。
- 在样本量较小,且数据中存在大量相同值时,肯德尔相关系数通常比斯皮尔曼表现得更好。
代码部分:
rho3 = corr(data, 'type', 'Kendall');
这行代码通过肯德尔方法计算数据集中的变量之间的相关性。
4. 总结
- 皮尔逊相关系数(Pearson):适用于线性关系,数据需要满足正态分布的假设。
- 斯皮尔曼相关系数(Spearman):适用于单调关系,无需正态分布,适合非线性但单调的关系。
- 肯德尔相关系数(Kendall):适用于有序数据,尤其是样本量较小或数据含有异常值时,稳健性较强。
代码中的应用:
在代码中,使用了三种不同的相关性分析方法,并通过热力图可视化它们的结果。每种方法都分别计算了不同变量之间的相关性,以帮助你判断变量间的关系,并为后续的建模和分析提供依据。通过观察这些相关系数矩阵,你可以选择最适合的相关性度量方法,进而决定哪些变量具有较强的线性或单调关系,并为模型的特征选择提供指导。
% 皮尔逊相关性矩阵
figure
h1 = heatmap(xvalues, yvalues, rho1, 'FontSize', 10, 'FontName', 'Helvetica');
h1.Title = 'Pearson 相关系数矩阵';
colormap summer
% 斯皮尔曼相关性矩阵
figure
h2 = heatmap(xvalues, yvalues, rho2, 'FontSize', 10, 'FontName', 'Helvetica');
h2.Title = 'Spearman 相关系数矩阵';
colormap summer
% 肯德尔相关性矩阵
figure
h3 = heatmap(xvalues, yvalues, rho3, 'FontSize', 10, 'FontName', 'Helvetica');
h3.Title = 'Kendall 相关系数矩阵';
colormap summer
这种多角度的相关性分析能够帮助你更好地理解数据中的变量关系,为后续的数据建模、特征选择和模型评估奠定基础。
Matlab代码手把手教运行
为了帮助更多的萌新更快上手数学建模建等竞赛,这里直接手把手教会如何直接使用本文中的相关性分析代码:
warning off
close all
clear
clc
%% 导入数据
data = xlsread("数据.xlsx");
%% 相关性分析
rho1 = corr(data, 'type','pearson'); %person相关性分析
rho2 = corr(data, 'type','Spearman'); %spearman相关性分析
rho3 = corr(data, 'type','Kendall'); %kendall相关性性分析
%% 热力图分析
string_name1={'组件温度','温度','气压','湿度','总辐射','直射辐射','散角辐射','发电功率'}; %X向量标签
string_name2={'组件温度','温度','气压','湿度','总辐射','直射辐射','散角辐射','发电功率'}; %Y向量标签
xvalues = string_name1;
yvalues = string_name2;
figure
h1 = heatmap(xvalues,yvalues, rho1, 'FontSize',10,'FontName','Helvetica');
h1.Title = 'pearson 相关系数矩阵';
colormap summer
figure
h2 = heatmap(xvalues,yvalues, rho2, 'FontSize',10,'FontName','Helvetica');
h2.Title = 'spearman 相关系数矩阵';
colormap summer
figure
h3 = heatmap(xvalues,yvalues, rho3, 'FontSize',10,'FontName','Helvetica');
h3.Title = 'kendall 相关系数矩阵';
colormap summer
数据.xlsx:
组件温度(℃) | 温度(°) | 气压(hPa) | 湿度(%) | 总辐射(W/m2) | 直射辐射(W/m2) | 散射辐射(W/m2) | 实际发电功率(mw) |
---|---|---|---|---|---|---|---|
34.5125 | 22.505 | 926.063 | 14.228 | 80.6 | 72.54 | 45.7733 | 3.8796 |
36.55 | 22.591 | 926.063 | 14.152 | 123.25 | 110.925 | 66.2267 | 4.142133 |
37.0325 | 22.942 | 926.069 | 14.11 | 137.35 | 123.615 | 69.8266 | 4.9934 |
38.3425 | 22.904 | 926.067 | 14.101 | 184.35 | 165.915 | 100.92 | 6.521934 |
39.925 | 23.428 | 926.066 | 13.502 | 276.375 | 248.738 | 154.493 | 7.875934 |
40.635 | 23.558 | 926.063 | 13.648 | 305.75 | 275.175 | 168.56 | 9.7814 |
43.795 | 24.095 | 926.062 | 13.273 | 468.375 | 421.538 | 270.04 | 6.682134 |
40.995 | 25.44 | 926.062 | 12.279 | 243.875 | 219.488 | 125.107 | 8.729 |
43.5525 | 25.314 | 926.062 | 12.504 | 402.35 | 362.115 | 216.773 | 10.012267 |
47.055 | 25.438 | 926.056 | 12.175 | 786.975 | 708.278 | 434.16 | 18.239334 |
52.835 | 26.172 | 926.047 | 11.576 | 841.45 | 757.305 | 454.693 | 20.289268 |
57.465 | 26.094 | 926.044 | 12.282 | 905.9 | 815.31 | 480.147 | 19.824066 |
59.61 | 26.239 | 926.04 | 13.498 | 980.95 | 882.855 | 507.907 | 23.251202 |
62.1625 | 26.516 | 926.036 | 13.578 | 1049.93 | 944.932 | 532.027 | 30.133934 |
64.4475 | 26.656 | 926.04 | 13.455 | 1103.45 | 993.105 | 551.413 | 31.352936 |
66.7 | 27.125 | 926.041 | 13.709 | 1152.2 | 1036.89 | 567.453 | 31.180735 |
替换教程:
仅需把各个特征变量像数据表格放入即可,替换数据后将代码中的这一部分修改一下,就是按照表格的特征顺序替换掉即可!
string_name1={'组件温度','温度','气压','湿度','总辐射','直射辐射','散角辐射','发电功率'}; %X向量标签
string_name2={'组件温度','温度','气压','湿度','总辐射','直射辐射','散角辐射','发电功率'}; %Y向量标签