Python机器学习:数据探索与可视化(一)

news2024/11/23 7:32:56

什么是数据探索?
在前面我们说到,所谓机器学习,就是用已知的数据通过算法去预测未来未知的数据。但是这个过程进行的前提就是要保证已知数据的完成性。所以数据探索,就是检查数据是否完整,是否有缺失值

什么是可视化?
可视化就是将数据以图像的形式呈现出来,例如散点图、直方图、正态图等等,这些都是将单纯的数据以图像的形式呈现,从而可以起到更清晰有效地传达、沟通并辅助数据分析的作用。

🌕 缺失值处理

⭐️数据缺失:指在数据采集、传输和处理等过程中,由于某些原因导致数据不完整的情况。

下面学习一下缺失值的处理方法。

🌗 简单的缺失值处理方法

在处理缺失值之前,我们肯定要有缺失值才能处理,所以我们第一步是去检查数据中有没有缺失值。

🌑 发现数据中的缺失值

在这里我们要用到一个数据集,通过这个数据集来介绍发现缺失值的方法。

  1. 首先我们读取并查看这个数据集
import pandas as pd
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
print(a)

在这里插入图片描述

  1. 然后我们再用pd.isna()判断a的每个元素是否为缺失值
import pandas as pd
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
print(pd.isna(a))

在这里插入图片描述

  1. 然后再用sum()方法对每列求和,计算出每列缺失值的数量
import pandas as pd
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
print(pd.isna(a).sum())

在这里插入图片描述
从结果中我们可以看到,SeaSurFaceTemp有3个缺失值,AirTemp有81个缺失值,Humidity有93个缺失值。

虽然我们已经知道了数据集中每列缺失值的数量,但是我们还不知道它们具体的分布情况(缺失值在哪一行)。

于是,我们可以使用mano.matrix()可视化出缺失值在数据中的分布情况。

import pandas as pd
from matplotlib import pyplot as plt
import missingno as msno
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
msno.matrix(a,figsize = (10,6))
plt.show()

在这里插入图片描述
该图左边的1和736表示行数,中间这一大块表示缺失值在数据中的分布,空白的部位表示该处存在缺失值。

右侧的折线表示每个样本缺失值的情况,8表示数据中一共有8个变量(8列),5表示对应的数据集只有5个变量是完整的,存在3个缺失值。

现在,我们已经发现数据中有缺失值,接下来就是根据缺失值的情况进行预处理。

🌑 剔除带有缺失值的行或列

通常情况下,如果数据中只有较少的样本带有缺失值,则可以剔除带有缺失值的行。如果某列的数据带有大量的缺失值,进行缺失值填充可能会带来更多的负面影响,则可以直接剔除缺失值所在的列。

其中,dropna()方法就是用来剔除带有缺失值的行或列。可以指定参数axis=0剔除行、axis=1剔除列。

# 剔除带有缺失值的行
import pandas as pd
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
b = a.dropna(axis = 0)
print(b.info())

在这里插入图片描述

# 剔除带有缺失值的列
import pandas as pd
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
b = a.dropna(axis = 1)
print(b.info())

在这里插入图片描述

🌑 对缺失值进行插补

因为AirTemp和Humidity列的缺失值最多,这里就针对这两个列来进行插补。

首先我们要使用散点图可视化出剔除带有缺失值行后,AirTemp和Humidity变量的数据分布。

import pandas as pd
from matplotlib import pyplot as plt
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns			 
sns.set(font="Kaiti",style="ticks",font_scale=1.4)


a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
b = a.dropna(axis = 0)

plt.figure(figsize = (10,6))
plt.scatter(b.AirTemp,b.Humidity,c = "blue")
plt.grid()
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("剔除带有缺失值的行")
plt.show()

这里直接对原始数据可视化也可以,这是因为plt.scatter()函数会自动地不显示带有缺失值的点。

在这里插入图片描述
对缺失值填充,pandas库提供了数据表的fillna()方法,该方法可通过参数method设置缺失值的填充方式。method=“ffill”,使用缺失值前面的值进行填充;method=“bfill”,使用缺失值后面的值进行填充。

  1. 使用缺失值前面的值进行填充
import pandas as pd
import matplotlib
from matplotlib import pyplot as plt
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)


a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
# 找到缺失值所在位置
index = pd.isna(a.AirTemp) | pd.isna(a.Humidity)	# “|”这个符号在这里是并集的意思
b = a.fillna(axis = 0,method = "ffill")

