**复习:**回顾学习完第一章,我们对泰坦尼克号数据有了基本的了解,也学到了一些基本的统计方法,第二章中我们学习了数据的清理和重构,使得数据更加的易于理解;今天我们要学习的是第二章第三节:数据可视化,主要给大家介绍一下Python数据可视化库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 |
《Python for Data Analysis》第九章
【思考】最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
#思考回答
#这一部分需要了解可视化图案的的逻辑,知道什么样的图案可以表达什么样的信号b
#折线图:展示数据随时间或有序类别的波动情况的趋势变化。
#柱状图:展示多个分类的数据变化和同类别各变量之间的比较情况。
#散点图:用于发现各变量之间的关系。
#饼图:用来展示各类别占比,比如男女比例。
#代码编写
survived_sex = df.groupby('Sex')['Survived'].sum()
survived_sex.plot.bar()
plt.title('survived_sex_count')
plt.show()
【思考】计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。
#思考题回答
# 使用堆积柱状图,比较同类别各变量和不同类别变量总和差异。
#代码编写
# 提示:计算男女中死亡人数 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')
【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?
#代码编写# 计算不同票价中生存与死亡人数 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()
#代码编写# 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)
【思考】看到这个前面几个数据可视化,说说你的第一感受和你的总结
#思考题回答# 对于不同的数据,因采用不同展示方式,进行对比展示
#代码编写#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()
#代码编写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')
【思考】上面所有可视化的例子做一个总体的分析,你看看你能不能有自己发现
#思考题回答# 女性总体比男性生存率高,票价越高对应的仓位等级越高,生存率也越高,但是三种仓位中都是40左右的年龄分布较多,说明这艘船大部分都史中青年
【总结】到这里,我们的可视化就告一段落啦,如果你对数据可视化极其感兴趣,你还可以了解一下其他可视化模块,如:pyecharts,bokeh等。
如果你在工作中使用数据可视化,你必须知道数据可视化最大的作用不是炫酷,而是最快最直观的理解数据要表达什么,你觉得呢?