**

泰坦尼克号数据分析

**

简介:

在csdn看了四五篇泰坦尼克号数据分析后,我也想做个分析,主要分为三个部分:描述性分析,建立逻辑回归模型预测生存率,建立决策树预测结果。
也不知道我这个算不算数据分析,我看那些公司招聘的都要用excel,但我没学,只会基本的操作。
工具:R软件
代码直接运行可能有错,因为我是边写边做的。第一次发文章,如果写的不好还请多多包涵。。。。。。

分析:

首先,我的数据不是从kaggle 下载的,因为它要注册账号,我注册总是失败,网上查了各种方法都不行,我的数据是从csdn一个博客下面下载的,十分感谢分享数据的兄弟,不然我真的无从下手。
主要数据有3个:mytrain.csv, mytest.csv,ground_truth 第一个是做描述性分析,建立逻辑回归模型,以及建立决策树用的,第二个是测试用的,第三个是测试的答案,用来查看决策树的效果如何。

一、数据清洗

先将数据导入R软件中

A<-read.csv("E:/R语言练习/泰坦尼克号分析/泰坦尼克代码、数据集和答案集/代码、数据集和答案集/mytrain.csv",head=T);   #读数据A;   #显示数据attach(A);   #连接到内存

部分截图:



可以看到看到字段有13种,
Passengerid 乘客编号
Survived 幸存者 (1:幸存 0:死亡)
Pclass 船舱等级 (从高级到低级:1>2>3)
Name 名字 没什么重要的,可能反应了性别,家族等
Sex 性别
Age 年龄
Sibsp 旁系亲属数量(兄弟姐妹)
Parch 直系亲属数量(父母子女)
Ticket 票
Fare 票价
Cabin 客舱号
Embarked 登船港口
X 应该是录入数据时的故障,全是空值
乘客先到港口,再买票,再上船,进到客舱,然后船触礁,一部分生还一部分死亡。
分析目的主要是探查影响幸存率的因素。
无意义数据:
登船港口:一定程度上反应乘客所在城市,城市的经济可以反应居民的经济状况,然而一般都是就近选择港口,有钱人可能来到一个不太好的港口,没钱人有可能从好港口上船,所以这个数据,没什么参考价值。
客舱号:本应有一定价值,可通过粗略观察(数据量不到900,如果数据太多就需要写代码),本数据缺失了80%左右,这就让其失去了价值,剩余的数据量太小,没什么好分析的,想分析的话后面再分析好了。
票:编号,没价值。
姓名:本应有价值,反映了乘客的阶级,经济状况等,总的来说就是社会地位,但难以量化,且这些内容在票价也有体现,所以太多余。
X:全是空值
1,删掉所有无意义数据

dim(A)   #查看原数据 行列数A=A[,-13]    #删掉 X A=A[,-12]    #删掉 登舱港口A=A[,-11]    #删掉 客舱号A=A[,-9]     #删掉 票A=A[,-4]     #删掉 姓名

2,将“male”标为“1”,将“female”标为0,以便接下来的分析

A$Sex=as.character(A$Sex);   #将因子型转为字符型A$Sex[A$Sex=="male"]=1;A$Sex[A$Sex=="female"]=0;   #结果的0和1还是字符型,我做的时候没注意到,一直出错 - -。A$Sex=as.numeric(A$Sex);   #将字符型转为数值型


3,将票价分级
因为票价包含种类较多,所以要分级,先看看直方图

hist(A$Fare)

A$Fare[A$Fare<=100]=1;A$Fare[A$Fare>100&A$Fare<=200]=2;A$Fare[A$Fare>200&A$Fare<=300]=3;A$Fare[A$Fare>300&A$Fare<=400]=4;A$Fare[A$Fare>400&A$Fare<=500]=5;A$Fare[A$Fare>500]=6;table(A$Fare)


可以看到每个票价区间包含的人数。

4,处理空值
计算每列包含空值数量

