原标题:如何用Python分析泰坦尼克号生还率?

1912年当时世界上最大的豪华客轮泰坦尼克号在处女航中撞上冰山沉没,船上船员及乘客共有2224人,只有710人生还。当灾难突然降临时,所有人的生死瞬间成了魔鬼撒旦手中的骰子,一切充满了随机性,究竟什么样的人更容易获得命运之神的垂青?幸存者具有哪些共同特点?让我们一起来用Python探索问题吧!

主要探寻坦尼克号上的生还率和各因素(客舱等级、年龄、性别、上船港口等)的关系。

01 获取数据

我把原始数据 titanic-data.csv 放在和 notebook 文件同一目录下,然后通过read_csv 来载入文件,当然在开始载入数据前,我必须按照需求将需要用到的 Python 包导入进来。

# 用于数据分析

importpandas aspd

importnumpy asnp

# 用于绘图

importmatplotlib.pyplot asplt

importseaborn assns

%matplotlib inline

# 读取前五行数据

data_t = pd.read_csv('titanic-data.csv')

data_t.head()

# 数据集信息,包含数据集大小,列名,类型

data_t.info()

data_t.columns.values

RangeIndex: 891entries, 0to 890

Data columns (total 12columns):

PassengerId 891non-nullint64

Survived 891non-nullint64

Pclass 891non-nullint64

Name 891non-nullobject

Sex 891non-nullobject

Age 714non-nullfloat64

SibSp 891non-nullint64

Parch 891non-nullint64

Ticket 891non-nullobject

Fare 891non-nullfloat64

Cabin 204non-nullobject

Embarked 889non-nullobject

dtypes: float64(2), int64(5), object(5)

memory usage: 83.6+ KB

