皮尔逊Pearson相关系数python代码实现

皮尔逊相关系数简介

wiki介绍

皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,缩写:PPMCC,或PCCs,有时简称相关系数)用于度量两组数据的变量X和Y之间的线性相关的程度。它是两个变量的协方差(Cov)与其标准差(std)的乘积之比; 因此,它本质上是协方差的归一化度量,因此结果始终具有介于-1和1之间的值

我们在数学建模中经常用样本值去估计总体数值,所以有些时候会运用样本协方差去作为总体协方差。

皮尔逊系数的计算公式

皮尔逊相关系数的目的是剔除了自变量和因变量的量纲影响,而且是X,Y标准化之后的协方差。

皮尔逊Pearson相关系数python代码实现_第1张图片

补充

协方差

协方差主要用于看X和Y之间的变化程度,即为如果两者在一定区间内变化趋势为相同或者相近的时候,cov(x,y)取正,相反取负。而且协方差一般用于研究趋势,不用于比较。

皮尔逊Pearson相关系数python代码实现_第2张图片

标准差

标准差主要是方差的平方根,而且主要用于去除量纲的影响,而且标准差能反映一个数据集的离散程度。

方法局限性

与协方差本身一样,该度量只能反映变量的线性相关性,而忽略了许多其他数据类型的关系或相关性。

皮尔逊系数应用条件

  1. 线性相关性

首先我们应该先确定自变量因变量之间具有线性相关性,之后我们再去根据皮尔逊系数去估计他们的先行相关性的程度。我们这里的线性相关性主要指的是广义的线性相关性。而不是(x,y之间的简单相关性),(取对数之后也认为具有线性相关性)

我们一般还会通过t检验等进行皮尔逊相关系数检验,然而t检验等方法需要数据符合正态分布,所以我们第二个条件为符合正态分布。

  1. 数据符合正态分布

正态分布检验主要分JB检验(大样本 n>30)和Shapiro-wilk夏皮洛-威尔克检验(小样本3<=n<=50),后续会讲到

  1. 数据需要成对存在

因变量和自变量一般要求一一对应,不能有缺失值

  1. 无异常值

数据不应该出现极端值或者异常值

  1. 数据为数值类型变量

这里的意思即为数据必须是区间或比例变量,简言之即为可以直接比较数据大小的变量(比如温度,15摄氏度比10摄氏度大)。而且比如(甲乙丙丁)()不属于区间或者比例数据。

皮尔逊系数计算实现代码

import pandas
import pandas as pd
from scipy.stats import pearsonr
# 计算皮尔逊相关系数矩阵
def calculate_pearson_correlation(data):
    data = pandas.DataFrame(data)
    correlations = data.corr(method='pearson')
    return correlations
def GetPvalue_Pearson(x,y):
    return pearsonr(x,y)[1]
# 返回的是相关系数检验P值矩阵
def calculate_person_correlation_P(data):
    data = pd.DataFrame(data)
    return data.corr(method=GetPvalue_Pearson)

皮尔逊系数检验

常规方法

皮尔逊系数r的检验我们主要分为以下三步,

  1. 首先提出原假设H0和备择假设H1(而且H1和H0为互斥关系)

H0:皮尔逊相关系数为0,H1:皮尔逊相关系数不为0。
  1. 假设原假设成立(条件),我们构造符合自由度为(n(样本数)-2)的t分布统计量,而且t的公式如图所示。

备注:r为计算得知的皮尔逊系数,n为样本数,t为检验值

  1. 我们画出分布的概率密度函数pdf,而且给定默认置信水平(一般为95%),确定接受域和拒绝域,而且一般默认为双侧检验,最后我们根据查T分布表得知临界值(上网找T分布的临界值即可)

网址如下:t分布表:https://wenku.baidu.com/view/d94dbd116bd97f192279e94a.html

P值检验法

我们用scipy方法取得P值矩阵,之后我们根据置信水平(95%)得知是否能够拒绝原假设即可。

结论:若P值大于0.05,证明不能够拒绝原假设,即为皮尔逊系数为0。与此同理可得P值小于0.05,能够拒绝原假设,即为皮尔逊系数不为0。

文中采取的方法为此种,代码如下。

def GetPvalue_Pearson(x, y):
    # pearsonr()返回的第一个皮尔逊系数,第二个为皮尔逊系数在执行水平为0.95条件之下的P值
    return pearsonr(x, y)[1]
# 返回的是相关系数检验P值矩阵
def calculate_person_correlation_P(data):
    data = pd.DataFrame(data)
    return data.corr(method=GetPvalue_Pearson)

参考

https://blog.csdn.net/qq_43779658/article/details/107783184

你可能感兴趣的:(数据挖掘,数据分析)