Spearman 相关系数的可视化和应用场景

Spearman 相关系数的可视化和应用场景

flyfish

Spearman 相关系数

Spearman 相关系数 (Spearman’s Rank Correlation Coefficient),也称为Spearman 秩相关系数 ,用于衡量两个变量之间的单调关系(无论是线性还是非线性)。计算方法基于变量的秩次(即变量的排序 后面有例子),公式为(后面有推导过程):
ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \rho = 1 - \frac{6 \sum d_i^2}{n(n^2 - 1)} ρ=1n(n21)6di2其中, d i d_i di 是两个变量的秩次之差, n n n 是样本数量。
变量是连续或离散型变量,变量不需要服从正态分布,适用于度量单调关系(无论是线性还是非线性)。对异常值不敏感,可以度量单调关系,对变量间的线性关系度量不如 Pearson 相关系数精确。

单调关系

单调关系 是指在整个数据范围内,两个变量之间的关系始终保持单调性,即一个变量增加(或减少)时,另一个变量也始终增加(或减少),但不要求是线性关系。单调关系可以是单调递增或单调递减。
单调递增: 当一个变量增加,另一个变量也增加。
单调递减: 当一个变量增加,另一个变量减少。

变量的秩次(rank)

计算变量的秩次

步骤:

  1. 排序: 首先,将数据按照从小到大的顺序进行排序。
  2. 分配秩次: 为排序后的数据分配秩次。
  3. 处理重复值: 如果存在重复值,对这些值分配相同的秩次,取它们的平均秩次。
  4. 还原原始顺序: 将秩次分配还原到原始数据顺序中。

示例

假设有以下数据:
x = [ 3 , 1 , 4 , 1 , 5 ] x = [3, 1, 4, 1, 5] x=[3,1,4,1,5]
步骤 1: 排序
首先,将数据排序:
排序后的数据 = [ 1 , 1 , 3 , 4 , 5 ] 排序后的数据 = [1, 1, 3, 4, 5] 排序后的数据=[1,1,3,4,5]
步骤 2: 分配秩次
为排序后的数据分配秩次:
排序后的数据 = [ 1 , 1 , 3 , 4 , 5 ] 排序后的数据 = [1, 1, 3, 4, 5] 排序后的数据=[1,1,3,4,5]
秩次 = [ 1 , 2 , 3 , 4 , 5 ] 秩次 = [1, 2, 3, 4, 5] 秩次=[1,2,3,4,5]**
步骤 3: 处理重复值**
注意到数据中有重复值 1。对于重复值,分配相同的秩次,取它们的平均秩次:
排序后的数据 = [ 1 , 1 , 3 , 4 , 5 ] 排序后的数据 = [1, 1, 3, 4, 5] 排序后的数据=[1,1,3,4,5]
秩次 = [ 1.5 , 1.5 , 3 , 4 , 5 ] 秩次 = [1.5, 1.5, 3, 4, 5] 秩次=[1.5,1.5,3,4,5]**
步骤 4: 还原原始顺序**
将分配好的秩次还原到原始数据的顺序中:
原始数据 = [ 3 , 1 , 4 , 1 , 5 ] 原始数据 = [3, 1, 4, 1, 5] 原始数据=[3,1,4,1,5]
原始数据对应的秩次 = [ 3 , 1.5 , 4 , 1.5 , 5 ] 原始数据对应的秩次 = [3, 1.5, 4, 1.5, 5] 原始数据对应的秩次=[3,1.5,4,1.5,5]
Python 代码验证

import numpy as np
import pandas as pd

# 原始数据
x = np.array([3, 1, 4, 1, 5])

# 使用 pandas 计算秩次
ranks = pd.Series(x).rank()

# 打印原始数据及其对应的秩次
print(f'原始数据: {x}')
print(f'对应的秩次: {ranks.values}')
原始数据: [3 1 4 1 5]
对应的秩次: [3.  1.5 4.  1.5 5. ]

Spearman 相关系数的计算 ,可视化数据和相关系数