sum(is.na(A[,1]));sum(is.na(A[,2]));sum(is.na(A[,3]));sum(is.na(A[,4]));sum(is.na(A[,5]));sum(is.na(A[,6]));sum(is.na(A[,7]));sum(is.na(A[,8]));


可以看到第五列(年龄)有177个空值,其余列都没有,177相对于891来说 不是个小数字,所以不删掉,填充它。

C1<-subset(A,is.na(Age));C1   #取出年龄为空值的数据
C2<-subset(A,!is.na(Age));C2   #取出年龄不为空值的数据
C3<-tapply(C2$Age,C2$Survived,mean);C3  #按幸存与否计算平均年龄
C4<-tapply(C2$Age,C2$Pclass,mean);C4  #按船舱等级计算平均年龄
C5<-tapply(C2$Age,C2$Sex,mean);C5  #按性别计算平均年龄
C6<-tapply(C2$Age,C2$SibSp,mean);C6   #按旁系亲属数量计算平均年龄
C7<-tapply(C2$Age,C2$Parch,mean);C7  #按直系亲属数量计算平均年龄
C8<-tapply(C2$Age,C2$Fare,mean);C8  #按票价区间计算平均年龄
C8[6]<-C8[4];
C8[4]=0;C8[5]=0;   #这两步是为了后面的计算。


for(i in 1:177){
C1$Age[i]=   (C3[C1$Survived[i]+1]+C4[C1$Pclass[i]]
+C5[C1$Sex[i]+1]+C6[C1$SibSp[i]+1]
+C7[C1$Parch[i]+1]+C8[C1$Fare[i]])/6
}  #填充年龄,按各个维度取平均值,结果再取平均值得到填充后的年龄.

填充完后还有七个空值,这七个没有登记年龄的乘客都没获救,船舱等级一致,旁系亲属数量都为8,直系亲属数量都为2,票价都不到100元,从同一港口上船,空值的原因是登记年龄的乘客中没有人有8个旁系亲属,所以找不到参照,我猜测他们是一家人,一共来了9个人他们派一个人去登记,这个人填完自己的,对其他几人的年龄不太清楚,就不填了,名单中登记了7个,应该有两个人的名单丢失了,且其中一人是他们派来填名单的。7相对891已经是很小的数字了,且旁系亲属这么多也比较少见,可以删掉这几行数据。

 C1<-na.omit(C1)
dim(C1)

C1[171:(171+713),]=C2;
A<-C1;          #已经删掉,再合并C1,C2,并赋值给A。

终于把年龄填充完了!
5,将年龄分级
先看看直方图

hist(A$Age)

A$Age[A$Age<=10]=1;A$Age[A$Age>10&A$Age<=20]=2;A$Age[A$Age>20&A$Age<=30]=3;A$Age[A$Age>30&A$Age<=40]=4;A$Age[A$Age>40&A$Age<=50]=5;A$Age[A$Age>50&A$Age<=60]=6;A$Age[A$Age>60&A$Age<=70]=7;A$Age[A$Age>70]=8;table(A$Age);A;

数据清洗到这里就好了,此时A是884行,8列的矩阵。

二、数据分析:

1,避不开的描述性分析
(1)先求整体幸存率:

sum(A$Survived==1)/length(A$Survived);


可看出整体幸存率在38.6%左右。

A1<-subset(A,A$Survived==1);  #取出A中幸存者名单保存到A1A2<-subset(A,A$Survived==0);  #取出A中死亡者名单保存到A2

(2)幸存率与船舱等级的关系:

hist(A$Pclass,col='red');   #所有乘客按船舱等级分类的直方图
hist(A1$Pclass,col='green',add=T);#幸存者按船舱等级分类的直方图
pie(as.numeric(table(A$Pclass)),labels=names(table(A$Pclass)))    #所有乘客的船舱等级饼状图



绿色表示幸存者中船舱等级的情况,红色表示整体乘客船舱等级情况。

