Python3数据分析与挖掘建模(12)复合分析-相关分析与实现示例

news2024/10/6 17:16:22

1. 相关分析

1.1 概述

相关分析是一种统计分析方法,用于研究两个或多个变量之间的关系和相互影响程度。它帮助我们了解变量之间的线性关系、趋势和相关程度。

在相关分析中,常用的指标是相关系数,用于衡量两个变量之间的相关程度。最常见的相关系数是皮尔逊相关系数(Pearson correlation coefficient),它衡量了两个变量之间的线性关系强度和方向。皮尔逊相关系数的取值范围在-1到1之间,接近1表示正相关,接近-1表示负相关,接近0表示无相关关系。

1.2 分析示例

在Python中,可以使用pandasnumpy库进行相关分析。

# 设置绘图环境的字体大小
sns.set_context(font_scale=1.5)

# 读取数据集
df = pd.read_csv("../data/HR.csv")

# 提取数值类型的列
numeric_cols = df.select_dtypes(include=[np.number]).columns

# 计算相关系数矩阵并绘制热图
sns.heatmap(df[numeric_cols].corr(), vmin=-1, vmax=1, cmap=sns.color_palette("RdBu", n_colors=128))

# 显示图形
plt.show()

上述代码的注释解释如下:

  • 导入需要使用的库:pandas用于数据处理,matplotlib.pyplot用于绘图,seaborn用于美化绘图风格,scipy.stats用于计算相关系数,numpy用于数据类型操作。
  • 设置绘图环境的字体大小,使得图形更加清晰可读。
  • 使用pd.read_csv()读取数据集,文件路径为"../data/HR.csv"。
  • 通过select_dtypes()方法结合np.number选择数据框中的数值类型的列,将其存储在numeric_cols变量中。
  • 使用df[numeric_cols].corr()计算数值列之间的相关系数矩阵。
  • 使用sns.heatmap()绘制热图,其中vminvmax指定了颜色映射的取值范围,cmap指定了使用的颜色映射方案。
  • 使用plt.show()显示图形。

分析结果图为:

如图,蓝色是接近于1,红色接近于-1。泛红的区域接近于负相关,泛蓝的区域接近于正相关。

2. 熵与互信息

2.1 概述

相关分析中的熵、条件熵和互信息是信息论中的概念,用于衡量随机变量之间的关联性。

(1)熵(Entropy):熵是表示随机变量的不确定性的度量。对于一个离散随机变量,其熵的定义为所有可能取值的信息量的期望值的负数。熵越大,随机变量的不确定性越高。在相关分析中,熵可以用于衡量单个随机变量的不确定性。

公式:H(X)=-\sum p_{i}log(p_{i})  值越接近于0,说明其不确定性越小。

(2)条件熵(Conditional Entropy):条件熵是在给定另一个随机变量的条件下,某个随机变量的不确定性。对于两个随机变量X和Y,给定Y的条件下,X的条件熵定义为在已知Y的取值情况下,X的熵的期望值。条件熵越大,表示X和Y之间的关联性越弱。

公式:H(Y|X)=\sum p(x_{i})H(Y|X=x_{i})

(3)熵增益(互信息(Mutual Information)):互信息衡量的是两个随机变量之间的相关性或依赖关系。对于两个随机变量X和Y,互信息定义为X和Y的联合分布与它们各自的边缘分布之间的差异。互信息可以看作是两个随机变量之间的共享信息量,互信息越大,表示两个随机变量之间的关联性越强。

在相关分析中,这些概念可以用于量化随机变量之间的关联程度,从而帮助理解和分析数据中的相互作用和依赖关系。

公式:I(X,Y)=H(Y)-H(Y|X)=H(X)-H(X|Y)

(4)熵增益率:熵增益率是一种用于特征选择的指标,常用于决策树算法中。它衡量了在给定某个特征的条件下,对目标变量的不确定性减少程度。熵增益率越高,意味着使用该特征进行划分可以获得更多的信息增益。计算熵增益率涉及两个概念:信息增益和分裂信息。信息增益是目标变量熵减少的量,分裂信息是指划分特征的熵。熵增益率通过将信息增益除以分裂信息来进行归一化,以解决特征取值数目不同带来的偏好问题。

公式:GainRatio(X->Y)=\frac{I(X,Y)}{H(Y)}

(5)相关性:相关性是指两个变量之间的关联程度。相关性通常用于衡量两个变量之间的线性关系。相关性的取值范围在-1到1之间,其中-1表示完全负相关,0表示无相关性,1表示完全正相关。相关性可以帮助我们了解变量之间的趋势、依赖关系和相互影响程度。在数据分析中,可以通过计算相关系数(如皮尔逊相关系数)来衡量变量之间的相关性。

公式:Corr(X,Y)=\frac{I(X,Y)}{\sqrt{H(X)H(Y)}}

2.2 示例数据

XY
X1Y1
X1Y1
X2Y1
X2Y2
X2Y2
X2Y2

2.3 求取熵

import pandas as pd
import seaborn as sns
import numpy as np

sns.set_context(font_scale=1.5)
df=pd.read_csv("../data/HR.csv")
s1=pd.Series(["X1","X1","X2","X2","X2","X2"])
s2=pd.Series(["Y1","Y1","Y1","Y2","Y2","Y2"])

def getEntropy(s):
    if not isinstance(s,pd.core.series.Series):
        s=pd.Series(s)
    # 如果输入不是 pandas Series,则将其转换为 Series 类型
    if not isinstance(s, pd.core.series.Series):
        s = pd.Series(s)
    
    # 计算每个值的出现频率并得到概率数组
    prt_ary = pd.value_counts(s).values / float(len(s))
    
    # 计算熵值,即对每个概率取负对数后乘以概率并求和
    entropy = -(np.log2(prt_ary) * prt_ary).sum()
    
    return entropy

print("熵值:", getEntropy(s2)) # Out:Entropy: 1.0

该代码定义了一个名为 getEntropy 的函数,用于计算序列 s 的熵值。函数首先检查输入 s 是否为 pandas Series 类型,如果不是,则将其转换为 Series 类型。然后,使用 pandas 的 value_counts 函数统计序列中每个值的出现次数,并计算出对应的概率。最后,根据熵值的计算公式,对每个概率取负对数并乘以概率,然后对所有结果求和,得到最终的熵值。函数返回计算得到的熵值。示例用法展示了如何使用 getEntropy 函数来计算特定序列 s2 的熵值,并打印结果。

2.4 求取条件熵

# 求取条件熵
def getCondEntropy(s1, s2):
    # 检查输入的序列长度是否相等
    assert len(s1) == len(s2)
    # 创建一个空字典
    d = dict()
    # 构建字典,键为 s1 的值,值为对应的 s2 值的列表
    for i in range(len(s1)):
        d[s1[i]] = d.get(s1[i], []) + [s2[i]]
    # 计算条件熵,对每个键值对应的列表计算熵值,并加权求和
    cond_entropy = sum([getEntropy(d[k]) * len(d[k]) / float(len(s1)) for k in d])
    return cond_entropy
print("CondEntropy", getCondEntropy(s1,s2)) #Out: CondEntropy 0.5408520829727552
print("CondEntropy", getCondEntropy(s2,s1)) #Out:CondEntropy 0.4591479170272448

该代码定义了一个计算条件熵的函数 getCondEntropy。首先,通过断言语句检查输入的序列 s1s2 的长度是否相等。然后,创建一个空字典 d。接下来,使用循环遍历序列 s1s2,将 s1 的值作为字典的键,s2 的对应值作为字典的值,将值添加到字典中。然后,通过列表推导式计算每个键值对应的列表的熵值,并乘以列表长度和总长度的比例,最后加权求和得到条件熵。最后,我们调用 getCondEntropy 函数,传入示例序列 s1s2,并打印计算得到的条件熵结果。

从结果可知,s1,s2与s2,s1的条件熵是不对应的。

2.5 熵增益(互信息)

# 熵增益(互信息)
def getEntropyGain(s1,s2):
    return getEntropy(s2)-getCondEntropy(s1,s2)
print("EntropyGain",getEntropyGain(s1,s2))  #Out:EntropyGain 0.4591479170272448

2.6 熵增益率

# 熵增益率
def getEntropyGainRatio(s1,s2):
    return getEntropyGain(s1,s2)/getEntropy(s2)
print("EntropyGainRatio",getEntropyGainRatio(s1,s2)) #Out:ntropyGainRatio 0.4591479170272448

2.7 相关性(相关度)

