常用的相关系数为 Pearson、Spearman、Kendall,在 python 中有多种计算相关系数的方法,
numpy,pandas,scipy 库中均可以计算相关系数,但用法存在较大区别,通过以下例子说明
假设有以下两个矩阵 data_temp1、data_temp2,两个向量 data_vector1、data_vector2
1、numpy.corrcoef()
numpy.corrcoef(x, y=None, rowvar=True, dtype=None)
返回 Pearson 相关系数矩阵
x:一维数组或者二维矩阵。x的每一行代表一个变量,每一列代表变量的观察值,不可省略
y:默认 None,额外的变量和观察值,形状与 x 相同,可省
rowvar:默认 True,为 Ture 时表示“每一行代表一个变量”,为 False 时表示“每一列代表一个变量”,可省
dtype:默认 None,结果的数据类型,默认至少为 numpy.float64 的精度,可省
注意:由于浮点舍入,结果可能不是Hermitian矩阵,结果对角线元素可能不是1,元素可能不满足 abs(a) <= 1。为试图改变这种情况,实部和虚部被裁减到区间[-1, 1],但在复杂情况下可能没什么作用。
结果可见,numpy.corrcoef() 始终返回的是变量之间相关系数的矩阵,
比如,对于同时传入矩阵 data_temp1、data_temp2,计算任意一对变量间的 Pearson 相关系数
比如,对于同时传入向量 data_vector1、data_vector2,返回 2 * 2 的矩阵
缺点:仅能计算 Pearson 相关系数,且不提供p值
2、pandas.DataFrame.corr(),pandas.DataFrame.corrwith() 和 pandas.Series.corr()
(1)pandas.DataFrame.corr(method='pearson', min_periods=1)
计算 DataFrame 对象列之间的相关性,返回相关系数矩阵,排除NA和缺失值
method:默认 pearson,需要计算的相关系数类型,可选 kendall,spearman;或可选 callable,当输入两个1d数组并返回一个float就可以选择调用,是版本0.24.0中的新功能,请注意,corr返回的矩阵在对角线上有1,并且无论可调用的行为如何,都是对称的
min_periods:默认1,为获得有效结果,每对列所需的最小观察数,目前只适用于 Pearson 和 Spearman 相关系数
(2)pandas.DataFrame.corrwith(other, axis=0, drop=False, method='pearson')
计算成对的相关性,返回的是Series
即计算 DataFrame 的行或列与 其他Series 或 DataFrame 对象的行或列的成对相关性;计算之前 DataFrame 会先沿轴对齐
other:用于计算相关的其他 Series 或 DataFrame 对象
axis:默认0,表示计算列之间的相关系数;可选0或‘index’以计算列之间的相关性,1或‘columns’以计算行之间的相关性
drop:默认 False,从结果删除缺失的索引
method:默认 pearson,需要计算的相关系数类型,可选 kendall,spearman;或可选 callable,当输入两个1d数组并返回一个float就可以选择调用,是版本0.24.0中的新功能
以上例子计算的是 data_temp1、data_temp2 对应列的相关性
(3)pandas.Series.corr(other, method='pearson', min_periods=None)
计算与其他 Series 对象的相关系数,排除缺失值
other:用于计算相关系数的 Series 对象
method:默认 pearson,需要计算的相关系数类型,可选 kendall,spearman;或可选 callable,当输入两个1d数组并返回一个float就可以选择调用,是版本0.24.0中的新功能,请注意,corr返回的矩阵在对角线上有1,并且无论可调用的行为如何,都是对称的
min_periods:默认 None,为获得有效结果所需的最小观察数,可选参数
缺点:不提供p值
3、scipy.stats.pearsonr(),scipy.stats.spearmanr() 和 scipy.stats.kendalltau()
(1)scipy.stats.pearsonr(x, y)
计算 Pearson 相关系数和对应p值,返回 相关系数和p值组成的元组
x:输入array,不可省
y:输入array,不可省
(2)scipy.stats.spearmanr(a, b=None, axis=0, nan_policy='propagate')
计算 Spearman 相关系数和对应p值,返回 Spearman 相关系数矩阵或单个值
a:一维或二维数组,不可省
b:一维或二维数组,可省
axis:默认0,表示每一列是一个变量;如果为1,表示每一行是一个变量;如果为None,都包含
nan_policy:默认 propagate,还可选raise或omit,表示对输入nan值的处理策略;propagate返回nan,raise报错,omit则计算前忽略nan值
计算任意两个变量间的相关性,传入 data_temp1、data_temp2 也是如此
(3)scipy.stats.kendalltau(x, y, nan_policy='propagate', method='auto', variant='b')
计算 Kendall 相关系数及对应p值
x: 表示排序的array,如果不是一维,则会先扁平化到一维
y:表示排序的array,如果不是一维,则会先扁平化到一维
nan_policy:默认 propagate,还可选raise或omit,表示对输入nan值的处理策略;propagate返回nan,raise报错,omit则计算前忽略nan值
method:默认 auto,还可选asymptotic或exact,确定如何计算p值;auto自动选择方法,折中考虑速度和准确率;asymptotic使用面向大样本的逼近方法;exact计算精确p值,随着样本增加计算时间可能会增加,精度会下降
variant:默认b,还可选c,确定返回tau值的哪种变体
缺点:三种相关性接口不统一,且 Pearson 和 Kendall 不能接受矩阵输入