1 引言

刚接触python与大数据不久,这个是学长给出的练习题目。知识积累太少,学习用了不少的时间。尽量详细的写,希望对各位的学习有所帮助。

2 背景

2.1 Kaggle

本次数据集来自于Kaggle。Kaggle是一个数据分析建模的应用竞赛平台。想要了解详细资料的小伙伴请自行百度。

2.2 泰坦尼克号

请到Data页面下载数据集

数据集的各属性在Data页面下有详细介绍。

问题就是以大家熟悉的泰坦尼克号为背景展开的,本次任务的目的就是构建一个可以根据乘客个人信息推测乘客是否生存的数据模型。

3 工具介绍

3.1 Python

我所用的python版本为:Python 3.5.2 。

3.2 Anaconda3

Anaconda 是一个很好用的数据分析工具集,其中的Spyder 与 Jupyter Notebook今后会经常使用,而且使用非常方便。

4 初探数据

相信你已经将数据下载到你的电脑中了,下面我们来将数据经行导入及简单分析。

请先打开Spyder。

4.1 导入训练集数据

import pandas as pd #数据分析

import numpy as np #科学计算

from pandas import Series,DataFrame

data_train = pd.read_csv(r'E:\Data\train.csv') #根据数据位置自行修改

运行后我们会在Spyder窗口右上部看到data_train数据。点击后即可显示数据表格,如下:

4.2 数据简单分析

观察图表我们可以知道,共有891行、12列。这代表本训练集共有891条数据,每条数据有12类信息。包括:

• PassengerId => 乘客ID

• Survived => 获救情况(1为获救,0为未获救)

• Pclass => 乘客等级(1/2/3等舱位)

• Name => 乘客姓名

• Sex => 性别

• Age => 年龄

• SibSp => 堂兄弟/妹个数

• Parch => 父母与小孩个数

• Ticket => 船票信息

• Fare => 票价

• Cabin => 客舱

• Embarked => 登船港口

初步观察,我们会发现一些数据信息值为:nan,这就代表该条数据该类信息缺失。在数据分析中,处理缺失值是一个很重要的步骤。一开始,我们不如统计各类信息的缺失的总体情况,让自己对该数据集有所了解。

我们可以在IPython console框中输入:

data_train.info()

回车运行后,即可出现以下内容:

由此可知,Age(年龄)有714人有记录,Cabin(客舱)有204人有记录,Embarked(登陆港口)有少量缺失。

我们还可以用下列语句进行数据的总体统计:

data_train.describe()

结果如下:

由此我们可知,乘客的平均年龄为29.7,最大年龄为80.0,最小年龄为0.42。获救人数为总体的0.383838,等等。

5 数据图形化分析

进行完总体的初步分析,我们接下来进行数据相关性的分析,为了便于观察,我们利用图表展示。

5.1 乘客各属性

代码:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

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

plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

fig = plt.figure()

fig.set(alpha=0.2) # 设定图表颜色alpha参数

plt.subplot2grid((2,3),(0,0)) # 在一张大图里分列几个小图

data_train.Survived.value_counts().plot(kind='bar')# 柱状图

plt.title(u"获救情况 (1为获救)") # 标题

plt.ylabel(u"人数") # Y轴标签

plt.subplot2grid((2,3),(0,1))

data_train.Pclass.value_counts().plot(kind="bar") # 柱状图显示

plt.ylabel(u"人数")

plt.title(u"乘客等级分布")

plt.subplot2grid((2,3),(0,2))

plt.scatter(data_train.Survived, data_train.Age) #为散点图传入数据

plt.ylabel(u"年龄") # 设定纵坐标名称

plt.grid(b=True, which='major', axis='y')

plt.title(u"按年龄看获救分布 (1为获救)")

plt.subplot2grid((2,3),(1,0), colspan=2)

data_train.Age[data_train.Pclass == 1].plot(kind='kde') # 密度图

data_train.Age[data_train.Pclass == 2].plot(kind='kde')

data_train.Age[data_train.Pclass == 3].plot(kind='kde')

plt.xlabel(u"年龄")# plots an axis lable

plt.ylabel(u"密度")

plt.title(u"各等级的乘客年龄分布")

plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best') # sets our legend for our graph.

plt.subplot2grid((2,3),(1,2))

data_train.Embarked.value_counts().plot(kind='bar')

plt.title(u"各登船口岸上船人数")

plt.ylabel(u"人数")

