本次分享的项目来自 Kaggle 的经典赛题:泰坦尼克号生还者预测。分为数据分析和数据挖掘两部分介绍。本篇为数据分析篇。

赛题解读

比赛概述

RMS 泰坦尼克号的沉没是历史上最为人熟知的海难事件之一。 1912 年 4 月 15 日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在船上的 2224 名乘客和机组人员中,共造成 1502 人死亡。这场耸人听闻的悲剧震惊了国际社会,从而促进了船舶安全规定的完善。

造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管在沉船事件中幸存下有一些运气因素,但有些人比其他人更容易存活下来,比如女人,孩子和上流社会。

在这个挑战中,要求完成哪些人可能存活下来的分析。特别的,要求运用机器学习工具来预测哪些乘客能够幸免于悲剧。

所需技巧

Python 和 R 的基础 (Python and R basics)

最终目标

预测一名乘客是否能够在泰坦尼克号沉没事件中幸存。

对测试集中的每一个PassengerId,将其相应的Survived变量预测为值 0 或 1(这里 1 表示幸存,0 表示遇难)。

数据分析

数据描述

首先,导入数据:

data_train = pd.read_csv('train.csv')

data_test = pd.read_csv('test.csv')

数据需要进行转换能够作为模型输入。我们对训练集data_train进行变换,同样需要对测试集data_test进行变换,保证模型输入的一致性。

合并在一起可以进行统一变换,变换后再拆分。也可使用之前没有经过变换的data_train。对数据集进行如下处理:

# 将目标变量 Survived 单独提取,从特征变量中移除目标变量 Survived

df_target = data_train['Survived']

data_train_feature = data_train.drop(['Survived'], axis=1)

# 合并 train 和 test 数据集,以方便数据处理对两个数据集同时进行

df = data_train_feature.append(data_test)

合并后的数据集如下图所示:

我们看到,共有 11 个特征:

PassengerId: 乘客 ID

Pclass: 舱位等级 (1 = 1st, 2 = 2nd, 3 = 3rd)

Name: 乘客姓名

Sex: 性别

Age: 年龄

SibSp: 在船上的兄弟姐妹/配偶个数

Parch: 在船上的父母/小孩个数

Ticket: 船票信息

Fare: 票价

Cabin: 客舱

Embarked: 登船港口 (C = Cherbourg, Q = Queenstown, S = Southampton)

以上就是对比赛和数据意义的解读,下面我们对数据进行探索,来达到最终目标。

数据预处理

特征分析

我们已经在上一步查看了有哪些特征,接下来要做的是:

查看哪些特征存在缺失值。

判断哪些特征存在异常值,通过对数值型特征进行简单的描述性统计。

判断这些特征的数据类型,从而为后面的可视化分析找到合适的方法。

对数据进行可视化分析。

分析得出有用的结论。

1. 查看哪些特征存在缺失值

查看 train 和 test 合并后的数据:

df.info()

查看哪些特征存在缺失值,缺失程度是否严重:

print(pd.isnull(df).sum())

可以看出 age,cabin,embarked 和 Fare 四个特征有缺失值,其中 cabin 的值缺失较严重。

2. 判断哪些特征存在异常值

对数值型特征进行简单的描述性统计,包括均值,中位数,标准差,最大值,最小值等,从而判断哪些特征存在异常值。

df.describe()

观察上述值,其中 Age 的最小值为 0.17,表示的应该是婴儿的年龄,最大值为 80,年龄有些偏大。Fare 表示船票价格,它的平均值为 33.2,中位数 14,平均值比中位数大很多,说明该特征分布是严重的右偏,又有最大值约 512,所以这个值很可能是一个异常值。在 SibSp 和 Parch 中,Sibsp 最大值为 8,有可能是异常值,但 Parch 最大值也为 9。这两个特征同时出现相近的较大的数值,而又由二者所表示的含义,说明这个数值是有可能的,需要进一步的观察。

由上所述,我们看到了一些可能的异常值,但还不能确定。需要我们进一步通过可视化来清楚的显示,并结合对业务的理解来确定。

3. 判断特征的数据类型

定类:Name, Sex, Ticket, Embarked, Cabin

定序:Pclass

定比:Age, Fare, SibSp, Parch

根据以上对各个特征数据类型的判断,选择合适的可视化方法完成可视化。通过可视化可以:

可以发现事实问题,并寻找出现的原因。

更清晰的了解特征对目标变量的影响,有助于特征工程。

可以发现不易发现的特征异常值。

4. 数据可视化分析

首先,定制画布风格:

plt.style.use("bmh")

解决中文乱码问题:

