**复习:**回顾学习完第一章,我们对泰坦尼克号数据有了基本的了解,也学到了一些基本的统计方法,第二章中我们学习了数据的清理和重构,使得数据更加的易于理解;今天我们要学习的是第二章第三节:数据可视化,主要给大家介绍一下Python数据可视化库Matplotlib,在本章学习中,你也许会觉得数据很有趣。在打比赛的过程中,数据可视化可以让我们更好的看到每一个关键步骤的结果如何,可以用来优化方案,是一个很有用的技巧。
2 第二章:数据可视化
开始之前,导入numpy、pandas以及matplotlib包和数据
# 加载所需的库
# 如果出现 ModuleNotFoundError: No module named 'xxxx'
# 你只需要在终端/cmd下 pip install xxxx 即可
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#加载result.csv这个数据
df = pd.read_csv('result.csv')
df.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
#折线图:展示数据随时间或有序类别的波动情况的趋势变化。
#柱状图:展示多个分类的数据变化和同类别各变量之间的比较情况。
#散点图:用于发现各变量之间的关系。
#饼图:用来展示各类别占比,比如男女比例。
2.7.2 任务二:可视化展示泰坦尼克号数据集中男女中生存人数分布情况(用柱状图试试)。
#代码编写
survived_sex = df.groupby('Sex')['Survived'].sum()
survived_sex.plot.bar()
plt.title('survived_sex_count')
plt.show()
【思考】计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。
#思考题回答
# 使用堆积柱状图,比较同类别各变量和不同类别变量总和差异。
2.7.3 任务三:可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例图(用柱状图试试)。
#代码编写
# 提示:计算男女中死亡人数 1表示生存,0表示死亡
# stack()即“堆叠”,作用是将列旋转到行
# unstack()即stack()的反操作,将行旋转到列
df.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked=True)
plt.title('Survived_count')
plt.ylabel('count')
Text(0,0.5,'count')
【提示】男女这两个数据轴,存活和死亡人数按比例用柱状图表示
2.7.4 任务四:可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况。(用折线图试试)(横轴是不同票价,纵轴是存活人数)
【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?
#代码编写# 计算不同票价中生存与死亡人数 1表示生存,0表示死亡fare_survived = df.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)fare_survived
Fare Survived8.0500 0 387.8958 0 3713.0000 0 267.7500 0 2226.0000 0 1613.0000 1 1626.0000 1 1510.5000 0 150.0000 0 147.7750 0 137.2500 0 127.7500 1 128.6625 0 127.2292 0 117.8542 0 107.9250 0 1010.5000 1 97.2250 0 926.5500 1 87.9250 1 824.1500 0 79.5000 0 716.1000 0 726.5500 0 769.5500 0 731.2750 0 77.0500 0 714.4542 0 627.9000 0 639.6875 0 6 ..90.0000 0 112.8750 0 112.6500 1 112.5250 0 116.0000 1 181.8583 1 117.4000 1 179.6500 0 175.2500 1 126.3875 1 176.2917 1 126.2833 1 125.9250 0 125.5875 0 124.1500 1 178.8500 0 124.0000 1 1 0 178.8500 1 122.5250 0 122.0250 1 121.6792 0 120.5750 1 1 0 120.5250 0 120.2500 1 1 0 118.7875 1 1 0 115.0500 0 1Name: Survived, Length: 330, dtype: int64
fig = plt.figure(figsize=(18,20))fare_survived.plot(grid=True)plt.legend()plt.show()
#排序前折线图fare_survivedare_before = df.groupby(['Fare'])['Survived'].value_counts()fare_survivedare_before
Fare Survived0.0000 0 14 1 14.0125 0 15.0000 0 16.2375 0 16.4375 0 16.4500 0 16.4958 0 26.7500 0 26.8583 0 16.9500 0 16.9750 0 1 1 17.0458 0 17.0500 0 77.0542 0 27.1250 0 47.1417 1 17.2250 0 9 1 37.2292 0 11 1 47.2500 0 12 1 17.3125 0 17.4958 0 2 1 17.5208 0 17.5500 0 3 1 1 ..106.4250 0 1 1 1108.9000 0 1 1 1110.8833 1 3 0 1113.2750 1 2 0 1120.0000 1 4133.6500 1 2134.5000 1 2135.6333 1 2 0 1146.5208 1 2151.5500 0 2 1 2153.4625 1 2 0 1164.8667 1 2211.3375 1 3211.5000 0 1221.7792 0 1227.5250 1 3 0 1247.5208 0 1 1 1262.3750 1 2263.0000 0 2 1 2512.3292 1 3Name: Survived, Length: 330, dtype: int64
fig = plt.figure(figsize=(18,20))fare_survivedare_before.plot(grid=True)plt.legend()plt.show()
2.7.5 任务五:可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况。(用柱状图试试)
#代码编写# 1表示生存,0表示死亡pclass_sur = df.groupby(['Pclass'])['Survived'].value_counts()pclass_sur
Pclass Survived1 1 136 0 802 0 97 1 873 0 372 1 119Name: Survived, dtype: int64
import seaborn as snssns.countplot(x='Pclass',hue='Survived',data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x1fe706752e8>
【思考】看到这个前面几个数据可视化,说说你的第一感受和你的总结
#思考题回答# 对于不同的数据,因采用不同展示方式,进行对比展示
2.7.6 任务六:可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况。(不限表达方式)
#代码编写#aspect : scalar, optional 文档说是纵横比,是说每个小图的横轴长度和纵轴的比Age = sns.FacetGrid(df,hue='Survived',aspect=3)#kdeplot(核密度估计图)# 核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验的方法之一。通过核密度估计图可以比较直观地看出数据样本本身的分布特征。Age.map(sns.kdeplot,'Age',shade=True)Age.set(xlim=(0,df['Age'].max())) #xlim x轴的范围Age.add_legend()
<seaborn.axisgrid.FacetGrid at 0x1fe706da2b0>
2.7.7 任务七:可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况。(用折线图试试)
#代码编写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.xlabel("age")plt.legend((1,2,3),loc='best')
<matplotlib.legend.Legend at 0x1fe6d1f5160>
【思考】上面所有可视化的例子做一个总体的分析,你看看你能不能有自己发现
#思考题回答# 女性总体比男性生存率高,票价越高对应的仓位等级越高,生存率也越高,但是三种仓位中都是40左右的年龄分布较多,说明这艘船大部分都史中青年
【总结】到这里,我们的可视化就告一段落啦,如果你对数据可视化极其感兴趣,你还可以了解一下其他可视化模块,如:pyecharts,bokeh等。
如果你在工作中使用数据可视化,你必须知道数据可视化最大的作用不是炫酷,而是最快最直观的理解数据要表达什么,你觉得呢?