皮尔逊相关系数与斯皮尔曼等级相关系数
一、皮尔逊相关系数(Pearson)
假设有两个变量X、Y,那么两变量间的皮尔逊相关系数可通过以下公式计算:
其中E是数学期望,cov表示协方差.
适用范围:
当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:
(1)、两个变量之间是线性关系,都是连续数据。
(2)、两个变量的总体是正态分布,或接近正态的单峰分布。
(3)、两个变量的观测值是成对的,每对观测值之间相互独立。
def mean(x):#期望 return sum(x)/len(x) def de_mean(x): x_bar = mean(x) return [x_i - x_bar for x_i in x] # 辅助计算函数 dot product 、sum_of_squares def dot(v, w): return sum(v_i * w_i for v_i, w_i in zip(v, w)) def sum_of_squares(v): return dot(v, v) # 方差 def variance(x): n = len(x) deviations = de_mean(x) return sum_of_squares(deviations) / (n - 1) # 标准差 import math def standard_deviation(x): return math.sqrt(variance(x)) # 协方差 def covariance(x, y): n = len(x) return dot(de_mean(x), de_mean(y)) / (n -1) # 相关系数 def correlation(x, y): stdev_x = standard_deviation(x) stdev_y = standard_deviation(y) if stdev_x > 0 and stdev_y > 0: return covariance(x, y) / stdev_x / stdev_y else: return 0
二、斯皮尔曼等级相关系数(Spearman Rank)
假设两个长度为N的向量X和Y,即X和Y中包含N个元素,计算两个向量X和Y的相关性,可以根据以下步骤计算:
step1:将两个列向量X和Y对应的元素Xi和Yi转换为在各自列向量中的排名,记为R(Xi)和R(Yi)
step2: 根据下面公式,计算两个列向量X和Y中对应元素的R(Xi)和R(Yi) 之间的差异d,并相加
step3:最后,根据下面公式计算出两个列向量之间的相关性Rs
适用范围
斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。
#序列:Series 用于存储一行或者一列的数据,以及与之相关的索引集合 #(类似于列表,但是有索引) import pandas as pd import numpy as np #原始数据 X1=pd.Series([1, 2, 3, 4, 5, 6]) Y1=pd.Series([0.3, 0.9, 2.7, 2, 3.5, 5]) #处理数据删除Nan x1=X1.dropna() y1=Y1.dropna() n=x1.count() x1.index=np.arange(n) y1.index=np.arange(n) #分部计算 d=(x1.sort_values().index-y1.sort_values().index)**2 dd=d.to_series().sum() p=1-6*dd/(n*(n**2-1)) r=x1.corr(y1,method='spearman') print(r,p) #0.942857142857143 0.9428571428571428