公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

这两周在看一本书《特征工程入门与实践》,对自己很有启发。

特征工程是数据工作者建模过程中极其重要的一步,如何从众多的特征中找到或者选择与目标具有高强相关的特征显得尤为重要。

本书中有提到相关系数,自己看了很多的资料,整理出这篇文章,希望对大家有所帮助。

何为相关系数

相关系数,也叫做关联系数(英语为:correlation coefficient),它是由统计学家卡尔.皮尔逊设计的一个统计指标,我们最常用的也是Person皮尔逊相关系数。相关系数描述的是两个变量之间的关系及相关方向。但是相关系数无法确切地表明两个变量之间相关的程度。

相关系数的取值在-1到1之间:

  • -1表示两个变量呈现负相关
  • 0表示两个变量没有相关性
  • 1表示两个变量呈现正相关

最后,相关系数是统计学中的一个概念,统计学你应该怎么入门?Peter建议你参考下面的这张图:

3种常见相关系数

** Pearson 相关系数、Spearman 相关系数、Kendall 相关系数并称统计学三大相关系数。

在分析特征相关性的时候,最常用的方法是pandas.DataFrame.corr:

DataFrame.corr(self, method=’pearson’, min_periods=1)

其中包含的方法主要为:

  • pearson:Pearson相关系数
  • Spearman:Spearman等级相关系数
  • kendall:Kendall秩相关系数

Person相关系数

Person相关系数也叫简单相关系数或者线性相关系数,用来检测两个连续型变量之间的线性相关程度。

总体的Person相关系数用ρ\rhoρ表示,计算公式为

ρx,y=cov⁡(x,y)σxσy=E[(x−μx,y−μy)]σxσy\rho_{x, y}=\frac{\operatorname{cov}(\boldsymbol{x}, \boldsymbol{y})}{\sigma_{x} \sigma_{y}}=\frac{E\left[\left(\boldsymbol{x}-\mu_{x}, \boldsymbol{y}-\mu_{y}\right)\right]}{\sigma_{x} \sigma_{y}}ρx,y​=σx​σy​cov(x,y)​=σx​σy​E[(x−μx​,y−μy​)]​

或者为:

ρX,Y=E(XY)−E(X)E(Y)E(X2)−(E(X))2E(Y2)−(E(Y))2\rho_{X, Y}=\frac{E(X Y)-E(X) E(Y)}{\sqrt{E\left(X^{2}\right)-(E(X))^{2}} \sqrt{E\left(Y^{2}\right)-(E(Y))^{2}}}ρX,Y​=E(X2)−(E(X))2​E(Y2)−(E(Y))2​E(XY)−E(X)E(Y)​

样本的Person相关系数用字母r表示,用来度量两个变量间的线性关系,计算公式为:

r(X,Y)=Cov⁡(X,Y)Var⁡[X]Var⁡[Y]r(X, Y)=\frac{\operatorname{Cov}(X, Y)}{\sqrt{\operatorname{Var}[X] \operatorname{Var}[Y]}}r(X,Y)=Var[X]Var[Y]​Cov(X,Y)​

表示的是:用两个变量的协方差除以两个变量标准差的乘积

  • Cov(X,Y):表示的是协方差
  • Var[X]:表示的是方差,开根号之后就变成了标准差

⚠️总结:两个变量之间的Pearson相关系数定义为两个变量之间的协方差标准差的商

Spearman相关系数

Spearman相关系数是以以查尔斯·爱德华·斯皮尔曼命名的斯皮尔曼等级相关系数。通常用希腊字母ρ\rhoρ表示,Spearman相关系数也被定义成等级变量间的Person相关系数。

计算公式为:

