统计科学之聊聊你知道和不知道的相关性系数

CodeCosmicRover
• 阅读 2391

01

这一篇我们来聊聊大家平常比较常用的相关系数。相关系数是用来度量两个变量之间相关性大小的一个量化指标。比如你要判断啤酒和尿布之间是否有相关性,就可以计算这两个变量的相关系数,通过相关系数来判断两者的相关性大小。相关系数主要有三种:Pearson相关系数、Spearman秩相关系数和Kendall τ相关系数。皮尔逊(Pearson)相关系数大家应该都知道,也应该有用到过。但是秩相关(Spearman)系数和τ相关(Kendall)系数大家或许不知道。我们这一篇就来聊聊这三个系数。

02

第一个讲的是大家熟悉的皮尔逊相关系数,在讲皮尔逊相关系数前,我们先讲一下另外一个概念,协方差。协方差是用来表示两个变量总体的误差,而方差是用来只表示一个变量的误差。协方差的公式如下:
统计科学之聊聊你知道和不知道的相关性系数

协方差除了表示两个变量总体的误差以外还用来表示两个变量之间的相关性,为什么协方差可以表示两个变量之间的相关性呢?我们需要从协方差的公式入手。通过上面公式中我们可以看出,协方差等于两个变量各自与均值之差的乘积和。

如果变量X与其均值的大小关系与变量Y完全一致,即变量X和Y的值要么同时大于均值要么同时小于均值,那这个时候得到的协方差全为正数,且协方差值达到最大;如果变量X与其均值的大小关系与变量Y刚好相反,即变量X大于其均值的时候变量Y刚好小于其均值,这个时候得到的协方差全为负数,且协方差值达到最小;如果变量X与其均值的大小关系与Y变量Y值部分一致,两者的乘积会有正有负,这个时候得到的协方差值就是介于最大值和最小值之间。X和Y变量的三种情况如下图所示:
统计科学之聊聊你知道和不知道的相关性系数

协方差比较容易受到量纲的影响,什么是量纲呢,就是单位,比如年龄和身高就不是一个单位,当X和Y变量的量纲之间的差别很大时,就会对协方差结果产生很大影响。下图中,左右两边的X和Y的趋势基本都一致,但是因为量纲不同(看纵坐标值),所以最后算出来的协方差会相差很大。
统计科学之聊聊你知道和不知道的相关性系数

下表为上图中用到的数据集,感兴趣的同学可以根据公式自己计算下:
统计科学之聊聊你知道和不知道的相关性系数

那对于上面这种不同量纲的影响我们该怎么办呢?明明趋势一致,但是算出来的协方差值会相差很大。什么原因导致的,我们就用什么方法解决。协方差差别很大的原因主要是因为量纲不同的原因引起的,那我们针对变量进行去量纲处理就行,怎么去量纲呢?就是在协方差的基础上再除以各自变量的标准差,这样就可以消除不同量纲的影响,具体公式如下:
统计科学之聊聊你知道和不知道的相关性系数

上面这个公式就是相关系数的公式,也就是我们常用的皮尔逊相关系数,这个系数的取值在[-1,1]之间,当值大于0说明两个变量是正相关,且值越接近于1,相关程度越强;当值小于0说明两个变量是负相关,且值越接近于-1,相关程度越强。

协方差不仅会受量纲的影响,还会受到异常值的影响,如果有异常值会拉高或拉低平均值,导致最后算出来的结果会有偏差。

03

讲完了皮尔逊相关系数,我们再来看看秩相关(Spearman)系数。

我们前面讲过皮尔逊系数容易受到异常值的的影响,过高和过低的值都会导致最后的结果有偏差,那有没有一种方法可以避免这种情况呢?答案就是我们这节要讲的秩相关(Spearman)系数,为什么这个可以避免异常值的影响呢?是因为这种方法没有使用变量的绝对值,而是使用了变量中绝对值出现的顺序,顺序就是将所有的变量值从小到大进行排序编号就行,是不是很有效。秩相关(Spearman)系数的公式如下:
统计科学之聊聊你知道和不知道的相关性系数

04

秩相关(Spearman)系数是用变量里面各值对应的顺序来代替原变量值的,还有另外一种类似的秩相关系数,叫做 Kendall τ秩相关系数。这种相关系数的方法也是利用变量值出现的顺序,但是与Spearman相关系数略有不同。具体求取方法为:先将变量X进行升序排列,然后再对变量Y从第一个开始,依次往后进行两两比较,最后看随着X的增大变量Y增大的值有多少,降低的有多少,通过增大的个数和降低的个数的比较来判定两个变量的相关性。

如下图所示,当我们对变量X进行升序排列以后,我们对变量Y从第一个值开始进行两两比较,一共需要比较的组合有:(1,3)、(1,6)、(1,2)、(1,5)、(1,4)、(3,6)、(3,2)、(3,5)、(3,4)、(6,2)、(6,5)、(6,4)、(2,5)、(2,4)、(5,4),然后我们看这里面大于的组合有多少,小于的组合有多少。
统计科学之聊聊你知道和不知道的相关性系数

如果随着X的增大变量Y增大的值越多,降低的值越少,说明两个变量之间越正相关;如果随着X的增大变量Y增大的值越少,降低的值越多,说明两个变量之间越负相关;如果随着X的增大变量Y增大的值与降低的值的数量比较接近,说明两个变量之间相关性比较弱。

05

以上就是关于三种不同相关系数的一个简单介绍,平常大家应该对第一种皮尔逊相关系数了解比较多,但是严格意义上后两种要比第一种更加通用,而且适用场景更多一些,尤其是对异常值的影响。

当然了,我们在使用这些方法的过程中肯定是不需要去自己手动计算的,大家只需要明白其中的原理即可。这些相关性系数的求取在Python中都是有现成的函数供大家使用。df.corr()大家应该有人使用过,不知道你有没有看过这个函数里面的参数,这个函数里面有一个method参数,该参数有三个值可选:‘pearson’, spearman’,‘kendall’,分别对应我们上面的三种系数的求取。

本文就讲到这里,大家可以去使用起来啦。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
CodeCosmicRover
CodeCosmicRover
Lv1
梅须逊雪三分白,雪却输梅一段香。
文章
5
粉丝
0
获赞
0