python肯德尔系数相关性数据分析示例
作者:fanstuck 发布时间:2023-02-20 21:42:35
前言
相关性分析算是很多算法以及建模的基础知识之一了,十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性系数就有三种:person相关系数,spearman相关系数,Kendall's tau-b等级相关系数。各有各自的用法和使用场景。当然关于这以上三种相关系数的计算算法和原理+代码我都会在我专栏里面写齐全。目前关于数学建模的专栏已经将传统的机器学习预测算法、维度算法、时序预测算法和权重算法写的七七八八了,有这个需求兴趣的同学可以去看看。
一、定义
Kendall(肯德尔)系数的定义:n个同类的统计对象按特定属性排序,其他属性通常是乱序的。同序对(concordant pairs)和异序对(discordant pairs)之差与总对数(n*(n-1)/2)的比值定义为Kendall(肯德尔)系数。
与斯皮尔曼秩相关相似的是,肯德尔相关也是一种秩相关系数,是基于数据对象的秩(rank)来进行两个(随机变量)之间的相关关系(强弱和方向)的评估。所分析的目标对象应该是一种有序的类别变量,比如名次、年龄段、肥胖等级(重度肥胖,中度肥胖、轻度肥胖、不肥胖)等。
不同的是,斯皮尔曼相关是基于秩差(比如说,小明在班级中的历史成绩排名为10,英语成绩排名为4,那么在这个班级的学生的历史成绩和英语成绩的斯皮尔曼相关分析中,小明的成绩的贡献就是(10-4=6) )来进行相关关系的评估;而肯德尔相关则是基于样本数据对之间的关系来进行相关系数的强弱的分析,数据对可以分为一致对(Concordant)和分歧对(Discordant)。
kendall相关系数的计算公式如下:
假如我们设一组8人的身高和体重在那里A的人是最高的,第三重,等等:
注意,A最高,但体重排名为 3 ,比体重排名为 4,5,6,7,8 的重,贡献5个同序对,即AB,AE,AF,AG,AH。同理,我们发现B、C、D、E、F、G、H分别贡献4、5、4、3、1、0、0个同序对,因此,同序对数
P = 5 + 4 + 5 + 4 + 3 + 1 + 0 + 0 = 22.
异序对数 Q=28-22 (总对数减去同序对数为异序对数)
因而R=((22-6)/28)=0.57。这一结果显示出强大的排名之间的规律,符合预期。 我们看到,有一些相关的两个排名之间的相关性,可以使用肯德尔头系数,客观地衡量对应。
如果两个排名之间的一致性是完美的(即两个排名相同),则系数的值为1。
如果两个排名之间的分歧是完美的(即,一个排名与另一个排名相反),则系数具有值-1。
如果X和Y是独立的,那么我们期望系数近似为零。
二、使用条件
在适用肯德尔相关分析前首先要检查数据是否满足以下基本假设,满足了这些基本假设才能确保你所得到的相关分析结果是有效的。
变量数据是有序的( ordinal) 或者是连续的(continuous). 有序尺度(Ordinal scales )的数据通常用于用数值的方式来衡量非数值的概念,比如说,满意度,幸福度等等,还有像成绩排名啊、比赛名次啊之类的。而连续尺度的数据就勿需解释了,常见的温度啊、体重啊、收入啊等等都(或严格、或近似)算是连续尺度的数据。
两个变量的数据之间应该遵循单调关系( monotonic relationship)。 简而言之就是,其中一个变量的值增大,另一个也增大,这个称为正相关;或者一个变量的值增大,另一个就变小,这个称为负相关。当然,这个单调关系是一个统计意义上的,或者说一种趋势上的,而非严格的单调。如下如所示。左图和中图都呈现一种近似单调的关系,而右图则不是,因为右图的左半部分和右半部分的趋势是相反的。
三、计算公式及代码示例
肯德尔系数有两个计算公式,一个称为Tau-c,另一个称为Tau-b。两者的区别是Tau-b可以处理有相同值的情况,即并列排位(tied ranks)。
1.Tau-a
from scipy.stats.stats import kendalltau
import numpy as np
import matplotlib.pyplot as plt
dat1 = np.array([1,2,3,4,5,6,7,8])
dat2 = np.array([3,4,1,2,5,7,8,6])
fig,ax = plt.subplots()
ax.scatter(dat1,dat2)
kendalltau(dat1,dat2)
2.Tau-b
在以上Tau-a的计算中假定原始数据中不存在并列排位。当原始数据中存在并列排位时,则用以下公式能够给出更准确的分析结果。
代码是一致的只不过使用数学运算不一致,具体我不展开了,更多关于python肯德尔系数相关性的资料请关注脚本之家其它相关文章!
来源:https://juejin.cn/post/7187943854141046839


猜你喜欢
- 有人问为什么要去扫描网站目录:懂的人自然懂这个Python脚本的特点:1.基本完善2.界面美观(只是画了个图案)3.可选参数增加了线程数4.
- Go 在testing包中内置测试命令go test,提供了最小化但完整的测试体验。标准工具链还包括基准测试和基于代码覆盖的语句,类似于NC
- 问题一:TypeError: a bytes-like object is required, not 'str'解决:该问
- 测试1deco运行,但myfunc并没有运行def deco(func): print 'bef
- 本文实例讲述了Python实现批量下载图片的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env python#-*-
- hanxiaolian 为了躲避 lake2 ASP站长管理助手而写.. 一.绕过lake2 Asp木马扫描的小马 代码如下:<%&n
- 一、什么是 Postman(前世今生)Postman 诞生于 2013 年,一开始只是 Abhinav Asthana 着手于解决 API
- 装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更
- 神经网络框架使用方法及设计思想在框自己手写架上基本模仿pytorch,用以学习神经网络的基本算法,如前向传播、反向传播、各种层、各种激活函数
- 一、继承的格式类的继承格式如下,括号中的为父类名。class 类名(父类名): 代码二、单继承下面我们让Man继承自Master类,并调用继
- time 模块time 模块,也就是时间模块,用来进行一些与时间有关的操作。其使用方法为:import timeprint(time.tim
- 因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作。网上 这篇
- 前言:开发环境:python 3.8pycharm 2021.2 专业版代码实现:发送请求获取数据解析数据(筛选数据)保存数据连接数据库请求
- 问题:一个文件夹c下的模块test要引用另一个包b里面模块test2的函数add,如下图解决办法:经过前辈oyljerry等的指点迷津,要在
- 本文实例为大家分享了python使用opencv切割图片白边的具体代码,可以横切和竖切,供大家参考,具体内容如下废话不多说直接上码,分享使人
- 闪回区爆满问题也是经常会遇到的问题,最关键的是闪回设置大小以及归档被默认存放在了闪回目录,恰巧今天又遇到了这个问题,就记录下处理步骤,仅供遇
- 1、find(sub[, start[, end]])在索引start和end之间查找字符串sub找到,则返回最左端的索引值,未找到,则返回
- 一、需求介绍该需求主要是分析某一种数据的历史数据。客户的需求是根据该数据的前两期的情况,如果存在某个斜着的两个数字相等,那么就买第三期的同一
- TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术
- 无意中看到以前在电脑上保存的一个html页面,关于div水平垂直居中的问题。如何实现div水平垂直居中呢?1.已知宽高度水平垂直居中posi