#相关度
def getDiscreteRelation(a1, a2):
    return getEntropyGain(a1, a2) / math.sqrt(getEntropy(a1) * getEntropy(a2))
print("DiscreteRelation",getDiscreteRelation(s1,s2)) #Out:DiscreteRelation 0.4791387674918639

2.8 Gini

# Gini
def getGini(a1, a2):
    assert (len(a1) == len(a2))
    d = dict()
    for i in list(range(len(a1))):
        d[a1[i]] = d.get(a1[i], []) + [a2[i]]
    return 1 - sum([getProbSS(d[k]) * len(d[k]) / float(len(a1)) for k in d])

# 可能性平方和
def getProbSS(s):
    if not isinstance(s, pd.core.series.Series):
        s = pd.Series(s)
    prt_ary = np.array(s.groupby(s).count().values / float(len(s)))
    return sum(prt_ary ** 2)

print("Gini", getGini(s1, s2)) #Out: Gini 0.25
print("Gini", getGini(s2, s1)) #Out: Gini 0.2222222222222222

这段代码计算了两个变量之间的基尼系数(Gini coefficient)。getGini 函数接受两个数组作为输入,假设这两个数组的长度相等。它首先根据第一个数组 a1 中的元素将第二个数组 a2 中的元素分组,然后计算每个组的可能性平方和,最后将所有组的可能性平方和加权求和,并与1相减,得到基尼系数。

getProbSS 函数计算了给定序列 s 的可能性平方和。它首先将序列转换为 Pandas 的 Series 对象(如果尚未是),然后使用 groupby 方法按照元素进行分组,并计算每个元素的计数。接下来,它计算每个元素计数的可能性,将其转换为数组,并计算可能性平方和。

最后,通过调用 getGini 函数来计算两个示例数据集 s1s2 之间的基尼系数,并打印结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 定时任务

可以用非root用户创建定时任务 Linux crontab 是用来定期执行程序的命令。 当安装完成操作系统之后,默认便会启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 注意:新创建的 cro…

怎么查询电脑的登录记录及密码更改情况?

源头是办公室公用的电脑莫名其妙打不开了,问别人也都不知道密码是多少 因为本来就没设密码啊!(躺倒) 甚至已经想好了如果是50万想攻破电脑,被po抓住要怎么花这笔钱了 是我想太多 当然最后也没解决,莫名…

27 getcwd 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 获取当前路径 不过 我们这里是从 具体的实现 来看一下 测试用例 就是简单的使用了一下 getcwd rootubuntu:~/Desktop/linux/HelloWorld# cat Test04Getcwd.c #inc…

11.DIY可视化-拖拽设计1天搞定主流小程序-小程序首页公告详情页面

小程序首页公告详情页面 本教程均在第一节中项目启动下操作 小程序首页公告详情页面前言一、添加界面,布局1.设定组件样式:数据绑定 二. 新增接口三:绑定公告四.查看效果五.动态参数设置 :之前是指定了公告单条数据2.优化还在那时详情页<p>标签:借助工具查看,清空绑定修改…

【树莓派】树莓派4B镜像安装(使用Raspberry Pi image)

本文主要记录下如何使用Raspberry Pi image 软件进行树莓派镜像进行安装。 官网&#xff1a;Raspberry Pi OS – Raspberry Pi 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1G7z1Fdvk5Chmhj894WPU3A 提取码&#xff1a;xnzw 一、格式化SD卡 若SD卡存在…

【Linux】按键驱动程序

【Linux】按键驱动程序 前言&#xff1a; 一、按键驱动程序的背景知识 1.1 查询方式 1.2 休眠-唤醒方式 1.3 poll方式 1.4 异步通知 1.5 总结 二、按键驱动程序的框架 三、按键驱动程序实战 3.1 头文件&#xff08;button_drv.h&#xff09; 3.2 驱动程序&#xf…

我的开源实践之路!这一路我遇到的困难和收获总结

Datawhale干货 作者&#xff1a;诸葛子房&#xff0c;Datawhale成员 从参与Apache开源项目&#xff0c;到凭借业务需求独自开发个人开源项目&#xff1b;从项目开源出来无人问津到至今500star&#xff0c;多个企业级用户&#xff0c;在开源过程中&#xff0c;我也从走过低谷&a…

Matplotlib的一些总结

