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

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 之间的基尼系数,并打印结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Same Symbol | 哇咔咔!!!盘点一下表达矩阵中重复基因的处理方法!~

1写在前面 医院天天叫我们填问卷,我真是不能理解。🫠 动不动就问我们对医院的福利满意吗,对自己的收入满意吗,觉不觉得工作负荷太重了???🙂 我们满不满意,觉不觉得累&…

【ChatGPT】数据科学 ChatGPT Cheat Sheet 书籍分享(阿里云盘下载)

封皮 以下为书中部分内容的机器翻译 我们的重要提示指南 1. 以 AI 角色的描述开始提示。 例如,“你是{x}”或“我希望你扮演{x}”。如果您不确定,请尝试“你是一个有帮助的助手”。 例如,您是 OpenAI 的数据科学家,您正在研究大型…

Java中线程的生命周期

Java中线程的生命周期 Java中线程的声明周期与os中线程的生命周期不太一样,java中线程有6个状态,见下: NEW: 初始状态,线程被创建出来但没有被调用 start() 。RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态…

C语言—程序环境和预处理

程序环境和预处理 程序的翻译环境和执行环境编译、链接翻译环境编译预处理(预编译)编译汇编 链接 编译环境几个阶段的总结 运行环境(执行环境)预处理详解预定义符号#define#define 定义标识符#define 定义宏#define 替换规则#和##…

【SpringMVC】SSM整合

1,SSM整合 前面我们已经把Mybatis、Spring和SpringMVC三个框架进行了学习,今天主要的内容就是把这三个框架整合在一起完成我们的业务功能开发,具体如何来整合,我们一步步来学习。 1. 流程分析 (1) 创建工程 创建一个Maven的web…

傅里叶级数简介

先看动图 将函数f(x) 用 sin(nx) cos(nx) 的形式表示出来的方式就是傅里叶级数 这里有几个使用条件 收敛性:符合迪力克雷收敛条件。简单理解为 f(x) 必须是一个丝滑的曲线。周期性: f(x) 必须是一个周期函数 还有一个基础条件,三角函数具…

200SMART CPU输入/输出接线的几个关键点

总结来看,S7-200系列PLC提供4个不同的基本型号的8种CPU,其接线方式也可大致分为6种: 1.CPU SR20接线 2.CPU SR40接线 3.CPU CR40接线 4.CPU ST40接线 5. CPU SR60接线 6. CPU ST60接线 除了CPU外,我们还需要了解200smart PLC的数…

从零玩转系列之微信支付实战基础框架搭建

一、前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端) 在此之前已经更新了微信支付开篇、微信支付安…

数据库—mysql、数据库编程(API)

1. Linux平台准备 &#xff08;1&#xff09;安装SDK开发包的命令 sudo apt-get install libmysqlclient-dev &#xff08;2&#xff09;编译时需要链接的库:-lmysqlclient 2. mysql 的初始化和清理 #include <mysql/mysql.h> MYSQL mysql1; //创建句柄 mysql_init(&…

宝塔面板搭建Discuz论坛并发布互联网访问【无需云服务器】

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 转载自cpolar极点云的文章&#xff1a;Linux宝塔面板搭建Discuz论坛&#xff0c;并公网远程访问【内网穿透】 前言 Crossday Discuz! Board&#xff08;以…

MapReduce共享单车练习

MapReduce 本机运行 文章目录 MapReduce 本机运行✅前置工作1. 配置JDK2. 创建Java项目3. 导入所需JAR包 编程实现以下题目1. 统计各个月份共享单车使用的总数2. 统计不同天气情况下共享单车使用的总数3. 统计每个季度共享单车使用的总数4. 统计每个月份的注册数量5. 统计每天1…

【V4L2】v4l2框架分析之video_device

文章目录 &#x1f53a;一、video_device分析&#xff08;1-1&#xff09;struct video_device结构&#xff08;1-2&#xff09;struct v4l2_ioctl_ops结构&#xff08;1-3&#xff09;v4l2_file_operations结构 &#x1f53a;二、注册video设备&#x1f53a;三、卸载清除video…

WPF开发txt阅读器6:用树形图管理书籍

txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定书籍管理系统 TreeView控件 TreeView可以通过可折叠的节点来显示层次结构中的信息&#xff0c;是表达文件系统从属关系的不二选择&#xff0c;其最终效果如下 为了构建这个树…

KISS复盘法

KISS复盘法 KISS复盘法是一种科学的项目复盘方法&#xff0c;能够把过往经验转化为实践能力&#xff0c;以促进下一次活动更好地展开&#xff0c;从而不断提升个人和团队的能力&#xff01; 模型介绍 【复盘】原是围棋术语&#xff0c;本意是对弈者在下完一盘棋之后&#xff0…

uniapp 横向滑动list(不同内容)分部问题:scroll-view,swiper overflow-x

横向滑动list,可使用标签&#xff1a; 1&#xff1a;scroll-view 2&#xff1a;swiper 3&#xff1a;overflow-x 正常来讲横向滑动的话 &#xff0c;需要特殊设置&#xff0c;只用view 设置display&#xff1a;flex&#xff0c;的话 无法横向滑动&#xff0c;右边的就会隐…

git hook

hook hook 翻译为钩子&#xff0c;简单说就是监听某个事件&#xff08;操作&#xff09;&#xff0c;然后触发自定义逻辑 在 git 中可以监听 commit&#xff0c;push 等操作&#xff0c;在操作之前或之后触发对应的 hook&#xff0c;在 hook 中写自定义的逻辑&#xff0c;比如…

Java Web开发实战经典学习过程笔记

Java Web开发实战经典学习简单笔记 第一章 Java Web 开发简介 1.胖客户端程序指的是&#xff0c;当一个程序运行时需要一个单独的客户端程序支持(如&#xff1a;QQ)。瘦客户端程序在操作时不需要任何其他程序的安装(如&#xff1a;登录网上论坛&#xff0c;只需浏览器即可)。 2…

算法刷题-链表-反转链表

反转链表 206.反转链表思路C代码双指针法递归法其他语言版本使用虚拟头结点解决链表翻转使用栈解决反转链表的问题 反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 …

4.使用Express跨域资源共享(继上一章)

4.5、CORS跨域资源共享 1.接口的跨域问题 刚才编写的GET和POST接口&#xff0c;存在一个很严重的问题&#xff1a;不支持跨域请求。 解决接口跨域问题的方案主要有两种&#xff1a; ①CORS&#xff08;主流的解决方案&#xff0c;推荐使用&#xff09; ②JSONP&#xff08…

6.11下周黄金行情分析及开盘多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;金价周五(6月8日)收低&#xff0c;但在美元整体走软的支撑下&#xff0c;本周录得连续第二周上升。美市尾盘&#xff0c;现货黄金收报1960.83美元/盎司&#xff0c;…