ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据清洗实验

2020-03-21 22:01:21  阅读:400  来源: 互联网

标签:complete 包含 cases mydata 实验 清洗 数据 缺失


#大数据分析基础 实验四

# 1. 启动Rstudio 软件,新建R Script 文件

# 2. 利用read.csv 函数导入D 盘中的bank-additional-full.csv 数据到Rstudio,
#    并赋值为mydata,然后展示mydata 的前5 行数据,并创建缺失值。

mydata <- read.csv("./bank-additional-full.csv", sep = ';')
mydata$job[which(mydata$job == 'unknown')] <- NA
mydata$default[which(mydata$default == 'unknown')] <- NA
mydata$education[which(mydata$education == 'unknown')] <- NA
mydata$housing[which(mydata$housing == 'unknown')] <- NA

# 3. 识别缺失值
# 在R 中,缺失值以符号NA 表示,函数is.na()通过返回逻辑值向量来检测缺失值是否存
# 在。当is.na()当变量值为NA 时,把该元素所在的值设置为TRUE,表明该元素是NA 。

mydata_2<-is.na(mydata)
head(mydata_2,3)

# 4. complete.cases()函数测试观测是否完整
# complete.cases()是stats 包中的一个函数,返回一个逻辑向量。
# 向量的每个元素表示每个观测是否完整,完整是指观测中的所有变量都不包含缺失值。

mydata_3<- complete.cases(mydata)
head(mydata_3,5)

# complete.cases() 输出的逻辑向量与is.na 正好相反, is.na 的TURE 为是缺失值;
# complete.cases()的TURE 为完整值。从代码结果中可以看出,mydata_3 的前5 行数据中
# 第2 个显示是FALSE,表示这个值是不完整值。

# 5. 缺失值分析
# 缺失值分析包括:含有缺失值的记录和属性,包含缺失值的观测总数和缺失率。
# 使用complete.cases()函数来查看查看含有缺失值的记录和属性。

mydata_4<-mydata[!complete.cases(mydata), ]
head(mydata_4,3)

# 以上程序中,筛选了mydata 中包含缺失值的数据,并显示了其前三行内容。
# 从显示结果来看,在education 列以及default 列均出现了缺失值<NA>。

# 6. 包含缺失值的统计数据
# a. 各列包含异常值的数量:

colSums(is.na(mydata))

# 上述结果显示了各列包含异常值的数量,其中job、education、default、housing 包含
# 缺失值较多,其余属性值中异常值数量为0。

# b. 统计包含缺失值的总行数:

sum(!complete.cases(mydata))

# 结果显示,该数据集中包含的缺失值总行数为10641。
# c. 缺失率
# 统计包含缺失值的观测数量占比:

mean(!complete.cases(mydata))

# 使用!complete.cases()函数来检测数据是否完整。如果数据为完整行,则返回FALSE,若
# 数据为非完整行,则返回TRUE。使用mean()函数计算返回向量,TRUE 为1,FALSE 为0。
# 最终就可以计算出数据中缺失行所占比例。
# 7. 删除缺失值
# 删除缺失值
# 当缺失值所占的比例比较少时,可以使用删除法,以减少样本数据量来换取数据的完整
# 性。删除缺失值可以通过na.omit()函数移除所有含有缺失值的观测。

mydata_5<- na.omit(mydata)
head(mydata_5,3)

# 从执行结果可以看出,经过na.omit()处理之后,没有缺失值的前三条数据分别是第1、
# 3、4 行。而其中带有缺失值的第2 行数据已经被删除。
# 8. 均值替换
# 均值替换法属于插补法的一种简单形式,适用于缺失率低的场景。如果是数值型变量,
# 则使用该变量中其他全部有效观测值的平均数来替换其中的缺失值。

mydata$age[which(mydata$age == '56')] <- NA #创建缺失值

# 用平均值来替代缺失值

mydata$age[is.na(mydata$age)] <- round(mean(mydata$age, na.rm = TRUE)) 
head(mydata$age,5)

# 程序把数据集第一行数据中的age 属性值由56 改为缺失值NA,然后进行均值替换。
# 从输出结果可以看出,替换后的第一行数据中的age 属性值,
# NA 缺失值已经被替换为均值40。

# 9. 异常值清洗
# 利用read.csv 函数导入bank-additional-full.csv 数据到R,并赋值为mydata,
# 然后展示mydata 的前5 行数据。
# a. 剔除缺失值并创建异常值

mydata$job[which(mydata$job == 'unknown')] <- NA # 剔除job 列含有缺失值的样本
mydata_clear1 <- na.omit(mydata)
mydata_clear2 <- subset(mydata_clear1, select = -poutcome) # 剔除poutcome 列