plt.rcParams['font.sans-serif'] = ['SimHei']

# 或者用 plt.rc('font', family='SimHei', size=13)

定类 / 定序特征分析

cat_list = ['Pclass','Name','Sex','Embarked','Ticket','Cabin']

for n,i in enumerate(cat_list):

Cabin_cat_num = df[i].value_counts().index.shape[0]

print('{0}. {1}特征的类型数量是: {2}'.format(n+1,i,Cabin_cat_num))

在上面各特征值的类型中,一些比较少数量的特征如 Pclass,Sex,Embarked 等可进行可视化分析。剩下特征如 Ticket 和 Cabin 分类较多,进行可视化分析达不到想要效果,难以得到有用的结论。

先对上面 3 种容易的分类进的特征行可视化,而对于 Name,Ticket,Cabin 等到后续进行进一步分析。

f, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=(20,5))

sns.countplot(x='Sex', hue='Survived', data=data_train, ax=ax1)

sns.countplot(x='Pclass', hue='Survived', data=data_train, ax=ax2)

sns.countplot(x='Embarked', hue='Survived', data=data_train, ax=ax3)

ax1.set_title('Sex特征分析')

ax2.set_title('Pclass特征分析')

ax3.set_title('Embarked特征分析')

f.suptitle('定类/定序数据类型特征分析', size=20, y=1.1)

plt.show()

通过分别观察各特征值的分布情况和与目标变量之间的关系,得出以下结论:

Sex:我们从 Sex 的特征分析图可以清晰的看,男性总人数大于女性总人数,但女性的存活率远远高于男性。

Pclass:3 等舱的存活率明显比 1 等舱和 2 等舱的低很多,这是由于 3 等舱的多为普通市民,而等级越高的舱位越有可能是当时社会地位较高的人。

Embarked:登陆港口 S 的数量最多,但获救率较低,而 C 港和 Q 港基本都有一半的人获救。

其中,Sex 和 Pclass 两个特征影响力较大。

以上是针对单独特征对生还与否的简单分析,但在实际问题中,往往是由多个因素共同决定对目标变量的影响。因此,我们需要知道在某个特定条件下的特征的影响(如 Pclass 是 1 的情况下男性和女性生还概率有何不同)才更加能帮助我们分析,即在数据集的子集内可视化变量的分布或多个变量之间的关系。这时就需要用到FacetGrid子集数据。

在不同社会等级下,男性和女性在不同登陆港口下的数量对比:

grid = sns.FacetGrid(df, col='Pclass', hue='Sex', palette='seismic', size=4)

grid.map(sns.countplot, 'Embarked', alpha=0.8)

grid.add_legend()

观察得到:

在 Q 港口登陆的乘客中,3 等舱的乘客占了绝大多数,而其他两个舱位几乎没有乘客在该港口登陆,说明登陆港口可能与社会等级有关联。

在 C 港口登陆的乘客中,女性乘客占大多数,这也间接的说明在 C 港口生还率很大。

在 S 港口登陆的乘客中,3 等舱的乘客最多,且总的来说男性乘客占比也最多,因此可推测 S 港口生还率较小。

定距/定比特征分析

Age 特征的 kde 分布:

f,ax = plt.subplots(figsize=(10,5))

sns.kdeplot(data_train.loc[(data_train['Survived'] == 0),'Age'] , color='gray',shade=True,label='not survived')

sns.kdeplot(data_train.loc[(data_train['Survived'] == 1),'Age'] , color='g',shade=True, label='survived')

plt.title('Age特征分布', fontsize = 15)

plt.xlabel("Age", fontsize = 15)

plt.ylabel('Frequency', fontsize = 15)

根据 Age 特征得到不同性别生还与否的分布:

def plot_distribution( df , var , target , **kwargs ):

row = kwargs.get( 'row' , None )

col = kwargs.get( 'col' , None )

facet = sns.FacetGrid( df , hue=target , aspect=4 , row = row , col = col )

facet.map( sns.kdeplot , var , shade= True )

facet.set( xlim=( 0 , df[ var ].max() ) )

facet.add_legend()

plot_distribution( data_train , var = 'Age' , target = 'Survived' , row = 'Sex' )

整体观察得到,0 到十几岁的孩子生还率最高,20 岁到 30 岁左右的生还率较低,其他年龄段没有太大的区别。而对于男性来说,0 到十几岁的乘客生还率明显较高,20 岁到 30 岁左右的生还率较低;而对女性来说,反而是 30 岁到 40 岁的年龄段生还率相对较高,0 到十几岁生还率并不高,其它各年龄段的生还率没有较大差别。

Fare 特征:

# 填充缺失值

