作者 | 伊凡·伊德里斯(Ivan Idris),曾是Java和数据库应用开发者,后专注于Python和数据分析领域,致力于编写干净、可测试的代码。他还是《Python Machine Learning By Example》《NumPy Cookbook》等书的作者,在工程实践和书籍撰写方面都非常有经验。(本文摘编自《Python数据分析实战》,经出版方授权发布。)
来源 | 大数据(ID:hzdashuju)
编辑 | Jane
【导读】相比于科学,数据分析更像是一门艺术。创建样式优美的数据可视化是这个艺术中不可缺少的部分。然而,某些人认为优美的,也会有人觉得难以接受。和艺术类似,随着数据分析的快速演变,人们的观念和品味也一直在变化。但是总的来说没有人是绝对正确和错误的。
作为一个数据艺术家以及有经验的Python程序员,我们可以从 matplotlib、Seaborn、Bokeh 和 ggplot 这些库里面选择一些来使用。
一、图形化安斯库姆四重奏
安斯库姆四重奏(Anscombe's Quartet)是一个经典案例,它可以说明为什么可视化是很重要的。四重奏包含了四组统计特性一致的数据。每个数据集有一些x值以及相对应的y值,我们将在一个IPython Notebook中列出这些指标。如果你绘制出这些数据集,你将发现这些图表截然不同。
操作步骤
在本节你需要执行如下操作:
(1)由如下导入开始:
(2)定义以下函数来计算某一数据集中 x 和 y 的均值和方差、相关系数,以及斜率和每个数据集的线性拟合的截距:
(3)下面这个函数返回一个字符串,这个字符串有一部分是Markdown,有一部分是重组的文字,有一部分是HTML,这主要是因为原生的Markdown不支持图表:
(4)绘制数据并相应地与Seaborn的lmplot()函数线性拟合:
(5)展示一个统计数据的表格如下:
下表中显示每个数据集的几乎相同的统计数据(我修改了IPython配置文件里的 custom.css,所以下表是有颜色的):
(6)以下几行代码绘制了数据集:
请参见以下截图了解最终结果:
二、选择 Seaborn 的调色板
Seaborn 的调色板和 matplotlib 的颜色表类似。色彩可以帮助你发现数据中的模式,也是重要的可视化组成部分。Seaborn有很丰富的调色板,在这个示例中会将其可视化。
操作步骤
(1)导入部分如下:
(2)使用以下函数帮助绘制调色板:
(3)分类调色板(categorical palette)对于分类数据很有用,例如性别、血型等。以下函数可以绘制一些Seaborn的分类调色板:
(4)圆形色彩系统(circular color system)通常用HLS(色度亮度饱和度,Hue Lightness Saturation)来取代RGB(红绿蓝Red Gree Blue)颜色空间。如果你有很多分类这将会很有用。以下函数可以使用HLS系统绘制调色板。
(5)Seaborn也有基于在线的ColorBrewer工具的调色板。用以下函数绘制出来:
http://colorbrewer2.org/
(6)连续调色板(sequential palettes)对于数据范围很广的数据来说很有用,比如说有数量级差异的数据。用以下函数绘制出来:
请参见以下截图了解最终结果:
三、选择matplotlib的颜色表
matplotlib的颜色表最近受到了很多批评,因为它们可能会误导用户,但是在我看来大多数的颜色表还是不错的。默认的颜色表在matplotlib 2.0中有一些改进,可以在这里查看:
http://matplotlib.org/style_changes.html
当然,有些matplotlib的颜色表不支持一些不错的参数,比如说jet。在艺术中,就像数据分析中一样,几乎没有什么东西是绝对正确的,所以这里就交给读者去判断。
实际上,我觉得考虑如何解决印刷出版物以及各种各样的色盲问题是很重要的。在这个示例中我将用色条来可视化相对安全的颜色表。这里使用到的是matplotlib众多颜色表中的很小一部分。
操作步骤
(1)导入部分如下:
(2)通过以下代码画出数据集:
请参见以下截图了解最终结果:
四、与 IPython Notebook 部件交互
简单来说,这些部件可以让你像在HTML表单里一样选择一些值,这包括滑块、下拉框、选择框等。正如你会读到的,这些部件非常方便将我们在第1章中提及的天气数据可视化。
操作步骤
(1)导入部分如下:
(2)加载数据同时请求内联图:
(3)定义以下函数,这个函数会显示气泡图:
(4)通过以下代码调用我们刚刚定义的函数:
(5)本示例需要上手操作一下来理解它的工作原理,下面是一个样例气泡图:
(6)定义另一个函数(和第(2)步中的程序同名,注释掉前一个),这个函数里我们将数据按照日或月进行分组:
(7)用这段代码调用上述函数:
请参见以下截图了解最终结果:
我对这个图的第一印象是温度和风速似乎是正相关的。
五、查看散点图矩阵
如果你的数据集中变量不是很多,那么查看你数据所有的散点图是个不错的主意。通过调用Seaborn或者pandas的一个函数就可以做到。这些函数会展示一个矩阵的核密度估计图或对角线上的直方图。
操作步骤
(1)导入部分如下:
(2)以下几行代码加载天气数据:
(3)用Seaborn的pairplot()函数绘制图形,这个函数默认绘制对角线上的直方图:
结果如下所示:
(4)通过pandas的scatter_matrix()函数生成一个类似的图形,并请求对角线上的核密度估计图:
请参见以下截图了解最终结果:
六、通过 mpld3 使用 d3.js进行可视化
d3.js是在2011年推出的一个Javascript 数据可视化库,我们可以在IPython Notebook里面使用这个库。我们将在一个普通matplotlib图上添加一个悬浮工具提示。这里我们会使用mpld3包作为使用d3.js的桥梁。这个示例不需要任何Javascript编程。
1. 准备工作
通过以下命令安装mpld3 0.2:
2. 操作步骤
(1)由导入开始,并启用mpld3:
(2)加载天气数据并按照下面的方法将其绘制出来:
高亮显示的那一行是工具栏。在下面的截图中,我们可以看到“Day of year 31”文本来自这个工具栏:
如你所见,在这个图形的底部,还有可以平移和缩放图形的装置。
七、创建热图
热图使用一组颜色在矩阵中可视化数据。最初,热图用于表示金融资产(如股票)的价格。Bokeh是一个Python包,可以在IPython Notebook中显示热图,或者生成一个独立的HTML文件。
1. 准备工作
Anaconda自带了 Bokeh 0.9.1。Bokeh的安装说明在:
http://bokeh.pydata.org/en/latest/docs/installation.html
2. 操作步骤
(1)导入部分如下:
(2)下面的函数加载了温度数据并按照年和月进行分组:
(3)定义一个将数据重排成特殊的Bokeh结构的函数:
(4)定义一个返回横轴标签的函数:
(5)定义一个绘制包含了悬浮工具栏的热图的函数:
请参见以下截图了解最终结果:
八、把箱线图、核密度图和小提琴图组合
小提琴图(Violin Plot)是一种组合盒图和核密度图或直方图的图形类型。Seaborn和matplotlib都能提供小提琴图。在这个示例中我们将使用Seaborn来绘制天气数据的Z分数(标准分数),分数的标准化并不是必需的,但是如果没有它的话小提琴图会很发散。
操作步骤
(1)导入部分如下:
(2)加载天气数据并计算标准分数:
(3)绘制标准分数的小提琴图:
第一个小提琴图如下所示:
(4)绘制雨天和旱天相对风速的小提琴图:
九、使用蜂巢图可视化网络图
蜂巢图(Hive Plot)是用于绘制网络图的可视化技术。在蜂巢图中我们将边缘绘制为曲线。我们根据属性对节点进行分组,并在径向轴上显示它们。
有些库在蜂窝图方面很专业。同时我们将使用API来划分Facebook用户的图形。
https://snap.stanford.edu/data/egonets-Facebook.html
这个数据属于斯坦福网络分析项目(Stanford Network Analysis Project,SNAP),它也提供了Python API,但是目前SNAP API还不支持Python 3。
1. 准备工作
Anaconda自带了NetworkX 1.9.1,它安装说明可见:
https://networkx.github.io/documentation/latest/install.html
同时我们还需要community包,安装地址:
https://bitbucket.org/taynaud/python-louvain
在PyPi上有一个同名的包,但是它和我们需要安装的没有任何关系。安装hiveplot包,这个包托管在:
https://github.com/ericmjl/hiveplot
本示例中使用的hiveplot版本是0.1.7.4。
2. 操作步骤
(1)导入部分如下所示:
(2)载入数据,创建一个NetworkX的Graph对象:
(3)分割图形对象并按照如下的方法创建一个nodes字典:
(4)这个图形会非常大,所以我们将会创建三个边缘分组:
(5)绘制这个图形大约需要6分钟:
等待一段时间,我们可以看到如下的图形:
十、显示地图
无论是处理全球数据还是本地数据,使用地图都是一个适合的可视化方式。我们需要用坐标来将数据定位到地图上,通常我们使用的就是这个点的经度和纬度。有很多现有的文件格式可以存储地理位置数据。
在这个示例中我们将会使用到特别的shapefile格式以及更常见的制表符分隔值(Tab Separated Values,TSV)格式。shapefile格式是由Esri公司创建的,并包含了三个必需的文件,它们的扩展名分别是.shp、.shx、.dbf。
.dbf文件包含了shapefile中每一个地理位置的额外信息的数据库。我们将使用的shapefile包含了国家边界、人口以及国内生产总值(Gross Domestic Product,GDP)的数据。我们可以使用cartopy库下载shapefile。
TSV文件包含了超过4000个城市的按时间序列的人口数据,可以在这里获得:
https://nordpil.com/resources/world-database-of-large-cities/
1. 准备工作
首先我们需要从源文件安装Proj.4,或者你也可以使用二进制版本安装:
https://github.com/OSGeo/proj.4/wiki
Proj.4的安装说明在:
https://github.com/OSGeo/proj.4
然后我们可以通过pip安装cartopy,本示例中使用到的是cartopy-0.13.0。或者你也可以通过下面的指令进行安装:
2. 操作步骤
(1)导入部分如下所示:
(2)我们会使用颜色来做国家人口以及人口众多的城市的可视化。引入如下数据:
(3)使用以下代码画出地图,以及相应的颜色条,并将人口众多的城市标记在地图上:
十一、使用类ggplot2图
ggplot2 是在 R 语言用户群中很流行的数据可视化库。ggplot2的主要思想是在数据可视化的产出中包含多个图层。就像一个画家,我们从一个空的画布开始,紧接着一步步地添加图层。
通常我们使用rpy2来让Python接入R语言代码。然而,如果我们只是想使用ggplot2的话,用pyggplot库会显得更加方便。在这个示例中将实现三个国家的人口增长的可视化,使用的数据来自pandas上检索到的世界银行的数据。这些数据中包含各种指标和相关元数据。在这里可以下载到关于这些指标的描述:
http://api.worldbank.org/v2/en/topic/19?downloadformat=excel
我们可以认为世界银行的数据集是静态的。然而,类似的数据集经常发生变化,足以占用分析师所有的时间。更换指标的名字明显会影响代码,所以我决定通过joblib库来缓存数据。但是这个方法美中不足的是不能pickle所有的Python对象。
1. 准备工作
首先你需要有安装了ggplot2的R语言环境。如果你不是特别想使用ggplot2,或许你可以跳过这个示例。
R语言的主页是:
http://www.r-project.org/
ggplot2的文档:
http://docs.ggplot2.org/current/index.html
你可以通过pip安装pyggplot,我使用的是pyggplot-23。安装joblib,请浏览:
https://pythonhosted.org/joblib/installing.html
我的Anaconda中有joblib 0.8.4。
2. 操作步骤
(1)导入部分如下:
(2)通过以下代码加载数据:
(3)下面用我们新建的pandas对象Dataframe初始化pyggplot:
(4)添加条形图:
(5)翻转图表,使条形图指向右边并渲染
请参见以下截图了解最终结果:
十二、使用影响图高亮数据
类似于气泡图,影响图(influence plot)会考虑到单个数据点拟合、影响和杠杆之后的残差。残差的大小绘制在垂直轴上,并且可以标识数据点是异常值。为了更好地理解影响图,可以看下面的这些方程。
根据statsmodels文档,残差按标准偏差式(2.1)进行缩放,在式(2.2)中,n是观测点的数量,p是回归量。式(2.3)我们习惯称之为帽子矩阵(hat-matrix)。帽子矩阵的对角元素给出称为杠杆(leverage)的特殊度量,杠杆作为水平轴的量,可以标识出影响图的潜在影响。
在影响图中,影响会决定绘图点的大小。影响大的点往往具有高残差和杠杆。statsmodels可以使用Cook距离(Cook's distance)(见式(2.4))或者DFFITS(见式(2.5))来衡量影响值。
操作步骤
(1)导入部分如下:
(2)获取可用的国家的编码:
(3)从世界银行加载数据:
(5)使用Cook距离描绘这个模型的影响图:
请参见以下截图了解最终结果:
(本文为 AI大本营转载文章,转载请微信联系原作者)
◆
实习生招募
◆
推荐阅读:
Python超越Java,Rust持续称王!Stack Overflow 2019开发者报告
科大讯飞刷新纪录,机器阅读理解如何超越人类平均水平? | 技术头条
12个案例教你用Python玩转数据可视化
抵制996!Python之父发声背后,这个社区一呼百应!
刘强东割袍弃兄弟,马爸爸醉心 996
996.ICU 下被过度消费的程序员,还配享受生活吗?
漫画:图的 “最短路径” 问题 | 技术头条
4000万假币流入波场, 发生在凌晨的BTT假币攻击事件始末及细节披露
刺激!我31岁敲代码10年,明天退休!