R 数据质量分析①

数据质量分析

数据质量分析是数据挖掘中数据准备的最重要一环,是数据处理的前体。数据质量分分析主要任务是识别脏数据。常见的脏数据包括:

  • 缺失值
  • 异常值
  • 不一致的值
  • 重复数据或者包括特殊符号的数据

缺失值处理

处理数据缺失的一般步骤:

  • 识别缺失数据
  • 检测导致数据缺失的原因
  • 删除包含缺失值的实例或用合理的数值代替(插补)缺失值。

1、识别缺失数据:

R语言中,NA代表缺失值,NaN代表不可能值,Inf和-Inf代表正无穷和负无穷。推荐使用is.na,is.nan,is.finite,is.infinite4个函数去处理。

setwd("E:\\Rwork\\data")
library(mice)
library(VIM)
a <- read.csv('catering_sale.csv',header = T)
dim(a)
sum(complete.cases(a))
sum(!complete.cases(a))
mean(!complete.cases(a))
a[!complete.cases(a), ]


# 异常值检测箱线图
sp <- boxplot(a$"销量", boxwex = 0.7)
title("销量异常值检测箱线图")
xi <- 1.1
sd.s <- sd(a[complete.cases(a), ]$"销量")
mn.s <- mean(a[complete.cases(a), ]$"销量")
points(xi, mn.s, col = "red", pch = 18)
arrows(xi, mn.s - sd.s, xi, mn.s + sd.s, code = 3, col = "pink", angle = 75, length = .1)
text(rep(c(1.05, 1.05, 0.95, 0.95), length = length(sp$out)), 
     labels = sp$out[order(sp$out)], sp$out[order(sp$out)] + 
       rep(c(150, -150, 150, -150), length = length(sp$out)), col = "red")

complete.case()可用来识别矩阵或数据框中没有缺失值的行

> complete.cases(a)
  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
 [16]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [31]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [46]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [61]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [76]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [91]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[106]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[121]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[136]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[151]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[166]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[181]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[196]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
> is.na(a)
        日期  销量
  [1,] FALSE FALSE
  [2,] FALSE FALSE
  [3,] FALSE FALSE
  [4,] FALSE FALSE
  [5,] FALSE FALSE
  [6,] FALSE FALSE
  [7,] FALSE FALSE
  [8,] FALSE FALSE
  [9,] FALSE FALSE
 [10,] FALSE FALSE
 [11,] FALSE FALSE
 [12,] FALSE FALSE
 [13,] FALSE FALSE
 [14,] FALSE FALSE
 [15,] FALSE  TRUE
 [16,] FALSE FALSE
 [17,] FALSE FALSE
 [18,] FALSE FALSE
 [19,] FALSE FALSE
 [20,] FALSE FALSE
 [21,] FALSE FALSE
 [22,] FALSE FALSE
 [23,] FALSE FALSE
 [24,] FALSE FALSE
 [25,] FALSE FALSE
 [26,] FALSE FALSE
 [27,] FALSE FALSE
 [28,] FALSE FALSE
 [29,] FALSE FALSE
 [30,] FALSE FALSE
 [31,] FALSE FALSE
 [32,] FALSE FALSE
 [33,] FALSE FALSE
 [34,] FALSE FALSE
 [35,] FALSE FALSE
 [36,] FALSE FALSE
 [37,] FALSE FALSE
 [38,] FALSE FALSE
 [39,] FALSE FALSE
 [40,] FALSE FALSE
 [41,] FALSE FALSE
 [42,] FALSE FALSE
 [43,] FALSE FALSE
 [44,] FALSE FALSE
 [45,] FALSE FALSE
 [46,] FALSE FALSE
 [47,] FALSE FALSE
 [48,] FALSE FALSE
 [49,] FALSE FALSE
 [50,] FALSE FALSE
 [51,] FALSE FALSE
 [52,] FALSE FALSE
 [53,] FALSE FALSE
 [54,] FALSE FALSE
 [55,] FALSE FALSE
 [56,] FALSE FALSE
 [57,] FALSE FALSE
 [58,] FALSE FALSE
 [59,] FALSE FALSE
 [60,] FALSE FALSE