plt.show()

结果如下:

如果Spyder无法显示中文标签,可以将代码放入IPython Notebook中运行。

我们可以从这五张图中形象的了解到乘客的信息,获救人数少于未获救人数(之前我们以得到此结论),三等乘客人数最多,获救人员各年龄段分布(第一列第三张图,左边竖列标签为0,右边竖列标签为1),S口岸上船的乘客最多。等等。

这时,我们就要将乘客各属性与其是否获救联系起来:

获救情况和乘客等级是否有关?

获救情况和乘客性别、年龄是否有关?(毕竟,妇女、小孩和老人优先搭乘救生艇)

登船口岸是否是获救因素呢?(虽然感觉关系不大,但是也要考虑全面)

5.2 各属性与获救情况的关联

各乘客等级的获救情况

Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts() # 未获救

Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts() # 获救

df = pd.DataFrame({u'获救':Survived_1,u'未获救':Survived_0})

df.plot(kind = 'bar', stacked = True)

plt.title(u'各乘客等级的获救情况')

plt.xlabel(u'乘客等级')

plt.ylabel(u'人数')

plt.show()

根据图表可以清楚看到第一等级的乘客,获救人数多于未获救人数,而其它两个等级的乘客,获救人数则少于未获救人数。

所以,乘客等级与获救情况有关联。

各性别的获救情况

Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()

Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()

df = pd.DataFrame({u'男性':Survived_m,u'女性':Survived_f})

df.plot(kind = 'bar', stacked = True)

plt.title(u'按性别看获救情况')

plt.xlabel(u'性别')

plt.ylabel(u'人数')

plt.show()

很明显看出,未获救人员中男性乘客比例较大,获救人员中女性乘客比例较大。

那么,可以确定性别也是获救情况的一个重要因素。

根据舱等级和性别的获救情况(第一、二等级为高级舱,第三等级为低级舱)

fig = plt.figure()

plt.title(u'根据舱等级和性别的获救情况')

ax1 = fig.add_subplot(141) # 将图像分为1行4列,从左到右从上到下的第1块

data_train.Survived[data_train.Sex == 'female'][data_train.Pclass != 3].value_counts().plot(kind = 'bar', label = 'female high class', color = '#FA2479')

ax1.set_xticklabels([u'获救',u'未获救'], rotation = 0) # 根据实际填写标签

ax1.legend([u'女性/高级舱'], loc = 'best')

ax2 = fig.add_subplot(142, sharey = ax1) # 将图像分为1行4列,从左到右从上到下的第2块

data_train.Survived[data_train.Sex == 'female'][data_train.Pclass == 3].value_counts().plot(kind = 'bar', label = 'female low class', color = 'pink')

ax2.set_xticklabels([u"未获救", u"获救"], rotation=0)

plt.legend([u"女性/低级舱"], loc='best')

ax3 = fig.add_subplot(143, sharey = ax1)

data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().plot(kind = 'bar', label = 'male high class', color = 'lightblue')

ax3.set_xticklabels([u'未获救',u'获救'], rotation = 0)

plt.legend([u'男性/高级舱'], loc = 'best')

ax4 = fig.add_subplot(144, sharey = ax1)

data_train.Survived[data_train.Sex == 'male'][data_train.Pclass == 3].value_counts().plot(kind = 'bar', label = 'male low class', color = 'steelblue')

ax4.set_xticklabels([u'未获救',u'获救'], rotation = 0)

plt.legend([u'男性/低级舱'], loc = 'bast')

plt.show()

很明显高级舱女性的生还率高于低级舱,低级舱男性的死亡率高于高级舱。在四种情况中,高级舱女性的生还率最高,低级舱男性的死亡率最高。

将与获救情况相关联的两种属性结合后,所得到的结果可以更明显知晓他们的相关性。

各登陆港口乘客的获救情况

fig = plt.figure()

fig.set(alpha = 0.2)

Survived_0 = data_train.Embarked[data_train.Survived == 0].value_counts()

Survived_1 = data_train.Embarked[data_train.Survived == 1].value_counts()

df = pd.DataFrame({u'获救':Survived_1,u'未获救':Survived_0})

df.plot(kind = 'bar', stacked = True)

plt.title(u'各登陆港口乘客的获救情况')

plt.xlabel(u'登陆港口')

plt.ylabel(u'人数')

plt.show()

获救情况与上船口岸的联系,根据上图感觉相关性并不强。C港的获救率高一些。

