第一章,我们对泰坦尼克号数据有了基本的了解,也学到了一些基本的统计方法,第二章中我们学习了数据的清理和重构,使得数据更加的易于理解;今天我们要学习的是第二章第三节:数据可视化,主要给大家介绍一下Python数据可视化库Matplotlib,在本章学习中,你也许会觉得数据很有趣。在打比赛的过程中,数据可视化可以让我们更好的看到每一个关键步骤的结果如何,可以用来优化方案,是一个很有用的技巧。
2 第二章:数据可视化
开始之前,导入numpy、pandas以及matplotlib包和数据
# 加载所需的库
# 如果出现 ModuleNotFoundError: No module named 'xxxx'
# 你只需要在终端/cmd下 pip install xxxx 即可
#%matplotlib inline #模仿命令行来访问magic函数的在IPython中独有的形式.
#magic函数分两种:一种是面向行的,另一种是面向单元型的.
#行magic函数是用前缀“%.单元型magic函数是由两个“%%”做前缀的,它的参数不仅是当前“%%”行后面的内容,也包括了在当前行以下的行。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#加载result.csv这个数据
text = pd.read_csv('result.csv')
text.head()
Unnamed: 0 | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
0 | 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
2.7 如何让人一眼看懂你的数据?
《Python for Data Analysis》第九章
2.7.1 任务一:跟着书本第九章,了解matplotlib,自己创建一个数据项,对其进行基本可视化
【思考】最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
#思考回答
#这一部分需要了解可视化图案的的逻辑,知道什么样的图案可以表达什么样的信号b
1.点阵图表 (Dot Matrix Chart) 以点为单位显示离散数据,每种颜色的点表示一个特定类别,并以矩阵形式组合在一起。
适合用来快速检视数据集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让人更容易找出当中模式。
2.点数图 (Point & Figure Charts)也称为「P&F 图」, 使用由 X 和 O 符号组成的一系列方格来显示特定资产的供需关系。
这种图表与时间无直接关系,主要集中看资产的过滤价格表现;它也不会显示交易量,其目的只是显示任何供需关系上的变化,称为「突破」(breakouts)。
3.弧线图 (Arc Diagram) 是二维双轴图表以外另一种数据表达方式。在弧线图中,节点将沿着X轴放置,然后再利用弧线表示节点与节点之间的连接关系。
适合用来查找数据共同出现的情况。但缺点是:不能如其他双轴图表般清楚显示节点之间的结构和连接,而且过多连接也会使图表难于阅读。
4.折线图用于在连续间隔或时间跨度上显示定量数值,最常用来显示趋势和关系;也能给出某时间段内的「整体概览」,看看数据在这段时间内的发展情况。
5.平行坐标图 (Parallel Coordinates Plots) 能显示多变量的数值数据,最适合用来比较 同一时间的多个变量,并展示它们之间的关系。
6.网络图:也称为「网络地图」或「节点链路图」,用来显示事物之间的关系类型。
7.象形图 (Pictogram Chart) 也称为「象形统计图」,使用图案来显示数据量。使用图案能克服语言、文化和教育水平方面的差异。
8.直方图适合用来显示在连续间隔或特定时间段内的数据分布,有助于估计数值集中位置、上下限值以及确定是否存在差距或异常值;也可粗略显示概率分布。
9.密度图 (Density Plot) 又称为「密度曲线图」,用于显示数据在连续时间段内的分布状况。
10.条形图 (Bar Chart) 也称为「棒形图」或「柱形图」,采用水平或垂直条形(柱形图)来比较不同类别的离散数值。
11.不等宽柱状图 (Marimekko Chart)也称为「马赛克图」,用来显示分类数据中一对变量之间的关系,原理类似双向的 100% 堆叠式条形图,但其中所有条形数 值/标尺轴上具有相等长度,并会被划分成段。主要缺点在于难以阅读,适合提供数据概览。
12.雷达图 (Radar Chart) 又称为「蜘蛛图」、「极地图」或「星图」,是用来比较多个定量变量的方法,可用于查看哪些变量具有相似数值,或者每个变量中有 没有任何异常值;也可用于查看数据集中哪些变量得分较高/低,是显示性能表现的理想之选。
13.桑基图 (Sankey Diagram) 用来显示流向和数量。
14.误差线可以作为一项增强功能来显示数据变化,通常用于显示范围数据集中的标准偏差、标准误差、置信区间或最小/最大值。
15.树状结构图 (Treemap) 是一种利用嵌套式矩形显示层次结构的方法,同时通过面积大小显示每个类别的数量。
16.饼形图适合用来快速展示数据比例分布,但主要缺点是:不能显示太多项目、通常需要图例说明、不能准确比较。
17.螺旋图很适合用来显示大型数据集,通常显示长时间段内的数据趋势,因此能有效显示周期性的模式。
18.热图 (Heatmap) 通过色彩变化来显示数据,当应用在表格时,热图适合用来交叉检查多变量的数据;适用于显示多个变量之间的差异;显示当中任何模式;
显示是否有彼此相似的变量;以及检测彼此之间是否存在任何相关性。
19.散点图 (Scatterplot) 也称为「点图」、「散布图」或「X-Y 点图」 ,用来显示两个变量的数值(每个轴上显示一个变量),并检测两个变量之间的关系或 相关性是否存在。
20.地区分布图通常用来显示不同区域与数据变量之间的关系,并把所显示位置的数值变化或模式进行可视化处理。缺点是无法准确读取或比较地图中的数值。
此外,较大的地区会比较小区域更加显眼,影响读者对数值的感知。
21.甘特图 (Gantt Chart) 通常用作项目管理的组织工具,显示活动(或任务)列表和持续时间,也显示每项活动何时开始和结束。
甘特图适合用来规划和估计整个项目的所需时间,也可显示相互重迭的活动。
22.箱形图又称为「盒须图」或「箱线图」,能方便显示数字数据组的四分位数, 可以垂直或水平的形式出现。通常用于描述性统计,是以图形方式快速查看一个 或多个数据集的好方法。
23.弦图 (Chord Diagram) 可以显示不同实体之间的相互关系和彼此共享的一些共通之处,因此这种图表非常适合用来比较数据集或不同数据组之间的相似性。
24.时间线 (Timeline) 是以时间顺序显示一系列事件的图象化方式,主要功能是传达时间相关信息,用于分析或呈现历史故事。
25.字云图 (Word Cloud) 也称为「标签云图」、「词云」等, 每个此的大小与其出现频率成正比,以此显示不同单词在给定文本中的出现频率,然后将所有的字词排在一起,形成云状图案。
2.7.2 任务二:可视化展示泰坦尼克号数据集中男女中生存人数分布情况(用柱状图试试)。
#代码编写
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count_bySex')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLFw8wEs-1626609589767)(output_10_0.png)]
【思考】计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。
#思考题回答
男性身体素质好呀,心理素质可能也好一些,在困境中更加冷静的处理问题,所以相对存活率更高。
2.7.3 任务三:可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例图(用柱状图试试)。
bar(x, height, width=0.8, bottom=None, ***, align=‘center’, data=None, **kwargs)
x 表示x坐标,数据类型为int或float类型,
height 表示柱状图的高度,也就是y坐标值,数据类型为int或float类型,
width 表示柱状图的宽度,取值在0~1之间,默认为0.8
bottom 柱状图的起始位置,也就是y轴的起始坐标,
align 柱状图的中心位置,“center”,"lege"边缘
color 柱状图颜色
edgecolor 边框颜色
linewidth 边框宽度
tick_label 下标标签
log 柱状图y周使用科学计算方法,bool类型
orientation 柱状图是竖直还是水平,竖直:“vertical”,水平条:“horizontal”
#代码编写
# 提示:计算男女中死亡人数 1表示生存,0表示死亡
#在用pandas进行数据重排时,经常用到stack和unstack两个函数。stack的意思是堆叠,堆积,unstack即“不要堆叠”
#表格在行列方向上均有索引(类似于DataFrame),花括号结构只有“列方向”上的索引(类似于层次化的Series),
#结构更加偏向于堆叠(Series-stack,方便记忆)。stack函数会将数据从”表格结构“变成”花括号结构“,即将其行索引变成列索引,
#反之,unstack函数将数据从”花括号结构“变成”表格结构“,即要将其中一层的列索引变成行索引。
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('isSurvived_count_bySex')
plt.ylabel('count')
Text(0, 0.5, 'count')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PzCk2CXt-1626609589782)(output_15_1.png)]
【提示】男女这两个数据轴,存活和死亡人数按比例用柱状图表示
2.7.4 任务四:可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况。(用折线图试试)(横轴是不同票价,纵轴是存活人数)
【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?
#代码编写
# 计算不同票价中生存与死亡人数 1表示生存,0表示死亡
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fare_sur
Fare Survived
8.0500 0 38
7.8958 0 37
13.0000 0 26
7.7500 0 22
13.0000 1 16
..
7.7417 0 1
26.2833 1 1
7.7375 1 1
26.3875 1 1
22.5250 0 1
Name: Survived, Length: 330, dtype: int64
# 排序后绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S1izFjs8-1626609589790)(output_20_0.png)]
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=True)
fare_sur1
Fare Survived
15.0500 0 1
18.7875 0 1
1 1
20.2500 0 1
1 1
..
26.0000 0 16
7.7500 0 22
13.0000 0 26
7.8958 0 37
8.0500 0 38
Name: Survived, Length: 330, dtype: int64
fig = plt.figure(figsize=(20, 18))
fare_sur1.plot(grid=True)
plt.legend()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAgV2qVa-1626609589860)(output_22_0.png)]
从上面可以看出,排序默认会按升序排
2.7.5 任务五:可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况。(用柱状图试试)
#代码编写
# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur
Pclass Survived
1 1 136
0 80
2 0 97
1 87
3 0 372
1 119
Name: Survived, dtype: int64
import scipy
import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=text)
<AxesSubplot:xlabel='Pclass', ylabel='count'>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6nEMsHur-1626609589866)(output_26_1.png)]
【思考】看到这个前面几个数据可视化,说说你的第一感受和你的总结
#思考题回答
仓位等级越高,存活比例越高
2.7.6 任务六:可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况。(不限表达方式)
#代码编写
facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
<seaborn.axisgrid.FacetGrid at 0x23aecbcabe0>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h3ijd25L-1626609589871)(output_30_1.png)]
2.7.7 任务七:可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况。(用折线图试试)
#代码编写
text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
<matplotlib.legend.Legend at 0x23aecc1a640>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EqGFOVn-1626609589879)(output_32_1.png)]
【思考】上面所有可视化的例子做一个总体的分析,你看看你能不能有自己发现
#思考题回答
条形统计图可以清楚地表明各种数量的多少。
折线统计图不仅可以表示数量的多少,而且可以反映同一事物在不同时间里的发展变化的情况。
【总结】到这里,我们的可视化就告一段落啦,如果你对数据可视化极其感兴趣,你还可以了解一下其他可视化模块,如:pyecharts,bokeh等。
目前pyecharts支持的数据类型主要是list,如果不是可能会报异常。其实在Python中有各种container, iterable. 只要不是无限长的generator,都可以直接list化,自然想到把这些类型的支持也加进去;
对于二元数据构成的list,希望通过add(name, data, **kwargs)直接绘图。pyecharts提供了方法cast,该方法主要实现:
将dict的keys和values分别转为attr和data,也就是x数据和y数据;
将形如[{k1: v1}, {k2: v2}]的数据转为两个list;
将形如[(k1, v1), (k2, v2)]的由二元tuple构成的list转为两个list。
对于pd.Series,其name, index, values 三个属性正好对应一般绘制所需要的参数,当然pyecharts也提供了pdcast方法来转换,个人希望直接能支持,而且pdcast也并不识别name;
对于pd.DataFrame,其实每个column都对应一个pd.Series,很多时候每列直接都是可比的数据,需要绘制在同一张图中,就像pd.DataFrame.plot那样。pyecharts的pdcast会将pd.DataFram 转为二维list,不识别相应的index和columns,可能对Radar, Parallel,这类图有用,但个人以为可能更多人需要用该数据绘制多条线。对于更高维的数据,在pd中一般会用多维index或columns来表示,个性化太强,暂就不考虑了。
bokeh是一个以web浏览器为展示平台的交互式可视化的Python库。bokeh可以很简单地按照D3.js风格展示各种高质量的交互图,支持大数据以及流数据。综合易用性、功能完整性、灵活性以及可定制性,bokeh给用户提供了两个level的接口:
low-level: bokeh.models,主要提供给开发者;
high-level: bokeh.plotting,主要围绕构建可视图像元素。
如果你在工作中使用数据可视化,你必须知道数据可视化最大的作用不是炫酷,而是最快最直观的理解数据要表达什么。