Python数据分析项目实例4:使用seaborn分析泰坦尼克号生还者数据
泰坦尼克号生还者数据集下载(免费):https://download.csdn.net/download/weixin_44940488/20814899使用的分析软件:jupyter notebook主要语法知识:Python数据清洗与整理、seaborn数据可视化。1. 数据来源# 导入相关库import numpy as npimport pandas as pdimport seaborn
·
泰坦尼克号生还者数据集下载(免费):https://download.csdn.net/download/weixin_44940488/20814899
使用的分析软件:jupyter notebook
主要语法知识:Python数据清洗与整理、seaborn数据可视化。
1. 数据来源
# 导入相关库
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei' # 用来正常显示中文
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 数据导入
titanic = pd.read_csv(open('数据/titanic.csv'))
titanic.head()
主要字段有:surived和alive为乘客的生还情况;pclass与class为船舱等级;sex和who为乘客性别;age为乘客年龄;silbsp和parch为是否带有家属,后面统一用alone字段代表是否有家属;fare为船票价格;embarked和embarked_town为上船地点。
2. 定义问题
本次分析中主要分析两个问题:
- 泰坦尼克号乘客的基本信息分布情况?
- 乘客的信息与生还数据是否有关联?
3. 数据清洗
第一步:缺失值处理
# 查看缺失值
titanic.isnull().sum()
titanic.info()
第二步:年龄处理
# 年龄分布图:通过seaborn和displot函数查看乘客的年龄分布
sns.set(style="darkgrid", palette="muted", color_codes=True)
sns.distplot(titanic[titanic['age'].notnull()]['age'])
这里发现年龄呈正态分布,于是年龄的均值进行缺失值填充,再进行年龄分布的可视化。
# 年龄插值
titanic['age'] = titanic['age'].fillna(titanic['age'].mean())
sns.distplot(titanic['age'])
第三步:乘客性别处理
# 男女乘客分类
Age_male = titanic[titanic.sex == 'male']['age']
Age_female = titanic[titanic.sex == 'female']['age']
from scipy.stats import norm
# 男性
sns.distplot(Age_male,bins=30,kde=False,hist_kws={'color':'steelblue'},
norm_hist = True,label='男性')
sns.distplot(Age_male,hist=False,kde=False,fit = norm,fit_kws={'color':'yellow'},
norm_hist = True,label='男性正态分布图')
plt.legend(loc='best')
# 女性
sns.distplot(Age_female,bins=30,kde=False,hist_kws={'color':'red'},
norm_hist = True,label='女性')
sns.distplot(Age_female,hist=False,kde=False,fit = norm,fit_kws={'color':'green'},
norm_hist = True,label='女性正态分布图')
plt.legend(loc='best')
sns.distplot(Age_male,bins=30,kde=False,hist_kws={'color':'steelblue'},
norm_hist = True,label='男性')
sns.distplot(Age_male,hist=False,kde=False,fit = norm,fit_kws={'color':'yellow'},
norm_hist = True,label='男性正态分布图')
plt.legend(loc='best')
sns.distplot(Age_female,bins=30,kde=False,hist_kws={'color':'red'},
norm_hist = True,label='女性')
sns.distplot(Age_female,hist=False,kde=False,fit = norm,fit_kws={'color':'green'},
norm_hist = True,label='女性正态分布图')
plt.legend(loc='best')
# 利用countplo方法对embarked进行可视化
sns.countplot(x="embarked",data=titanic)
# 接着利用正确的登船地点S进行缺失值的填充。
# 填充embarked字段
titanic['embarked'] = titanic['embarked'].fillna('S')
titanic.isnull().sum()
titanic.head()
# 清洗后的数据
titanic = titanic.drop(['survived','pclass','sibsp','parch','who','adult_male','deck','embark_town'],axis=1)
titanic.head()
4. 数据探索
(1)性别分布
# 性别分布
sns.countplot(x="sex",data=titanic)
(2)乘客性别、年龄分布
# 乘客性别、年龄分布箱线图
sns.boxplot(x='sex',y='age',data=titanic)
(3)船舱等级数量分布
# 船舱等级数量分布
sns.countplot(x='class',data=titanic)
(4)船舱等级年龄分布
# 船舱等级年龄分布
sns.violinplot(x='class', y='age', data=titanic)
(5)生还乘客计数
# alone计数
sns.countplot(x='alone',data=titanic)
# 生还乘客分布
sns.countplot(x="alive",data=titanic)
(6)乘客性别与生还关系1
# 乘客性别与生还关系1
sns.countplot(x='alive',hue='sex',data=titanic)
(7)乘客性别与生还关系2
# 乘客性别与生还关系2
g = sns.FacetGrid(titanic, col='sex')
g.map(sns.countplot, 'alive')
(8) 乘客年龄段分布
老人和小孩也是优先考虑的对象,因此这里对年龄进行分级,分开小孩和老人的数据。代码如下:
# 年龄分级
def agelevel(age):
if age <= 16:
return 'child'
elif age >= 60:
return 'aged'
else:
return 'midlife'
titanic['age_level'] = titanic['age'].map(agelevel)
titanic.head()
# 乘客年龄段分布
sns.countplot(x='age_level',data=titanic)
# 乘客年龄和生还关系
sns.countplot(x='alive',hue='age_level',data=titanic)
(9)舱位等级、是否有家属字段与生还关系
# 舱位等级(class)、是否有家属(alone)字段与生还关系
g = sns.FacetGrid(titanic, col='class', row='alone')
g.map(sns.countplot, 'alive')
5. 分析结果
- 男性乘客比女性乘客更多一些。
- 男性和女性的年龄很接近,但女性乘客的年龄跨度更大一些。
- 头等舱的年龄跨度较大,第三级船舱的中年人分布最多。
- 单独的乘客数量更多一些。
- 未生还的乘客人数更多一些。
- 生还乘客中女性占大多数。
- 成年人乘客数量占比很大,而小孩和年长乘客的占比很小。
- 乘客年龄与生还乘客之间的关系并不明显,但小孩的生还几率还是比较大的,而老人却相对更小。
- 乘客仓位等级越高,生还几率越大,单独的乘客生还的几率也更大一些。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)