如何使用R语言解决可恶的脏数据

转自:http://shujuren.org/article/45.html

在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模、挖掘等工作造成严重的错误,所以必须谨慎的处理那些脏数据。

脏数据的存在形式主要有如下几种情况:

1)缺失值

2)异常值

3)数据的不一致性

下面就跟大家侃侃如何处理这些脏数据。

一、缺失值

缺失值,顾名思义就是一种数据的遗漏,根据CRM中常见的缺失值做一个汇总:

1)会员信息缺失,如身份证号、手机号、性别、年龄等

2)消费数据缺失,如消费次数、消费金额、客单价,卡余等

3)产品信息缺失,如批次、价格、折扣、所属类别等

根据实际的业务需求不同,可以对缺失值采用不同的处理办法,如需要给会员推送短信,而某些会员恰好手机号不存在,可以考虑剔除;如性别不知道,可以使用众数替代;如年龄未知,可以考虑用均值替换。当然还有其他处理缺失值的办法,如多重插补法。下面以一个简单的例子,来说明缺失值的处理。

#模拟一批含缺失值的数据集

set.seed(1234)
Tel <- 13812341000:13812341999
Sex <- sample(c(‘F‘,‘M‘), size = 1000, replace = T, prob = c(0.4,0.6))
Age <- round(runif(n = 1000, min = 18, max = 60))
Freq <- round(runif(n = 1000, min = 1, max = 368))
Amount <- rnorm(n = 1000, mean = 134, sd = 10)
ATV <- runif(n = 1000, min = 23, max = 138)
df <- data.table(Tel = Tel, Sex = Sex, Age = Age, Freq = Freq, Amount= Amount, ATV = ATV)

上面的数据框是一个不含有任何缺失值的数据集,现在我想随机产生100个缺失值,具体操作如下:

查看原始数据集的概要

summary(df)

随机参数某行某列的下标

set.seed(1234)

i <- sample(1:6, size = 100, replace = T)

j <- sample(1:1000, size = 100)

将下标组合成矩阵

index <- as.matrix(data.frame(j,i))

将原始数据框转换为矩阵

df <- as.matrix(df)

将随机参数的行列赋值为NA

df[index] <- NA

重新将矩阵转换为数据框

df2 <- as.data.frame(df)

变换变量类型

df2$Age <- as.integer(df2$Age)

df2$Freq <- as.integer(df2$Freq)

df2$Amount <- as.numeric(df2$Amount)

df2$ATV <- as.numeric(df2$ATV)

再一次查看赋予缺失值后的数据框概要

summary(df2)

很明显这里已经随机产生100个缺失值了,下面看看这100个缺失值的分布情况。我们使用VIM包中的aggr()函数绘制缺失值的分布情况:

library(VIM)

aggr(df2, prop = FALSE, numbers = TRUE)

图中显示:Tel变量有21个缺失,Sex变量有28个缺失,Age变量有6个缺失,Freq变量有20个缺失,Amount变量有13个缺失,ATV有12个缺失。

为了演示,下面对Tel变量缺失的观测进行剔除;对Sex变量的缺失值用众数替换;Age变量用平均值替换;Freq变量、Amount变量和ATV变量用多重插补法填充。

剔除Tel变量的缺失观测

df3 <- df2[is.na(df2$Tel)==FALSE,]

分别用众数和均值替换性别和年龄

性别的众数

Sex_mode <- names(which.max(table(df3$Sex)))

年龄的均值

Age_mean <- mean(df3$Age, na.rm = TRUE)

library(tidyr)

df3 <- replace_na(df3,replace = list(Sex = Sex_mode, Age = Age_mean))

summary(df3)

这个时候,Tel变量、Sex变量和Age变量已不存在缺失值,下面对Freq变量、Amount变量和ATV变量使用多重插补法。

可通过mice包实现多重插补法,该包可以对数值型数据和因子型数据进行插补。

对于数值型数据,默认使用随机回归添补法(pmm);对二元因子数据,默认使用Logistic回归添补法(logreg);对多元因子数据,默认使用分类回归添补法(polyreg)。

其他插补法,可通过?mice查看相关文档。

library(mice)

对缺失值部分,进行5次的多重插补,这里默认使用随机回归添补法(pmm)

imp <- mice(data = df3, m = 5)

查看一下插补的结果

imp$imp

计算5重插补值的均值

Freq_imp <- apply(imp$imp$Freq,1,mean)

Amount_imp <- apply(imp$imp$Amount,1,mean)

ATV_imp <- apply(imp$imp$ATV,1,mean)