堂兄弟/妹,孩子/父母有几人,对是否获救的影响

g = data_train.groupby(['SibSp','Survived']) # 数据分组

df = pd.DataFrame(g.count()['PassengerId'])

print (df)

g = data_train.groupby(['Parch','Survived'])

df = pd.DataFrame(g.count()['PassengerId'])

print (df)

堂兄弟/妹,孩子/父母有几人,对是否获救的影响并不明显。

按Cabin有无看获救情况

fig = plt.figure()

fig.set(alpha = 0.2)

Survived_cabin = data_train.Survived[pd.notnull(data_train.Cabin)].value_counts()

Survived_nocabin = data_train.Survived[pd.isnull(data_train.Cabin)].value_counts()

df = pd.DataFrame({u'有':Survived_cabin, u'无':Survived_nocabin}).transpose()

df.plot(kind = 'bar', stacked = True)

plt.title(u'按Cabin有无看获救情况')

plt.xlabel(u'Cabin有无')

plt.ylabel(u'人数')

plt.show()

有客舱信息的获救情况较高一点。但情况复杂,比如生还者上岸后进行信息统计的话,就会影响信息有无对获救情况的关系。

6 简单数据预处理

#我们将测试集导入,再将删除Survived数据的训练集与测验集进行合并,这样便于进行数据处理

data_test = pd.read_csv(r'E:\Data\test.csv') # 导入测验集数据

y = data_train['Survived'] # 将训练集Survived 数据存储在y中

del data_train['Survived'] # 删除训练集Survived数据

sum_id = data_test['PassengerId'] # 存储测试集乘客ID

df = pd.merge(data_train, data_test,how='outer') # 合并无Survived数据的训练集与测验集,how = ‘outer’ 意为并集

#删掉无关因素

df = df.drop(['Name','PassengerId','Ticket','Cabin'],axis=1) # 删除姓名、ID、船票信息、客舱信息,axis=0 删除行,=1 删除列

#缺失数据填充

df['Age'] = df['Age'].fillna(df['Age'].mean()) # 用平均值填充空值

df['Fare'] = df['Fare'].fillna(df['Fare'].mean())

df['Embarked'] = df['Embarked'].fillna( df['Embarked'].value_counts().index[0]) # 用数量最多项填充

#将性别与港口用哑变量表示

dumm = pd.get_dummies(df[['Sex','Embarked']]) # '哑变量'矩阵

df = df.join(dumm)

del df['Sex'] // 删除

del df['Embarked']

#数据降维

df['Age'] = (df['Age']-df['Age'].min()) /(df['Age'].max()-df['Age'].min())

df['Fare'] = (df['Fare']-df['Fare'].min()) /(df['Fare'].max()-df['Fare'].min())

#训练模型

data_train = df[:len(data_train)] # 将合并后的数据分离

data_test = df[len(data_train):]

7 训练并预测

from sklearn.cross_validation import train_test_split

X_train, X_val, y_train,y_val = train_test_split(data_train,y,test_size=0.3, random_state=42) # 以7:3(0.3)将训练集与获救结果随机拆分,随机种子为42

from sklearn.linear_model import LogisticRegression # 引入逻辑回归

LR = LogisticRegression()

LR.fit(X_train, y_train) # 训练数据

print('训练集准确率:\n',LR.score(X_train, y_train)) # 分数

print('验证集准确率:\n',LR.score(X_val, y_val))

#预测测验集

pred= LR.predict(data_test) # pred 为预测结果

pred = pd.DataFrame({'PassengerId':sum_id.values, 'Survived':pred}) # 格式化预测结果

pred.to_csv('pred_LR.csv',index=None) # 导出数据

结果:

最后,也可以将导出的csv文件在Kaggle中进行提交。

8 结语

这是个不太复杂的数据处理题目,预测结果只有两种,但是题目所给因素较多,需要经行无关因素排除,排除后要将数据经行预处理。预处理时,先将缺失值进行补全,再进行降维处理,本题在降维前要将分类变量Sex、Embarked变为哑变量。最后进行train_test_split方法拆分数据,利用逻辑回归训练模型。

附:佳句

来了,爱了,给了她一颗星星,走了。

——云天明《三体》

以上

