统计学知识:相关系数

2023-10-31

公众号:尤而小屋
作者: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σycov(x,y)=σxσyE[(xμx,yμy)]

或者为:

ρ X , Y = E ( X Y ) − E ( X ) E ( Y ) E ( X 2 ) − ( E ( X ) ) 2 E ( Y 2 ) − ( 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 ( x i − x ˉ ) ( y i − y ˉ ) ∑ i ( x i − x ˉ ) 2 ∑ i ( y i − 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(xixˉ)2i(yiyˉ)2 i(xixˉ)(yiyˉ)

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

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

其中,n表示数据点的个数, d i d_i di表示数据点 ( x i , y i ) (x_i,y_i) (xi,yi)的秩次 ( r x i , r y i ) (r_{xi},r_{yi}) (rxi,ryi)的差值: d i = r x i − r y i d_i=r_{xi}-r_{yi} di=rxiryi

有了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 = ρ r x , r y = cov ⁡ ( r x , r y ) σ r x σ r y \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σrycov(rx,ry)

其中: r x r_x rx表示变量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) / n
    y_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.0
    sumBottom = 0.0
    x_pow = 0.0
    y_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和类别向量y
    y = [0] * n
    for 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

统计学知识:相关系数 的相关文章

随机推荐

  • matlab pwm如何设计,原来PWM这么简单!!

    原标题 原来PWM这么简单 基本原理 PWM的全称是 脉冲宽度调制 Pulse width modulation 是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式 所以根据 面积等效法则 可以通过对改变脉冲的时间
  • Java实现简单的区块链

    区块链可以简单抽象成将一个个区块存放在一个链表中 每新增一个块就把它放置在链表尾端 并通过区块之间信息的传递形成独一无二的hash 来确保区块链的数据未被篡改过 区块的实现 区块的基本属性有 当前区块的hash值 前一个区块的hash值 当
  • c语言字母意义,%C是什么意思? c语言中?和:是什么意思

    导航 网站首页 gt C是什么意思 c语言中 和 是什么意思 C是什么意思 c语言中 和 是什么意思 相关问题 匿名网友 c单个字符输出的意思 s是输出字符串 d是输出整型 f是输出整型 这是在scanf printf这样的函数中 将参数类
  • mbed TLS 概述

    系统概要 mbedtls 也许是最小巧的ssl代码库 高效 便于移植和集成 支持常见的安全算法 如 AES DES RSA ECC SHA256 MD5 BASE64等等 除此之外还支持公钥证书体系 它提供了具有直观的 API 和可读源代码
  • 解决g2o无法编译出g2o_viewer的问题

    如果你的ubuntu系统版本较高 例如Ubuntu20 04 可能在利用原始的g2o进行编译时会提示找不到 Could NOT find QGLVIEWER missing QGLVIEWER LIBRARY 解决方法1 安装必要的库 su
  • can't locate node [xxxx] in package [yyyy]

    在运行范例的launch文件时 提示 ERROR cannot launch node of type chapter2 tutorials example2 a can t locate node example2 a in packag
  • 一、为什么从IDEA打开的JavaFx scene builder,imageView没有响应呢?

    问题描述 不知道大家有没有出现和我一样的问题 就是当用idea打开JavaFx scene builder时呢 imageView是无法正常使用的 解决方法 在JavaFx scene builder中新建一个页面 完成界面设置后保存即可
  • 部分交换主元的高斯消去法

    伪代码 pseudocode 程序 function Gauss a b tol if nargin 2 tol 1e 4 end n size a 1 dimention s zeros n 1 initialize save maxim
  • NBA球员能力雷达图matplotlib,pandas

    name BaseData 球员 score BaseData 得分 assist BaseData 助攻 rebound BaseData 篮板 steal BaseData 抢断 block BaseData 盖帽 num BaseDa
  • 【registry】registry 0.9 源码 在 windows下运行

    1 概述 我在本地mac环境运行了registry源码 然后想在winodws也正常运行 于是将mac下能用的源码拷贝到了windows下 结果一堆报错 基本上全是pom问题 此处我用了2天才搞定了下面是pom整理好的拍照 慎重呀 不要轻易
  • 【图像处理】基于收缩系数的粒子群优化和引力搜索算法的多级图像阈值研究【CPSOGSA】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献 1 概述 文献来源 图像分割 IS 是图像处理和计
  • 前端学习——HTML5

    新增语义化标签 新增布局标签
  • C++之对象包含与成员函数不兼容的类型限定符---补充(5)《Effective C++》

    C 值对象那个包含与成员函数不兼容的类型限定符 在上篇博客中 运行代码时候 由于没有对show函数添加const 结果突然报了一个错误 对象包含与成员函数不兼容的类型限定符 所以本篇博客进行一个快速补充 在解释这个问题之前 我们先来看看如下
  • HCM SaaS市场百舸争流,肯耐珂萨为何能立于潮头?

    科技树总在飞快生长 叠加上后疫情这个宏大的时代背景 无论是从大的千行百业 抑或是具体的企业各个业务环节的角度来看 一场声势浩大的数字化浪潮正奔涌而来 浩浩汤汤 焦距拉长 基于企业这个微观视角 相对于其他业务环节 人力资源管理的重要性越发凸显
  • jquery 中 change input 事件失效

    今天工作的时候 遇到了用jquery选择 input输入框 监听input中的内容变化 然后将input中的内容获取到 赋值给另一个input输入框 这种逻辑本来很简单的 代码如下 showProductInfo append tr td
  • Tomcat内存优化4.1 内存泄漏——内存分析工具 MAT 的使用

    在eclipse安装 使用MAT插件 简介 Eclipse提供的一个内存分析工具 它是一个功能丰富的 JAVA 堆转储文件分析工具 可以帮助你发现内存漏洞和减少内存消耗 官网地址 Eclipse Memory Analyzer Open S
  • 从零搭建完整python自动化测试框架(UI自动化和接口自动化 )——持续更新

    本自动化测试框架采用python unittest 的基础来搭建 采用PO模式 数据驱动的思想 通过selenium来实现WEB UI自动化 通过request来实现接口自动化 移动终端的自动化也可在该框架基础上去构建补充 目录 总体框架
  • 线扫相机——机器视觉中无限制物体的检测(重要转载)

    在机器视觉中 在检测连续物体或者滚动物体时 线扫相机是最佳的解决方案 通常 它们能提供很高的分辨率 因为它们要求很高的速度和数据率 一 多条窄带拼成一副图像 线扫相机只抓取一行作为图像发送到电脑 主机电脑将所有的行进行组织拼接 如果不停止抓
  • C++四大特性——多态 的总结

    我们都知道 C语言和C 的区别就是 C语言是面对过程的程序设计 而C 是面对对象的程序设计 面对对象的程序设计有4大特性 分别是 抽象 封装 继承 多态 今天我们就来总结一下多态的内容 多态 分为静态多态和动态多态 静态多态 编译器在编译期
  • 统计学知识:相关系数

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 这两周在看一本书 特征工程入门与实践 对自己很有启发 特征工程是数据工作者建模过程中极其重要的一步 如何从众多的特征中找到或者选择与目标具有高强相关的特征显得尤为重要