泰坦尼克号生还者数据集下载(免费)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()

 主要字段有surivedalive为乘客的生还情况;pclassclass为船舱等级;sexwho为乘客性别;age为乘客年龄;silbspparch为是否带有家属,后面统一用alone字段代表是否有家属;fare为船票价格;embarkedembarked_town为上船地点。

2.  定义问题

本次分析中主要分析两个问题:

  1. 泰坦尼克号乘客的基本信息分布情况?
  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.  分析结果

  1. 男性乘客比女性乘客更多一些。
  2. 男性和女性的年龄很接近,但女性乘客的年龄跨度更大一些。
  3. 头等舱的年龄跨度较大,第三级船舱的中年人分布最多。
  4. 单独的乘客数量更多一些。
  5. 未生还的乘客人数更多一些。
  6. 生还乘客中女性占大多数。
  7. 成年人乘客数量占比很大,而小孩和年长乘客的占比很小。
  8. 乘客年龄与生还乘客之间的关系并不明显,但小孩的生还几率还是比较大的,而老人却相对更小。
  9. 乘客仓位等级越高,生还几率越大,单独的乘客生还的几率也更大一些。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