数据清洗
数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值等。
一、缺失值处理
从统计上说,缺失的数据可能会产生有偏估计,从而使样本数据不能很好地代表总体,而现实中绝大部分数据都包含缺失值,因此如何处理缺失值很重要。
一般来说,缺失值的处理包括两个步骤,即缺失数据的识别和缺失值处理。在R语言中缺失值通常以NA表示,可以使用函数is.na()
判断缺失值是否存在,另外数complete.cases()
可识别样本数据是否完整从而判断缺失情况。在对是否存在缺失值进行判断之后需要进行缺失值处理,常用的方法有删除法、替换法、插补法等。
1. 删除法
删除法是最简单的缺失值处理方法,根据数据处理的不同角度可分为删除观测样本、删除变量两种。删除观测样本又称行删除法,在R中可通过na.omit()
函数移除所有含有缺失数据的行,这属于以减少样本量来换取信息完整性的方法,适用于缺失值所占比例较小的情况;删除变量适用于变量有较大缺失且对究目标影响不大的情况,意味着要删除整个变量,这在R中可通过data[ ,-p]
来实现,其中data表示目标数据集,p表示缺失变量所在的列。
2. 替换法
变量按属性可分为数值型和非数值型,二者的处理办法不同:如果缺失值所在变量为数值型的,一般用该变量在其他所有对象的取值的均值来替换变量的缺失值;如果为非数值型变量,则使用该变量其他全部有效观测值的中位数或者众数进行替换。
3. 插补法
删除法虽然简单易行,但会存在信息浪费的问题且数据结构会发生变动,以致最后得到有偏的统计结果,替换法也有类似问题。在面对缺失值问题,常用的插补法有回归插补、多重插补等。回归插补法利用回归模型,将需要插值补缺的变量作为因变量,其他相关变量作为自变量,通过回归函数lm()预测出因变量的值来对缺失变量进行补缺;多重插补法的原理是从一个包含缺失值的数据集中生成一组完整的数据,如此进行多次,从而产生缺失值的一个随机样本,R中的函数包可以用来进行多重插补。
# 读取数据文件,提取标题行
>inputfile <- read.csv('./data/catering_sale.csv', header = TRUE)
# 变换变量名
>inputfile <- data.frame(sales = inputfile$'销量', date = inputfile$'日期')
>head(inputfile)
# 数据截取
>inputfile <- inputfile[5:16, ]
# 缺失数据的识别
>is.na(inputfile) # 判断是否存在缺失
>n <- sum(is.na(inputfile)) # 输出缺失值个数
# 异常值识别
>par(mfrow = c(1, 2)) # 将绘图窗口划为1行两列,同时显示两图
>dotchart(inputfile$sales) # 绘制单变量散点图
>boxplot(inputfile$sales, horizontal = TRUE) # 绘制水平箱形图
# 异常数据处理
>inputfile$sales[5] = NA # 将异常值处理成缺失值
>fix(inputfile) # 表格形式呈现数据
# 缺失值的处理
> inputfile$date <- as.numeric(inputfile$date) # 将日期转换成数值型变量
> sub <- which(is.na(inputfile$sales)) # 识别缺失值所在行数
> inputfile1 <- inputfile[-sub, ] # 将数据集分成完整数据和缺失数据两部分
> inputfile2 <- inputfile[sub, ]
# 行删除法处理缺失,结果转存
> result1 <- inputfile1
# 均值替换法处理缺失,结果转存
> avg_sales <- mean(inputfile1$sales) # 求变量未缺失部分的均值
> inputfile2$sales <- rep(avg_sales,n) # 用均值替换缺失
> result2 <- rbind(inputfile1, inputfile2) # 并入完成插补的数据
# 回归插补法处理缺失,结果转存
> model <- lm(sales ~ date, data = inputfile1) # 回归模型拟合
> inputfile2$sales <- predict(model, inputfile2) # 模型预测
> result3 <- rbind(inputfile1, inputfile2)
# 多重插补法处理缺失,结果转存
>library(lattice) # 调入函数包
>library(MASS)
>library(nnet)
>library(mice) # 前三个包是mice的基础
>imp <- mice(inputfile, m = 4) # 4重插补,即生成4个无缺失数据集
>fit <- with(imp,lm(sales ~ date, data = inputfile)) # 选择插补模型
>pooled <- pool(fit)
>summary(pooled)
>result4 <- complete(imp, action = 3) # 选择第三个插补数据集作为结果