> md.pattern(a)
    日期 销量  
195    1    1 0
  6    1    0 1
       0    6 6

备注:0表示变量的列中没有缺失,1则表示有缺失值。 第一行给出了没有缺失值的数目(共多少行)。 第一列表示各缺失值的模式。 最后一行给出了每个变量的缺失值数目。 最后一列给出了变量的数目(这些变量存在缺失值)。

aggr(a,prop=F,numbers=T)
matrixplot(a)

2. 缺失值处理

  • 行删除法:数据集中含有缺失值的行都会被删除,一般假定缺失数据是完全随机产生的,并且缺失值只是很少一部分,对结果不会造成大的影响。即:要有足够的样本量,并且删除缺失值后不会有大的偏差!

行删除的函数有na.omit()和complete.case()

  • 删除含有缺失值的行
newdata<-na.omit(a)
newdata<-a[complete.cases(a),]
  • 删除含有缺失值的列
t(na.omit(t(a)))

na_flag <- apply(is.na(a), 2, sum)
a <- a[, which(na_flag == 0)]

lapply(Y, na.omit)
  • 预测插补法
> a <- read.csv("titanic.train.csv",header = T, row.names = 1) 
> sapply(a,function(x) sum(is.na(x)))
Survived   Pclass     Name      Sex      Age    SibSp    Parch 
       0        0        0        0      177        0        0 
  Ticket     Fare    Cabin Embarked 
       0        0        0        0 
> age.model <- rpart(Age ~ Pclass + Sex + SibSp + 
+                      Parch + Fare + Embarked  ,
+                    data=a[!is.na(a$Age), ],
+                    method='anova')
> 
> a$Age[is.na(a$Age)] <- predict(age.model, a[is.na(a$Age), ])
> sapply(a,function(x) sum(is.na(x)))
Survived   Pclass     Name      Sex      Age    SibSp    Parch 
       0        0        0        0        0        0        0 
  Ticket     Fare    Cabin Embarked 
       0        0        0        0 
> 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

KMP算法学习(详解)

kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简...

31850
来自专栏刘望舒

算法(二)初等排序前篇[插入和冒泡排序]

前言 排序是算法的基础,排序有很多种方法,有些方法实现起来很简单,但是效率较差,我们可以将这些排序的方法称之为初等排序。这篇文章我们就来学习初等排序中的插入排序...

19190
来自专栏塔奇克马敲代码

第3章 字符串、向量和数组

19960
来自专栏Python疯子

数据分析之numpy

ndarray概述 创建n维数组 接收的是列表类型,所有元素类型必须相同 shape表示各维度大小的元组 dtype表示数组数据类型对象

15410
来自专栏尾尾部落

普林斯顿大学算法公开课笔记——插入排序

现有一组数组 arr = [5, 6, 3, 1, 8, 7, 2, 4],共有八个记录,排序过程如下:

16210
来自专栏编程理解

排序算法(十):基数排序

基数排序也可以称为多关键字排序,同计数排序类似,也是一种非比较性质的排序算法。将待排序集合中的每个元素拆分为多个总容量空间较小的对象,对每个对象执行桶排序后,则...

71810
来自专栏韦弦的偶尔分享

Swift 字符串转整数 (atoi) - LeetCode

1、在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为...

12030
来自专栏JAVA技术站

Python学习二运算符 原

除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

14440
来自专栏我是东东强

常见算法之排序

各类排序算法,不仅是算法基本功,也是面试中永恒的考题,关于每种算法思想、实现(递归与非递归)以及时空复杂度分析是必须牢牢把握的送分题。本文先将排序算法按不同标准...

11820
来自专栏编程理解

排序算法(五):堆排序

的时间复杂度即可将二叉树重新调整为有序状态。若构造出一种具有特殊节点顺序的二叉树,使得每次对二叉树执行插入或删除节点操作后,都调整保持二叉树根节点的值为树中节...

19320

扫码关注云+社区

领取腾讯云代金券