# 创建异常值

set.seed(1) # 设置该种子函数,产生的随机数相同
index <- sample(1:nrow(mydata_clear2), 5) # 随机抽样
index
mydata_clear2$age[index ]
mydata_clear2$age[index] <- mydata_clear2$age[index] * 3
mydata_clear2$age[index]

# 程序先通过na.omit()的方法,对缺失值进行了清除。然后通过随机抽样对方法,得到一
# 个数据行数对样本集。最后对样本集中age 属性的值扩大3 倍,使之成为异常值。

# b. 识别异常值并剔除

boxplot(mydata_clear2$age, boxwex = 0.7)
index2 <- which(mydata_clear2$age >= 80) #筛选age 大于80 的异常点
mydata_clear2 <- mydata_clear2[-index2, ] #剔除异常点
head(mydata_clear2, 5) # 查看数据集的前5 行

#通过绘制该数据age 属性的箱线图,发现有偏离正常区间的异常点存在。筛选出age 大
#于80 的异常点并删除,最终得到符合要求的数据集mydata_clear2。
#c.均值替换异常值
#异常值处理如果是连续变量,可以选择均值;离散变量,可以选择众数或者中位数。计
#算非异常值数据的均值,然后赋值给异常值数据。
# 由于对异常值的均值替换与缺失值操作类似,此处不再单独举例。

# 10. 不一致值处理
#编码不一致和数据表示不一致的问题通常需要人工检测,当发现一定规律时可以通过编
#程进行替换和修改。若存在不一致的数据是无意义数据,可以使用缺失值处理方法进行相应
#处理。当对数据进行批量操作时,可以通过对函数返回值进行约束,根据是否提示错误判断、
#是否存在数据不一致问题,如vapply 函数。vapply 函数的作用是对一个列表或向量进行指
#定的函数操作,其常用格式如下:

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

#其中X 是作为输入变量的列表或向量,FUN 是指定函数,FUN.VALUE 是函数要求的
#返回值,当USE.NAMES 赋值为TRUE 且X 是字符型时,若返回值没有变量名则用X 作为
#变量名。与vapply 类似的函数还有lapply 和sapply,sapply 是lapply,
#但可预测性不好。如果是大规模的数据处理,后续的类型判断工作会很麻烦而且很费时。
#vapply 增加的FUN.VALUE 参数可以直接对返回值类型进行检查,这样的好处是不仅运算
#速度快,而且程序运算更安全(因为结果可控)。

# 下面代码中的rt.value 变量设置返回值的长度和类型,如果FUN 函数获得的结果和
# rt.value 设置的不一致(长度和类型)都会出错。

x<-list(a=1:10, beta=exp(-3:3), logic=c(TRUE,FALSE,FALSE,TRUE))# 生成列表

x

probs <- c(1:3/4)
rt.value <- c(0,0,0) # 设置返回值为3 个数字
vapply(x,quantile,FUN.VALUE=rt.value,probs=probs)

# 若将probs <- c(1:3/4)改成probs <- c(1:4/4),会导致返回值与要求格式不一致,
# 进而提示错误。

probs<- c(1:4/4) #设置四个分为点
vapply(x, quantile,FUN.VALUE=rt.value,probs=probs)

# 结果显示错误,要求返回值的长度必须为3,但FUN(X[[1]])返回的结果长度却是4,两
# 者不一致导致错误。当将要求值长度改为4 后,结果如下:

rt.value<- c(0,0,0,0) # 设置返回值为4 个数字
vapply(x, quantile,FUN.VALUE=rt.value,probs=probs)

rt.value<- c(0,0,0,"") # 设置返回值为3 个数字和1 个字符串
vapply(x, quantile,FUN.VALUE=rt.value,probs=probs)

# 由于要求返回值的种类必须是'character',但FUN(X[[1]])结果的种类却是'double',导致
# 产生错误提示。从上述实验可以看出,可以根据vapply 函数的这一功能,使用FUN.VALUE
# 参数对数据进行批量的不一致性检测。
# 实验分析
# 数据清洗在数据预处理过程中有着不可或缺的作用,是保证数据完整性与精确性的关键
# 步骤。该实验中,从数据的缺失值、异常值以及不一致值三个方面来进行数据的清洗工作,
# 例如缺失值常用的方法有删除法、替换法、插补法等。通过利用R 语言中功能完善的函数
# 与方法,能够按照要求完成实验的目标。并且对数据清洗的流程和思路进行了锻炼与巩固。
# 2020.03

标签:complete,包含,cases,mydata,实验,清洗,数据,缺失
来源: https://www.cnblogs.com/adeepbluesky/p/12542591.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有