Data Analytics for Beginners:第二节

来源:互联网 发布:和外国人谈恋爱知乎 编辑:程序博客网 时间:2024/06/11 18:31

本节目的:运用数据集建模

清洗数据

  1. 缺失数据的处理,如:年龄字段中有缺失数据
  2. 删除数据集中不能使用的变量:Ticket, Fare, Cabin, and Embarked。
trainData = trainData[-c(1,9:12)]

c()函数生成一个数字列表,通过上述语句,R语言执行9到12行的删除功能。

  • 性别转换成为男/女–> 0/1
    为了转换成数字模型,将男女性别定性为0 1,使用gsub()函数,该函数可以将文本段替换成我们需要的值。
trainData$Sex = gsub("female",1,trainData$Sex)trainData$Sex = gsub("male",0,trainData$Sex)
  • 缺失年龄判断:第一步
    数据集中的年龄有很多值缺失,但是Age是一个重要的变量,为了弥补这些缺失值,需要判断年龄和其他变量之间的关系。假设字段中的Mrs.的年龄大于字段Ms的年龄,缺失字段中有相同头衔的假定其年龄是一样的。
    因此,我们将有相同姓氏的人员放在一个列表中,使用grep()函数,函数将返回指定姓氏的行号向量。
master_vector = grep("Master.",trainData$Name,fixed = TRUE)miss_vector = grep("Miss.",trainData$Name, fixed = TRUE)mrs_vector = grep("Mrs.",trainData$Name, fixed = TRUE)mr_vector = grep("Mr.",trainData$Name, fixed = TRUE)dr_vector = grep("Dr.",trainData$Name, fixed = TRUE)

数据集中的一些不太常见的头衔,牧师或者是上校啥的,我们基于其人数少,不再考虑。
接下来,将每个名称缩短化,由于外国人的名字都太长了,为了数据易于分析,将每个人的名字直接缩短为其头衔名称,比如“Cumings, Mrs. John Bradley (Florence Briggs Thayer)”简化为“Mrs”

for(i in master_vector){  trainData$Name[i] = "Master"}for (i in miss_vector) {  trainData$Name[i] = "Miss"}for (i in mrs_vector) {  trainData$Name[i] = "Mrs"}for (i in mr_vector) {  trainData$Name[i] = "Mr"}for (i in dr_vector) {  trainData$Name[i] = "Dr"}

这里写图片描述
如图所示,姓名简化,名别替代后,整个表变的很简洁啦。

  • 缺失年龄判断:第二步
    对年龄缺失的部分,计算出具有相同头衔的组内平均值,使用其平均值进行替代。
master_age = round(mean(trainData$Age[trainData$Name == "Master"],na.rm = TRUE),digits = 2)miss_age = round(mean(trainData$Age[trainData$Name == "Miss"],na.rm = TRUE),digits = 2)mrs_age = round(mean(trainData$Age[trainData$Name == "Mrs"], na.rm = TRUE), digits = 2)mr_age = round(mean(trainData$Age[trainData$Name == "Mr"],na.rm = TRUE), digits = 2)dr_age = round(mean(trainData$Age[trainData$Name == "Dr"], na.rm = TRUE),digits = 2)

round函数好像是四舍五入,这里是保留两位小数点?)
然后开始进行缺失值的循环替代

for (i in 1:nrow(trainData)) {  if (is.na(trainData[i,5])) {    if (trainData$Name[i] == "Master") {      trainData$Age[i] = master_age    } else if (trainData$Name[i] == "Miss") {      trainData$Age[i] = miss_age    } else if (trainData$Name[i] == "Mrs") {      trainData$Age[i] = mrs_age    } else if (trainData$Name[i] == "Mr") {      trainData$Age[i] = mr_age    } else if (trainData$Name[i] == "Dr") {      trainData$Age[i] = dr_age    } else {      print("Uncaught Title")    }  }}

nrow()
官方解释:nrow and ncol return the number of rows or columns present in x. NCOL and NROW do the same treating a vector as 1 -column matrix.
(大写的解释还没用到,也不是很明白,小写的nrow就是返回数据集中的行数或列数)

  • 创建新变量
    为了使增强模型需要创建新变量,也许通过创建的新的变量能更准确的预测出乘客是否生存。(通过创建这些变量,观察变量是否是有用的,变量是如何影响存活率的)
    变量1:child
    这个变量是考虑到乘客是否是孩子可能影响到该乘客的生存率,添加一个名为“Child”的新列,年龄在12岁以下的列中填“1”,其他的填“2”
trainData["Child"]for (i in 1:nrow(trainData)) {  if(trainData$Age[i] <= 12){    trainData$Child[i] = 1  }else{    trainData$Child[i] = 2  }}

变量2:Family
家庭变量表示每位乘客的家庭规模,猜测大的家庭可能存活率低,或者是完全相反的情况,接下来,构建模型对问题进行优化,看家庭与存活率之间是否存在某些关系(Siblings/Spouses[SibSp] Parents/Children[Parch])

trainData["Family"] = NAfor (i in 1:nrow(trainData)) {  x = trainData$SibSp[i]  y = trainData$Parch[i]  trainData$Family[i] = x+y+1}

变量3:Mother
通过查看头衔是否是Mrs或者是携带孩子数目是否大于0

trainData["Mother"] = NAfor (i in 1:nrow(trainData)) {  if(trainData$Name[i] == "Mrs" & trainData$Parch[i]>0){    trainData$Mother[i] = 1  }else{    trainData$Mother[i] =2  }}