并用该均值替换原来的缺失值

df3$Freq[is.na(df3$Freq)] <- Freq_imp

df3$Amount[is.na(df3$Amount)] <- Amount_imp

df3$ATV[is.na(df3$ATV)] <- ATV_imp

再次查看填补完缺失值后的数据集和原始数据集概况

summary(df3)

summary(df2)

通过不同的方法将缺失值数据进行处理,从上图可知,通过填补后,数据的概概览情况基本与原始数据相近,说明填补过程中,基本保持了数据的总体特征。

二、异常值

异常值也是非常痛恨的一类脏数据,异常值往往会拉高或拉低数据的整体情况,为克服异常值的影响,我们需要对异常值进行处理。首先,我们需要识别出哪些值是异常值或离群点,其次如何处理这些异常值。下面仍然以案例的形式,给大家讲讲异常值的处理:

1、识别异常值

一般通过绘制盒形图来查看哪些点是离群点,而离群点的判断标准是四分位数与四分位距为基础。

即离群点超过上四分位数的1.5倍四分位距或低于下四分位数的1.5倍四分位距。

例子:

随机产生一组数据

set.seed(1234)

value <- c(rnorm(100, mean = 10, sd = 3), runif(20, min = 0.01, max
= 30), rf(30, df1 = 5, df2 = 20))

绘制箱线图,并用红色的方块标注出异常值

library(ggplot2)

ggplot(data = NULL, mapping = aes(x = ‘’, y = value)) + geom_boxplot(outlier.colour
= ‘red’, outlier.shape = 15, width = 1.2)

图中可知,有一部分数据落在上四分位数的1.5倍四分位距之上,即异常值,下面通过编程,将异常值找出来:

计算下四分位数、上四分位数和四分位距

QL <- quantile(value, probs = 0.25)

QU <- quantile(value, probs = 0.75)

QU_QL <- QU-QL

QL;QU;QU_QL

2、找出异常点

which(value > QU + 1.5*QU_QL)

value[which(value > QU + 1.5*QU_QL)]

结果显示,分别是第104、106、110、114、116、118和120这6个点。下面就要处理这些离群点,一般有两种方法,即剔除或替补。剔除很简单,但有时剔除也会给后面的分析带来错误的结果,接下来就讲讲替补。

用离异常点最近的点替换

test01 <- value

out_imp01 <- max(test01[which(test01 <= QU + 1.5*QU_QL)])

test01[which(test01 > QU + 1.5*QU_QL)] <- out_imp01

用上四分位数的1.5倍四分位距或下四分位数的1.5倍四分位距替换

test02 <- value

out_imp02 <- QU + 1.5*QU_QL

test02[which(test02 > QU + 1.5*QU_QL)] <- out_imp02

对比替换前后的数据概览

summary(value)

summary(test01)

summary(test02)

三、数据的不一致性

数据的不一致性一般是由于不同的数据源导致,如有些数据源的数据单位是斤,而有些数据源的数据单位为公斤;如有些数据源的数据单位是米,而有些数据源的数据单位为厘米;如两个数据源的数据没有同时更新等。对于这种不一致性可以通过数据变换轻松得到一致的数据,只有数据源的数据一致了,才可以进行统计分析或数据挖掘。由于这类问题的处理比较简单,这里就不累述具体的处理办法了。

时间: 2024-10-25 19:55:53

如何使用R语言解决可恶的脏数据的相关文章

大数据基础--R语言(刘鹏《大数据》课后习题答案)

1.R语言是解释性语言还是编译性语言?   解释性语言 2.简述R语言的基本功能.   R语言是一套完整的数据处理.计算和制图软件系统,主要包括以下功能: (1)数据存储和处理功能,丰富的数据读取与存储能力,丰富的数据处理功能. (2)数组运算工具 (3)完整连贯的统计分析工具 (4)优秀的统计制图功能 3.R语言通常用在哪些领域?   人工智能.统计分析.应用数学.计量经济.金融分析.财经分析.生物信息学.数据可视化与数据挖掘等. 4.R语言常用的分类和预测算法有哪些?   (1)K-近邻算法

R语言进阶之4:数据整形(reshape)

一.通过重新构建数据进行整形 数据整形最直接的思路就把数据全部向量化,然后按要求用向量构建其他类型的数据.这样是不是会产生大量的中间变量.占用大量内存?没错.R语言的任何函数(包括赋值)操作都会有同样的问题,因为R函数的参数传递方式是传值不传址,变量不可能原地址修改后再放回原地址. 矩阵和多维数组的向量化有直接的类型转换函数: as.vector,向量化后的结果顺序是先列后行再其他: > (x <- matrix(1:4, ncol=2))  #为节省空间,下面的结果省略了一些空行 [,1] 

