参考文章https://zhuanlan.zhihu.com/p/27550334
在20世纪初,由英国白星轮船公司耗资7500万英镑打造的当时世界上最大的豪华客轮“泰坦尼克”号,曾被称作为“永不沉没的船”和“梦幻之船”这艘豪轮在她的处女之航中,就因撞上冰山而在大西洋沉没。百年来,关于“泰坦尼克”号沉没的原因,一直是人们争论不休的话题。
究竟什么样的人获救几率更大一些呢?这就是本次kaggle的主题,预测每个人的生还几率。
首先在开始建模之前,最好对于数据做一个简单的了解。这会对于建模时候特征的选择有很大的帮助。
数据一共包括,乘客id,是否生还,姓名,性别,年龄,兄弟姐妹陪同的数量,父母陪同的数量,票号,船票的价格,仓位号,上船的码头位置,这些数据中有部分有缺失值,可以先看下哪些有缺失。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
train=pd.read_csv('C:/kaggle/Titanic/train.csv')
test=pd.read_csv('C:/kaggle/Titanic/test.csv')
print train.head(3) #打印数据
print train.info() #查看数据训练数据缺失情况和数据类型,其中age和cabin确实较严重
print train.describe() #数据描述,包括数量,平均数,标准差,4分位数,中位数,3/4分位数,最大值
年龄有714个数据,缺失200个,仓位号只有200多个,缺了700多个数据,那我们就应该考虑仓位号对于能否生还的影响大不大,如果不大的话应该把这个数据删掉,毕竟缺失太严重。
接下来考虑下变量间的相关系数,这些数据的相关系数如下
data=train[['Survived','Pclass','Age','SibSp','Parch','Fare','Sex']]
data=data.corr()
print data
sns.heatmap(data)
plt.title('train corr')
plt.show() #相关系数图
一。对于年龄的分析
上面那张图是去掉缺失数据的年龄分布,下面那张图是活着和死亡的人数分布,感觉每个年龄都是有人生存有人死亡。
age=data['Age'].dropna(axis = 0) #除去NaN值
plt.subplot(211)
sns.distplot(age)
plt.subplot(212)
sns.distplot(data[data.Survived==1].Age.dropna(axis=0),hist=False,color='r',label='live')
sns.distplot(data[data.Survived==0].Age.dropna(axis=0),hist=False,color='g',label='dead')
sns.plt.show()
plt.subplot(211)
sns.distplot(data[data.Sex=='male'].Age.dropna(axis=0),hist=False,color='r',label='male')
sns.distplot(data[data.Sex=='female'].Age.dropna(axis=0),hist=False,color='g',label='female')
sns.plt.show()
二。对于仓位等级的分析
class1就是一等舱,class2是二等舱,class3是三等舱,可以看出一等舱生存几率还是很高的,三等舱的话生存几率低很多。
data=train[['Pclass','Survived']]
y_live=data[data.Survived==1].groupby('Pclass')['Survived'].count()
y_dead=data[data.Survived==0].groupby('Pclass')['Survived'].count()
pos=range(1,4)
defination=['class%d'%(i) for i in range(1,4)]
plt.bar(pos,y_live,label='live')
plt.bar(pos,y_dead,bottom=y_live,label='dead')
plt.legend()
plt.xticks(pos,defination)
plt.title('Pclass Surveved count')
plt.show()
三。对于性别的分析
这次换了个思路,死亡的人中男性占绝大比例,而生存的人中女性比例更高,所以其实和性别相关性挺强的。
data=train[['Sex','Survived']]
y_male=[0,0]
y_female=[0,0]
for i in range(len(data.Sex)):
if data.Sex[i]=='male':
if data.Survived[i]==0:
y_male[0]+=1
else:
y_male[1]+=1
else:
if data.Survived[i]==0:
y_female[0]+=1
else:
y_female[1]+=1
x_number=range(1,3)
x_word=['dead','live']
plt.bar(x_number,y_male,label='male')
plt.bar(x_number,y_female,bottom=y_male,label='female')
plt.legend()
plt.xticks(x_number,x_word)
plt.show()
四。对于票价的分析
每个仓位的价格并不是一定的,这就好比是飞机票一样,同样是经济舱,可能价格也是千差万别。
首先来看一下所有人的价格分布,果然票价低的人还是占大部分。
接下来看一下生存和死亡的人分别的价格分布情况,可以看出来,总价在300美元以上的人没有死亡的……所以其实有钱人还是生存几率高很多的……
data=train[['Fare','Survived']]
sns.distplot(data.Fare,hist=False)
plt.title('Fare distribution')
plt.show()
sns.distplot(data[data.Survived==1].Fare,hist=False,label='Survived')
sns.distplot(data[data.Survived==0].Fare,hist=False,label='Dead')
plt.title('Fare and Survived distribution')
plt.show()
五。对于兄弟姐妹和父母子女的陪同数量的分析
对于整体数据进行分析,发现大部分人其实都没有兄弟姐妹和父母子女陪同,看来大家都喜欢独立出行啊
对于兄弟姐妹的生存死亡数量进行分析,兄弟姐妹太多可能会致死,太少也会致死,有一个兄弟姐妹的生还几率稍大些。
对于父母子女的生存死亡数量进行分析,得到差不多同样的结论,父母子女太多可能会致死,太少也会致死,有一个父母子女的生还几率稍大些。
data=train[['SibSp','Parch','Survived']]
plt.subplot(211)
sns.countplot(train.SibSp)
plt.subplot(212)
sns.countplot(train.Parch)
plt.suptitle('SibSp and Parch distribution')
plt.show()
plt.subplot(211)
sns.countplot(train[train.Survived==1].SibSp)
plt.xlabel('live')
plt.subplot(212)
sns.countplot(train[train.Survived==0].SibSp)
plt.xlabel('dead')
plt.suptitle('SibSp live and dead')
plt.show()
plt.subplot(211)
sns.countplot(train[train.Survived==1].Parch)
plt.xlabel('live')
plt.subplot(212)
sns.countplot(train[train.Survived==0].Parch)
plt.xlabel('dead')
plt.suptitle('Parch live and dead')
plt.show()
六。对于上船地点的分析
C地的人生存几率更大,S地的人生存几率更小。
data=train[['Embarked','Survived']]
y_dead=[0,0,0]
y_live=[0,0,0]
pos=[1,2,3]
for i in range(len(data)):
if data.Survived[i]==1:
if data.Embarked[i]=='C':
y_live[0]+=1
elif data.Embarked[i]=='Q':
y_live[1]+=1
else:
y_live[2]+=1
else:
if data.Embarked[i]=='C':
y_dead[0]+=1
elif data.Embarked[i]=='Q':
y_dead[1]+=1
else:
y_dead[2]+=1
plt.bar(pos,y_live,label='live')
plt.bar(pos,y_dead,bottom=y_live,label='dead')
defination=['C','Q','S']
plt.xticks(pos,defination)
plt.legend()
plt.title('Embarked and Survived')
plt.show()
七。对于船仓位号的分析
船仓位号为空时死亡几率更大,而有船仓位号时死亡生存几率更大。
八。还有姓名和船票号没有分析,但是感觉没有什么太大的用处。
下一步就要开始建立模型啦~