data_test["Fare"].fillna(data_test["Fare"].median(), inplace=True)

data_train['Fare'] = data_train['Fare'].astype(int)

data_test['Fare'] = data_test['Fare'].astype(int)

# 分别获得生还和遇难乘客的 Fare

fare_not_survived = data_train["Fare"][data_train["Survived"] == 0]

fare_survived = data_train["Fare"][data_train["Survived"] == 1]

# 得到 Fare 的均值和方差

avgerage_fare = pd.DataFrame([fare_not_survived.mean(), fare_survived.mean()])

std_fare = pd.DataFrame([fare_not_survived.std(), fare_survived.std()])

data_train['Fare'].plot(kind='hist', figsize=(15,3),bins=100, xlim=(0,50))

avgerage_fare.index.names = std_fare.index.names = ["Survived"]

avgerage_fare.plot(yerr=std_fare,kind='bar',legend=False)

容易观察得到 Fare 低的数量多,而 Fare 高的数量少,但生还率明显要比 Fare 低的高很多。这也符合实际情况,买得起高票价的有钱人居多,社会地位可能相对较高,更容易获救。

SibSp 和 Parch 特征:

data_train['Family'] = data_train["Parch"] + data_train["SibSp"]

data_train['Family'].loc[data_train['Family'] > 0] = 1

data_train['Family'].loc[data_train['Family'] == 0] = 0

data_test['Family'] = data_test["Parch"] + data_test["SibSp"]

data_test['Family'].loc[data_test['Family'] > 0] = 1

data_test['Family'].loc[data_test['Family'] == 0] = 0

# 删除 Parch 和 SibSp

data_train = data_train.drop(['SibSp','Parch'], axis=1)

data_test = data_test.drop(['SibSp','Parch'], axis=1)

# 绘图

fig, (axis1,axis2) = plt.subplots(1,2,sharex=True,figsize=(10,5))

sns.countplot(x='Family', data=data_train, order=[1,0], ax=axis1)

# 分为和家人一起、独自乘船两种情况

family_perc = data_train[["Family", "Survived"]].groupby(['Family'],as_index=False).mean()

sns.barplot(x='Family', y='Survived', data=family_perc, order=[1,0], ax=axis2)

axis1.set_xticklabels(["With Family","Alone"], rotation=0)

我们将 SibSp 和 Parch 这两个特征合并为了一个 Family 特征,表示该乘客是否有和家人一起乘船,来判断是否会增加生还率。

可以明显的看出独自乘船的乘客人数大于和家人一起的乘客人数,但幸存人数相对而言较少。

5. 总结

将上述 6 个特征的相互关联图进行汇总,对角线为特征自身的 kde 分布,如下图所示:

g = sns.pairplot(data_train[[u'Survived', u'Pclass', u'Sex', u'Age', u'Family', u'Fare', u'Embarked']], hue='Survived', palette = 'seismic',

size=4,diag_kind = 'kde',diag_kws=dict(shade=True),plot_kws=dict(s=50) )

g.set(xticklabels=[])

数据分析部分就是这样了,根据个人的不同理解还可以有很多种不同的可视化方法,但最终目标都是为了帮助我们理解数据,进行挖掘分析。关于特征工程和建模的部分将在下一篇的数据挖掘中来介绍。

不足之处,欢迎指正。