D<-table(A1$Pclass)/table(A$Pclass);D   #各等级船舱的幸存率


从数值结果,直方图和饼状图可看出船舱等级越高,幸存率越大,且从直方图中可看出3级舱的乘客占了总乘客一半左右,说明英国当时也有一定的贫富差距。

cor(as.numeric(names(D)),as.numeric(D));  #船舱等级和幸存率的相关系数

船舱等级与幸存率的相关系数为-0.9944763,虽然这个值比较高,但是数据只有三条。
(3)幸存率与性别的关系:

hist(A$Sex,col='red');   #所有乘客按性别分类的直方图
hist(A1$Sex,col='green',add=T);   #幸存者按性别分类的直方图
pie(as.numeric(table(A$Sex)),labels=names(table(A$Sex))) #所有乘客的性别饼状图
E<-table(A1$Sex)/table(A$Sex);E   #男女各自的幸存率
cor(as.numeric(names(E)),as.numeric(E));  #性别和幸存率的相关系数



从幸存率数值,直方图和饼状图可看出泰坦尼克号上男性数量接近女性的两倍,但是幸存率比女性低得多,所以英国的男性虽然比较懂得享受(船上男人比女人多)不过关键时刻还是很有牺牲精神的!

两个量都是二维向量,不管怎么算都是1或-1,所以这个结果不太可靠

直接原数据做相关系数,还不到0.1这与直方图显示的信息不符合,我认为当两个变量都是二项分布时,他们间的相关系数参考价值不大,因为结果就只能为两个中的一个,一下走到一个极端,都离中间很远,即”距离太远”。我认为变量的可取值的长度越多,越连续,对应的相关系数参考价值越大!而本数据中,因变量是生存与否,只有两个量,所以相关系数参考价值不大,仅作为计算结果放出来。
(4)幸存率与年龄关系:

hist(A$Age,col='red');   #所有乘客按年龄分类的直方图
hist(A1$Age,col='green',add=T);   #幸存者按年龄分类的直方图
pie(as.numeric(table(A$Age)),labels=names(table(A$Age)))   #所有乘客年龄饼状图
F<-table(A1$Age)/table(A$Age)   #各个年龄的幸存率
cor(as.numeric(names(F)),as.numeric(F));  #年龄和幸存率的相关系数F





从直方图和幸存率的结果可以看到乘客中20~40岁的人为大多数,占了所有人数的3/4左右
幸存率是10岁以下最高,为0.59375,3040次之,为0.4352332,5060再次之,为0.404(404警告)。
本次得到的相关系数-0.7966169,比性别和幸存的相关系数好得多,原因可能是年龄取值有8种,所以更准确一些,有一定的参考价值。
(5)幸存率与旁系亲属数量的关系:

hist(A$SibSp,col='red');   #所有乘客按旁系亲属数量分类的直方图
hist(A1$SibSp,col='green',add=T);   #幸存者按旁系亲属数量分类的直方图
pie(as.numeric(table(A$SibSp)),labels=names(table(A$SibSp)))   #所有乘客旁系亲属数量饼状图
G<-table(A1$SibSp)/table(A$SibSp);G   #幸存率按旁系亲属数量分类



从直方图,饼状图中可以看出接近3/4的人没有带旁系亲属,接近1/4的人带着一个兄弟姐妹,兄弟姐妹数为1和0的最多,幸存者也最多。

第4行运行出错

 table(A1$SibSp)table(A$SibSp) #查看具体信息


原因是长度不一样

q1<-as.numeric(table(A1$SibSp))q1[6]=0;            #现在长度一样了q2<-as.numeric(table(A$SibSp))G<-q1/q2;Gcor(c(0,1,2,3,4,5),G);  #旁系亲属数量和幸存率的相关系数G=cbind(0:5,G);G



可以看出 带一个旁系亲属的乘客幸存率最高,为0.5358852,带两个旁系亲属的次之,为0.4642857,单独来的再次之,为0.3453947.
相关系数为-0.8258045,相关性较强,有一定参考价值