散点图和秩次图
在这里插入图片描述
在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import spearmanr
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成样本数据
np.random.seed(0)
x = np.random.randn(100)
y_linear = 2 * x + np.random.randn(100)  # 线性相关
y_nonlinear = np.sin(x) + np.random.randn(100) * 0.1  # 非线性相关

# 计算 Spearman 相关系数
spearman_corr_linear, _ = spearmanr(x, y_linear)
spearman_corr_nonlinear, _ = spearmanr(x, y_nonlinear)

print(f'Spearman 相关系数 (x, y_linear): {spearman_corr_linear}')
print(f'Spearman 相关系数 (x, y_nonlinear): {spearman_corr_nonlinear}')

# 可视化
plt.figure(figsize=(14, 6))

# 线性相关数据散点图
plt.subplot(1, 2, 1)
sns.scatterplot(x=x, y=y_linear)
plt.title(f'Linear Relationship\nSpearman 相关系数: {spearman_corr_linear:.2f}')
plt.xlabel('X')
plt.ylabel('Y')

# 非线性相关数据散点图
plt.subplot(1, 2, 2)
sns.scatterplot(x=x, y=y_nonlinear)
plt.title(f'Nonlinear Relationship\nSpearman 相关系数: {spearman_corr_nonlinear:.2f}')
plt.xlabel('X')
plt.ylabel('Y')

plt.tight_layout()
plt.show()

# 可视化秩次图
plt.figure(figsize=(14, 6))

# 线性相关数据秩次图
plt.subplot(1, 2, 1)
rank_x = pd.Series(x).rank()
rank_y_linear = pd.Series(y_linear).rank()
sns.scatterplot(x=rank_x, y=rank_y_linear)
plt.title(f'Rank Plot (Linear)\nSpearman 相关系数: {spearman_corr_linear:.2f}')
plt.xlabel('Rank of X')
plt.ylabel('Rank of Y')

# 非线性相关数据秩次图
plt.subplot(1, 2, 2)
rank_y_nonlinear = pd.Series(y_nonlinear).rank()
sns.scatterplot(x=rank_x, y=rank_y_nonlinear)
plt.title(f'Rank Plot (Nonlinear)\nSpearman 相关系数: {spearman_corr_nonlinear:.2f}')
plt.xlabel('Rank of X')
plt.ylabel('Rank of Y')

plt.tight_layout()
plt.show()

Spearman 相关系数主要应用于以下情况:

  1. 非线性单调关系:
    当两个变量之间存在非线性但单调的关系时,例如一个变量增加,另一个变量也增加(或减少),但不是线性关系。

  2. 异常值:
    数据集中存在异常值时,Spearman 相关系数对这些异常值不敏感,能提供更稳健的相关性度量。

  3. 非正态分布:
    当数据不符合正态分布时,Spearman 相关系数仍然可以提供有效的相关性度量。

  4. 序列数据:
    数据是有序但不连续的,例如排名数据或打分数据,适合使用 Spearman 相关系数。

进阶部分 公式的推导

假设有 n n n 个数据点,两个变量 X X X Y Y Y,各自的秩次分别为 R ( X i ) R(X_i) R(Xi) R ( Y i ) R(Y_i) R(Yi)。定义秩次差 d i = R ( X i ) − R ( Y i ) d_i = R(X_i) - R(Y_i) di=R(Xi)R(Yi)
1. 秩次差的平方和: ∑ i = 1 n d i 2 = ∑ i = 1 n ( R ( X i ) − R ( Y i ) ) 2 \sum_{i=1}^n d_i^2 = \sum_{i=1}^n \left( R(X_i) - R(Y_i) \right)^2 i=1ndi2=i=1n(R(Xi)R(Yi))2
2. 完全独立的秩次: X X X Y Y Y 完全独立时,秩次差 d i d_i di 是独立且均匀分布的随机变量。
3. 期望值的计算: 为了计算秩次差的平方和的期望,需要知道单个秩次差平方的期望。考虑两个秩次 R ( X i ) R(X_i) R(Xi) R ( Y i ) R(Y_i) R(Yi) 的差值 d i d_i di,可以使用以下步骤:
每个秩次 R ( X i ) R(X_i) R(Xi) R ( Y i ) R(Y_i) R(Yi) 都是从 1 到 n n n 的排列,因此可以看成是从集合 {1, 2, …, n} 中随机抽取的值。
可以把秩次差的期望值计算分成两个部分:

  1. 单个秩次差 d i d_i di 的均值和方差: 对于每一个 d i d_i di ,因为秩次是独立且均匀分布的,所以有: E ( d i ) = E ( R ( X i ) − R ( Y i ) ) = E ( R ( X i ) ) − E ( R ( Y i ) ) = n + 1 2 − n + 1 2 = 0 E(d_i) = E(R(X_i) - R(Y_i)) = E(R(X_i)) - E(R(Y_i)) = \frac{n+1}{2} - \frac{n+1}{2} = 0 E(di)=E(R(Xi)R(Yi))=E(R(Xi))E(R(Yi))=2n+12n+1=0