泰坦尼克号python数据分析统计服_Kaggle入门级赛题:泰坦尼克号生还者预测——数据分析篇...相关推荐

  1. 2021年全国大学生数据统计与分析竞赛赛题B—基于机器学习的用户消费行为预测(上)

    2021年全国大学生数据统计与分析竞赛赛题B-基于机器学习的用户消费行为预测(上) 一.赛题B:用户消费行为价值分析 二.基于机器学习的用户消费行为预测 1.数据简介及清洗 (一)数据简介 (二)数据 ...

  2. 2021年全国大学生电子设计大赛(一)赛题解析与预测

    2021年全国大学生电子设计大赛赛题解析与预测 参考链接 往年赛题解析: 2015年无人机赛题: (2015)基本目标: (2015)发挥目标: (2015)赛题分解: 2017年赛题分析: (201 ...

  3. 【赠书】阿里云天池大赛赛题解析,深度学习篇!

    ‍‍ 阿里云天池作为国内知名的竞赛平台和AI社区,自诞生以来就一直秉持着让更多人公平获得大数据的理念.也正因此,天池每场经典赛事沉淀的课题和数据集都会永久保留和开放.截至目前,天池平台已举办了超过20 ...

  4. 2023年电赛国赛仪器仪表类赛题分析和预测

    2023年电赛国赛仪器仪表类赛题分析和预测 前言: 2023年题目应当与往年差异不大,无非是仪器类.电源类.控制类.通信类等几大类.但近几年随着科学技术的发展,电赛也添加了许多的新元素,比如互联网+. ...

  5. python上海房价数据分析统计服_(干货)数据分析案例--以上海二手房为例

    如果你手上有一批数据,你可能应用统计学.挖掘算法.可视化方法等技术玩转你的数据,但你没有数据的时候,我该怎么玩呢?接下来就带着大家玩玩没有数据情况下的数据分析. 本文从如下几个目录详细讲解数据分析的流 ...

  6. python excel 数据分析统计服_数据分析从入门到进阶(透彻讲解EXCEL.SQL.TABLEAU、PYTHON四项数据分析必会工具.免费提供1GB数据集...

    透彻讲解Excel.SQL.Tableau.Python四项数据分析必会工具,数据分析工作者的案头推荐工具书.系统介绍数据分析的策略.方法(数据分析之道):实例讲解引导.快速掌握数据分析工具(数据分析 ...

  7. python与金融数据分析统计服_作为一名量化金融分析师,你知道在量化金融中有多少个Python数据分析库嘛?...

    作为一名量化金融分析师,好用的工具非Python莫属了.为什么呢?Python也算得上是比较常用的编程语言,其效率和代码可读性是不容小觑的.作为一个科学数据的编程语言,Python介于R和java之间 ...

  8. python篮球比赛预测数据分析统计服_NBA常规赛结果预测——利用Python分析比赛数据...

    提起「大数据」,你会想到什么? 在很多人脑中,大数据都只是一个模糊的概念:也有人会说,大数据可以用来"预测股市"."预测地震"."预测消费者行为&qu ...

  9. 泰坦尼克号python数据分析统计服_Titanic数据分析报告(Python)

    研究目的:使用机器学习来创建一个模型,该模型可以预测哪些乘客在泰坦尼克号沉船事故中幸存下来. 研究结论: 分析过程: 本次分析使用Jupter Notebook进行分析 该notebook 服务的版本 ...

  10. 泰坦尼克号python数据分析统计服_数据分析可视化——泰坦尼克号幸存者分析(上)...

    文章目录数据获取.结构分析如何获取seaborn提供数据源 特征列分析 缺失值与数据清洗年龄缺失值处理 填充embarked 删除不必要的列 幸存者分析分析性别对存活率的影响 分析年龄对存活率影响 分 ...

最新文章

  1. 使用Leangoo共享脑图/思维导图做多级需求管理
  2. [YTU]_2738 指针练习--变量交换
  3. linux怎么进入gnu grub_十项Linux常识,你知道吗?
  4. 阿里云罗小飞:阿里云边缘云,从资源到场景的产品演进
  5. linux系统下开机启动流程
  6. [数据库] Oracle使用CASE判断解决多值问题
  7. 大V怒怼银行服务太差,一怒取走500万现金!上海银行回应了
  8. 第0003 天:论团队分工、成长
  9. 计算机信息数据集通信的概念,南京信息工程大学数据通信与计算机网络复习题库.doc...
  10. 「三分钟系列06」3分钟看懂http与https的区别
  11. 在Mac下连接阿里云服务器
  12. Android Service完全解析,关于服务你所需知道的一切(下) (转载)
  13. c# emnu 获取注释_C#机器学习之判断日报是否合格
  14. java web 基础框架搭建_JavaWeb之搭建自己的MVC框架(一)
  15. android自定义TextView字体
  16. 考研高等数学张宇30讲笔记——第五讲 一元函数微分学的几何应用
  17. 甘特图首选解决方案-世界级甘特图控件(XGANTT) - XGantt甘特图中文官方网站
  18. 天刀 服务器状态,12月11日服务器例行维护公告(已完成)
  19. Visual Studio Code下载安装教程
  20. 企业微信 PC端多开

热门文章

  1. [湖南大学程序设计实训训练作业一]7.F1方程式冠军(灵活运用下标来简化代码)
  2. 用正则去掉代码前面附带的数字序号
  3. D - Plane 航空管制2 HYSBZ - 2535
  4. unity3D网络游戏实战之坦克单元
  5. js打折 (批量计算9折 8折 7折
  6. python 修图_拿到一张图怎么后期才能更好一点啊?告诉你具体的修图思路
  7. 使用python绘制热力图(调用百度地图API)
  8. Java常用开源框架
  9. 学习:SPWeb:Allusers、SiteUsers、Users和Sitegroups、Groups以及安全性编程
  10. java文件一行一行读取_java一行一行写入或读取文件