# 画图
plt.figure(figsize = (10,6))
plt.scatter(b.AirTemp[~index],b.Humidity[~index],c = "blue",marker = "o",label = "非缺失值")	# “~”这个符号在这里是取反的意思
plt.scatter(b.AirTemp[index],b.Humidity[index],c = "red",marker = "s",label = "缺失值")
plt.grid()
plt.legend(loc = "upper right",fontsize = 12)
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("使用缺失值前面的值填充")
plt.show()

关于~index,我们知道index是缺失值所在的位置,那么~index就是非缺失值所在的位置。
在这里插入图片描述

  1. 使用缺失值后面的值进行填充

我们只需将上面代码中参数“method”的值改成bfill就行了。
在这里插入图片描述
3. 使用均值进行填充

跟上面的代码也差不多,再对这两列求个均值就行了。

import pandas as pd
import matplotlib
from matplotlib import pyplot as plt
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)


a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
index = pd.isna(a.AirTemp) | pd.isna(a.Humidity)
# 求均值
AirTempmean = a.AirTemp.mean()
Humiditymean = a.Humidity.mean()
# 填充
AirTemp = a.AirTemp.fillna(value = AirTempmean)
Humidity = a.Humidity.fillna(value = Humiditymean)

plt.figure(figsize = (10,6))
plt.scatter(AirTemp[~index],Humidity[~index],c = "blue",marker = "o",label = "非缺失值")
plt.scatter(AirTemp[index],Humidity[index],c = "red",marker = "s",label = "缺失值")
plt.grid()
plt.legend(loc = "upper right",fontsize = 12)
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("使用缺失值后面的值填充")
plt.show()

在这里插入图片描述
从上面三种简单的填充方式的结果图可以看出,红色并没有起到填充的作用(红色分布太规律了,并且很“单独”),这是因为这三种方法只是简单地分析一个变量,没有从整体出发。下面,我们来学习一下比较复杂的填充方法,它们都能考虑到数据的整体情况

🌗 复杂的缺失值填充方法

🌑 IterativeImputer多变量缺失值填充

IterativeImputer是sklearn库中提供的一种缺失值填充方式。该方法会考虑数据在高维空间中的整体分布情况,然后对缺失值的样本进行填充。

from sklearn.experimental import enable_iterative_imputer	
from sklearn.impute import IterativeImputer	# 导入我们所需的IterativeImputer,同时还要加上上面一句,不然会导入失败
import pandas as pd
from matplotlib import pyplot as plt
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)


a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
index = pd.isna(a.AirTemp) | pd.isna(a.Humidity)
# 填充
iterimp = IterativeImputer(random_state = 123) # random_state相当于随机数种子
a_iter = iterimp.fit_transform(a)
# 获取填充后的变量
AirTemp = a_iter[:,4]	# [:,4]表示第4列的所有行,下同
Humidity = a_iter[:,5]

plt.figure(figsize = (10,6))
plt.scatter(AirTemp[~index],Humidity[~index],c = "blue",marker = "o",label = "非缺失值")
plt.scatter(AirTemp[index],Humidity[index],c = "red",marker = "s",label = "缺失值")
plt.grid()
plt.legend(loc = "upper right",fontsize = 12)
plt.xlabel("AirTemp")
plt.ylabel("Humidity")
plt.title("使用IterativeImputer方式填充")
plt.show()

关于sklearn中的模块导入失败的问题,我自己之前也在网上找到了很多解决办法,都挨个试了一下,还是不行,最后还是在一位大佬的帮助下才成功,具体怎么解决的我也没看懂0.0

在这里插入图片描述
将这个图和上面那三个图一对比,是不是发现这个图填充的结果更符合数据的分布规律?

🌑 K-近邻缺失值填充

该方法可以使用sklearn库中的KNNImputer来完成。该方法会利用带有缺失值样本的多个近邻(挨得近的)综合情况,对缺失值样本进行填充。

# 只需改一下上面代码的填充和获取填充后的变量部分即可
knnimp = KNNImputer(n_neighbors = 5)
a_knn = knnimp.fit_transform(a)
AirTemp = a_knn[:,4]
Humidity = a_knn[:,5]

在这里插入图片描述

🌑

🌕 数据描述与异常值发现

数据描述是通过分析数据的统计特征,增强对数据的理解,从而利用合适的机器学习方法,对数据进行挖掘、分析