Var ( d i ) = Var ( R ( X i ) − R ( Y i ) ) = Var ( R ( X i ) ) + Var ( R ( Y i ) ) = 2 × Var ( R ) = 2 × ( n 2 − 1 ) 12 \text{Var}(d_i) = \text{Var}(R(X_i) - R(Y_i)) = \text{Var}(R(X_i)) + \text{Var}(R(Y_i)) = 2 \times \text{Var}(R) = 2 \times \frac{(n^2 - 1)}{12} Var(di)=Var(R(Xi)R(Yi))=Var(R(Xi))+Var(R(Yi))=2×Var(R)=2×12(n21)
其中 Var ( R ) = ( n 2 − 1 ) 12 \text{Var}(R) = \frac{(n^2 - 1)}{12} Var(R)=12(n21) 是秩次 R R R 的方差。因此, d i d_i di 的方差是: Var ( d i ) = n 2 − 1 6 \text{Var}(d_i) = \frac{n^2 - 1}{6} Var(di)=6n21

  1. 秩次差平方和的期望: 由于 d i d_i di 的均值为 0,方差为 n 2 − 1 6 \frac{n^2 - 1}{6} 6n21,所以 d i 2 d_i^2 di2 的期望是方差: E ( d i 2 ) = Var ( d i ) = n 2 − 1 6 E(d_i^2) = \text{Var}(d_i) = \frac{n^2 - 1}{6} E(di2)=Var(di)=6n21
    因此,秩次差平方和的期望 E ( ∑ d i 2 ) E\left(\sum d_i^2\right) E(di2) 为: E ( ∑ d i 2 ) = n ⋅ E ( d i 2 ) = n ⋅ n 2 − 1 6 = n ( n 2 − 1 ) 6 E\left(\sum d_i^2\right) = n \cdot E(d_i^2) = n \cdot \frac{n^2 - 1}{6} = \frac{n(n^2 - 1)}{6} E(di2)=nE(di2)=n6n21=6n(n21)

秩次的方差 解释 推导过程的12

假设有 n n n 个观测值,其秩次 R i R_i Ri 从 1 到 n n n 分布。秩次的方差可以通过以下步骤计算:

  1. 秩次的均值: 对于秩次 R i R_i Ri,其取值范围是 {1, 2, …, n}。均值为: E ( R ) = 1 + 2 + ⋯ + n n = n ( n + 1 ) / 2 n = n + 1 2 E(R) = \frac{1 + 2 + \cdots + n}{n} = \frac{n(n + 1) / 2}{n} = \frac{n + 1}{2} E(R)=n1+2++n=nn(n+1)/2=2n+1

  2. 秩次的方差: 秩次的方差 Var ( R ) \text{Var}(R) Var(R) 是: Var ( R ) = E ( R 2 ) − ( E ( R ) ) 2 \text{Var}(R) = E(R^2) - \left(E(R)\right)^2 Var(R)=E(R2)(E(R))2
    其中 E ( R 2 ) E(R^2) E(R2) 是所有秩次平方的均值,可以通过以下计算: E ( R 2 ) = 1 2 + 2 2 + ⋯ + n 2 n = n ( n + 1 ) ( 2 n + 1 ) 6 n = ( n + 1 ) ( 2 n + 1 ) 6 E(R^2) = \frac{1^2 + 2^2 + \cdots + n^2}{n} = \frac{n(n + 1)(2n + 1)}{6n} = \frac{(n + 1)(2n + 1)}{6} E(R2)=n12+22++n2=6nn(n+1)(2n+1)=6(n+1)(2n+1)

