Pandas中有pandas.DataFrame.corr和pandas.Series.corr两个方法进行相关性的计算,第一个针对整个dataframe数据返回一个矩阵,第二个针对不同的column。下面对第二个方法的函数内容、使用方法以及重要的显著性检验三个方面进行介绍。
第一部分:相关性系数计算方法及相应函数介绍
Pandas函数:
Series.corr
(self, other, method='pearson', min_periods=None)[source]
参数:
otherSeries: 需要用来计算相关性的Series
method{‘pearson’, ‘kendall’, ‘spearman’} :用来计算相关性的方法,可以是这三种,或者其他的可调动函数,默认是皮尔森相关系数。
min_periodsint:可选参数,为了获得有效结果所需要的最小的观察数量
返回:float类型的相关系数
主要参数methods介绍:
- pearson correlation coefficient(皮尔逊相关性系数)。
常用的相关系数求法,采用协方差cov(X,Y)/标准差的乘积(σX, σY)。
数据要求: 线性数据、连续且符合正态分布;数据间差异不能太大;变量准差不能为0,即两变量中任何一个值不能都是相同。 - spearman correlation coefficient(斯皮尔曼秩相关性系数)。
根据原始数据的排序位置进行计算。
数据要求:用于解决称名数据和顺序数据相关的问题,适用于两列变量,而且具有等级变量性质具有线性关系的数据,能够很好处理序列中相同值和异常值。 - kendall correlation coefficient(肯德尔相关性系数)。
等级相关系数,适用于两个变量均为有序分类的情况
数据要求:肯德尔相关性系数,它也是一种秩相关系数,不过它所计算的对象是分类变量。
所以针对【连续、正态分布、线性】数据,采用pearson相关系数;针对【非线性的、非正态】数据,采用spearman相关系数;针对【分类变量、无序】数据,采用Kendall相关系数。一般来讲,线性数据采用pearson,否则选择spearman,如果是分类的则用kendall。
该部分内容部分参考https://blog.csdn.net/tcy23456/article/details/83910011
第二部分:Pandas包Series.corr()调用
import pandas as pd
x = [1,2,3,4,5]
y = [6,7,8,9,6]
df = pd.DataFrame({'x':x, 'y':y})
df
Out[138]:
x y
0 1 6
1 2 7
2 3 8
3 4 9
4 5 6
df.x.corr(df.y)
Out[139]: 0.24253562503633297
df.x.corr(df.y, method='spearman')
Out[140]: 0.20519567041703082
df.x.corr(df.y, method='kendall')
Out[141]: 0.31622776601683794
df.corr()
Out[142]:
x y
x 1.000000 0.242536
y 0.242536 1.000000
可以看出,构造出的数据采用顺序方法即Kendall相关系数最高。最后调用DataFrame.corr()可以得到一个相关性矩阵。
第三部分:显著性检验
显著性检验的目的是为了 将从样本中得到的结论推广到总体中,通过“小概率事件是不可能事件”这一原理进行推断。一般而言是对总体做出原假设,然后通过对随机的样本数据对原假设进行分析,判断其与原假设是否存在显著性的差异。
调用Python代码计算相关系数是非常简单的,但是如果没有显著性检验,那么所得的结果是没有意义的。不方便的是pandas内嵌的函数中不提供p值的统计,需要采用其他的统计软件包。
在对相关性检验前,需要先画一个散点图,看看两个变量是否具有线性关系。关于方差齐性的问题,采用 stats.levene() 方法进行检验。如果同方差性结果不满足的话,则不能采用pearson 这总参数性的方法,需要采用separsman或者是Kendall这两种非参数性的方法进行计算。
在scipy这一个统计包中,采用scipy.stats.spearmanr()等函数可以直接获得相关系数以及双边检验的P值。
correlation, p-value = scipy.stats.pearsonr(x, y)
correlation, p-value = scipy.stats.spearmanr(x, y)
correlation, p-value = scipy.stats.kendalltau(x, y)
采用这种方法,可以直接得到相关系数和P值,如下所示:
import scipy
import pandas as pd
x = [1,2,3,4,5]
y = [6,7,8,9,6]
df = pd.DataFrame({'x':x, 'y':y})
df
Out[138]:
x y
0 1 6
1 2 7
2 3 8
3 4 9
4 5 6
scipy.stats.pearsonr(x, y)
Out[144]: (0.24253562503633297, 0.6942488516293593)
scipy.stats.spearmanr(x, y)
Out[145]: SpearmanrResult(correlation=0.20519567041703082, pvalue=0.7405819415910722)
scipy.stats.kendalltau(x, y)
Out[146]: KendalltauResult(correlation=0.31622776601683794, pvalue=0.44848886103153185)
虽然看着相关性系数达到了0.3, P-value高达0.4,所以结果是不显著的。
附录
在网上搜到了一些关于相关性计算方法对数目要求的描述,对相关性的检验描述非常详细,下面截取部分内容:
Pearson correlation assumptions
Pearson correlation test is a parametric test that makes assumption about the data. In order for the results of a Pearson correlation test to be valid, the data must meet these assumptions:
1. The sample is independently and randomly drawn. 【正态】
2. A linear relationship between the two variables is present【线性】
3. When plotted, the lines form a line and is not curved【成对】
4. There is homogeneity of variance【方差齐性】
The variables being used in the correlation test should be continuous and measured either on a ratio or interval sale, each variable must have equal number of non-missing observations, and there should be no outliers present.【无异常值、缺失个数一致、变量连续】
Spearman Rank correlation assumptions
The Spearman rank correlation is a non-parametric test that does not make any assumptions about the distribution of the data. The assumption for the Spearman rank correlation test is:
There is a monotonic relationship between the variables being tested【单调性】
A monotonic relationship exists when one variable increases so does the other
For the Spearman rank correlation, the data can be used on ranked data, if the data is not normally distributed, and even if the there is not homogeneity of variance.
Kendall’s Tau correlation assumptions
The Kendall’s Tau correlation is a non-parametric test that does not make any assumptions about the distribution of the data. The only assumption is:
There should be a monotonic relationship between the variables being tested【单调性】
The data should be measured on either an ordinal, ratio, or interval scale.