array(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',

'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype=object)

02 数据观察

载入 titanic-data.csv 到一个 DataFrame ,然后用 head() 函数打印出前5行数据(p.s 用 tail() 函数可以打印出后5行)。

通过对数据的初步观测,这个数据样本一共有 891 行 * 12 列数据,字段包含:

‘PassengerId(乘客id)’, ‘Survived(是否活下来)’, ‘Pclass(船舱等级)’, ‘Name(姓名)’, ‘Sex(性别)’, ‘Age(年龄)’, ‘SibSp(兄弟姐妹同行数量)’,‘Parch(父母配偶同行数量)’, ‘Ticket(票)’, ‘Fare(费)’, ‘Cabin(船舱)’, ‘Embarked(上船站)’

其中, 定类变量包括 Survived,Sex,Embarked, 定序变量 包括 Pclass, 数字变量 包括 PassengerId,Age,SibSp,Parch,Fare

通过观测发现,Age、Cabin、Embarked 包含了有空值

# 字段分析

defy(x):

returndata_t[x].unique()

print('='*20+ 'Survived字段内容'+ '='*20)

print(y('Survived'))

print('='*20+ 'Sex字段内容'+ '='*20)

print(y('Sex'))

print('='*20+ 'Pclass字段内容'+ '='*20)

print(y('Pclass'))

print('='*20+ 'Embarked字段内容'+ '='*20)

print(y('Embarked'))

====================Survived字段内容====================

[0 1]

====================Sex字段内容====================

['male''female']

====================Pclass字段内容====================

[3 1 2]

====================Embarked字段内容====================

['S''C''Q'nan]

03 变量的值

Survived 的值:0(死亡),1(存活)

Sex 的值:male(男性),female(女性)

Embarked的值包含 ‘S’ ‘C’ ‘Q’

# 显示重复的数据数量

data_t.duplicated().value_counts()

False 891

dtype: int64

04 重复数据

数据集一共有 891 行数据,不重复。

# 显示有空值的列

print(data_t['Age'].isnull().value_counts())

print('-'*50)

print(data_t['Cabin'].isnull().value_counts())

print('-'*50)

print(data_t['Embarked'].isnull().value_counts())

print('-'*50)

False714

True177

Name: Age, dtype: int64

--------------------------------------------------

True687

False204

Name: Cabin, dtype: int64

--------------------------------------------------

False889

True2

Name: Embarked, dtype: int64

--------------------------------------------------

05 空值情况

Age 一共有 714 行空数据

Cabin(船舱)一共有 204 行空数据

Embarked(上船站)一共有 2 行空数据。

# 描述性分析

data_t.describe()

06 描述性统计

在这次旅行的 891 名乘客中,有 38% 的人活了下来,幸运儿。

所有旅客中,年龄最小的只有 0.4 岁,最大的有 80 岁,平均年龄在 28 岁左右。

平均每个乘客有 0.52 个兄弟姐妹陪同,有 0.38 个父母配偶陪同。

有些乘客居然有 8 名同行的人。

旅客为这趟旅行平均花费 32 美元,最高花费 512 美元(贵族吧)

07 数据清洗(cleanse the data)

缺失值处理中,我们一般会删除缺失值。pandas模块中,提供了将包含NaN值的行删除的方法dropna(),但其实处理缺失值最好的思路是用最接近的数据替换。

首先,清洗数据就是处理空值,让这些空值参与到之后的数据分析中去。其次,我将删除那些对于数据分析本身并没有相关性的数据列,比如Cabin(因为一个船舱号对于是否能够逃生确实没有任何影响)。

最后,我会观察数据集,看看是否可以创造出一些新的特性,让我们的分析能够更直观快捷。

# 处理空值

data_t['Age'] = data_t['Age'].fillna(data_t['Age'].mean()).astype(np.int64)

data_t['Embarked'] = data_t['Embarked'].fillna({"Embarked":"S"},inplace=True)

# 删除无关的列

data_t = data_t.drop(['Ticket','Cabin'],axis='columns')

data_t.info()

RangeIndex: 891entries, 0to 890

Data columns (total 10columns):

PassengerId 891non-nullint64

Survived 891non-nullint64

Pclass 891non-nullint64

Name 891non-nullobject

Sex 891non-nullobject

Age 891non-nullint64

SibSp 891non-nullint64

Parch 891non-nullint64

Fare 891non-nullfloat64

Embarked 0non-nullobject

dtypes: float64(1), int64(6), object(3)

memory usage: 69.7+ KB

08 处理空值和多余的值

上面用年龄的平均数来代替空值,因为 ‘S’ 出现的频数最多,咖位最高,所以用 ‘S’ 代替空值。

我删除掉了 ‘Ticket’,‘Cabin’ 两列数据,实际上这两列数据对于我们分析数据并没有太多用处。

09 数据可视化分析

数据透视表是 Excel 中最常用的数据汇总分析工具,它可以根据一个或多个制定的维度对数据进行聚合,探索数据内深层次的信息。

在 pandas 中,同样提供了pandas.pivot_table 函数来实现这些功能。在接下来的分析中,我们会多次用到这个函数,所以先来熟悉下下这个函数:

pandas.pivot_table 函数中包含四个主要的变量,以及一些可选择使用的参数。四个主要的变量分别是数据源 data,行索引 index,列 columns,和数值 values。可选择使用的参数包括数值的汇总方式,NaN值的处理方式,以及是否显示汇总行数据等。

10 基本情况分析

我们先来看下基本情况:891人当中,生还比率与未生还比率是多少?

total_survived= data_t['Survived'].sum()

total_no_survived = 891- total_survived

plt.figure(figsize = (10,5)) # 创建画布

plt.subplot(121) # 添加第一个子图

sns.countplot(x='Survived',data=data_t)

plt.title('Survived count')

plt.subplot(122) # 添加第二个子图

plt.pie([total_survived,total_no_survived],labels=['Survived','No survived'],autopct='%1.0f%%')

plt.title('Survived rate')

plt.show()

结论:这891名乘客中,生还和未生还的比率分别为 38% 和 62%。

分别探索下 Pclass、Sex、Age 和 Embarked 等与“生还率”的关系,舱位(Pclass)与生还率关系

把 pivot_table 派上场。

# 不同船舱人数分布

data_t.pivot_table(values='Name',index='Pclass',aggfunc='count')

传几个参数就出来了,是不是很方便。

如果不使用 pivot_table 函数,我们一般用 group_by 来分组聚合。

data_t[['Pclass','Name']].groupby(['Pclass']).count()

比较来说,pivot_table 函数可读性更高。

可视化操作

plt.figure(figsize = (10,5)) # 创建画布

sns.countplot(x='Pclass',data=data_t)

plt.title('Person Count Across on Pclass')

plt.show()

还可以用饼图。

plt.figure(figsize = (10,5)) # 创建画布

plt.pie(data_t[['Pclass','Name']].groupby(['Pclass']).count(),labels=['1','2','3'],autopct='%1.0f%%')

plt.axis("equal") #绘制标准的圆形图

plt.show()

好了,这是不同舱位的人数分布情况,我们需要求出的是舱位与生还率的关系。

舱位与生还率的关系

data_t.pivot_table(values='Survived',index='Pclass',aggfunc=np.mean)

可视化操作

plt.figure(figsize= (10,5))

sns.barplot(data=data_t,x="Pclass",y="Survived",ci=None) # ci表示置信区间

plt.show()

结论:头等舱的生还概率最大,其次是二等舱,三等舱的概率最小。

性别(Sex)与生还率关系

# 不同性别生还率

data_t.pivot_table(values='Survived',index='Sex',aggfunc=np.mean)

plt.figure(figsize=(10,5))

sns.barplot(data=data_t,x='Sex',y='Survived',ci=None)

plt.show()

结论:女性幸存概率远远大于男性。

综合考虑性别(Sex),舱位(Pclass)与生还率关系

结论:女性幸存概率远远大于男性。

综合考虑性别(Sex),舱位(Pclass)与生还率关系

可视化操作

plt.figure(figsize=(10,5))

sns.pointplot(data=data_t,x='Pclass',y='Survived',hue='Sex',ci=None)

plt.show()

结论

·在各个船舱中,女性的生还率都大于男性。

·一二等船舱中女性生还率接近,且远大于三等舱。

·一等舱的男性生还率大于二三等舱,二三等舱男性生还率接近。

年龄(Age)与生还率关系

与上面的舱位、性别这些分类变量不同,年龄是一个连续的数值变量,一般处理这样的数据类型,我们采用将连续性的变量离散化的方法。

所谓离散化,指的是将某个变量的所在区间分割为几个小区间,落在同一个区间的观测值用同一个符号表示,简单理解就是将属于统一范围类的观测值分为一组。然后分组观察。

pandas中提供了cut函数,对变量进行离散化分割。

data_t['AgeGroup'] = pd.cut(data_t['Age'],5) # 将年龄的列数值划分为五等份

data_t.AgeGroup.value_counts(sort=False)

(-0.08, 16.0] 100

(16.0, 32.0] 525

(32.0, 48.0] 186

(48.0, 64.0] 69

(64.0, 80.0] 11

Name: AgeGroup, dtype: int64

各个年龄段的生还率

data_t.pivot_table(values='Survived',index='AgeGroup',aggfunc=np.mean)

可视化操作

plt.figure(figsize=(10,5))

sns.barplot(data=data_t,x='AgeGroup',y='Survived',ci=None)

plt.xticks(rotation=60) # 设置标签刻度角度

plt.show()

结论:儿童少年组的生还率更高。

11 多因素分析

以上是单独看年龄/性别/舱位和生还率的关系,下面我们综合多个因素来看生还率。

年龄(Age),性别(Sex)与生还率关系

data_t.pivot_table(values='Survived',index='AgeGroup',columns='Sex',aggfunc=np.mean)

可视化操作

plt.figure(figsize= (10,5))

sns.pointplot(data=data_t,x="AgeGroup",y="Survived",hue="Sex",ci=None,

markers=["^", "o"], linestyles=["-", "--"])

plt.xticks(rotation=60)

plt.show()

结论:儿童少年,女性的生还率更高。男性生还的基本上都是儿童少年。

年龄(Age),性别(Sex),舱位(Pclass)与生还率关系

data_t.pivot_table(values="Survived",index="AgeGroup",columns=["Sex","Pclass"],aggfunc=np.mean)

可视化操作

sns.FacetGrid(data=data_t,row="AgeGroup",aspect=2.5)

.map(sns.pointplot,"Pclass","Survived","Sex",hue_order=["male","female"],ci=None,palette="deep",

markers=["^", "o"], linestyles=["-", "--"]).add_legend()

plt.show()

总结

本次分析主要探寻泰坦尼克号上的生还率和各因素(客舱等级、年龄、性别、上船港口等)的关系。

样本数量为 891,海难发生后,生还者还剩 342 人,生还率为 38%。

泰坦尼克号上有一/二/三等舱三种船舱类型,其中头等舱的生还概率最大,其次是二等舱,三等舱的概率最小。

891人中,男性共577人,女性314人,女性生还率远远大于男性。可见女性比男性在这次事故中更容易生还,表明“女士优先”的原则在本次事故中得到了发扬。

样本的 891 人中,最小年龄为 0.42 ,最大年龄 80。按照[(0.34, 16.336] < (16.336, 32.252] < (32.252, 48.168] < (48.168, 64.084] < (64.084, 80.0]]划分原则,划分为5组,儿童少年组的生还率最高,年龄越大,生还率越低。“尊老爱幼”的原则在本次事故中没有很好体现。

样本的 891 人中,从 C 上船的生还率最高, Q上船的 次之,S上船生还率 最低。

最后需要说明的是,此次数据分析的数据集是从总体中抽样而来的,如果抽样无偏,样本是从总体随机选取,根据中心极限定理,分析结果具有代表性,如果不是随机选出,那么分析结果就不可靠了。

End.

作者:sixkery

来源:CSDN

最后推荐一门爱数据学院出品的课程

【零基础入职数据分析—就业班】1月24日 准时开课返回搜狐,查看更多

责任编辑:

python 分析泰坦尼克号生还率_如何用Python分析泰坦尼克号生还率?相关推荐

  1. python write 写多行_如何用 Python 执行单行命令

    一般来说,面对日常处理的一些小任务,直接用 sed,grep 之类的就可以搞定,更复杂一点的就会考虑 awk 或者用一些现成的轮子,要是 awk 搞不定我就只好用 Python 了.但有些时候,我仅仅 ...

  2. python删除excel第一行_如何用 Python 清洗数据?

    林骥的第 38 篇文章 0. 序言在做数据分析之前,我们首先要明确数据分析的目标,然后应用数据分析的思维,对目标进行细分,再采取相应的行动.我们可以把数据分析细分为以下 8 个步骤:(1)读取(2)清 ...

  3. python调用有道翻译_如何用python“优雅的”调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js"斗争"的 ...

  4. python爬取微信好友_如何用 Python 爬取自己的微信朋友

    原标题:如何用 Python 爬取自己的微信朋友 作者 Alfred 本文转载自网络,如涉及侵权请及时联系我们 微信作为一款拥有将近9亿用户的超级APP,已经成为很多人生活中不可或缺的一部分,聊天.分 ...

  5. python中文模糊关键词提取_如何用Python提取中文关键词?

    本文一步步为你演示,如何用Python从中文文本中提取关键词.如果你需要对长文"观其大略",不妨尝试一下. 需求 好友最近对自然语言处理感兴趣,因为他打算利用自动化方法从长文本里提 ...

  6. python能制作游戏吗_如何用python写一个小游戏

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 引言最近python语言大火,除了在科学计算领域python有用武之地之外,在游 ...

  7. 用python刷网页浏览量_如何用python 增加网站点击量?

    简单一句话:就是调用你的浏览器,然后程序自动帮你打开你的网页,隔一段时间自动关闭.之后的步骤就是循环,刷访问量.下面看一篇文章: python3爬虫之访问量.点击率数据的爬取分析 1.明确问题: 通过 ...

  8. python提取pdf文件内容_如何用Python批量提取PDF文本内容?

    本文为你展示,如何用Python把许多PDF文件的文本内容批量提取出来,并且整理存储到数据框中,以便于后续的数据分析. 问题 最近,读者们在后台的留言,愈发五花八门了. 写了几篇关于自然语言处理的文章 ...

  9. python判断素数的函数_如何用python求素数

    如何用python求100以内的素数? 质数(primenumber)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,如:2.3.5.7.11.13.1 ...

  10. python向数据库写入数据_如何用Python向Mysql中插入数据

    我们使用Python经常会和Postgresql进行搭配,很少将python和mysql进行搭配.下面小编给大家分享如何用Python向Mysql中插入数据. 工具/原料 Pycharm 方法/步骤 ...

最新文章

  1. Watir-webdriver处理table
  2. 大话卷积神经网络CNN,小白也能看懂的深度学习算法教程,全程干货建议收藏!...
  3. [转] Java中的static关键字解析
  4. Django从理论到实战(part13)--include函数
  5. [js] 微信的JSSDK都有哪些内容?如何接入?
  6. python根据文件名打标签_使用python将图片按标签分入不同文件夹的方法
  7. 寻找无向图的关节点(Articulation Points)和判断图是否是双连通图(Biconnect Graph)
  8. ASP.NET 推荐书籍
  9. C语言面试题分类-位运算
  10. 瞬变抑制二极管工作原理、特性参数、封装形式
  11. 爱站网关键词挖掘查询工具-批量网站关键词挖掘导出软件免费下载
  12. html多重阴影效果,如何使用css3实现文字的单阴影效果和多重阴影效果(附完整代码)...
  13. PTA:7-120 新浪微博热门话题 (30分)--(map方法,加解析)
  14. 2022年上半年软考报名常见问题及解答
  15. VA_LIST可变参数列表的使用方法与原理
  16. python 二值化细化_Python OpenCV图像细化
  17. K8S 1.8 平台搭建手册
  18. Linux 进程内存布局(一)
  19. 抖音小程序创建广告位
  20. suse11sp3上面配置zypper源

热门文章

  1. 工业机器人导轨 百度文库_工业机器人复习资料
  2. C++笔记(《C++新经典》)
  3. 卡口和电子警察的区别
  4. docker安装solr搜索引擎
  5. python贪吃蛇游戏手把手教学 第一课
  6. 互联网+房地产最后拼什么?除了技术还是技术
  7. 可在线接收验证短信的网站
  8. 关于手机app合并m3u8文件失效,pc端合成方法
  9. html id命名规范,关于Html class id 命名规范
  10. acwing 1904 奶牛慢跑