假如n=10
在这里插入图片描述 1 2 + 2 2 + ⋯ + n 2 = ( 2 n + 1 ) ( 1 + 2 + ⋯ + n ) 3 = n ( n + 1 ) ( 2 n + 1 ) 6 1^2+2^2+\cdots+n^2=\frac{(2n+1)(1+2+\cdots+n)}{3}=\frac{n(n+1)(2n+1)}{6} 12+22++n2=3(2n+1)(1+2++n)=6n(n+1)(2n+1)

import numpy as np
import matplotlib.pyplot as plt

#  implementation of the triangular arrangement based on the description
def create_correct_triangle(n):
    triangle = np.zeros((n, n), dtype=int)
    for i in range(n):
        triangle[i, :i+1] = i+1
    return triangle

# Create the  triangular arrangement for n=10
correct_triangle = create_correct_triangle(10)

# Plot the  triangular arrangement
plt.figure(figsize=(10, 10))
plt.imshow(correct_triangle, cmap='viridis', interpolation='nearest')
plt.colorbar(label='Number')

# Add text for each cell
for i in range(10):
    for j in range(i+1):
        plt.text(j, i, correct_triangle[i, j], ha="center", va="center", color="w")

# Set labels and title
plt.title(' Triangular Arrangement for Squares Sum')

plt.xlabel('Column')

plt.ylabel('Row')

plt.grid(False)

plt.show()

因此,秩次的方差为:
Var ( R ) = ( n + 1 ) ( 2 n + 1 ) 6 − ( n + 1 2 ) 2 \text{Var}(R) = \frac{(n + 1)(2n + 1)}{6} - \left(\frac{n + 1}{2}\right)^2 Var(R)=6(n+1)(2n+1)(2n+1)2

  1. 简化方差公式:
    通过对上式进行简化,得到:
    Var ( R ) = ( n + 1 ) ( 2 n + 1 ) 6 − ( n + 1 ) 2 4 \text{Var}(R) = \frac{(n + 1)(2n + 1)}{6} - \frac{(n + 1)^2}{4} Var(R)=6(n+1)(2n+1)4(n+1)2

继续简化:
Var ( R ) = ( n + 1 ) ( 2 n + 1 ) ⋅ 2 12 − ( n + 1 ) 2 ⋅ 3 12 = 2 ( n + 1 ) ( 2 n + 1 ) − 3 ( n + 1 ) 2 12 \text{Var}(R) = \frac{(n + 1)(2n + 1) \cdot 2}{12} - \frac{(n + 1)^2 \cdot 3}{12} = \frac{2(n + 1)(2n + 1) - 3(n + 1)^2}{12} Var(R)=12(n+1)(2n+1)212(n+1)23=122(n+1)(2n+1)3(n+1)2

展开并合并同类项:
Var ( R ) = 2 n 2 + 2 n + 2 n + 1 − 3 n 2 − 6 n − 3 12 = n 2 − 1 12 \text{Var}(R) = \frac{2n^2 + 2n + 2n + 1 - 3n^2 - 6n - 3}{12} = \frac{n^2 - 1}{12} Var(R)=122n2+2n+2n+13n26n3=12n21
最终得到秩次 R R R 的方差为: Var ( R ) = n 2 − 1 12 \text{Var}(R) = \frac{n^2 - 1}{12} Var(R)=12n21

秩次 R R R

秩次 R R R 是指在一组数据中,每个数据点的排名。假设有一组数据 X = { X 1 , X 2 , … , X n } X = \{X_1, X_2, \ldots, X_n\} X={X1,X2,,Xn},可以给每个数据点分配一个秩次 R ( X i ) R(X_i) R(Xi),表示它在数据集中的相对位置。例如,在数据集 X = { 3 , 1 , 4 , 1 , 5 } X = \{3, 1, 4, 1, 5\} X={3,1,4,1,5} 中,数据点的秩次 R R R 可以是 { 3 , 1.5 , 4 , 1.5 , 5 } \{3, 1.5, 4, 1.5, 5\} {3,1.5,4,1.5,5}(在有重复值时,取平均秩次)。

