第一章,我们对泰坦尼克号数据有了基本的了解,也学到了一些基本的统计方法,第二章中我们学习了数据的清理和重构,使得数据更加的易于理解;今天我们要学习的是第二章第三节:数据可视化,主要给大家介绍一下Python数据可视化库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 |
《Python for Data Analysis》第九章
【思考】最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
#思考回答
#这一部分需要了解可视化图案的的逻辑,知道什么样的图案可以表达什么样的信号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) 也称为「标签云图」、「词云」等, 每个此的大小与其出现频率成正比,以此显示不同单词在给定文本中的出现频率,然后将所有的字词排在一起,形成云状图案。
#代码编写
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count_bySex')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLFw8wEs-1626609589767)(output_10_0.png)]
【思考】计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。
#思考题回答
男性身体素质好呀,心理素质可能也好一些,在困境中更加冷静的处理问题,所以相对存活率更高。
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)]
【提示】男女这两个数据轴,存活和死亡人数按比例用柱状图表示
【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?
#代码编写
# 计算不同票价中生存与死亡人数 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)]
从上面可以看出,排序默认会按升序排
#代码编写
# 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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6nEMsHur-1626609589866)(output_26_1.png)]
【思考】看到这个前面几个数据可视化,说说你的第一感受和你的总结
#思考题回答
仓位等级越高,存活比例越高
#代码编写
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()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h3ijd25L-1626609589871)(output_30_1.png)]
#代码编写
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")
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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,主要围绕构建可视图像元素。
如果你在工作中使用数据可视化,你必须知道数据可视化最大的作用不是炫酷,而是最快最直观的理解数据要表达什么。