🌗 数据描述统计

数据描述统计主要有数据的集中位置、离散程度、偏度和峰度等

首先我们导入一个数据集。
这个数据集的部分如下:
在这里插入图片描述
为了方面我们进行数据描述统计,我们需要把Id列和Species列删除,因为Id并不是我们要的数据,Species也不是数字。

import pandas as pd
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/Iris.csv")
a = a.drop(["Id","Species"],axis = 1)
print(a)

在这里插入图片描述

🌑 数据集中位置

描述数据集中位置的统计量主要有均值、中位数、众数等

print(a.mean())		# 求均值
print(a.median())	# 求中位数
print(a.mode())		# 求众数

在这里插入图片描述

🌑 离散程度

描述数据离散程度的统计量主要有方差、标准差、变异系数、分位数和极差等。

⭐️变异系数:度量观测数据的标准差相对于均值的离中程度,计算公式为均值除以标准差。变异系数没有量纲,所以针对不同度量方式的变量可以相互比较,变异系数取值越大说明数据越分散

⭐️分位数:亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,可以使用quantile()方法进行计算。

⭐️极差:指的是数据最大值和最小值之间的差值,极差越小说明数据越集中

print(a.var())							# 方差
print(a.std())							# 标准差
print(a.mean() / a.std())				# 变异系数
print(a.quantile(q=[0.25,0.5,0.75]))	# 分位点,0.25是计算第一四分位数,0.5是第二四分位数(中位数),0.75是第三四分位数
print(a.max() - a.min())				# 极差

在这里插入图片描述

🌑 偏度和峰度

⭐️ 偏度:也称偏态系数,是用于衡量对称程度或偏斜程度的指标。可以通过skew()方法进行计算。

⭐️ 峰度:也称峰态系数,是哟过来衡量数据尾部分散度的指标。可以通过kurtosis()方法进行计算。

print(a.skew())
print(a.kurtosis())

在这里插入图片描述

🌑 单个数据变量的分布情况

单个连续变量可以使用直方图进行可视化。

import pandas as pd
from matplotlib import pyplot as plt

import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/Iris.csv")
a = a.drop(["Id","Species"],axis = 1)

plt.figure(figsize = (10,6))
plt.hist(a.PetalLengthCm,bins = 30,color = "blue")
plt.xlabel("PetalLengthCm")
plt.ylabel("频数")
plt.title("直方图")
plt.show()

hist()是绘制直方图的函数,第一个参数是指定要绘制直方图的数据(a.PetalLengthCm),第二个参数是设置长条形的数目(bins=30),第三个参数是长条形的颜色设置。
在这里插入图片描述

🌗 发现异常值的基本方法

在前面我们处理了缺失值,当一个数据没有缺失值后,我们就要去分析,去看有没有异常值。要处理异常值,我们首先就要发现异常值。那么怎样的值才被定义为“异常”呢?

🌑 3sigma法则

针对单个变量,通常可以使用3sigma法则识别异常值,即超出均值3倍标准差的数据可被认为是异常值(言下之意就是用数据的值减去均值后的绝对值大于标准差的3倍就是异常值)。

下面我们使用前面由IterativeImputer填充缺失值后的数据中的5个变量,来分析每个变量是否存在异常值。

import pandas as pd
from matplotlib import pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)
# 数据准备(前面有)
a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/热带大气海洋数据.csv")
index = pd.isna(a.AirTemp) | pd.isna(a.Humidity)
iterimp = IterativeImputer(random_state = 123)
a_iter = iterimp.fit_transform(a)
AirTemp = a_iter[:,4]
Humidity = a_iter[:,5]
b = pd.DataFrame(data = a_iter[:,3:8],columns = ["SeaSurfaceTemp","AirTemp","Humidity","UWind","VWind"])
print(b.head(5))	# 输出b的前五行数据
# 找出异常值
bmean = b.mean()	# 均值
bstd = b.std()		# 标准差
result = abs(b - bmean) > 3 * bstd	# 结果
print(result)	# 处理异常值的结果
print(result.sum())	# 异常值数量的统计

在这里插入图片描述

🌑 箱线图

同时,针对该数据也可以用箱线图进行可视化分析,箱线图在可视化时会使用点输出异常值的位置,因此可以判断数据中是否存在异常值。

b.plot(kind = "box",figsize = (10,6))
plt.title("数据集箱线图")
plt.grid()
plt.show()

在这里插入图片描述

🌑 散点图