秩次差 d i d_i di

秩次差 d i d_i di 是两个变量的秩次之差。假设有两个变量 X X X Y Y Y,它们的秩次分别为 R ( X i ) R(X_i) R(Xi) R ( Y i ) R(Y_i) R(Yi)。那么秩次差 d i d_i di 定义为: d i = R ( X i ) − R ( Y i ) d_i = R(X_i) - R(Y_i) di=R(Xi)R(Yi)这是计算 Spearman 秩相关系数时的重要步骤。通过计算所有数据点的秩次差 d i d_i di,可以进一步计算秩次差的平方和,从而得出 Spearman 秩相关系数。

举例说明

假设有两个变量 X X X Y Y Y X = { 3 , 1 , 4 , 1 , 5 } X = \{3, 1, 4, 1, 5\} X={3,1,4,1,5} Y = { 2 , 3 , 4 , 3 , 6 } Y = \{2, 3, 4, 3, 6\} Y={2,3,4,3,6}
可以计算两个变量的秩次:

  • X X X 的秩次 R ( X ) = { 3 , 1.5 , 4 , 1.5 , 5 } R(X) = \{3, 1.5, 4, 1.5, 5\} R(X)={3,1.5,4,1.5,5}

  • Y Y Y 的秩次 R ( Y ) = { 1 , 2.5 , 3 , 2.5 , 4.5 } R(Y) = \{1, 2.5, 3, 2.5, 4.5\} R(Y)={1,2.5,3,2.5,4.5}
    然后计算秩次差 d i d_i di d = R ( X ) − R ( Y ) = { 3 − 1 , 1.5 − 2.5 , 4 − 3 , 1.5 − 2.5 , 5 − 4.5 } = { 2 , − 1 , 1 , − 1 , 0.5 } d = R(X) - R(Y) = \{3 - 1, 1.5 - 2.5, 4 - 3, 1.5 - 2.5, 5 - 4.5\} = \{2, -1, 1, -1, 0.5\} d=R(X)R(Y)={31,1.52.5,43,1.52.5,54.5}={2,1,1,1,0.5}

秩次差的方差

如前所述,秩次 R R R 的方差是: Var ( R ) = n 2 − 1 12 \text{Var}(R) = \frac{n^2 - 1}{12} Var(R)=12n21
而秩次差 d i d_i di 的方差是两个秩次方差的和: Var ( d i ) = Var ( R ( X ) ) + Var ( R ( Y ) ) = 2 × n 2 − 1 12 = n 2 − 1 6 \text{Var}(d_i) = \text{Var}(R(X)) + \text{Var}(R(Y)) = 2 \times \frac{n^2 - 1}{12} = \frac{n^2 - 1}{6} Var(di)=Var(R(X))+Var(R(Y))=2×12n21=6n21

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 01:12:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 01:12:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 01:12:02       58 阅读
  4. Python语言-面向对象

    2024-07-13 01:12:02       69 阅读

热门阅读

  1. 基于深度学习的文本分类

    2024-07-13 01:12:02       19 阅读
  2. VRRP虚拟路由器协议的基本概述

    2024-07-13 01:12:02       20 阅读
  3. ubuntu服务器部署vue springboot前后端分离项目

    2024-07-13 01:12:02       19 阅读
  4. c++二分算法

    2024-07-13 01:12:02       19 阅读
  5. try catch 解决大问题

    2024-07-13 01:12:02       20 阅读
  6. [C++]多态

    2024-07-13 01:12:02       23 阅读
  7. [Python学习篇] Python Socket网络编程

    2024-07-13 01:12:02       24 阅读
  8. 洛谷 P1506 拯救 oibh 总部

    2024-07-13 01:12:02       22 阅读
  9. 「AIGC」TDSQL技术详解

    2024-07-13 01:12:02       19 阅读