气象数据处理与分析中,经常需要统计两个或多个变量之间的相关关系。本文主要讲解皮尔逊(普通)相关、Spearman秩相关、Kendall’s τ \tau τ相关以及序列相关的使用方法以及适用条件,并给出相应的Python实践案例。
一、皮尔逊(普通)相关
两个变量
x
,
y
x,y
x,y之间的皮尔逊相关系数可以表示为:
r
x
y
=
Cov
(
x
,
y
)
s
x
s
y
=
1
n
−
1
∑
i
=
1
n
[
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
]
[
1
n
−
1
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
]
1
/
2
[
1
n
−
1
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
]
1
/
2
(1)
r_{x y}=\frac{\operatorname{Cov}(x, y)}{s_{x} s_{y}}=\frac{\frac{1}{n-1} \sum_{i=1}^{n}\left[\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)\right]}{\left[\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}\right]^{1 / 2}\left[\frac{1}{n-1} \sum_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}\right]^{1 / 2}} \tag{1}
rxy=sxsyCov(x,y)=[n−11∑i=1n(xi−xˉ)2]1/2[n−11∑i=1n(yi−yˉ)2]1/2n−11∑i=1n[(xi−xˉ)(yi−yˉ)](1)
r
x
y
=
∑
i
=
1
n
(
x
i
′
y
i
′
)
[
∑
i
=
1
n
(
x
i
′
)
2
]
1
/
2
[
∑
i
=
1
n
(
y
i
′
)
2
]
1
/
2
(2)
r_{xy}=\frac{\sum_{i=1}^{n}\left(x_{i}^{\prime} y_{i}^{\prime}\right)}{\left[\sum_{i=1}^{n}\left(x_{i}^{\prime}\right)^{2}\right]^{1 / 2}\left[\sum_{i=1}^{n}\left(y_{i}^{\prime}\right)^{2}\right]^{1 / 2}} \tag{2}
rxy=[∑i=1n(xi′)2]1/2[∑i=1n(yi′)2]1/2∑i=1n(xi′yi′)(2)
皮尔逊相关系数,既不具有鲁棒性也不具有稳定性。它不具有鲁棒性,点那个两个变量
x
,
y
x,y
x,y之间有很强但是非线性关系时,是不可以识别的。不具有稳定性,是因为它可能对一个或者几个离群点极为敏感。但是皮尔逊相关系数非常适合数学运算,所以经常被使用,并于回归分析等内容有密切关系。
皮尔逊相关系数的两个重要性质:
- 皮尔逊相关系数数值在[-1,1]之间
- 皮尔逊相关系数的平方
r
x
y
2
r^{2}_{xy}
rxy2 表征
x
x
x或者
y
y
y中一个由另一个线性说明或描述的比例,但这个是不合理的。
皮尔逊相关系数的另一个表示方法:
r
x
y
=
1
n
−
1
∑
i
=
1
n
[
(
x
i
−
x
ˉ
)
s
x
(
y
i
−
y
ˉ
)
s
y
]
=
1
n
−
1
∑
i
=
1
n
z
x
i
z
y
i
(3)
r_{x y}=\frac{1}{n-1} \sum_{i=1}^{n}\left[\frac{\left(x_{i}-\bar{x}\right)}{s_{x}} \frac{\left(y_{i}-\bar{y}\right)}{s_{y}}\right]=\frac{1}{n-1} \sum_{i=1}^{n} z_{x_{i}} z_{y_{i}} \tag{3}
rxy=n−11i=1∑n[sx(xi−xˉ)sy(yi−yˉ)]=n−11i=1∑nzxizyi(3)
从计算角度考虑,上述皮尔逊计算公式是复杂的,会消耗大量的计算资源,导致运行效率的下降。为此,提出了以下的计算公式,以提高运行与计算效率。
∑ i = 1 n [ ( x i − x ˉ ) ( y i − y ˉ ) ] = ∑ i = 1 n [ x i y i − x i y ˉ − y i x ˉ − x ˉ y ˉ ) ] = ∑ i = 1 n ( x i y i ) − y ˉ ∑ i = 1 n x i − x ˉ ∑ i = 1 n y i + x ˉ y ˉ ∑ i = 1 n ( 1 ) = ∑ i = 1 n ( x i y i ) − n x ˉ y ˉ − n x ˉ y ˉ + n x ˉ y ˉ = ∑ i = 1 n ( x i y i ) − 1 n [ ∑ i = 1 n x i ] [ ∑ i = 1 n y i ] (4) \begin{aligned} \sum_{i=1}^{n}\left[\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)\right] &\left.=\sum_{i=1}^{n}\left[x_{i} y_{i}-x_{i} \bar{y}-y_{i} \bar{x}-\bar{x} \bar{y}\right)\right] \\ &=\sum_{i=1}^{n}\left(x_{i} y_{i}\right)-\bar{y} \sum_{i=1}^{n} x_{i}-\bar{x} \sum_{i=1}^{n} y_{i}+\bar{x} \bar{y} \sum_{i=1}^{n}(1) \\ &=\sum_{i=1}^{n}\left(x_{i} y_{i}\right)-n \bar{x} \bar{y}-n \bar{x} \bar{y}+n \bar{x} \bar{y} \\ &=\sum_{i=1}^{n}\left(x_{i} y_{i}\right)-\frac{1}{n}\left[\sum_{i=1}^{n} x_{i}\right]\left[\sum_{i=1}^{n} y_{i}\right] \end{aligned} \tag{4} i=1∑n[(xi−xˉ)(yi−yˉ)]=i=1∑n[xiyi−xiyˉ−yixˉ−xˉyˉ)]=i=1∑n(xiyi)−yˉi=1∑nxi−xˉi=1∑nyi+xˉyˉi=1∑n(1)=i=1∑n(xiyi)−nxˉyˉ−nxˉyˉ+nxˉyˉ=i=1∑n(xiyi)−n1[i=1∑nxi][i=1∑nyi](4)
s x = ( ∑ x i 2 − n x ˉ 2 n − 1 ) 1 / 2 = [ ∑ x i 2 − 1 n ( ∑ x i ) 2 n − 1 ] 1 / 2 (5) s_{x}=\left(\frac{\sum x_{i}^{2}-n \bar{x}^{2}}{n-1}\right)^{1 / 2}=\left[\frac{\sum x_{i}^{2}-\frac{1}{n}\left(\sum x_{i}\right)^{2}}{n-1}\right]^{1 / 2} \tag{5} sx=(n−1∑xi2−nxˉ2)1/2=[n−1∑xi2−n1(∑xi)2]1/2(5)
r x y = ∑ i = 1 n x i y i − 1 n ( ∑ i = 1 n x i ) ( ∑ i = 1 n y i ) [ ∑ i = 1 n x i 2 − 1 n ( ∑ i = 1 n x i ) 2 ] 1 / 2 [ ∑ i = 1 n y i 2 − 1 n ( ∑ i = 1 n y i ) 2 ] 1 / 2 (6) r_{x y}=\frac{\sum_{i=1}^{n} x_{i} y_{i}-\frac{1}{n}\left(\sum_{i=1}^{n} x_{i}\right)\left(\sum_{i=1}^{n} y_{i}\right)}{\left[\sum_{i=1}^{n} x_{i}^{2}-\frac{1}{n}\left(\sum_{i=1}^{n} x_{i}\right)^{2}\right]^{1 / 2}\left[\sum_{i=1}^{n} y_{i}^{2}-\frac{1}{n}\left(\sum_{i=1}^{n} y_{i}\right)^{2}\right]^{1 / 2}} \tag{6} rxy=[∑i=1nxi2−n1(∑i=1nxi)2]1/2[∑i=1nyi2−n1(∑i=1nyi)2]1/2∑i=1nxiyi−n1(∑i=1nxi)(∑i=1nyi)(6)
代码实现
pccs_1 = np.corrcoef(x1, y1)
pccs_2 = np.corrcoef(x2, y2)
print(pccs_1)
print("=====================================")
print(pccs_2)
二、Spearman秩相关
Spearman秩相关具有鲁棒性和抗干扰性,可以有效弥补皮尔逊相关的不足。Spearman秩相关使用的是资料的秩,而不是资料本身,其具体计算过程如下:
-
将数据本身转化成数据的秩。
-
计算公式
如果没有重复的秩,使用下列公式进行计算:
r r a n k = 1 − 6 ∑ i = 1 n D i 2 n ( n 2 − 1 ) (7) r_{\mathrm{rank}}=1-\frac{6 \sum_{i=1}^{n} D_{i}^{2}}{n\left(n^{2}-1\right)} \tag{7} rrank=1−n(n2−1)6∑i=1nDi2(7)
其中 D i = x i ′ − y i ′ D_{i}=x^{'}_{i}-y^{'}_{i} Di=xi′−yi′,为 y i y_{i} yi和 x i x_{i} xi之间的秩差值。
具体推导过程:
从1到n的整数平均值为 n + 1 2 \frac{n+1}{2} 2n+1,其方差为 n ( n + 1 ) 12 \frac{n(n+1)}{12} 12n(n+1), 1 2 + 2 2 + ⋯ + n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 1^2+2^2+\cdots +n^2=\frac{n(n+1)(2n+1)}{6} 12+22+⋯+n2=6n(n+1)(2n+1)
r r a n k = 1 n − 1 ∑ i = 1 n [ ( x i − x ˉ ) ( y i − y ˉ ) ] [ 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) 2 ] 1 / 2 [ 1 n − 1 ∑ i = 1 n ( y i − y ˉ ) 2 ] 1 / 2 (8) \begin{aligned} r_{\mathrm{rank}}=\frac{\frac{1}{n-1} \sum_{i=1}^{n}\left[\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)\right]}{\left[\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}\right]^{1 / 2}\left[\frac{1}{n-1} \sum_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}\right]^{1 / 2}}\\ \end{aligned} \tag{8} rrank=[n−11∑i=1n(xi−xˉ)2]1/2[n−11∑i=1n(yi−yˉ)2]1/2n−11∑i=1n[(xi−xˉ)(yi−yˉ)](8)
对上述式子进行化简并代入可以得到:
r r a n k = 1 n − 1 ∑ i = 1 n x i y i − n x ˉ y ˉ n ( n + 1 ) 12 = 12 ∑ i = 1 n x i y i − n x ˉ y ˉ n ( n + 1 ) ( n − 1 ) = 12 ∑ i = 1 n x i y i − n ( n + 1 ) 2 4 n ( n + 1 ) ( n − 1 ) = 12 ∑ i = 1 n x i y i − 3 n ( n + 1 ) 2 n ( n + 1 ) ( n − 1 ) (9) \begin{aligned} r_{rank} &= \frac{1}{n-1}\frac{\sum_{i= 1}^{n}x_{i}y_{i}-n\bar{x}\bar{y}}{\frac{n(n+1)}{12} } \\ &=12\frac{\sum_{i=1}^{n}x_{i}y_{i}-n\bar{x}\bar{y} }{n(n+1)(n-1)} \\ &=12\frac{\sum_{i=1}^{n}x_{i}y_{i}-\frac{n(n+1)^2}{4} }{n(n+1)(n-1)} \\ &=\frac{12\sum_{i=1}^{n}x_{i}y_{i}-3n(n+1)^2 }{n(n+1)(n-1)} \end{aligned} \tag{9} rrank=n−1112n(n+1)∑i=1nxiyi−nxˉyˉ=12n(n+1)(n−1)∑i=1nxiyi−nxˉyˉ=12n(n+1)(n−1)∑i=1nxiyi−4n(n+1)2=n(n+1)(n−1)12∑i=1nxiyi−3n(n+1)2(9)
∑
i
=
1
n
x
i
y
i
=
∑
i
=
1
m
x
i
2
+
∑
i
=
1
n
y
i
2
−
∑
i
=
1
n
(
x
i
−
y
i
)
2
(10)
\begin{aligned} \sum_{i=1}^{n} x_{i}y_{i}=\sum_{i=1}^{m}x_{i}^2+\sum_{i=1}^{n}y_{i}^2-\sum_{i=1}^{n}(x_{i}-y_{i})^2 \end{aligned} \tag{10}
i=1∑nxiyi=i=1∑mxi2+i=1∑nyi2−i=1∑n(xi−yi)2(10)
将公式(10)代入公式(9)后,利用
1
2
+
2
2
+
⋯
+
n
2
=
n
(
n
+
1
)
(
2
n
+
1
)
6
1^2+2^2+\cdots +n^2=\frac{n(n+1)(2n+1)}{6}
12+22+⋯+n2=6n(n+1)(2n+1),便可得到公式(7)的结果。
如果存在重复的秩,则需要计算秩次之间的皮尔逊相关系数:
r
r
a
n
k
=
∑
i
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
i
(
x
i
−
x
ˉ
)
2
∑
i
(
y
i
−
y
ˉ
)
2
(11)
r_{\mathrm{rank}}=\frac{\sum_{i}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{\sqrt{\sum_{i}\left(x_{i}-\bar{x}\right)^{2} \sum_{i}\left(y_{i}-\bar{y}\right)^{2}}} \tag{11}
rrank=∑i(xi−xˉ)2∑i(yi−yˉ)2∑i(xi−xˉ)(yi−yˉ)(11)
代码实现
import scipy.stats
x1=[0,1,2,3,5,7,9,12,16,20]
y1=[0,3,6,8,11,13,14,15,16,16]
scipy.stats.spearmanr(x1,y1)
三、Kendall’s相关
kendall的
τ
\tau
τ相关同样具有鲁棒性和抗干扰性,是皮尔逊相关系数的第二种替代方案。
计算公式为:
τ
=
N
C
−
N
D
n
(
n
−
1
)
/
2
(12)
\tau=\frac{N_{C}-N_{D}}{n(n-1) / 2} \tag{12}
τ=n(n−1)/2NC−ND(12)
N
C
N_{C}
NC一致数据对的数目
N
D
N_{D}
ND不一致的数据对数目
下面通过一个具体的数据进行说明:
以样本编号1为例,样本1-9的年龄都比样本1大,且样本1-9的任务完成度也全部大于样本1的任务完成度,所以一致对数为9,不一致对数为0。
代码实现
import scipy.stats
age=[10,15,18,21,23,25,28,30,45,41]
degree=[0.001,0.04,0.01,0.03,0.02,0.56,0.12,0.75,0.78,0.89]
scipy.stats.kendalltau(age,degree)