python泰坦尼克号数据分析_利⽤python分析泰坦尼克号数据
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 #数据分析spyder python下载
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
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.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived, data_train.Age) #为散点图传⼊数据
plt.ylabel(u"年龄") # 设定纵坐标名称
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.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 = upby(['SibSp','Survived']) # 数据分组
df = pd.unt()['PassengerId'])
print (df)
g = upby(['Parch','Survived'])
df = pd.unt()['PassengerId'])
print (df)
堂兄弟/妹,孩⼦/⽗母有⼏⼈,对是否获救的影响并不明显。
按Cabin有⽆看获救情况
fig = plt.figure()
fig.set(alpha = 0.2)
Survived_cabin = data_train.ull(data_train.Cabin)].value_counts()
Survived_nocabin = data_train.Survived[pd.isnull(data_train.Cabin)].value_counts()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。