在数据挖掘中,海量的原始数据中存在着大量不完整、不一致、有异常的数据,严重影响到数据挖掘建模的执行效率,甚至可能导致挖掘结果的偏差,所以进行数据清洗就显得尤为重要,数据清洗完成后接着进行或者同时进行数据集成、变换、规约等一系列的处理,该过程就是数据预处理。
数据预处理一方面是要提高数据的质量,另一方面是要让数据更好地适应特定的挖掘技术或工具。
数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约。处理过程如下图所示:
数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值。
缺失值处理
从统计上说,缺失的数据可能会产生有偏估计,从而使样本数据不能很好地代表总体,而现实中绝大部分数据都包含缺失值,因此如何缺失值很重要。
一般说来,缺失值的处理包括两个步骤,即缺失数据的识别和缺失值处理。R语言中缺失值通常以NA表示,可以使用函数is.na()判断缺失值是否存在,另外函数complete.cases()可识别样本数据是否完整从而判断确实情况。在对是否存在缺失值进行判断之后需要进行缺失值处理,常用的方法有删除法、替换法、插补法等。
(1)删除法
删除法是最简单的缺失值处理方法,根据数据处理的不同角度可分为删除观测样本、删除变量两种。在R中可通过na.omit()函数移除所有含有缺失数据的行,这属于以减少样本量来换取信息完整性的方法,适用于缺失值所占比例较小的情况;删除变量适用于变量有较大缺失且对研究目标影响不大的情况,意味着要删除整个变量,这在R中可通过data[, -p]来实现,p表示缺失变量所在的列。
(2)替换法
变量按属性可分为数值型和非数值型,二者的处理办法不同:如果缺失值所在变量为数值型,一般用该变量在其他所有对象的取值的均值来替换变量的缺失值;如果为非数值型变量,则使用该变量其他全部有效观测值的中位数或者众数进行替换。
(3)插补法
删除法虽然简单易行,但会存在信息浪费的问题且数据结构会发生变动,以致最后得到有偏的统计结果,替换法也有类似的问题。在面对缺失值问题,常用的插补法有回归插补、多重插补等。回归插补法利用回归模型,将需要插值补缺的变量作为因变量,其他相关变量作为自变量,通过回归函数lm()预测出因变量的值来对缺失值进行补缺;多重插补法的原理是从一个包含缺失值的数据集中生成一组完整的数据,如此进行多次,从而产生缺失值的一个随机样本,R语言中mice()函数包可以进行多重插补。
下面结合具体案例介绍缺失值的识别和处理。
餐饮系统中的销量数据可能会出现缺失值,销量数据的下载地址为:
https://github.com/windform/R/blob/master/R%E8%AF%AD%E8%A8%80%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/%E6%95%B0%E6%8D%AE%E8%B4%A8%E9%87%8F%E5%88%86%E6%9E%90/chapter4/data/catering_sale.cs
下面代码将演示均值替换、回归插补、多重插补进行缺失数据插补:
> # 读取销售数据文件,提取标题行
> inputfile
> # 变换变量名
> inputfile
> # 数据截取
> inputfile
> # 缺失数据的识别
> is.na(inputfile) # 判断是否存在缺失
sales date
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 TRUE FALSE
16 FALSE FALSE
> n
> # 异常值识别
> par(mfrow = c(1, 2)) # 将绘图窗口划为1行两列,同时显示两图
> dotchart(inputfile$sales) # 绘制单变量散点图
> boxplot(inputfile$sales, horizontal = TRUE) # 绘制水平箱形图
> # 异常数据处理
> inputfile$sales[5] = NA # 将异常值处理成缺失值
> fix(inputfile) # 表格形式呈现数据
> # 缺失值的处理
> inputfile$date
> sub
> inputfile1
> inputfile2
> # 行删除法处理缺失,结果转存
> result1
> # 均值替换法处理缺失,结果转存
> ag_sales
> inputfile2$sales
> result2
> # 回归插补法处理缺失,结果转存
> model
> inputfile2$sales
> result3
> # 多重插补法处理缺失,结果转存
> library(lattice) # 调入函数包
> library(MASS)
> library(nnet)
> library(mice) # 前三个包是mice的基础
> imp
iter imp ariable
1 1 sales
1 2 sales
1 3 sales
1 4 sales
2 1 sales
2 2 sales
2 3 sales
2 4 sales
3 1 sales
3 2 sales
3 3 sales
3 4 sales
4 1 sales
4 2 sales
4 3 sales
4 4 sales
5 1 sales
5 2 sales
5 3 sales
5 4 sales
> fit
> pooled
> summary(pooled)
est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
(Intercept) -8127.53603 6907.61505 -1.176605 6.5448 0.2803675 -24694.59377 8439.5217 NA 0.2095382 0
date 61.87193 37.47189 1.651156 6.5448 0.1456650 -27.99975 151.7436 0 0.2095382 0
> result4
异常值处理
在异常值处理之前需要对异常值进行识别,一般多采用单变量散点图或是箱线图来达到目的。在R语言中,使用函数dotchart()、boxplot()实现绘制单变量散点图与箱线图,远离正常值范围的点即视为异常值。异常值产生最常见的原因是人为输入的错误。
在数据预处理时,异常值是否剔除,需视具体情况而定,因为有些异常值可能包含有用的信息,异常值的常用处理方法有:
将含有异常值的记录直接删除这种方法简单易行,但缺点也很明显,在观测值很少的情况下,这种删除会造成样本量不足,可能会改变变量的原有分布,从而造成分析结果的不准确。视为缺失值处理的好处是可以利用现有变量的信息,对异常值进行填补。
很多情况下,要先分析异常值出现的可能原因,再判断异常值是否应该舍弃,如果是正确的数据,可以直接在具有异常值的数据集上进行挖掘建模。
领取专属 10元无门槛券
私享最新 技术干货