在数据挖掘中,海量的原始数据中存在着大量不完整、不一致、有异常的数据,严重影响到数据挖掘建模的执行效率,甚至可能导致挖掘结果的偏差,所以进行数据清洗就显得尤为重要,数据清洗完成后接着进行或者同时进行数据集成、变换、规约等一系列的处理,该过程就是数据预处理。

数据预处理一方面是要提高数据的质量,另一方面是要让数据更好地适应特定的挖掘技术或工具。

数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约。处理过程如下图所示:

数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值。

缺失值处理

从统计上说,缺失的数据可能会产生有偏估计,从而使样本数据不能很好地代表总体,而现实中绝大部分数据都包含缺失值,因此如何缺失值很重要。

一般说来,缺失值的处理包括两个步骤,即缺失数据的识别和缺失值处理。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.csv

下面代码将演示均值替换、回归插补、多重插补进行缺失数据插补:

> # 读取销售数据文件,提取标题行

> inputfile <- read.csv('./data/catering_sale.csv', header = TRUE)

> # 变换变量名

> inputfile <- data.frame(sales = inputfile$'销量', date = inputfile$'日期')

> # 数据截取

> inputfile <- inputfile[5:16, ]

> # 缺失数据的识别

> 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 <- 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个无缺失数据集

iter imp variable

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 <- with(imp,lm(sales ~ date, data = inputfile)) # 选择插补模型

> pooled <- pool(fit)

> 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 <- complete(imp, action = 3) # 选择第三个插补数据集作为结果

异常值处理

在异常值处理之前需要对异常值进行识别,一般多采用单变量散点图或是箱线图来达到目的。在R语言中,使用函数dotchart()、boxplot()实现绘制单变量散点图与箱线图,远离正常值范围的点即视为异常值。异常值产生最常见的原因是人为输入的错误。

在数据预处理时,异常值是否剔除,需视具体情况而定,因为有些异常值可能包含有用的信息,异常值的常用处理方法有:

将含有异常值的记录直接删除这种方法简单易行,但缺点也很明显,在观测值很少的情况下,这种删除会造成样本量不足,可能会改变变量的原有分布,从而造成分析结果的不准确。视为缺失值处理的好处是可以利用现有变量的信息,对异常值进行填补。

很多情况下,要先分析异常值出现的可能原因,再判断异常值是否应该舍弃,如果是正确的数据,可以直接在具有异常值的数据集上进行挖掘建模。

数据预处理——数据清洗相关推荐

  1. 机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)

    机器学习之数据预处理--数据清洗缺失值.异常值和重复值的处理 基础知识 技术点总结 数据列缺失的处理方法 1.丢弃(缺失值处理) 1.生成一份随机数据 2.查看哪些值缺失 3.获得含有NA的列 4.获 ...

  2. 使用jupyter进行数据预处理-数据清洗

    使用jupyter进行数据预处理-数据清洗 使用jupyter进行数据预处理-数据清洗 查询各字段的数据类型 使用pandas对列进行重命名 缺失值处理 判断缺失值是否存在 处理缺失值([https: ...

  3. python数据预处理—数据清洗、数据集成、数据变换、数据归约

    进行数据分析时,需要预先把进入模型算法的数据进行数据预处理.一般我们接收到的数据很多都是"脏数据",里面可能包含缺失值.异常值.重复值等:同时有效标签或者特征需要进一步筛选,得到有 ...

  4. 数据预处理——数据清洗、异常值与重复数据的检测

    数据预处理(Data Preprocessing) Where are data from? Why Data Preprocessing? How to handle missing data? O ...

  5. 数据预处理—数据清洗(2)—异常值(极值)处理

    3.1.2异常值(极值)处理 处于特定分布区域或范围之外的数据通常会被定义为异常或"噪音".产生数据"噪音"的原因很多,例如业务运营操作.数据采集问题.数据同步 ...

  6. 数据可视化与数据预处理

    # -*- coding: utf-8 -*- """ Created on Fri Oct 4 20:41:20 2019@author: shenlong " ...

  7. 数据预处理(纯干货,适合小白学习)

    数据预处理 数据清洗 数据清洗目的:将脏数据(这里指是对数据分析没有意义.格式非法.不在指定范围的数据)清洗干净,是原数据具有完整性.唯一性.权威性.合法性.一致性等特点. pandas常见数据清洗: ...

  8. 数据挖掘导论 复习一(介绍+数据预处理方法+定性归纳)

    数据挖掘=数据库+机器学习 算法 经验 模型 机器学习任务:分类.回归.聚类(KMeans.DCSAN.层次聚类).数据降维.数据预处理 常用分类器:KNN.贝叶斯. 逻辑回归 .决策树.随机森林 本 ...

  9. 【Python数据分析】数据预处理1——数据清洗

    在数据挖掘过程中,数据预处理过程是占比很大的一部分工作 数据预处理过程主要有以下几个部分 1.数据清洗--2.数据集成--3.数据变换--4.数据规约 本文介绍数据清洗部分 一.缺失值分析与处理 1. ...

最新文章

  1. IROS2021|DLL直接点云定位:一种基于点云地图的航空机器人定位方法
  2. AI洞观 | 一文读懂英特尔的AI之路
  3. oracle 日期排序_日期居然用字符串保存?我笑了
  4. HashMap与垃圾回收
  5. 2016年3月1日Android实习笔记
  6. 蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法
  7. mysql function 事务_MySQL 事务
  8. Oracle listener
  9. Photos_2017 China MVP Community Connection
  10. Casbin荣获2021年度“科创中国”开源创新榜优秀开源产品
  11. 成都电子信息学校计算机专业,成都电子信息学校2020招生简章
  12. 解决设置easyUI tabs onSelect事件时提示tabs未定义的方法
  13. JS获取浏览器版本号
  14. (半翻译)篡改mac应用后,如何resign签名,重新获得mac系统的信任?
  15. [渝粤教育] 中原科技学院 管理学原理 参考 资料
  16. linux环境git安装及使用教程,Ubuntu Git安装与使用
  17. FIAA固定资产【05资产购置】
  18. 荣耀linux电脑开机后黑屏,开机黑屏进不了系统,教您解决电脑开机黑屏进不了系统...
  19. 大型直播平台应用架构浅谈
  20. python中weekday_Python calendar.weekday方法代码示例

热门文章

  1. 多边形画椭圆算法java_运用椭圆画法,45行代码画出随意正多边形
  2. 十大经典排序算法的动图
  3. Grbl v1.1版本的编译方法
  4. WIN7 iTunes无法识别iPhone,重装系统解决
  5. 可视化搭建平台的地图组件和日历组件方案选型
  6. java jta mysql_JTA实现跨数据库操作
  7. Shiro视频-佟刚-专题视频课程
  8. indent用法 [indent Usage]
  9. Uncaught TypeError: Cannot read property ‘then‘ of undefined
  10. Python学习笔记(1)---B站黑马程序员