(6)幸存率与直系亲属数量关系:

hist(A$Parch,col='red');   #所有乘客按年龄分类的直方图
hist(A1$Parch,col='green',add=T);   #幸存者按年龄分类的直方图
pie(as.numeric(table(A$Parch)),labels=names(table(A$Parch)))   #所有乘客年龄饼状图



可以看出,直系亲属数量为0,1,2的乘客最多,占95%以上,幸存者也最多

H<-table(A1$Parch)/table(A$Parch);H   #各个年龄的幸存率


运行出错,具体看看
table(A1Parch);table(AParch);table(AParch);table(AParch);

 q3<-as.numeric(table(A1$Parch))q3[6]=1; q3[5]=0; q3[7]=0;           #现在长度一样了q4<-as.numeric(table(A$Parch))H<-q3/q4;Hcor(0:6,H);  #直系亲属数量和幸存率的相关系数H=cbind(0:6,H);H



可以看出,拥有3个直系亲属的乘客,生存率最高,为0.6,但它乘客数量比较少,1个直系亲属次之,为0.5508475 ,2个直系亲属再次之,为0.5479452
相关系数为-0.678.有一定参考价值

(7)幸存率与票价的关系:

hist(A$Fare,col='red');   #所有乘客按票价分类的直方图
hist(A1$Fare,col='green',add=T);   #幸存者按票价分类的直方图
pie(as.numeric(table(A$Fare)),labels=names(table(A$Fare)))   #所有票价饼状图


I<-table(A1$Fare)/table(A$Fare);I   #各个票价的幸存率
cor(as.numeric(names(I)),as.numeric(I));  #票价和幸存率的相关系数I



从图和结果可以看出,几乎所有乘客票价都低于200,90%以上低于100,
票价为500~600的乘客幸存率为1,最高, 其次是100200之间的,为75%,再次是200300之间的,为64%,票价最低的一层幸存率最低,仅为36.4%,虽然他们幸存者最多。
乘客中没有人票价在300~500。
相关系数为0.8859,有一定参考价值。

2,逻辑回归模型:

glm.sol<-glm(A$Survived~A$Pclass+A$Sex+A$Age+A$SibSp+A$Parch+A$Fare, family=binomial, data=A)
summary(glm.sol)


从结果中可看出 前五个量都通过了检验(取α=0.05),直系亲属和票价的系数未通过检验,我们看看他们的相关系数

cor(A)


可以看出直系亲属与旁系亲属相关系数为0.39,比较高,而旁系亲属系数通过了检验,所以直系亲属可以考虑去掉,票价和船舱等级相关系数为-0.33,也比较高也可以考虑去掉,其实这是在预料之内的,因为票价越高,船舱等级越高。该表也反应了来上船的有些是一大家子都来了,包括兄弟姐妹和父母一起来了,不然相关系数没这么高。
现在做逐步回归

lm.step<-step(glm.sol)


可以看到初始AIC是805,找到最小的AIC是801,这个方案包含变量有船舱等级,性别,年龄,旁系亲属,去掉了直系亲属与票价,正好与我们之前的分析吻合。

glm.sol1<-glm(A$Survived~A$Pclass+A$Sex+A$Age+A$SibSp, family=binomial, data=A)
summary(glm.sol1)


可以看到,都通过了检验
所以ln(P/(1-P))=-1.20123Pclass-2.7183Sex-0.38823Age-0.32309SibSp+5.36563
P=exp(-1.20123Pclass-2.7183Sex-0.38823Age-0.32309SibSp+5.36563)/1+exp(-1.20123Pclass-2.7183Sex-0.38823Age-0.32309SibSp+5.36563);P表示幸存率。
回归诊断:

source("D:/R软件/R-3.3.1/bin/i386/回归诊断1.R")
Reg_Diag(glm.sol1)

还有其他的诊断方法,这里就举着一个例子。
数据太多(891x7),这里展示一部分,部分数据:

现在你们看不到完整的了,不过我可以看到
第298号数据有4个数据都异常,残差2.6,标准残差2.6,外学生化残差2.6,DTTITS统计量超过指标,所以需要进一步研究该数据。还有一些数据也有一些问题,不过残差没有太大问题,这里就不讨论了,太多了。
关于模型是不是线性的,对于这种多个自变量,还包含标签的逻辑回归,我目前的水平还不会诊断,要是多重线性的就容易多了。
多重共线性之前在相关性分析已经草率地讨论过了,来看看效果

AA<-data.frame(A$Survived,A$Pclass,A$Sex,A$Age,A$SibSp)
kappa(AA,exact=TRUE);


共线性的程度很小。

3、决策树

library(rpart)  #决策树包
fit<-rpart(Survived~Pclass+Age+Sex+SibSp+Parch+Fare,method="class",cp=0.0001,minsplit=40,data=A)
plot(fit,uniform=TRUE,main="Classification Tree for Titanic");  #决策树
text(fit,use.n=TRUE,all=TRUE)   #树上的标签

AA=read.csv("E:/R语言练习/泰坦尼克号分析/泰坦尼克代码、数据集和答案集/代码、数据集和答案集/mytest.csv",skipNul=TRUE);   AA=AA[,-11]   AA=AA[,-10]  AA=AA[,-8]  AA=AA[,-3]     AA$Sex=as.character(AA$Sex);
AA$Sex[AA$Sex=="male"]=1;
AA$Sex[AA$Sex=="female"]=0;
AA$Sex=as.numeric(AA$Sex);AA$Fare[AA$Fare<=100]=1;AA$Fare[AA$Fare>100&AA$Fare<=200]=2;AA$Fare[AA$Fare>200&AA$Fare<=300]=3;AA$Fare[AA$Fare>300&AA$Fare<=400]=4;AA$Fare[AA$Fare>400&AA$Fare<=500]=5;AA$Fare[AA$Fare>500]=6;AA$Age[AA$Age<=10]=1;AA$Age[AA$Age>10&AA$Age<=20]=2;AA$Age[AA$Age>20&AA$Age<=30]=3;AA$Age[AA$Age>30&AA$Age<=40]=4;AA$Age[AA$Age>40&AA$Age<=50]=5;AA$Age[AA$Age>50&AA$Age<=60]=6;AA$Age[AA$Age>60&AA$Age<=70]=7;AA$Age[AA$Age>70]=8;        #整理测试集,未填充年龄
bb<-read.csv("E:/R语言练习/泰坦尼克号分析/titanic/ground_truth.csv",head=T)   #导入答案
result <- predict(fit,AA,type="class")   #预测的结果
source("D:/R软件1/R-4.0.4/bin/i386/数数.R")
count_result(result,bb)


0.77还凑合,这个数字不够准确是因为决策树太早结束了,我参数设置的不太好。

