本篇主要展示数据可视化过程,数据仍基于此前经过清洗和重构的泰坦尼克号沉船乘客数据。主要介绍一下Python数据可视化库Matplotlib。数据可视化可以让我们更好的看到数据建模过程中每一个关键步骤的结果如何,可以用来优化方案,是一个很有用的技巧。
2.7 数据可视化
开始前导入相应库和数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#加载数据
df = pd.read_csv('result.csv')
df.head(2)
【思考】最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
- line plot, 折线图适合可视化某个属性值随时间变化的走势,用于在连续间隔或时间跨度上显示定量数值,最常用来显示趋势和关系;也能给出某时间段内的「整体概览」,看看数据在这段时间内的发展情况。
- bar plot, 水平柱状图或垂直柱状图,参数stacked=True,可以设置叠状柱形图,是最常见的可视化表示方法,非常适合用于对比大小、直观
- pie plot, 饼图,明确显示数据的比例情况,尤其适合渠道来源分析等场景
- box plot, 箱盒图,能方便显示数字数据组的四分位数, 可以垂直或水平的形式出现。通常用于描述性统计,是以图形方式快速查看一个 或多个数据集的好方法,便于发现数据异常值
- scatter plot, 散点图,针对离散数据,用于判断两个变量之间的联系
- contour plot,等高线图 在地理课中讲述山峰山谷时绘制的图形,在机器学习中也会被用在绘制梯度下降算法的图形中
- histogram plot, 直方图是一种对数值频率进行离散化显示的条形图。数据点被分割成离散的,均匀间隔的箱子,并绘制每个箱子中的数据点的数量。用来查看数据的分布特征。
- Radar Chart 雷达图,又称为「蜘蛛图」、「极地图」或「星图」,是用来比较多个定量变量的方法,可用于查看哪些变量具有相似数值,或者每个变量中有 没有任何异常值;也可用于查看数据集中哪些变量得分较高/低,是显示性能表现的理想之选。
- Density Plot)密度图又称为「密度曲线图」,用于显示数据在连续时间段内的分布状况。
- Word Cloud 字云图 也称为「标签云图」、「词云」等, 每个此的大小与其出现频率成正比,以此显示不同单词在给定文本中的出现频率,然后将所有的字词排在一起,形成云状图案。
2.7.1 可视化展示泰坦尼克号数据集中男女中生存人数分布情况(用柱状图试试)
>>>sex = df.groupby('Sex')['Survived'].sum()
>>>sex
Sex
female 233
male 109
Name: Survived, dtype: int64
>>>sex.plot.bar()
>>>plt.title('survived')
Text(0.5,1,'survived')
**【思考】**计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?
>>>df.groupby(['Sex','Survived'])['Survived'].count()
Sex Survived
female 0 81
1 233
male 0 468
1 109
Name: Survived, dtype: int64
#按性别分存活与死亡人数
sex_survived = df.groupby(['Sex','Survived'])['Survived'].count().unstack()
sex_survived
【注】这里的unstack用法见python pandas stack和unstack函数 表格在行列方向上均有索引(类似于DataFrame),花括号结构只有“列方向”上的索引(类似于层次化的Series),结构更加偏向于堆叠(Series-stack,方便记忆)。stack函数会将数据从”表格结构“变成”花括号结构“,即将其行索引变成列索引,反之,unstack函数将数据从”花括号结构“变成”表格结构“,即要将其中一层的列索引变成行索引。
>>>died = sex_survived[0]
>>>died
Sex
female 81
male 468
Name: 0, dtype: int64
#画出死亡人数柱形图
died.plot.bar()
plt.title('died')
2.7.2 可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例图(用柱状图试试)
# 计算男女中死亡人数 1表示生存,0表示死亡
sex_survived.plot.bar()
sex_survived.plot(kind='bar',stacked='True')
#stack参数负责将条形柱堆叠起来
2.7.3 可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况。(用折线图试试)(横轴是不同票价,纵轴是存活人数)
# 计算不同票价中生存与死亡人数 1表示生存,0表示死亡
fare_survived = df.groupby(['Fare','Survived'])['Survived'].count().unstack()
fare_survived.head(8)
fare_survived.plot()
#plot默认为折线图
2.7.4 可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况。(用柱状图试试)
# 1表示生存,0表示死亡
pclass = df.groupby(['Pclass','Survived'])['Survived'].count().unstack()
pclass
pclass.plot.bar() #可以看到一等舱存活率最高,三等舱死亡人数最多
【总结】以上三个任务,得出结论:
- 女性的存活人数更多,存活比率更大
- 低票价的人死亡人数多,死亡概率大
- 头等舱的存活概率大,三等舱的死亡概率大(舱位等级越低,存活率越低,舱位等级越高,存活率越高)
2.7.5 可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况。(不限表达方式)
形式一:直方图
# 以死亡为例,找出死亡的个案所对应的年龄
df.Age[df.Survived == 0]
0 22.0
4 35.0
5 NaN
6 54.0
7 2.0
12 20.0
13 39.0
14 14.0
16 2.0
......
# 以直方图的形式展现
df.Age[df.Survived == 0].hist(bins=5)
#将不同年龄的人生存与死亡人数数据分布叠在一起做对比
df.Age[df.Survived == 0].hist(bins=5,alpha=0.5)
df.Age[df.Survived == 1].hist(bins=5,alpha=0.5)
#后面的alpha参数为修改颜色透明度使更直观可见
#添加图例
plt.legend((0,1))
#添加x,y坐标标题
plt.xlabel('age')
plt.ylabel('count')
#添加图标题
plt.title('Age_Survived')
可以看出,年龄小的乘客的存活概率要比年龄大的存活概率要大。接下来,我们将直方图标准化,纵坐标改为分布密度
#alpha参数为修改颜色透明度使更直观可见,density表示概率密度
df.Age[df.Survived == 0].hist(bins=5,alpha=0.5,density = 1)
df.Age[df.Survived == 1].hist(bins=5,alpha=0.5,density = 1)
#添加图例
plt.legend((0,1))
#添加x,y坐标标题
plt.xlabel('age')
plt.ylabel('density')
#添加图标题
plt.title('Age_Survived_density')
用曲线来分别拟合存活与死亡的概率密度,只需加入两步命令
#添加密度曲线
df.Age[df.Survived == 0].plot.density()
df.Age[df.Survived == 1].plot.density()
形式二:区域图
df4 = df.groupby(['Age', 'Survived'])['Survived'].count().unstack()
# df4.plot(kind='pie',subplots=True,stacked=True)
# df4.plot.bar(stacked=True)
df4.plot(kind='area',subplots=False,stacked=True, figsize=(20, 20),fontsize=20)
从area图中可以看出,泰坦尼克号小孩中青年存活的存活的数目较多,老年人存活率很低
形式三:面积图 除了matplotlib包,我们还可以使用seaborn画图工具
#运用seaborn画图工具
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()
2.7.6 可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况。(用折线图试试)
# 以一等舱为例画出其年龄分布的概率密度函数
df.Age[df.Pclass == 1].plot.density()
对仓位等级标签进行排序
>>>unique_pclass = df.Pclass.unique()
>>>unique_pclass.sort()
>>>unique_pclass
array([1, 2, 3], dtype=int64)
将不同等级舱位的概率密度函数画在一张图上
for i in unique_pclass:
df.Age[df.Pclass == i].plot.density()
plt.xlabel('age')
plt.legend(unique_pclass)
使用seaborn画图包
import seaborn as sns
# linewidth、legend分别表示线条宽度和图例,legend默认为True
for i in unique_pclass:
sns.kdeplot(df.Age[df.Pclass == i],shade=True,linewidth=0,legend=False)
for i in unique_pclass:
sns.kdeplot(df.Age[df.Pclass == i],shade=True)
plt.legend(unique_pclass)
可以看出头等舱的人一般年龄偏大,三等舱年龄分布较为年轻
【总结】: 数据可视化的本质是最快最直观的理解数据要表达什么。除了本文提到的matplotlib、seaborn库之外,还有如pyecharts,bokeh等诸多可视化模块,简要介绍可参考以下文章: 这10个python数据可视化库,通吃任何领域 深度盘点!整理了 38 个 python 数据可视化库 Pandas的奇淫技巧-数据可视化
|