您的位置:首页 > 其它

Kaggle实例-Titanic分析(一)

2017-09-14 22:42 357 查看
  看了很多发掘类和ML的文章,但是一直苦于没有想法,没有进行过想关的尝试以及练习,无意中在csdn中看到了hanxiaoyang大佬的一篇初学者测试的文章,对照着dalao的教程,我开始进行我的首次尝试,该篇文章同时也是记录同时也是分析我在对其内容进行分析的过程。同时,其中dalao没有注意到的一些小问题 我也会相关地进行说明(因为真是从零开始掉了不少坑ORZ)。

  首先我们看一下当前的这个被练烂了的问题0。


  这是现在的这个首页,当你第一次注册的时候,他也会想你推荐这个项目,毕竟是一个萌新练手的项目(大佬除外:))。英文好的小伙伴们可以在overview中详细看一下。这里有整个数据处理的大概流程,以及一些相关算法的推荐。当然正规的比赛项目是没有的。。。(大概- -!)。而我们最关心的则是给我们的数据集Data


  这里我们就能下到我们想要的数据集了。很明显 train是给我们训练用的,而test则是给我们测试用的。gender_submission则是让我们对我们自己做出的测试结果进行比对判断正确率的这里我们就不用管了。我们下载train.csv就好

  首先说一下,这个案列是一个众所周知的一个案例。杰克与肉丝的爱情,(捷克斯洛伐克 滑稽),简单点,说话的方式简单点。就是船沉了,我们现在手上有一份数据,登船的人的信息以及最后的情况,让我们用这些数据来进行训练。因为救生船有限,同时为了发扬绅士传统—-妇女儿童优先。所以是否获救其实并非随机,而是基于一些背景有rank先后的。这个问题说白了其实就是一个二分类问题,因为让我们预测的最终情况也无非就是死了或着存货,这就是问题的背景,我们首先将数据加载出来找一找特征。

  

import pandas as pd #数据分析
import numpy as np #科学计算
from pandas import Series,DataFrame

data_train = pd.read_csv("Train.csv")
data_train.columns


运行结果:

Out[6]:

Index([u’PassengerId’, u’Survived’, u’Pclass’, u’Name’, u’Sex’, u’Age’,

u’SibSp’, u’Parch’, u’Ticket’, u’Fare’, u’Cabin’, u’Embarked’],

dtype=’object’)

我们能看到在这个给我们数据集里的相关特征。有很多可供我们选择的一些特征值

PassengerId => 乘客ID

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

Name => 乘客姓名

Sex => 性别

Age => 年龄

SibSp => 堂兄弟/妹个数

Parch => 父母与小孩个数

Ticket => 船票信息

Fare => 票价

Cabin => 客舱

Embarked => 登船港口

光看这些我们肯定是看不出啥的,我们加载进去后会看到完整的数据,这里我就不展示了。但是我们可以很快地发现,光瞅我们是毛都看不出来的我们先用info查看一下(别忘了加载库)。



我们可以来看一下这组数据的概况,这时我们会很悲伤地发现一个问题,那就是我们的数据时残缺的(QAQ).我们看到 年龄 和 客舱是残缺,这样对于我们分析还是有些困难的。此时我们还是发现我们无从下手,所以我们来看一下数据的分布情况。这里我们用describe来进行尝试一下。



这里我们可以看出一下大概的数据,我们发现获救的人的概率只有0.38左右(emmm是挺少的)。当然这里只是一个简单的分布情况 我们可能还是看不出来什么 (原谅我是一名星际选手)没办法 我们只好用图来更直观地获取一些我们需要的数据。我们可以先简单地推测一下获救会与哪些因素有关,我们可以分别进行尝试。首先我们尝试一下年龄与获救情况。

plt.subplot2grid()
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年龄")
plt.grid(b=True, which='major', axis='y')
plt.title(u"按年龄看获救分布 (1为获救)")




额 如果是初次使用的童鞋 如果发现自己的图上没有中文 请添加这样一段代码

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


恩 图有了 我们可以从图中看出。。emm什么也看不出。因为这张图让我们看到 获救者的年龄跨度十分广泛,光这一点还不足以让我们进行训练。我们再尝试一下其他的测试

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()




这里我们可以发现一些新的东西。0代表挂了 1代表健在。那么我们发现 老外还是非常绅士的。我们明显地可以看出女性获救的概率很大。抓住这个点,我们接可以向里面添加一些东西再来考虑一下。比如加入船票等级来看

fig=plt.figure()
fig.set(alpha=0.65) # 设置图像透明度,无所谓
plt.title(u"根据舱等级和性别的获救情况")

ax1=fig.add_subplot(141)
data_train.Survived[data_train.Sex == 'female'][data_train.Pclass != 3].value_counts().plot(kind='bar', label="female highclass", color='#FA2445')
ax1.set_xticklabels([u"获救", u"未获救"], rotation=0)
ax1.legend([u"女性/高级舱"], loc='best')

ax2=fig.add_subplot(142, sharey=ax1)
data_train.Survived[data_train.Sex == 'female'][data_train.Pclass == 3].value_counts().plot(kind='bar', label='female, low class', color='black')
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='blue')
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='yellow')
ax4.set_xticklabels([u"未获救", u"获救"], rotation=0)
plt.legend([u"男性/低级舱"], loc='best')

plt.show()




然后我们可以再次发现。。。。大小姐们的确存活率很高。(有钱真好!)男性低级仓未获救的人数占了未获救人数的大头。接着我们再看看其它的一些特征,我们发现在这里有一项非常有意思,那就是是否存在兄弟姐妹以及父母与小孩这一选项,我们把他们也拉出来看看。

因为这里父母与孩子以及存在兄弟姐妹并非一个独立选项,所以我们选择列表统计一下。

g = data_train.groupby(['SibSp','Survived'])
d1 = pd.DataFrame(g.count()['PassengerId'])
P = data_train.groupby(['Parch','Survived'])
d2 = pd.DataFrame(g.count()['PassengerId'])






看了这个图,貌似我们可以大胆地进行一下推测。大概,也许,有孩子的有兄弟姐妹的存活率有所提升。

然后我们再看 还剩一个Cabin属性,这个也是一个有无的属性所以我们用图来看一下它的分布

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

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'Y':Survived_cabin, u'N':Survived_nocabin}).transpose()
df.plot(kind='bar', stacked=True)
plt.title(u"按Cabin有无看获救情况")
plt.xlabel(u"Cabin有无")
plt.ylabel(u"人数")
plt.show()




按图所给的比例来看,我们可以较明显地看出,有cabin的人的获救率明显高了许多。(万恶的资本主义!)

综上我们大概的过了一下我们现在所拥有的一些属性,也大概分析出了几个能够用到的特征。但是我们也发现了一个在我们训练前的一个首要问题,我们的有一些属性是残缺的。所以首先要做的就是补全这些数据。我将在下一次的总结中继续分析。希望大佬们看完有些许指正,同时如果有相关小伙伴也在按照hanxiaoyang大佬的博文进行训练的童鞋 有疑问也可以在下面留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: