数据质量通常是指数据值的质量,包括准确性、完整性和一致性。数据的准确性是指数据不包含错误或异常值、完整性是指数据不包含缺失值、一致性是数据在各个数据源中都是相同的。广义的数据质量还包括数据整体的有效性,例如,数据整体是否是可信的、数据的取样是否合理等。本文的数据质量分析,是指对原始数据值的质量进行分析,以检查数据的质量。没有可信的数据,数据分析将是空中楼阁,因此,数据分析的前提就是要保证数据质量是可信的。

数据质量分析的主要任务是检测原始数据中是否存在脏数据,脏数据一般是指不符合要求,以及不能直接进行相应分析的数据,脏数据一般包括:

缺失值
异常值(离群点)
不一致的值
内容未知的值

通常情况下,原始数据中都会存在不完整(有缺失值)、不一致、数据异常等问题,这些脏数据会降低数据的质量,影响数据分析的结果,因此,在进行数据分析之前,需要对数据进行清洗、集成、转换等处理,以提高数据的质量。对于内容未知和不一致的数据,通常需要人工识别,进而才能确定处理方法,本文重点介绍缺失值和异常值的分析方法。

一,缺失值分析

数据的缺失一般是指观测的缺失和观测中变量值的缺失,两者都会造成分析结果的不准确。观测的缺失会导致由样本数据推断出的总体数据的性质和特点出现偏差。

本小节涉及的是样本中数据值的分析,使用简单的统计分析,可以得到含有缺失值的属性的个数和样本空间的缺失率。缺失的数据可能会对数据分析的结果产生误差,从而使样本数据不能很好地代表数据总体。

用作分析缺失值的数据集:

df <- data.frame(col1 = c(1,3, NA,7,5),
                 col2 = c("a", NA,"b", "a","d"), 
                 col3 = c(TRUE, FALSE, NA, TRUE,FALSE), 
                 col4 = c(2.5, 4.2, 3.2, NA,1.4),
                 stringsAsFactors = TRUE)

1,识别缺失数据

在R语言中,缺失值通常以NA表示,可以使用函数is.na()判断缺失值是否存在,另外,函数complete.cases()通过识别样本数据是否完整,从而判断缺失情况。

(1)is.na()标记出现NA的变量

is.na()返回逻辑值向量,当变量值为NA时,把该元素所在的值设置为TRUE,表明该元素是NA。

> is.na(df)
      col1  col2  col3  col4
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE  TRUE FALSE FALSE
[3,]  TRUE FALSE  TRUE FALSE
[4,] FALSE FALSE FALSE  TRUE
[5,] FALSE FALSE FALSE FALSE

(2) complete.cases()函数测试观测是否完整

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

complete.cases(df)
[1]  TRUE FALSE FALSE FALSE  TRUE

2,缺失值分析

缺失值分析包括:含有缺失值的记录和属性,包含缺失值的观测总数和缺失率。

(1)查看含有缺失值的记录和属性

使用complete.cases()函数来查看包含缺失值的观测

df[!complete.cases(df), ]
  col1 col2  col3 col4
2    3 <NA> FALSE  4.2
3   NA    b    NA  3.2
4    7    a  TRUE   NA

(2)包含缺失值的统计数据

各列包含异常值的数量:

colSums(is.na(df))
col1 col2 col3 col4 
   1    1    1    1 

包含异常值的总行数:

sum(!complete.cases(df))
[1] 3

(3)缺失率

包含缺失值的观测数量占比是60%

mean(!complete.cases(df))
[1] 0.6

3,处理缺失值

对缺失值的处理,常用的处理方法是删除缺失值所在的记录,均值替换和插补。插补法比较复杂,本文暂不讨论该主题。

(1)删除

当缺失值所占的比例比较少时,可以使用删除法,以减少样本数据量来换取数据的完整性。

删除缺失值可以通过na.omit()函数移除所有含有缺失值的观测。

df <- na.omit(df)

通常情况下,字符类型的缺失值可以不做任何处理;如果缺失值是因子,且占比较少,可以直接删除:

df <- df[!is.na(df$col2),]

(2)均值替换

均值替换法属于插补法的一种简单形式,适用于缺失率低的场景。

使用均值来替换缺失值,这是处理缺失值中比较常见的作法。对于数值类型的缺失值,一般用该变量在其他有效观测中的均值来替换该缺失值。如果是非数值型变量,则使用该变量其他全部有效观测值的众数来替换。

df$col1[is.na(df$col1)] <- round(mean(df$col1, na.rm = TRUE))
df$col4[is.na(df$col4)] <- mean(df$col4, na.rm = TRUE)

众数,简单地说,就是在一组数据中出现次数最多的那个数据,是原数据,而不是出现的次数。例如:一组数据 1,2,3,3,4的众数是3,而1,2,3,4,5没有众数。

不同于平均值和中位数,众数可以是数字数据,也可以是字符数据。R没有标准的内置函数来计算众数,因此,我们将创建一个用户自定义函数来计算数据集的众数。

该函数将向量作为输入,并将众数值作为输出。

getmode <- function(v) {
   uniqv <- unique(v)
   uniqv[which.max(tabulate(match(v, uniqv)))]
}

对因子数据做众数处理:

df$col2[is.na(df$col2)] <- getmode(na.omit(df$col2))

(3)不处理缺失值

在数据集中保留缺失值

二,异常值分析

异常值在统计学上的全称是疑似异常值,也称作离群点,异常值的分析也称作离群点分析。异常值是指样本中出现的“极端值”,数据值看起来异常大或异常小,其分布明显偏离其余的观测值。异常值分析是检验数据中是否存在不合常理的数据,在数据分析中,既不能忽视异常值的存在,也不能简单地把异常值从数据分析中剔除。重视异常值的出现,分析其产生的原因,常常成为发现新问题进而改进决策的契机。

1,简单统计量分析

对变量做一个描述性分析,进而查看哪些数据是不合理的。常用的统计量是最大值和最小值,用来判断变量的取值是否超出了合理的范围,例如,客户年龄的最大值是199,该取值就存在异常。

2,3σ原则

如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过三倍标准差的值。在正态分布下,距离平均值3σ之外的值出现的概率为 P(|x-μ|>3σ)<=0.003,属于极个别的小概率事件。

如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

3,箱型图分析

箱线图提供了识别异常值的一个标准方法:

异常值通常被定义为小于 Q– l.5 IQR 或者 大于 Q+ 1.5 IQR的值,QL称为下四分位数, Qu称为上四分位数,IQR称为四分位数间距,是Qu上四分位数和QL下四分位数之差,其间包括了全部观察值的一半。

4,异常值的处理

在数据处理时,异常值的处理方法,需视具体情况而定。有时,异常值也可能是正常的值,只不过异常的大或小,所以,很多情况下,要先分析异常值出现的可能原因,再判断如何处理异常值。

处理的异常值的常用方法有:

删除含有异常值的记录;
插补,把异常值视为缺失值,使用缺失值的处理方法进行处理,好处是利用现有数据对异常值进行替换,或插补;
不处理,直接在含有异常值的数据集上进行数据分析;

三,一致性分析

数据不一致性是指数据的矛盾性,主要是由于数据源不同,导致数据编码的不一致;例如,对于一组数据,性别是M和F,而其他数据源中使用Male和Female表示性别,那么这两种数据就产生编码不一致性的问题。

另外,数据更新不同步也容易导致的数据不一致性,例如,同一个人的工作地点,在不同的数据表中,可能是不同的,这就是在更新数据时,由于更新的不同步导致数据出现不一致性。

当数据出现不一致性时,需要对数据进行清洗和集成操作,去除冗余数据、统一变量名、统一数据的计量单位等,并使用最新的数据来消除不一致性。

参考文档:

数据分析中的缺失值处理

Dealing with Missing Values