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

news2024/12/24 8:36: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/645210.html

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

相关文章

Linux之文件一般权限

目录 Linux之文件一般权限 文件和目录的一般权限 解析: 文件类型 文件的权限针对三类对象进行定义 文件针对每类访问者定义的三种权限 对于文件和目录,r,w,x的作用以及含义 设置文件和目录的一般权限 修改文件或目录权限 ---…

论文可视化分析神器——CiteSpace和vosviewer

文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量化的综合性知识体系。特别是,信息可视化技术手段和方法的运用,可直观的展示主题的研究发展历程、研究现状、研究…

MySQL启停要十分钟?

一、问题背景 基础环境: 主机类型:x3850 X6 操作系统:DB:Red Hat Enterprise Linux 9.1 7.8 存储:IBM存储,500GB 内存:64 G CPU型号:E7-4830 v3 2.10GHz CPU核数:32CORE 数据…

洞察丨挖掘游戏行为数据价值的 6 个新思路

现阶段,游戏赛道越来越难,主要表现在玩家对游戏质量的要求提高、游戏立项选择空间变小、游戏买量越来越贵且回本周期越来越长……与此同时,游戏出海势头依然强劲,难以突破重围。 可以说,几乎所有的游戏都在尽可能地朝着…

便利店小程序怎么做

便利店小程序是一种基于移动互联网的购物平台,它为用户提供了便捷的购物体验,可以满足用户的购物需求。下面是便利店小程序的主要功能介绍: 1. 商品展示:便利店小程序可以展示商家的商品信息,包括商品图片、价格、描述…

【什么是iMessage推送,im群发】苹果推iMessage是苹果公司为其设备用户提供的即时通讯服务

iMessage是苹果公司为其设备用户提供的即时通讯服务,拥有一系列强大的功能和特点。然而,至今为止,苹果并未提供官方的群发部署功能。iMessage主要被设计为点对点的通信工具,即用户可以与一个或多个人进行私密的聊天对话。以下是关…

酷克数据简丽荣:“模型热”将引发云计算与数据库行业大变革

随着LLM智能涌现的发生和API的爆发式发展,各行各业都在关注如何用好通用模型,如何调校好适合自己的行业应用。LLM最重要的输入是数据,最频繁的接口是数据库。模型应用的普及会对数据库产生哪些影响?大模型时代对企业的数据管理能力…

深度学习应用篇-元学习[13]:元学习概念、学习期、工作原理、模型分类等

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

通讯基站电源智能监控系统

通信基站又称无线基站,一般都安装在宽阔、偏远的地方,且分散,实现人工值守十分困难,成本高;另外局部内动力设备、蓄电池电源以及环境无法及时监视和控制,造成事故频发。然而蓄电池作为直流备用电源&#xf…

怎么把图片放大不改变清晰度,给大家介绍两个方法

时代的发展和进步,我们在使用手机、电脑等设备时,常常需要对图片进行放大操作。从功能上来说,图片放大可以让我们更好地观看和理解图片内容,同时也可以提高图像分辨率和清晰度,以满足不同的需求和场景首先,…

SQL-将数组打散regexp_replace/split/explode

目的:将数组(拒绝码refuse_codes)打散 原数据: 打散后数据col: – regexp_replace()替换函数 – split()函数是用于切分数据,也就是将一串字符串切割成了一个数组 – explode()函数是用于打散行的函数&am…

Ubuntu安装英伟达显卡驱动、Cuda和Cudnn

显卡驱动安装 1、下载对应型号显卡驱动 首先查看自己机器显卡型号 lspci | grep -i nvidia得到如下输出,其中GeForce GTX 1080就是型号 01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1) 01:00.1 Audio device: NVIDI…

第14届蓝桥杯Scratch(中级)省赛真题解析2023.5.14

选择题 1. 已知下图角色一共有3个造型,则以下选项中,不能呈现下图中第三个造型效果的程序是(C) *选择题严禁使用程序验证,选择题不答或答错都不扣分 A. B. C. D. 2. 运行以下程序,循环执行4次后,x的值是(D)。 *选择题严禁使用程序验证,选择题不答或答错都不扣分

vue2之element-ui多个穿梭框实现 -Transfer

效果图 组件实现 -目录结构 Transfer.vue实现 <template><el-card :body-style"{ minHeight: 350px }"><el-inputv-show"filterable"v-model"filterName":placeholder"filterPlaceholder"clearableinput"han…

【Flutter】Flutter 如何切换页面

文章目录 一、简介二、Navigator 的使用三、实际示例&#xff1a;电影应用的页面切换四、完整代码五、 总结 一、简介 什么是页面切换呢&#xff1f;简单来说&#xff0c;页面切换就是在应用的不同界面之间进行跳转。例如&#xff0c;在一个电影应用中&#xff0c;从电影列表页…

java基础(多线程)-共享模型之管程

一、共享资源带来的问题 class ThreadProblem{static int counter 0;public static void testThread(){Thread t1 new Thread(()-> {for (int i 0; i < 5000; i) {counter;}},"t1");Thread t2 new Thread(()-> {for (int i 0; i < 5000; i) {count…

基于html+css的图展示126

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

苹果手机之间如何互传照片?批量传输操作指南

很多时候&#xff0c;我们用手机拍摄了好看的照片或者收藏了一些有趣的图片&#xff0c;想要分享给朋友&#xff0c;却不知道苹果手机之间如何互传照片&#xff1f;在分享大量照片的时候不清楚如何批量操作&#xff1f;别担心&#xff0c;下面小编就来分享一下苹果手机照片传输…

LeetCode279. 完全平方数 DP完全背包

https://leetcode.cn/problems/perfect-squares/ 题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4…

python类中常用的魔术方法

文章目录 构造方法__init__对象转字符__str__对象自定义大小比较First__lt__Second__le__Third__eq__ 构造方法__init__ 构造方法也是魔术方法的一种&#xff0c;此方法我在python对象与类中已经展示过了 注意&#xff1a;在方法中引用类成员变量一定要记得使用self关键字引用…