本学习笔记为Datewhale-7月组队学习-动手学数据分析的学习内容,学习链接为:https://github.com/datawhalechina/hands-on-data-analysis
在前一篇博文【动手学数据分析-Task03:数据重构】里,我们一起学习了数据重构,包括数据从一种几何形态到另一种几何形态,从一种格式到另一种格式的转换,学习了数据拼接、数据聚合与运算等相关操作和指令。而在这篇博文中我们将会一起学习数据可视化,数据可视化可以让我们更加直观得观察数据的构成,方便我们从数据中获取更多的信息,可以为优化方向提供思路。
Task04:数据可视化
知识点:
matplotlib是python的一个绘图库,与numpy、pandas共享数据科学三剑客的美誉,也是很多高级可视化库底层基础,其重要性不言而喻。matplotlib不是python内置库,调用前需手动安装,且需依赖numpy库。
matplotlib是matrix + plot + library的缩写,有pylab和pyplot两个重要子模块。
figure,为所有绘图操作定义了顶层类对象Figure,相当于是提供了画板;
import matplotlib.pyplot as plt
fig = plt.figure()
在拥有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)
详细参考:
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
开始之前,导入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()
可视化展示男女中生存人数分布情况
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')
可视化展示不同票价的生存和死亡人数分布情况。
【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?
排序前:
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是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。但应强调的是,应该把Seaborn视为matplotlib的补充,而不是替代物。
在探索中等维数据时,一种有用的方法是在数据集的不同子集上绘制同一图的多个实例,但数据必须位于Pandas DataFrame中,并且必须采用“整洁”数据的形式。
Matplotlib为制作多轴数字提供了很好的支持; seaborn构建于此之上,可直接将绘图结构链接到数据集的结构。
FacetGrid可在数据集的子集中分别可视化变量的分布或多个变量之间的关系。 一个FacetGrid可展示三个变量的条件关系,将其中的变量赋值给网格的行和列,并使用不同颜色的绘图元素。
FacetGrid 是一个绘制多个图表(以网格形式显示)的接口。
步骤:
1、实例化对象
2、map,映射到具体的 seaborn 图表类型
3、调整绘图:更改轴标签,使用不同刻度或添加图例等操作
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)
可视化展示不同仓位等级的人生存和死亡人员的分布情况
pclass_sur = df.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur
import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=df)
可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况
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")
可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况
方法一:
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)
参数 | 说明 |
---|---|
x | X轴数据,列表或数组,可选 |
y | Y轴数据,列表或数组 |
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