使用Pandas进行数据分析
在您阅读这篇文章之前,您需要先了解以下内容:
如果您使用Python相关的技术进行机器学习,那么这篇文章很适合您。这篇文章即是介绍pandas这个python库在数据分析方面的应用。
在这篇文章中,您将会学习到pandas的一些使用技巧。通过这些技巧,您可以更加简便快速地处理数据,同时也会提高您对数据的理解。
数据分析
数据分析即是从您的数据中发掘并解决问题。
作为一名机器学习从业者,也许您并没有真正理解您所从事的领域,那么您需要一个这方面的专家随时在身边,但通常来说这不太可能。
当您将通过分析标准机器学习数据集,接受咨询或参与机器学习竞赛时,这些方法也同样适用。
您需要通过数据发掘更有价值的问题,或者您需要更好地了解您拥有的数据时,您可以通过汇总和可视化您的数据来做到这一点。
Pandas
Pandas这个Python库是专为数据分析设计的,使用它你可以快速地对数据进行处理。如果你用过R语言或其他技术进行过数据分析,那么你会感觉pandas的使用简单而熟悉。
通常Pandas似乎仅被用于数据预处理,但其实它也是非常优秀的数据分析工具,其在statsmodels包中提供了各类标准统计方法的封装,并且在matplotlib中提供了相应的绘图方法。
例子:糖尿病发病情况分析
首先,我们需要一个数据集,这个数据集将被用于练习使用pandas进行数据分析。
UIC机器学习知识库提供了大量不同标准的机器学习数据集,您可以通过在这些数据集上进行的练习来学习和应用机器学习。其中我最喜欢的一个数据集是印第安人糖尿病数据集。
该数据集通过秘鲁印第安女性的医疗记录数据展示了糖尿病的发病情况。您可以在这里了解有关此数据集的更多信息,这里可以下载该数据集的CSV文件pima-indians-diabetes.data。
数据摘要
首先,我们将从理解我们所使用的数据集组成开始。
加载数据
首先将CSV文件中的数据作为DataFrame(pandas所生成的数据结构)加载到内存中,并且在加载时设置每一列的名称:
import pandas as pd
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pd.read_csv('pima-indians-diabetes.data', names=names)
在这里可以了解更多的有关pandas读取和输出功能的使用和read_csv方法的更多信息。
数据描述
我们现在可以看看数据的整体情况:
可以直接通过print来查看前60行数据
print(data)
我们可以看到,所有的数据都是numeric类型的,而最后一列的类别(class)值即是我们要预测的因变量。
在数据转换结束时,我们可以看到数据框本身的描述为768行和9列,所以现在我们已经了解了我们的数据的整体情况。
接下来,我们可以通过查看汇总统计来了解数据集每个属性的分布情况。
print(data.describe())
这将显示我们data frame中各个属性的详细信息表,具体来说包含:数量,平均数,标准差,最小值,最大值,排序后位于25%的值、位于50%的值(中位数)以及位于75%的值。
通过查看这些统计数据,我们可以注意到一些有趣的信息:如平均怀孕次数为3.8次、最小年龄为21岁、有些人的体重指数为0,但这是显然是不可能的,因此某些属性值应标记为缺失。
可以在这里详细了解对DataFrame的描述操作。
数据可视化
图表更能说明数据集各属性的分布及相互之间的关系。
然而,重要的是要花时间先查看统计数据,每次查看以不同方式统计的数据时,您都注意到数据不同的特征,并可能对问题有更多样的见解。
Pandas使用matplotlib来创建图表,matplotlib也提供了很多方便的功能,您可以在这里了解Pandas更多关于数据可视化的知识。
特征分布
第一个易于审查的特征是各属性的分布。
我们可以通过箱线图(boxplot)来了解每个属性的分布:
import matplotlib.pyplot as plt
pd.options.display.mpl_style = 'default'
data.boxplot()
上面这段代码将绘制图形的样式(通过matplotlib)更改为默认样式,这样图像显示效果更好:
我们可以看到,在上图中test属性有很多异常值。同样也可以看到,plas属性似乎有一个相对均匀的正态分布。我们还可以通过将各值进行离散化处理,处理后可以将各“容器(bucket)”中属性的频率作为直方图(hist)来查看:
data.hist()
这可以让您注意各属性有趣的分布特征,例如pres和skin等属性近似于正态分布:
您可以在这里查看关于boxplot方法和hist方法的更多信息。
属性与分类的关系
下一个要探讨的重要内容是各属性的分类聚合。
其中一种方法是对每个各属性在数据上的特征进行分类,并对每一分类的进行不同的标记。您可以生成属性的直方图矩阵和按class分类后每一类值的直方图矩阵,如下所示:
data.groupby('class').hist()
数据按class属性分组,然后为每个组中的属性创建直方图矩阵,结果是两个图像:
这有助于指出诸如plas属性的class之间的分布差异。
您可以更好地比较同一图表上每个类的属性值
data.groupby('class').plas.hist(alpha=0.4)
这个数据按class属性分组,并且仅绘制了plas属性的直方图,其中红色的分类值为0,蓝色的分类值为1。如图你可以看到一个类似正态分布的图形,这个用法会有助于区分每一类。
您可以在这里阅读DataFrame上有关groupby函数的更多信息。
属性与属性的关系
最后要探讨的重要关系是属性之间的关系。
我们可以通过查看每对属性的交互分布来回顾属性之间的关系:
from pandas.tools.plotting import scatter_matrix
scatter_matrix(data, alpha=0.2, figsize=(6, 6), diagonal='kde')
这使用一个构造函数来创建属性与属性之间的散点图矩阵。每个属性将对其自身绘制的对角线显示该属性的核密度估计:
这是一个强大的功能,从中可以得出很多有关数据分析的启发。例如,我们可以看到age属性与preg之间可能存在的相关性,以及skin属性与mass属性之间的可能存在的关系。
总结
在这篇文章中我们已经涵盖了使用pandas进行数据分析的很多地方。
首先,我们着眼于如何快速而简便地载入CSV格式的数据,并使用汇总统计来描述它。
接下来,我们研究使用了各种不同的方法来进行数据可视化,通过可视化图标我们发掘了数据中的更多有趣的信息,并且研究了数据在箱线图和直方图中的分布。之后我们研究了与属性与分类的关系及分布,最后讨论了成对属性的散点图中各属性之间的关系。
- 破解之美:利用ECB加密缺陷突破cookie加密
- 让Python猜猜你是否能约会成功
- python学习笔记之初识Python
- 从APK解密到批量获取他人信息
- React native和原生之间的通信
- 移动云存储服务平台Parse下的iOS安全分析
- 经典算法学习之回溯法
- 渗透测试系统BackBox Linux 4.1发布
- CMS漏洞检测工具 - CMSmap
- 基因组分析中多物种同源基因的鉴定和筛选
- SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
- Intellij IDEA 插件开发之自建插件仓库
- 空Word文档附件:绕过垃圾邮件过滤的新方法
- SpringMVC基本使用关于DisptacherServlet关于ServletContainerInitializer最简单配置接收参数路径变量表单变量
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?
- 2020CHINC,来赴一场“共建智慧医院”的约会
- 《闲扯Redis十》Redis 跳跃表的结构实现
- 图数据库HugeGraph源码解读 (1) —— 入门介绍
- String及StringTable(一):String源码解读
- 四、原型模式与建造者模式详解
- LeetCode 23. 移动零
- LeetCode 11. 盛最多水的容器
- 29.MyBatis体系结构与工作原理
- 五、代理模式详解
- 六、门面模式与装饰器模式详解
- 七、享元模式与门面模式详解
- 如何白嫖3个月的JetBrains全家桶(包括Java神器IDEA)
- 潘石屹用Python解决100个问题 | 打印菱形
- 八、适配器模式与桥接模式详解