ρ=∑i(xi−xˉ)(yi−yˉ)∑i(xi−xˉ)2∑i(yi−yˉ)2\rho=\frac{\sum_{i}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{\sqrt{\sum_{i}\left(x_{i}-\bar{x}\right)^{2} \sum_{i}\left(y_{i}-\bar{y}\right)^{2}}}ρ=∑i​(xi​−xˉ)2∑i​(yi​−yˉ​)2​∑i​(xi​−xˉ)(yi​−yˉ​)​

实际应用中,变量间的连结是无关紧要的,于是可以通过简单的步骤计算ρ。被观测的两个变量的等级的差值,则ρ为:

ρ=1−6∑di2n(n2−1)\rho=1-\frac{6 \sum d_{i}^{2}}{n\left(n^{2}-1\right)}ρ=1−n(n2−1)6∑di2​​

其中,n表示数据点的个数,did_idi​表示数据点(xi,yi)(x_i,y_i)(xi​,yi​)的秩次(rxi,ryi)(r_{xi},r_{yi})(rxi​,ryi​)的差值:di=rxi−ryid_i=r_{xi}-r_{yi}di​=rxi​−ryi​

有了Person相关系数,为什么还要有Spearman相关系数?Person相关系数有一定的局限性**:第一是变量必须是连续型,第二必须服从正态分布**

Spearman相关系数只关心变量的单调关系,不考虑具体数值的影响,还能够容忍异常值,一般情况下能够用Person相关系数的地方都能够用Spearman系数。

快速理解秩次和秩和

下面有AB两组数据,如何求秩次与秩和?

1、按照顺序排列ABL两组数据:

2、标记它们的次序,也就是秩次。如果两个值相同则取次序的均值

3、秩和就是秩次之和:

A:3.5 + 5 + 8 + 9 + 10 = 35.5

B:1 + 2 + 3.5 + 6 + 7 = 19.5

特殊情况:当两个变量有重复的数据,则计算变量之间的Spearman相关系数就是计算变量数据秩次之间的Person相关系数:

ρs=ρrx,ry=cov⁡(rx,ry)σrxσry\rho_{s}=\rho_{r_{x}, r_{y}}=\frac{\operatorname{cov}\left(r_{x}, r_{y}\right)}{\sigma_{r_{x}} \sigma_{r_{y}}}ρs​=ρrx​,ry​​=σrx​​σry​​cov(rx​,ry​)​

其中:rxr_xrx​表示变量x转换后的秩次。从上面的定义能够看出来,Spearman 相关系数实际上就是对数据做了秩次变换后的 Pearson 相关系数

Kendall秩相关系数

Kendall秩相关系数是一种秩相关系数,是用来度量两个有序变量之间单调关系强弱的相关系数,它的取值范围在-1到1之间。其绝对值越大,表示单调相关性越强,取值为 0 时表示完全不相关。Kendall系数通常用希腊字母τ\tauτ(tau)表示。

分类变量可以理解成有类别的变量,可以是无序的,比如:性别(男女);也可以是有序的,比如成绩:优、良、中、差。

通常情况下都是求有序分类变量的相关系数

如何求解Person相关系数

在这里我们分别介绍多种基于Python或者第三方库求解Person相关系数的方法。Person相关系数还是使用的较为频繁。

导入库

import pandas as pd
import numpy as np
import math
import random

模拟数据

模拟一份简单的数据,包含两个列(变量)

方法1:基于pandas

pandas库有一个函数corr(),我们可以直接求解变量中数值类型变量两两之间的相关系数。

在下面的结果中,我们看到:

  • 主对角线的系数都是1,自身与自身的相关系数肯定都是1
  • 副对角线的相关系数肯定是相同的

corr函数有个参数method,指定不同的值,我们就可以求解不同的相关系数,默认是Pearson系数,下面指定参数的值:

方法2:基于Python自定义函数

1、先求两个变量的均值

2、求出xy期望值

3、xy协方差系数

根据上面的结果求出xy的协方差系数:

4、求出xy的标准差

5、求解Person系数

协方差除以标准差就是Person系数

方法3:基于Numpy

Numpy库中有个函数corrcoef能够直接求解两个变量间的相关系数,返回的array数组。主对角线上的值都是1(自身和自身的相关性为1),副对角线都是两两不同变量间的相关系数:

方法4:基于Scipy

Scipy也是python的强大数据计算库,里面有个pearsonr函数也能够求解pearson相关系数。

该函数返回两个值:第一个表示Person相关系数,第二个表示p-value。

p值小于0.05,小于显著性水平,则认为两个变量是相关的

案例实战

1、我们先模拟一份数据:ABCDE为5个变量,cat是最后的类别(取值在0和1之间选择一个)

import random# 模拟一份数据:5个类+1个特征
df1 = pd.DataFrame({"A":np.random.randint(1,5,20),"B":np.random.randint(4,10,20),"C":np.random.randint(3,6,20),"D":np.random.randint(22,50,20),"E":np.random.randint(15,60,20),"cat":np.random.randint(0,2,20),},index=list(range(20)))
df2 = np.array(df1)

2、计算特征和类的均值

 # 计算数据中特征和类的平均值def calcMean(x,y):"""作用:计算特征和类的平均值参数:x:类的数据y:特征的数据返回值:特征和类的平均值"""x_sum = sum(x)y_sum = sum(y)n = len(x)x_mean = float(x_sum) / ny_mean = float(y_sum) / n  return x_mean,y_mean  # 返回均值

3、计算pearson系数

def calcPearson(x,y):x_mean, y_mean = calcMean(x,y)  # 调用上面的函数返回均值n = len(x)sumTop = 0.0sumBottom = 0.0x_pow = 0.0y_pow = 0.0# 计算协方差for i in range(n):sumTop += (x[i] - x_mean) * (y[i] - y_mean) # 计算标准差for i in range(n):x_pow += math.pow(x[i] - x_mean, 2)for i in range(n):y_pow += math.pow(y[i] - y_mean ,2)sumBottom = np.sqrt(x_pow * y_pow)  p = sumTop / sumBottom  # 协方差 / 标准差return p

4、计算每个属性的贡献度

def calcAttribute(dataSet):prr = []  # 空列表待追加数据n,m = np.shape(dataSet)  # 获取行数和列数x = [0] * n  # 初始化特征x和类别向量yy = [0] * nfor i in range(n):y[i] = dataSet[i][m-1]  # 得到全部的类别向量for j in range(m-1):for k in range(n):x[k] = dataSet[k][j]prr.append(calcPearson(x,y))  # 计算每个特征和类别y的相关系数,存入列表return prr

5、计算结果

prr = calcAttribute(df2)
prr# 结果
[-0.12335134242111898,-0.05860090386731199,-0.39038619785678985,-0.14989060907230156,-0.03952841713829405]

下面描述的是每个变量和类别cat之间的相关系数大小:

6、通过pandas中的corr函数能够直接显示Pearson相关系数,返回值就是各变量之间的相关系数DataFrame表格。

  • 对角线的相关系数都是1
  • 最后一行表示的就是每个变量和类别cat的相关系数(和上面自定义函数计算的结果相同)

同时,我们还可以查看任意两个变量之间的相关性:

参考资料

1、常用的特征选择方法之 Pearson 相关系数:https://guyuecanhui.github.io/2019/07/20/feature-selection-pearson/

2、怎么理解秩次与秩和:https://blog.csdn.net/weixin_42159940/article/details/86293441

3、相关性分析:Pearson、Kendall、Spearman:https://www.biaodianfu.com/pearson-kendall-spearman.html

统计学知识:相关系数相关推荐

  1. 数据分析必备的统计学知识(一)

    数据分析师的必备技能栈里,除了熟悉业务.掌握业务分析思维和工具外,还有一个特别重要的知识点,就是统计学,无论在简历的技能描述中还是实际的面试过程中,统计学都是必备的基础知识. 为什么对于数据分析师来说 ...

  2. [数据分析自学帮手]数据分析必备的统计学知识大梳理,还不赶紧收藏?

    目录 写在前面的话 今天的主题是数据分析要用到的统计学知识 如何学到统计学知识? 概率与概率分布 样本空间 随机事件 概率 概率分布 用图表演示数据 1.数据类型 2.统计表 3.统计图 数据的概括性 ...

  3. 【思维导图】统计学知识大梳理

    统计学(statistics):****收集.处理.分析.解释数据并从数据中得出结论的科学. 描述统计(descriptive statistics):研究数据收集.处理和描述的统计学方法. 推断统计 ...

  4. 关于数据分析用到的统计学知识

    需要了解和掌握的统计学知识如下: 基本统计量:均值.中位数.众数.百分位数.极值等 其他描述性统计量:偏度.方差.标准差.显著性等 其他统计知识:总体和样本.参数和统计量.ErrorBar 概率分布与 ...

  5. 统计学知识大梳理(三)

    统计量及其抽样分布 抽样容易理解,抽样分布不容易理解. 抽样是从整个研究中抽取一部分个体作为我们真正的研究对象.我们可以简单地把样本理解为整体的一个子集,并通过样本的结果来推断整体情况.例如,我们想知 ...

  6. 数据分析入门需要了解的统计学知识【持续更新】

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我或者我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 最近一直 ...

  7. 皮尔森(Pearson correlation coefficient)相关系数—统计学三大相关系数之一

    概述 皮尔森相关系数也称皮尔森积矩相关系数(Pearson product-moment correlation coefficient) ,是一种线性相关系数,是最常用的一种相关系数.记为r,用来反 ...

  8. 学好这些统计学知识,帮你入门数据分析

    前言 数据分析是目前数据时代的热门方向,统计学又是数据分析必备的基础知识. 本文简单总结了一下需要的统计学知识. 基础的统计学知识 1.集中趋势(Central Tendency) 2.变异性(Var ...

  9. 朴实无华之一万字统计学知识大梳理

    来源:海豚数据科学实验室 编辑:王萌(深度学习冲鸭公众号) 著作权归作者所有,本文仅作学术分享,若侵权,请联系后台删文处理 道德经云:"道生一,一生二,二生三,三生万物".学习知识 ...

最新文章

  1. Mono源代码学习笔记:Console类(四)
  2. 百度AI快车道—企业深度学习实战营,推荐系统主题专场即将开课
  3. 错误传播 --try{}catch(e){console.log(e)}
  4. arraylist线程安全吗_Java的线程安全、单例模式、JVM内存结构等知识梳理
  5. linux make命令实现,Linux make命令主要参数详解
  6. 信息学奥赛一本通(1095:数1的个数)
  7. linux创建脚本文件auto,linux 自动化部署脚本
  8. Flutter 初尝:从 Java 无缝过渡,java开发面试笔试题
  9. 被单位开除,已经交了14年的养老保险,该怎么办?
  10. 为何手机厂商如此热衷 5G?
  11. centos7 如何重启web服务_如何重启web服务器
  12. 台大李宏毅Machine Learning 2017Fall学习笔记 (6)Logistic Regression
  13. 体育馆预约系统java_基于SSM框架下的JAVA体育场地预约系统
  14. iOS中文字体斜体效果
  15. 【STM32】 色环电阻
  16. ADP(自适应动态规划)-值迭代
  17. 地表最强超融合 | 揭开VxRail“隐秘的角落”
  18. 小程序流量主怎么赚钱?小程序流量主怎么变现?
  19. python3 规则引擎_Ilog、Drools、Jess规则引擎的Rule Language 对比
  20. 5.3. 虚拟存储管理------页面置换算法

热门文章

  1. 浅谈Retrofit封装-让框架更加简洁易用
  2. 手动档科目三考试过程
  3. 初中计算机科目三必背,驾校科目三路考必背要点口诀(教练整理)
  4. 实时数据库 - 笔记
  5. ARM:你从未听说过的英国最成功的科技公司
  6. 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了
  7. Java电商平台-电商订单系统全解析
  8. Payoneer取人民币全过程(ATM)
  9. 信号完整性可能遇见的五类问题
  10. 用Python批量操作文件