通俗易懂的泰坦尼克号⽣存分析(titanic)
作者:离散梦
欢迎⼤家给出宝贵的建议!
泰坦尼克号数据分析
⼀、前⾔
主要⽬的是整理⾃⼰的思路。本⽂主要是关于泰坦尼克号⽣存率python分析,因为很多博客做这个项⽬都⽐较深⼊,感觉都⽐较⾼⼤上,我们初学者并不⼀定都能懂,甚⾄没兴趣看下去。这⽂章,也是从视频上学了之后,发现很不错,通俗易懂,⾮常推荐⼊门。我们可以共同学习。⾮常希望有⼈愿意指出我的不⾜。
⼆、正题
接下来开始进⼊本⽂的正题:
⾸先,我们要把数据集download下来吧,要准备好!
⼤家可以从kaggle平台⾥⾯下载,建议去了解⼀下,上⾯有很多经典的数据集。当然,其实百度也能搜索到。
软件平台吧,各取所好吧。我这⾥⽤的jupyter notebook,当然spyder,pycharm,普通的IDE都可以。
我选择⽤这个软件,是因为我可以⼀个部分⼀个部分去分析解剖,并且错误。有兴趣的同志可以去了解⼀下,我⽐较习惯这个软件。实际效果是⼀样的。
数据集下载下来之后呢,是个csv格式的表格,打开jupyter notebook,打开数据集,观察⼀下数据有哪些属性,并且选择出对我们分析⽣存率有帮助的信息。
相信⼤家看过泰坦尼克号的电影。没有看过的同志可以去百度了解⼀下。会对本项⽬有更深的理解。
打开下载的⽂件,由下⾯这幅图可以看见有:
其中:
PassengerId ,乘客的id号,这个我觉得对⽣存率没影响。因为⼀个⼈的id号不会影响我是否⽣存下来吧。这列可以忽略
Survived ,⽣存的标号,上⾯图的数值1表⽰这个⼈很幸运,⽣存了下来。数值0,则表⽰遗憾。
Pclass ,船舱等级,就是我们坐船有等级之分,像⾼铁,飞机都有。这个属性会对⽣产率有影响。因为⼀般有钱⼈,权贵才会住头等舱的。保留。
Name ,名字,这个不影响⽣存率。我觉得可以不⽤这列数据。可以忽略
Sex , 性别,这个因为全球都说lady first,⼥⼠优先,所有这列保留。
Age , 年龄,因为优先保护⽼幼,这个保留。
SibSp ,兄弟妹,就是有些⼈和兄弟妹⼀起上船的。这个会有影响,因为有可能因为救他们⽽导致⾃⼰没有上救⽣船船。保留这列
Parch , ⽗母和⼩孩。就是有些⼈会带着⽗母⼩孩上船的。这个也可能因为要救⽗母⼩孩耽误上救⽣船。保留
Ticket , 票的编号。这个没有影响吧。
Fare , 费⽤。这个和Pclass有相同的道理,有钱⼈和权贵⽐较有势⼒和影响⼒。这列保留
Cabin ,舱号。住的舱号没有影响。忽略。
Embarked ,上船的地⽅。这列可能有影响。我认为登陆地点不同,可能显⽰⼈的地位之类的不⼀样。我们先保留这列。
所以,我们⼤概知道需要提取哪些列的信息了,有:
Pclass、Sex、Age、SibSp、Parch、Fare、Embarked
三、代码及其解析
好了,我们分析完表格,就是我们要分析的这个数据集。我那时,就想,下⼀步应该要建模型来帮我们做分析了。
所以下⼀步,我就开始进⼊jupyter notebook去撸代码了。
import pandas                                    #导⼊pandas库,这个库是专门设计⽤来做数据分析的⼯具
ad_csv('titanic_train.csv')      #读取⽂件titanic_train数据集
print(titanic.describe())                        #describe()函数是⽤来描述数据属性的,然后print打印出来
输⼊上⾯代码会显⽰出上⾯那幅图的结果:
count,是总数的意思。
mean,是平均值
std,是⽅差
min,最⼩值
max,最⼤值
25%、50%、75%,意思是位置分别是25%、50%、75%⼤的数据是什么。⽐如,Age,就是年龄⼤⼩排在25%的⼈的年龄是20.125岁,⼩数点表⽰年⽉。
由上⾯可知:
Age那列只有714个数。⽽其他属性都有891个数值。那说明,Age那列有空值,就是数据丢失了,⼀共有接近200个数据丢失。
那怎么办?因为我们⼀开始分析了,Age这⼀列对⽣存率分析有影响,我们必须保留,不能忽略。所以我选择补充上去。
那么问题来了,补充什么样的数据⽐较合理呢?才不会导致数据的准确性呢?我想应该补充平均值。
#机器学习中输⼊的数据集要求是M*N的矩阵,Age列有缺失值,median()函数代表去均值
titanic['Age']=titanic['Age'].fillna(titanic['Age'].median())  #fillna()表⽰补充,median()表⽰求平均值
print(titanic.describe())                                      #再看看表的变化
python是做什么的通俗易懂的这⾥我们可以看见,Age这⼀列补充了数值了,到达891个。这列数据算是处理完了。
接下来,该看看我们刚刚分析其他列的数据有什么需要改进的地⽅。
我们可以看到Sex这⼀列的数据显⽰是为:female和male,下⾯可以输⼊代码可以显⽰出来:
print(titanic['Sex'].unique())  #返回其参数数组中所有不同的值,并且按照从⼩到⼤的顺序排列
返回其参数数组中所有不同的值,并且按照从⼩到⼤的顺序排列
这⾥就有个问题了。
机器学习算法⼀般来说解决不了对字符的分类。因为我们是要对Survived这列‘’0‘’和"1"进⾏分类嘛。
所以我们就要把"Sex"这⼀列的数据进⾏处理,把它改为数值型。那我们就把"male"和“female”进⾏处理,分别⽤0和1替代。下⾯是代码:
#loc是通过⾏标签索引⾏数据,iloc是通过⾏号获取⾏数据, ix是结合前两种的混合索引
#注意loc后⾯加的是中括号,不是⼩括号
titanic.loc[titanic['Sex']=='male','Sex']=0
titanic.loc[titanic['Sex']=='female','Sex']=1
同时,我们也把"Embarked"这⼀列数据进⾏同样的处理:
print(titanic['Embarked'].unique())
titanic['Embarked']=titanic['Embarked'].fillna('S')
titanic.loc[titanic['Embarked']=='S','Embarked']=0
titanic.loc[titanic['Embarked']=='C','Embarked']=1
titanic.loc[titanic['Embarked']=='Q','Embarked']=2
好了,到这⾥基本数据就处理完了。我们下⼀步就要做什么?就是要建⽴模型了,就是撸代码。让这模型替我们做分析做分类。
下⾯我们分别⽤线性模型、逻辑回归、随机森林这三种机器学习算法模型来分析这个案例,就是分析⽣存率。
(1)我们先⽤线性模型进⾏分析。
#在线性模型模块中导⼊线性回归
#交叉验证,把训练数据集分成三份。最后去平均值
from sklearn.linear_model import LinearRegression
ss_validation import KFold
#这⾥的数据都对预测⽣存有影响
predictors=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
#把线性回归导进来
alg=LinearRegression()
#选择做⼏倍的交叉验证,n_folds意思是⼏倍
kf=KFold(titanic.shape[0],n_folds=3,random_state=1)
predictions=[]
for train,test in kf:
#意思是把训练数据拿出来
train_predictors=(titanic[predictors].iloc[train,:])
#the target we're using to train the algorithm
train_target=titanic['Survived'].iloc[train]
#把线性回归应⽤在train_pridictors,train_target数据集上
alg.fit(train_predictors,train_target)
#we can now make predictors on the test fold
test_predictions=alg.predict(titanic[predictors].iloc[test,:])
#我们要进⾏预测,是要对测试集进⾏预测
predictions.append(test_predictions)
下⾯调⽤sklearn⾥⾯的模型,sklearn被称为机器学习的核武器,⾥⾯封装了⼏乎所有我们想得到的算法模型。我们直接调⽤就⾏了。
import numpy as np
#The predictions are in three separate numpy arrays. Concatenate them into one
#we concatenate them on axis 0, as they only one axis.
atenate (predictions,axis=0)
#Map predictions to outcomes(only possible outcomes are 1 and 0)
predictions[predictions>.5]=1
predictions[predictions<=.5]=0
accuracy=sum(predictions[predictions==titanic['Survived']])/len(predictions)
print(accuracy)
这段代码算是撸完了,但是告诉你们⼀个我的悲剧,我这段代码分析的⽣存率准确性很低,我还没出原因。原本准确率正常,后来重新撸了⼀遍,出问题了。
⼤家帮我问题,给我留⾔⼀下。谢谢!
(2)下⾯我们⽤逻辑回归算法模型

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