R 语言数据结构 --2 矩阵和数据框①矩阵-matrix

矩阵-matrix-2018年6月9日 今天很可惜,没有过多地学习R语言(主要因为去听了党课,学习了党重要讲话,所以没有看书),所以今天就总结一个矩阵吧.不过多的学习了. 首先稍微复习一下昨天的因子,首先要记得的就是mode()看每个元素,class()看整体是什么,另外如果你把TRUE abc 1都传给一个向量,那向量会把它进行类型转换.安全性:字符串>数字>逻辑值.会尽量向安全性高的转换.这个是隐式类型转换.当然也可以用as家族进行类型转化,例如将数字转换成字符串:as.character

在R语言中显示美丽的数据摘要summary统计信息

原文链接:http://tecdat.cn/?p=6481 总结数据集 ## Skim summary statistics ## n obs: 150 ## n variables: 5 ## ## Variable type: factor ## variable missing complete n n_unique top_counts ## 1 Species 0 150 150 3 set: 50, ver: 50, vir: 50, NA: 0 ## ordered ## 1 FA

R语言解决最优化运营研究问题-线性优化(LP)问题

使用R中的线性编程工具来解决优化问题. 优化通常用于运营研究领域,以解决生产计划,运输网络设计,仓库位置分配和调度等问题,我们尝试最大化或最小化具有决策变量和约束数量的线性函数. 在这里,我使用了我的一个咨询项目,帮助我们的投资组合公司选择一个无线供应商,其中包含可以满足所有要求(总线数和汇总数据量)的数据计划组合,同时花费最少的金钱. 这种优化通常可以在Excel求解器中解决.但是,由于我有20个投资组合公司有2个提供商和2个方案进行分析,要在Excel中完成,我将不得不运行80次.使用R会容

《数据挖掘:R语言实战》第二章 数据概览

2.1 n*m数据集 在n*m表格形式的数据集中,n代表数据的行,即观测点的数量:m代表列,即变量的数量:n*m为数据的维度. 一般来说,当拿到一份数据时,最先做的往往就是查看数据集的观测样本数.变量数,以及这些变量的实际含义,以此对数据集的庞大程度和各变量的相对重要性做到心中有数.这对选取何种数据挖掘算法,以及在这之前应该抽取多少及哪些变量及样本纳入建模都有重要的先导作用. 2.2 数据的分类 2.2.1 一般的数据分类 定量数据:连续型数据和离散型数据 定性数据:定类数据.定序数据.定距数据

R语言读取Excel和对数据框的操作

找整理了下资料,你看看,希望对你有帮助 你下载一本资料http://down.51cto.com/data/957270 导入Excel数据请参考书中的2.3.3, 使用SQL语句操作数据框请参考书中的4.11节 你可以根据自己的功能分写成不同的脚本,使用的时候直接使用就可以了 我使用了以下方法: install.packages("XLConnect") library("XLConnect") 这里有weatherday.xlsx, 我放在workspace下面

R语言-来自Prosper的贷款数据探索

案例分析:Prosper是美国的一家P2P在线借贷平台,网站撮合了一些有闲钱的人和一些急用钱的人.用户若有贷款需求,可在网站上列出期望数额和可承受的最大利率.潜在贷方则为数额和利率展开竞价. 本项目拟通过该数据集的探索,结合自己的理解进行分析,最终目的的是初步预测哪些人贷款后会还款.哪些人会赖账. 1.探索数据集 1 loandata = read.csv("prosperLoanData.csv") 2 str(loandata) 结论:一共有81个变量,113937个对象 2.选择

R 语言数据结构 --2 矩阵和数据框②数据框-dataframe

2018年6月11日晚,今天又中午没睡觉,但是还是不觉得困.也不觉得头疼,其实很多事情都是分人的.你不一定非要午睡,午睡是给早上干完活回寝室特别累的人,是视情况而定的,并不是每个人每天都要午睡的,很多事情养成了习惯反而是一种拖累,相反适时而动才是明智之举.比如早起早睡是好习惯,午睡如果下午会觉得头疼,就应该反思适不适合自己,很多事情也是这样.强迫自己并不好. 说多了,说回来,今天讲数据框dataframe 注意是data不是date.很重要!!!打错字哭都没用. 1dataframe的创建: 一