python泰坦尼克号数据分析_利用python分析泰坦尼克号数据集相关推荐

  1. 利用python进行数据分析_利用python进行数据分析复现(1)

    一直以来,都想学习python数据分析相关的知识,总是拖拖拉拉,包括这次这个分享也是.<利用python进行数据分析 第2版>是一次无意之间在简书上看到的一个分享,我决定将很详细.一直都 ...

  2. python股票数据分析_利用PYTHON全自动生成分析报告

    日常工作当中,特别是金融行业当中,有不少人的工作是提取数据,分析数据,得到可视化图表,并加入自已的研究分析结论,最终生成分析报告,并且有不少报告是定期生成,存在不少重复手工劳动.本文通过一个简单实例, ...

  3. python营业数据分析_利用Python对咖啡馆营业做一个简单的数据分析

    准备数据 1.导入python数据分析模块三剑客:pandas\matplotlib\numpy 2.用read_excel()方法导入数据源 .输出结果截图如下(部分): 可以看到有这些数据:订单日 ...

  4. 用python做数据分析pdf_利用python进行数据分析pdf

    利用python进行数据分析pdf微盘下载!<利用python进行数据分析>利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接 ...

  5. python和excel数据分析_利用Python处理和分析Excel表中数据实战

    作为一个学习用Python进行数据分析的新手来说,通过本文来记录分享一些我在用Python中的pandas.numpy来分析Excel表中数据的数据清洗和整理的工作,目的是熟悉numpy以及panda ...

  6. python怎么做面板数据分析_利用python进行数据分析之准备(一)

    原标题:利用python进行数据分析之准备(一) 欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区. 对商业智能BI.大数据分析挖掘.机器学习,python,R等数 ...

  7. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

  8. 用python进行股票数据分析_利用python进行股票数据分析

    个人觉得这问题问的不太对,说句不好的话,你是来搞编程的还是做股票的. 当然,如果题主只是用来搜集资料,看数据的话那还是可以操作一波的,至于python要怎么入门,个人下面会推荐一些入门级的书籍,通过这 ...

  9. python多元非线性回归_利用Python进行数据分析之多元线性回归案例

    线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量).例如,餐厅根据每天的营业数据(包括菜谱价格.就餐人数.预定人数.特价菜折扣等)预测就餐规 ...

  10. python气象数据分析_利用python-cdo处理气象数据

    如果你不喜欢命令行的操作方式,那么你可以尝试使用python-cdo,利用python脚本语言的优势来处理气象数据.命令行的方式有其优势,比如简单易操作,可扩展性更强等,利用CDO的python接口也 ...

最新文章

  1. 我国第一台微型计算机诞生于哪一年,2015计算机一级《MSOffice》章节练习题及答案(1)...
  2. SQL 基礎語句-case
  3. CF Educational Round 23 F.MEX Queries
  4. Spring Boot配置IDEA无法创建Spring Initializr项目
  5. bootstrap怎么在一个页面渲染多个表格_推荐一个前端框架
  6. 《软件工程》实验报告——软件设计
  7. 学术与技术(与队长交流偶得)
  8. lwip netbuf
  9. Python 使用while循环实现打印9x9乘法表
  10. VAX Patch VA_X.DLL 安装位置的问题 for VS2008 , VS2010 , VS2011
  11. 企业移动办公小助手——华为云桌面
  12. 轻量级任务调度中间件
  13. Eclipse中的Lua插件 LDT
  14. python爬取拉勾网_python爬取拉勾网职位数据
  15. O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸老师)
  16. 如何彻底关闭Wiindows10系统自带输入法
  17. python证明冰雹猜想_如果冰雹猜想被证明了。那数学会有很大突破吗?
  18. 【Python游戏】用Python基于centernet在win10平台开发,射击游戏 | 附带源码
  19. 毕业答辩的PPT攻略
  20. 基于灰色神经网络的订单需求预测代码

热门文章

  1. idea 2018汉化包(附使用教程)
  2. 爬取东方财富的利润表数据记录
  3. java研发手机归属地批量查询
  4. Lua C API 研究 —— 基础篇
  5. Mosek 证书更新 - MATLAB
  6. cada0图纸框_CAD怎么画图纸框?cad图纸框的绘制方法
  7. ArcGIS拓扑关系建立概述
  8. 快快编程kkcoding/太戈编程Tiger AI答案库 (每月更新)第三期 答案仅供参考,不能保证100%的准确性
  9. 【经典策略系列】之 Dual Thrust 交易策略
  10. 全国省市区 mysql_2017全国省市区数据库【含三款数据库】