前面两种方式都是分析单个变量是否有异常值,对于两个变量,也可以使用散点图直观地分析数据中是否有异常值。

from matplotlib import pyplot as plt

import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

x = [10,8,13,9,11,14,6,4,12,7,5]
y = [7.46,6.77,12.74,7.11,7.81,8.84,6.08,5.39,8.15,6.42,5.73]
plt.figure(figsize = (10,6))
plt.plot(x,y,"ro")
plt.grid()
plt.xlabel("X")
plt.ylabel("Y")
plt.text(12.5,12,"异常值")
plt.show()

在这里插入图片描述

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

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

相关文章

【安全研究】基于OPA和Spring Security的外部访问控制

译者导读 CNCF的毕业项目Open Policy Agent(OPA), 为策略决策需求提供了一个统一的框架与服务。它将策略决策从软件业务逻辑中解耦剥离,将策略定义、决策过程抽象为通用模型,实现为一个通用策略引擎,可适用于广泛的业…

阿里云对话 Tapdata:「开发者优先」正在影响商业化软件的开源选择

在刚刚过去的2022年,Tapdata 带着开源项目 PDK(Plugin Development Kit)及 Tapdata Community 和大家见面,兑现了我们对自己以及开发者们的开源承诺,同时与阿里云等生态伙伴联合,加速构建更加开放的数据生态…

Linux基础 - DNS服务进阶

‍‍🏡博客主页: Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主🌐所属专栏:『Linux基础』🌌上期文章: Linux基础 - DNS服务基础📰如觉得博主文章写的不错或对你有所帮助的话…

贪心策略(三)多机调度问题、活动选择(库函数sort的整理)

把sort库函数的使用总结一下&#xff1a; 1、头文件#include<algorithm> 时间复杂度nlog(n) 2、使用格式 sort&#xff08;arr.begin(), arr.end()&#xff09;&#xff1b; 3、默认使用升序排序&#xff0c;第三个参数默认使用less<T>() 4、如果需要进行降序排序…

springcloud + nacos多环境联调、本地联调(即灰度版本)

背景&#xff1a;当我们使用nacos为注册中心注册微服务时&#xff0c;想本地环境和测试环境公用一个nacos&#xff0c;即注册中心等基础服务共用。当我们在服务A开发时&#xff0c;本地服务和测试环境服务都是注册到同一个nacos&#xff0c;由于nacos自带负载均衡策略&#xff…

小程序开发经验分享(9)小程序快速上线汇总

微信小程序申请 开发中的Appid 需要从“微信公众平台”中获取 如果是直接从git上拉取的话 直接项目导入就可以了(名称可以是中文) 小程序基础配置 如果需要修改显示的名称和appid可以去生成的配置文件project.config.json里面修改

前端特效之毛玻璃-倾斜-日历

前端特效之毛玻璃-倾斜-日历描述项目效果index.htmlindex.css描述 项目描述开发语言HTML、JavaScript、CSS库dyCalendarJS、vanilla-tilt 该项目中需要使用到的库有&#xff1a; dyCalendarJS vanilla-tilt.js 是 JavaScript 中的一个平滑的 3D 倾斜库。vanilla-tilt dyCalen…

MS SQL Server 日志审核工具

手动审核数据库活动是一项艰巨的任务。有效实现这一目标的最佳方法是使用全面的解决方案来简化和自动化数据库和活动监控。该解决方案还应使数据库管理员能够监控、跟踪、即时识别任何操作问题的根本原因&#xff0c;并实时检测对机密数据的未经授权的访问。 审核 Microsoft S…

Bootstrap踩坑笔记(记录Bootstrap当中的核心知识点)

目录 1.Bootstrap官网 2.核心1:布局&#xff08;栅格系统&#xff09; 3.核心知识点3:响应式布局 A.容器 B.行 C.列 注意: D.案例: E.列偏移 F.列排序 4. 样式 A.按钮 B.图片 C.表格 5.组件 A.导航条 B.分页条 C.js插件 1.Bootstrap官网 Bootsrap官网 2.核心1…

docker入门(二):docker的常用命令

文章目录前言docker常用命令1 启停类/帮助 命令2镜像命令3 容器命令结语前言 大家好&#xff0c;这是我学习docker系列的笔记文章&#xff0c;目标是掌握docker,为后续学习K8s做准备。本文列举了docker的常用命令&#xff0c;感兴趣的朋友可以看一下以前的文章。 上一篇&#…

处理Springboot项目启动时streamBridge.send导致的卡住卡死问题

现象 我们的Spring Boot 项目启动时&#xff0c;偶现卡死的现象&#xff0c;启动到一半卡主不动了 2023-01-16 10:23:10.338 INFO 1 --- [ restartedMain] com.hazelcast.core.LifecycleService : [172.18.0.14]:5701 [dev] [4.2.4] [172.18.0.14]:5701 is STARTED 20…

Unity脚本 --- 常用API(常用类) --- Component类和Transform类

上面这个是Unity核心类图 第一部分 --- Component类 提供了查找组件的方法&#xff08;当前物体的&#xff0c;子物体&#xff0c;父物体的&#xff09; 1.颜色&#xff08;color&#xff09;是材质&#xff08;meterial&#xff09;控制的&#xff0c;meterial&#xff08…

【FreeRTOS】在Cortex-M4开发板上移植FreeRTOS并且实现LED灯闪烁(保姆级教程)

相信有不少小伙伴手上只有M4的开发板&#xff0c;想要移植FreeRTOS&#xff1b;但是&#xff0c;网上大部分都是M3移植教程。因此&#xff0c;陷入深深的迷茫中&#xff0c;难不成只能使用仿真了&#xff1f;&#xff1f;&#xff1f;&#x1f914;因此&#xff0c;小编特意写了…

【Linux】静态库和动态库

Linux为什么不允许普通用户给目录建立硬链接呢&#xff1f; 系统层面上有.和…硬链接指向目录。假设我们是超级用户&#xff0c;允许给目录建立硬链接&#xff0c;给根目录建立硬链接&#xff0c;从根目录开始查找&#xff0c;当查找硬链接的时候就是根目录&#xff0c;这时候递…

面试官让我聊聊 MQ 的数据丢失问题,没想到水这么深。。。

目录 一、背景引入二、Kafka分布式存储架构三、Kafka高可用架构四、画图复现Kafka的写入数据丢失问题五、Kafka的ISR机制是什么&#xff1f;六、Kafka写入的数据如何保证不丢失&#xff1f;七、总结 一、背景引入 这篇文章&#xff0c;给大家聊一下写入Kafka的数据该如何保证…

Git常用命令(全局设置获取仓库)

新建仓库: 填写名称等信息&#xff0c;根据需要选择私有&#xff0c;开源等选项。 创建完成。 邀请成员&#xff1a; Git常用命令 Git全局设置 首先要做的是设置用户名和email地址。这是非常重要的&#xff0c;每次Git提交都会使用该用户信息。 设置用户信息&#xff1a; …

岁末年初捷报频传 HashData斩获多项行业殊荣

凯歌高奏辞旧岁&#xff0c;数据赋智谱新篇。 刚刚过去的2022年&#xff0c;面对充满变数的外部环境&#xff0c;HashData始终坚持以技术为本&#xff0c;持续全面创新&#xff0c;适应数字经济发展趋势&#xff0c;笃行致远&#xff0c;砥砺前行&#xff0c;积极推动企业“上…

VPS融合怪测评脚本(主体已完善,历史遗留问题解决时间未知)(VPS fusion monster evaluation script)

ecs 原仓库链接&#xff1a;https://github.com/spiritLHLS/ecs 支持系统&#xff1a;Ubuntu 18&#xff0c;Debian 8&#xff0c;centos 7&#xff0c;Fedora&#xff0c;Almalinux 8.5, Arch 融合怪测评脚本 bash <(wget -qO- --no-check-certificate https://gitlab.…

Sealer 0.9 :帮助集群和分布式应用实现 Build、 Share、Run

作者&#xff1a;sealer 社区 新春之际&#xff0c;很高兴在此时宣布 Sealer [ 1] 0.9 版本的正式发布。Sealer 是一款致力于探索面向分布式应用的快速打包、交付和运行的解决方案。2021 年5月 Sealer 项目正式开源&#xff1b;短短一年时间&#xff0c;Sealer 在 2022 年 4 月…

人工智能图像识别四大算子

文章目录背景引入图像识别发展简介边缘检测算法*Prewitt算子**Sobel算子**Laplace算子**Conny算子** 文末寄语*背景引入 图像识别是当今计算机科学最热门的研究方向之一。随着科学技术的发展和人类社会的不断进步&#xff0c;图像识别技术在很多行业得到了广泛的应用。本章除了…