plt.figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue) 参数说明&#xff1a; 1.num&#xff1a;图像编码或者名称&#xff0c;数字是编码&#xff0c;字符串是名称 2.figsize&#xff1a;宽和高&#xff0c;单位是英尺 3.dpi&#xff1a;指…

chatgpt赋能python:Python怎么取二进制低三位?

Python怎么取二进制低三位&#xff1f; 在Python编程中&#xff0c;处理位运算是一个非常常见的任务。其中&#xff0c;取二进制低三位也是其中的一项操作。那么&#xff0c;如何实现这个操作呢&#xff1f;本篇文章将为大家介绍Python如何取二进制低三位的方法。 什么是二进…

苹果Vision Pro:虚拟现实走进个人计算机未来

一段时间以来&#xff0c;虚拟现实&#xff08;VR&#xff09;这个概念以其无限的潜力吸引了全世界&#xff0c;用户可以进入身临其境的计算机生成的环境中&#xff0c;这些环境通常模糊了数字和物理世界之间的界线。多年来&#xff0c;VR 技术持续以惊人的速度发展&#xff0c…

软考A计划-系统架构师-学习笔记-第三弹

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

yolov4——你总能在这找到你想要的答案

目录 一&#xff1a;前言 二&#xff1a;一些数据增强的方法 三&#xff1a;自提议 四&#xff1a;dropout 普通的dropout yolov4的dropblock 五&#xff1a;Label smothing 标签平滑 六&#xff1a; GIOU&#xff0c;DIOU&#xff0c;CIOU 七&#xff1a; 对网络结构的…

代码随想录算法训练营第五十五天 | 力扣 392.判断子序列, 115.不同的子序列

392.判断子序列 题目 392. 判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace&quo…

Mysql 经典面试题总结

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

Flask+pyecharts实现电影数据分析可视化

之前有写过pyecharts实现电影数据分析可视化和Djangopyecharts实现电影数据分析可视化&#xff0c;但是综合起来感觉还是有缺陷&#xff0c;所以我使用Flaskpyecharts重新整合一下电影数据可视化。 下面是完成后的截图 这应该就算是可视化大屏了吧 文章目录 代码结构index.cs…

MM32F3273G8P火龙果开发板MindSDK开发教程3 - Sysclk的配置

MM32F3273G8P火龙果开发板MindSDK开发教程3 - Sysclk的配置 1、时钟初始化流程 一般流程为startup_mm32f3273g.s中调用system_mm32f3273g.c中的SystemInit函数完成系统时钟的初始&#xff0c;而system_mm32f3273g.c中函数是空的。 原来MindSdk时钟初始化的流程放到了clock_i…

【ArcGIS Pro二次开发】(37):图层一键应用村规、国空符号系统

在国空、村规的实际工作中&#xff0c;将要素类加载到地图中后&#xff0c;需要将图斑的符号系统修改成国空或村规的样式。一般的做法是使用样式库或已经做好的图层文件进行匹配&#xff0c;这个工具要实现的功能是直接应用特定的符号系统&#xff0c;其实用的方法也就是GP工具…

HTMLCSS Day02 CSS简介与选择器

文章目录 1.CSS32.语法2.1.CSS声明&#xff08;CSS declarations&#xff09;2.2.CSS声明块&#xff08; CSS declaration blocks&#xff09;2.3.CSS规则集2.4.CSS可读性- 空白&#xff08; White space&#xff09;- 注释&#xff08; Comments&#xff09;- 速记写法&#x…

【OpenMMLab AI实战营第二期】目标检测笔记

目标检测 目标检测的基本范式 划窗 使用卷积实现密集预测 锚框 多尺度检测与FPN 单阶段&无锚框检测器选讲 RPN YOLO、SSD Focal Loss与RetinaNet FCOS YOLO系列选讲 什么是目标检测 目标检测&#xff1a;给定一张图片&#xff0c;用矩形框框出所有感兴趣物体同…

【系统迁移:笔记本更换硬盘,不重装系统方法】

本人在使用笔记本的时候&#xff0c;C盘空间经常不够用。每次空间满了&#xff0c;就要清理磁盘&#xff0c;卸载一些软件。后来网上搜索一些C盘扩容的办法&#xff0c;列在下面了。去官方下载 diskgenius 软件&#xff0c;点击 here 跳转官网。 电脑型号&#xff1a;联想小新…