动手学数据分析-Task04:数据可视化

本学习笔记为Datewhale-7月组队学习-动手学数据分析的学习内容,学习链接为:https://github.com/datawhalechina/hands-on-data-analysis



前言

在前一篇博文【动手学数据分析-Task03:数据重构】里,我们一起学习了数据重构,包括数据从一种几何形态到另一种几何形态,从一种格式到另一种格式的转换,学习了数据拼接、数据聚合与运算等相关操作和指令。而在这篇博文中我们将会一起学习数据可视化,数据可视化可以让我们更加直观得观察数据的构成,方便我们从数据中获取更多的信息,可以为优化方向提供思路。


一、学习知识点概要

Task04:数据可视化

知识点:

  1. 认识Matplotlib
  2. Matplotlib绘图操作
  3. 认识Seaborn
  4. Seaborn绘图操作

二、学习内容

(一)Matplotlib

matplotlib是python的一个绘图库,与numpy、pandas共享数据科学三剑客的美誉,也是很多高级可视化库底层基础,其重要性不言而喻。matplotlib不是python内置库,调用前需手动安装,且需依赖numpy库。
在这里插入图片描述

1. 认识Matplotlib

matplotlib是matrix + plot + library的缩写,有pylab和pyplot两个重要子模块。

  • pylab被定位是python中对MATLAB的替代产品。这里我们不对pylab做过多的叙述,有兴趣的小伙伴可以自行搜索
  • pyplot子模块主要用于绘图,有各种丰富的绘图功能是我们本次学习的重点。
(1)Figure

figure,为所有绘图操作定义了顶层类对象Figure,相当于是提供了画板;

import matplotlib.pyplot as plt
fig = plt.figure()
(2)Axes

在拥有Figure对象之后,在作画前我们还需要轴,没有轴的话就没有绘图基准,所以需要添加Axes,其定义了画板中的每一个绘图对象Axes,相当于画板内的各个子图,也可以理解成为真正可以作画的纸。

换句话说,figure是axes的父容器,而axes是figure的内部元素,而我们常用的各种图表、图例、坐标轴等则又是axes的内部元素。

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',
       ylabel='Y-Axis', xlabel='X-Axis')
plt.show()

以上的代码,在一幅图上添加了一个Axes,然后设置了这个Axes的X轴以及Y轴的取值范围,效果如下图:
在这里插入图片描述
对于上面的fig.add_subplot(111)就是添加Axes的,参数的解释的在画板的第1行第1列的第一个位置生成一个Axes对象来准备作画。也可以通过fig.add_subplot(2, 2, 1)的方式生成Axes,前面两个参数确定了面板的划分,例如 2,2会将整个面板划分成 2 * 2 的方格,第三个参数取值范围是 [1, 2*2] 表示第几个Axes。如下面的例子:

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(224)

在这里插入图片描述

2. 绘图3步走

在这里插入图片描述
详细参考:
https://blog.csdn.net/lemonbit/article/details/107096392
https://blog.csdn.net/qq_34859482/article/details/80617391

思考: 最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
解答:

定义特点代码
折线图以折线的上升或下降来表示统计数量的增减变化的统计图【变化情况】能够显示数据的变化趋势,反映事物的变化情况。plt.plot()
散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。【分布规律】判断变量之间是否存在数量关联趋势,展示离群点plt.scatter()
柱状图排列在工作表的列或行中的数据可以绘制到柱状图中。【统计/对比】绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。plt.bar(x, width, align=“center”)
直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。【正态分布】绘制连续性的数据展示一组或者多组数据的分布状况(统计)plt.hist(x, bins)
饼图用于表示不同分类的占比情况,通过弧度大小来对比各种分类。【占比】分类数据的占比情况(占比)plt.pie(x, labels, autopct, colors)

详细参考:https://blog.csdn.net/weixin_44799217/article/details/113839745

(二)Matpotlib绘图操作

1. 数据加载

开始之前,导入numpy、pandas以及matplotlib包和数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('result.csv',index_col=0)
df.head()

在这里插入图片描述

2. 柱状图

可视化展示男女中生存人数分布情况

sex = df.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
plt.ylabel('count')
plt.show()

在这里插入图片描述
思考: 计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?

解答:

计算出男女死亡人数

sex = df[df["Survived"]<1]
sex1 = sex.groupby('Sex')['Survived'].count()
print(sex1)

在这里插入图片描述
可视化男女死亡人数

sex1.plot.bar()
plt.title('dead_count')
plt.ylabel('count')
plt.show()

在这里插入图片描述
可视化展示男女中生存人数与死亡人数的比例

df.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')

在这里插入图片描述

3. 折线图

可视化展示不同票价的生存和死亡人数分布情况。

【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?

排序前:

fare_sur1 = df.groupby(['Fare'])['Survived'].value_counts()
fare_sur1

在这里插入图片描述
排序前绘折线图

fig = plt.figure(figsize=(10, 10))
fare_sur1.plot(grid=True)
plt.legend()
plt.ylabel('count')
plt.show()

在这里插入图片描述
对不同票价的生存和死亡人数进行排序

fare_sur = df.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fare_sur

在这里插入图片描述
排序后绘折线图

fig = plt.figure(figsize=(10, 10))
fare_sur.plot(grid=True)
plt.legend()
plt.ylabel('count')
plt.show()

在这里插入图片描述

(三)Seaborn

Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。但应强调的是,应该把Seaborn视为matplotlib的补充,而不是替代物。

1. FacetGrid

