• 主页
  • 课程

    关于课程

    • 课程归档
    • 成为一名讲师
    • 讲师信息
    同等学历教学

    同等学历教学

    免费
    阅读更多
  • 特色
    • 展示
    • 关于我们
    • 问答
  • 事件
  • 个性化
  • 博客
  • 联系
  • 站点资源
    有任何问题吗?
    (00) 123 456 789
    weinfoadmin@weinformatics.cn
    注册登录
    恒诺新知
    • 主页
    • 课程

      关于课程

      • 课程归档
      • 成为一名讲师
      • 讲师信息
      同等学历教学

      同等学历教学

      免费
      阅读更多
    • 特色
      • 展示
      • 关于我们
      • 问答
    • 事件
    • 个性化
    • 博客
    • 联系
    • 站点资源

      R语言

      • 首页
      • 博客
      • R语言
      • 【数据整理】如何使用R语言解决可恶的脏数据

      【数据整理】如何使用R语言解决可恶的脏数据

      • 发布者 weinfoadmin
      • 分类 R语言
      • 日期 2016年2月18日
      测试开头

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

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

      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.frame(Tel = Tel, Sex = Sex, Age = Age, Freq = Freq, Amount = Amount, ATV = ATV)


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


      #查看原始数据集的概要

      summary(df)

      【数据整理】如何使用R语言解决可恶的脏数据

      #随机参数某行某列的下标

      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)

      【数据整理】如何使用R语言解决可恶的脏数据

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


      library(VIM)

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

      【数据整理】如何使用R语言解决可恶的脏数据

      图中显示: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)

      【数据整理】如何使用R语言解决可恶的脏数据

      这个时候,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)

      【数据整理】如何使用R语言解决可恶的脏数据

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


      二、异常值

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

      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)

      【数据整理】如何使用R语言解决可恶的脏数据

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


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

      QL <- quantile(value, probs = 0.25)

      QU <- quantile(value, probs = 0.75)

      QU_QL <- QU-QL

      QL;QU;QU_QL

      【数据整理】如何使用R语言解决可恶的脏数据

      2、找出异常点

      which(value > QU + 1.5*QU_QL)

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

      【数据整理】如何使用R语言解决可恶的脏数据

      结果显示,分别是第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)

      【数据整理】如何使用R语言解决可恶的脏数据


      三、数据的不一致性

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


      刘顺祥,数据分析师,热爱数据分析与挖掘工作,擅长使用R语言,目前自学Python语言。

      严禁修改,可以转载,请注明出自数据人网和原文链接:http://shujuren.org/index.php/Article/update/aid/162


      更多精彩内容,请点击阅读原文。

      数据人网(http://shujuren.org),数据人学习、交流和分享的家园,专注于从数据中学习,努力发觉数据之洞见,积极利用数据之价值。为“让人懂数据、用数据”之使命坚持做点事情。大家可以来投稿,做分享和传播,可以给反馈。您有什么想法,请反馈给我们,谢谢。数据人网,我们共建和共享。

      数据人网构建了数据人圈子,诚邀热爱数据和利用数据朋友入群。加小编微信:luqin360,注明入圈子。


      测试结尾

      请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!

      • 分享:
      作者头像
      weinfoadmin

      上一篇文章

      【R画图】使用R绘制其他图形之热图及网络图
      2016年2月18日

      下一篇文章

      【R画图】使用R绘制几种常用的双坐标轴图形
      2016年2月20日

      你可能也喜欢

      3-1665801675
      R语言学习:重读《R数据科学(中文版)》书籍
      28 9月, 2022
      6-1652833487
      经典铁死亡,再出新思路
      16 5月, 2022
      1-1651501980
      R语言学习:阅读《R For Everyone 》(第二版)
      1 5月, 2022

      搜索

      分类

      • R语言
      • TCGA数据挖掘
      • 单细胞RNA-seq测序
      • 在线会议直播预告与回放
      • 数据分析那些事儿分类
      • 未分类
      • 生信星球
      • 老俊俊的生信笔记

      投稿培训

      免费

      alphafold2培训

      免费

      群晖配置培训

      免费

      最新博文

      Nature | 单细胞技术揭示衰老细胞与肌肉再生
      301月2023
      lncRNA和miRNA生信分析系列讲座免费视频课和课件资源包,干货满满
      301月2023
      如何快速批量修改 Git 提交记录中的用户信息
      261月2023
      logo-eduma-the-best-lms-wordpress-theme

      (00) 123 456 789

      weinfoadmin@weinformatics.cn

      恒诺新知

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      链接

      • 课程
      • 事件
      • 展示
      • 问答

      支持

      • 文档
      • 论坛
      • 语言包
      • 发行状态

      推荐

      • iHub汉语代码托管
      • iLAB耗材管理
      • WooCommerce
      • 丁香园论坛

      weinformatics 即 恒诺新知。ICP备案号:粤ICP备19129767号

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      要成为一名讲师吗?

      加入数以千计的演讲者获得100%课时费!

      现在开始

      用你的站点账户登录

      忘记密码?

      还不是会员? 现在注册

      注册新帐户

      已经拥有注册账户? 现在登录

      close
      会员购买 你还没有登录,请先登录
      • ¥99 VIP-1个月
      • ¥199 VIP-半年
      • ¥299 VIP-1年
      在线支付 激活码

      立即支付
      支付宝
      微信支付
      请使用 支付宝 或 微信 扫码支付
      登录
      注册|忘记密码?