泰坦尼克号数据分析!相关推荐

  1. 泰坦尼克号 数据分析_第1部分:泰坦尼克号-数据分析基础

    泰坦尼克号 数据分析 My goal was to get a better understanding of how to work with tabular data so I challenge ...

  2. python泰坦尼克号数据分析_Python数据分析|泰坦尼克逻辑回归

    Python数据分析学习笔记,今天分享下利用Python进行逻辑回归,预测泰坦尼克号乘客生存情况. #导入2个Python常用数据分析的库import numpy as npimport pandas ...

  3. 泰坦尼克号—数据分析(单因素、多因素分析)

    一.提出问题: 获救与其他因素(性别.年龄.舱位)的关系大小 二.整理数据: 数据来源:经典的titanic数据分析,大多数人都会从这个案例做教学或者做练习,数据可从kaggle(https://ww ...

  4. 泰坦尼克号数据分析案例实战

    这是一个很经典的案例,很多博主都写过,对,就是它:泰坦尼克号生存率的分析,它是kaggle上的一道题,通过船上乘客的信息分析和建模,预测哪些乘客得以生还. 我们就非常粗暴地拿这个数据集做一个简单的分析 ...

  5. kaggle 泰坦尼克号数据分析 笔记

    #泰坦尼克号 https://www.kaggle.com/ 数据来源 import pandas #读取数据 titanic = pandas.read_csv("D:/panana/ta ...

  6. 沉没的泰坦尼克号的幸存者数据分析

    点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 泰坦尼克号是英国白星航运公司下的一艘奥林匹克级邮轮,号称永不沉没,然而在1912年4月14日却与冰山相撞,沉没水中.2224 名船员及乘 ...

  7. 探索性数据分析(EDA)-不要问如何,不要问什么

    数据科学 , 机器学习 (Data Science, Machine Learning) This is part 1 in a series of articles guiding the read ...

  8. 通俗易懂的泰坦尼克号生存分析(titanic)

    作者:离散梦 欢迎大家给出宝贵的建议! 泰坦尼克号数据分析 一.前言 主要目的是整理自己的思路.本文主要是关于泰坦尼克号生存率python分析,因为很多博客做这个项目都比较深入,感觉都比较高大上,我们 ...

  9. 什么是好的数据指标:精益数据分析

    <精益数据分析>这本书是[加] 阿利斯泰尔·克罗尔和本杰明·尤科维奇著作,人民邮电出版社出版,2014年首发,如今过去6年,在数据分析行业依然畅销,同类型的"精益"系列 ...

  10. sql 取重复key中的第一条_SQL每日一题

    写在前面 SQL每日一题是用牛客网的sqlite库的题目进行深度讲解(感觉进度慢的小伙伴可以自行前往刷题),这个系列要开启日更计划,每日一题,一起进步学习. 题目描述 查找最晚入职员工的所有信息,为了 ...

最新文章

  1. 压力传感器 ZNHM-I-5KG初步测试
  2. ruby Encoding
  3. 【错误记录】IntelliJ IDEA 编译 Groovy 报错 ( Could not open/create prefs root node Software\JavaSoft\Prefs )
  4. go使用MySQL数据库
  5. leetcode 519. Random Flip Matrix | 519. 随机翻转矩阵(洗牌算法Fisher–Yates shuffle)
  6. Java语言之数组_java语言之数组-----选择排序
  7. 《C++标准程序库》学习笔记5 — 第七章
  8. 给刚入行的存储工程师10+1点建议
  9. python小项目之头像右上角加数字
  10. IoU实现 python
  11. 锦鱼课堂:跪着赚快钱,一年20W你愿意吗?
  12. Linux桌面版横评:九、Mandriva Linux 2007 Spring One
  13. C语言实现三种死循环
  14. java hl7_java-发送HL7消息后何时关闭并重新打开套接...
  15. mysql new 与old_mysql触发器new和old区别 阿星小栈
  16. 数字门店要怎么运营,才能助力线下门店降本增效?
  17. js中offset、client、scroll的区别
  18. 04 Python | 写入古诗并复制到新文档
  19. yeezy350灰橙_yeezy新灰橙会氧化吗 椰子350新灰橙氧化怎么办
  20. Python计算空间二面角

热门文章

  1. vue前端UI框架收集
  2. XP系统电脑连不上服务器,windowsxp系统电脑连不上路由器如何解决
  3. STM32F103串口通信用于获取GY-53 红外测距模块数据
  4. 机器人动力学-拉格朗日方程
  5. 计算线性回归方程和相应系数
  6. 贴片二极管正负极如何区分
  7. android真机调试工具,ADB 安卓真机调试工具
  8. 使用libyuv对YUV数据进行缩放,旋转,镜像,裁剪等操作
  9. cmd 批量复制文件/文件夹
  10. 超详细讲解ArcGIS拓扑分析(附路网练习数据下载)