在探索中等维数据时,一种有用的方法是在数据集的不同子集上绘制同一图的多个实例,但数据必须位于Pandas DataFrame中,并且必须采用“整洁”数据的形式。

Matplotlib为制作多轴数字提供了很好的支持; seaborn构建于此之上,可直接将绘图结构链接到数据集的结构。

FacetGrid可在数据集的子集中分别可视化变量的分布或多个变量之间的关系。 一个FacetGrid可展示三个变量的条件关系,将其中的变量赋值给网格的行和列,并使用不同颜色的绘图元素。

(1)FacetGrid 绘图步骤

FacetGrid 是一个绘制多个图表(以网格形式显示)的接口。

步骤:
1、实例化对象
2、map,映射到具体的 seaborn 图表类型
3、调整绘图:更改轴标签,使用不同刻度或添加图例等操作

(2)FacetGrid 参数介绍
class seaborn.FacetGrid(data, row=None, col=None, hue=None, col_wrap=None, sharex=True, sharey=True, height=3, aspect=1, palette=None, row_order=None, col_order=None, hue_order=None, hue_kws=None, dropna=True, legend_out=True, despine=True, margin_titles=False, xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)

(四)Seaborn绘图操作

1. 柱状图

可视化展示不同仓位等级的人生存和死亡人员的分布情况

pclass_sur = df.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur

在这里插入图片描述
可视化展示不同仓位等级的人生存和死亡人员的分布情况

import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=df)

在这里插入图片描述

2. 折线图

可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况

df.Age[df.Pclass == 1].plot(kind='kde')
df.Age[df.Pclass == 2].plot(kind='kde')
df.Age[df.Pclass == 3].plot(kind='kde')
plt.legend((1,2,3),loc="best")

在这里插入图片描述

3. 一个数据多种可视化方法

可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况

方法一:

import seaborn as sns
plt.figure(figsize=(40, 20))
sns.countplot(x='Age',hue='Survived',data=df)

在这里插入图片描述
方法二:

facet = sns.FacetGrid(df, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, df['Age'].max()))
facet.add_legend()

在这里插入图片描述
方法三:

df.Age[df.Survived == 0].plot(kind = 'kde')
df.Age[df.Survived == 1].plot(kind = 'kde')
plt.xlim(xmin = 0, xmax=80)

在这里插入图片描述

三、学习问题与解答

问题一: 最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
解答:

定义特点代码
折线图以折线的上升或下降来表示统计数量的增减变化的统计图【变化情况】能够显示数据的变化趋势,反映事物的变化情况。plt.plot()
散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。【分布规律】判断变量之间是否存在数量关联趋势,展示离群点plt.scatter()
柱状图排列在工作表的列或行中的数据可以绘制到柱状图中。【统计/对比】绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。plt.bar(x, width, align=“center”)
直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。【正态分布】绘制连续性的数据展示一组或者多组数据的分布状况(统计)plt.hist(x, bins)
饼图用于表示不同分类的占比情况,通过弧度大小来对比各种分类。【占比】分类数据的占比情况(占比)plt.pie(x, labels, autopct, colors)

问题二: plt.plot()函数?
解答:

plt.plot()函数详细介绍:

plt.plot(x, y, format_string, **kwargs)
参数说明
xX轴数据,列表或数组,可选
yY轴数据,列表或数组
format_string控制曲线的格式字符串,可选
**kwargs第二组或更多(x,y,format_string),可画多条曲线

详细链接:https://www.jianshu.com/p/ed3f31fc6a41

问题三: kdeplot(核密度估计图)
解答:

核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。通过核密度估计图可以比较直观的看出数据样本本身的分布特征。具体用法如下:

seaborn.kdeplot(data,data2=None,shade=False,vertical=False,kernel='gau',bw='scott',gridsize=100,cut=3,clip=None,legend=True,cumulative=False,shade_lowest=True,cbar=False, cbar_ax=None, cbar_kws=None, ax=None, **kwargs)
部分主要参数说明
cut参数表示绘制的时候,切除带宽往数轴极限数值的多少(默认为3)
cumulative是否绘制累积分布
shade若为True,则在kde曲线下面的区域中进行阴影处理
color控制曲线及阴影的颜色
vertical表示以X轴进行绘制还是以Y轴进行绘制

详细链接:https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/103982455

问题四: Seaborn常见绘图总结
解答: https://blog.csdn.net/qq_40195360/article/details/86605860

问题五: Pyplot 常见绘图总结
解答: https://blog.csdn.net/qq_40195360/article/details/103710930

四、学习思考与总结

本次学习,学会了如何进行数据可视化。

数据可视化可以让我们更加直观得观察数据的构成,方便我们从数据中获取更多的信息,可以为优化方向提供思路。希望通过本次的学习,为后面数据建模与评估做一个良好的铺垫。

在学习过程中遇到了许多参考答案上没有给出的疑惑,通过自己的查找和理解在上面第三部分学习问题与解答给出了参考。

希望大家可以互相交流、共同学习,如果发现博文中有错的或不解的,欢迎留言或私聊交流~
————————————————

五、参考文章

[1]https://github.com/datawhalechina/hands-on-data-analysis
[2]https://blog.csdn.net/lemonbit/article/details/107096392
[3]https://blog.csdn.net/qq_34859482/article/details/80617391
[4]https://blog.csdn.net/weixin_44799217/article/details/113839745
[5]https://blog.csdn.net/weixin_42398658/article/details/82960379
[6]https://www.jianshu.com/p/ed3f31fc6a41

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值