【数据科学笔记】第三章 数据清洗与预处理
文章目录
前言
博客已上传为PDF资源,系统没办法直接开源,只有关注帅气的不二程序猿才能下载。(不想关注可以私信或评论,备注资源名称可以获取)🆓资源链接:【数据科学笔记】第三章 数据清洗与预处理.pdf 428KB
3.1 数据分类
数据是数据对象及属性的集合。在大数据时代,数据的来源越来越多样化。
3.2 数据清洗
数据清洗是准备数据重要的一步,通过填补缺失值,光滑噪声数据,识别或删除离群点解决不一致性来清洗数据。
3.2.1处理缺失值
从数据缺失的分布来讲,缺失值分为完全随机缺失(Missing Completely At Random,MCAR), 随机缺失(Missing At Randon,MAR) 和完全非随机缺失(Missing Not At Random,MNAR)。
- 缺失数据的识别:
在R语言中,缺失值以符号 NA 表示。我们可以使用赋值语句将某些值重新编码为缺失值。
在问卷中年龄的值为 99,要让R语言明白 99 是缺失值,例如:
dataframe $ age [ datafarme $ age == 99 ] <- NA
任何等于 99 的年龄都会被修改为 NA。
2. 缺失数据的探索与检验
R语言中提供了一些函数用来识别包含缺失值的观测。 is.na()
函数检测缺失值是否存在。假设有一个向量:
> y <- c( 1, 2, 3, NA )
> is.na( y ) # 使用函数
[1] FALSE FALSE FALSE TRUE
complete.cases()
函数可以用来识别矩阵或数据框的行是否完整,也就是有无缺失值,返回结果是逻辑值。如果一行中没有缺失值返回 TRUE, 若有一个或者多个缺失值,返回 FALSE 。可以使用 sum()
函数和 mean()
函数计算完整数据的行数和完整率。以 VIM 包中的 sleep 数据举例子:
> data( sleep , package = 'VIM' ) # 读取VIM包中的sleep数据
> sleep[ ! complete.cases( sleep ) , ] # 提取sleep数据中不完整行(没在Rstudio中运行成功)
> sum( ! complete.cases( sleep ))
[1] 20 # 列出了20个缺失值的观测值
> mean( complete.cases( sleep ))
[1] 0.6774194 # 有67.7%的完整实例
- 缺失数据的处理
(1) 行删除。通过na.omit( sleep )
函数移除所有含缺失值的观测值,也可以删除所有缺失数据的行。
> newsleep <- na.omit ( sleep )
(2) 均值插补法(Mean Imputation)
(3) 多重插补(Multiple Imputation,MI) 面对复杂的问题时,MI 是最好的解决方法,它从一个包含缺失值的数据集中生成一组完整的数据集。缺失的数据用蒙特卡洛方法填补。R语言中的 mice
包能多重插补。
> library( mice )
> data( sleep , package = 'VIM' )
> imp <- mice ( sleep , m = 5 , seed = 6666 )
iter imp variable
1 1 NonD Dream Sleep Span Gest
1 2 NonD Dream Sleep Span Gest
1 3 NonD Dream Sleep Span Gest
1 4 NonD Dream Sleep Span Gest
1 5 NonD Dream Sleep Span Gest
2 1 NonD Dream Sleep Span Gest
2 2 NonD Dream Sleep Span Gest
> fit <- with ( imp , expr = lm( Dream ~ Span + Gest ))
> pooled <- pool( fit )
> summary( pooled )
term estimate std.error statistic df p.value
1 (Intercept) 2.566278726 0.243596941 10.5349382 55.44495 7.549517e-15
2 Span -0.004067545 0.011600780 -0.3506269 56.39153 7.271747e-01
3 Gest -0.004002280 0.001486934 -2.6916336 50.77112 9.604566e-03
>
其中,imp 包含 m 个插补数据集的列表对象;m 默认是 5 ;exp 是一个表达式对象;lm()
是线性回归模型;广义线性模型 glm()
函数。
3.2.2 处理噪声数据
数据噪声是指数据中存在的随机性错误或偏差,产生的原因很多。噪声数据的处理方法通常有分箱、聚类分析和回归分析等,something depend on people’s 经验。
只需了解,现阶段暂时用不上,不做详细介绍。
3.3 数据转换
数据变换包括平滑、聚合、泛化、规范化、属性和特征的重构操作。
1. 数据平滑: 是指将噪声从数据中移除。
2. 数据聚合: 是指将数据进行汇总,以便分析。
3. 数据泛化: 是指数据在概念层次上转化为较高层次的概念过程。
4.数据规范化:
(1) 标准差标准化。
(2) 极差标准化。
(3) 极差正规化。
5.最小——最大规范化
3.4 R语言实现
对于数据预处理的基本函数,例如集合并
merge()
、数据筛选subset()
等。在此介绍R语言中的 dplyr 包,专注接受 dataframe 对象。
下面以R语言中 rpart 包中的 car90 数据集进行示范。
3.4.1 数据集的基本操作
由于 dplyr 基于C语言开发,处理 tbl(表格)对象非常快,在做预处理时,可以使用
tbl_df()
函数将原数据转为tbl对象。
> library( dplyr )
> library( rpart ) # 需要载入rapart包中的car90数据集
> data( car90 )
> car90_df <- tbl_df( car90 )
1. 数据筛选
如果需要对数据集按照某些逻辑条件进行筛选得到符合要求的记录,可以用
filter()
函数。例如: 分别筛选出产自日本的中型车数据和产自日本或者美国的汽车数据:
> filter( car90_df , Country == 'Janpan' , Type == 'Medium' ) # 且的关系
# A tibble: 0 x 34
# … with 34 variables: Country <fct>, Disp <dbl>, Disp2 <dbl>, Eng.Rev <dbl>,
# Front.Hd <dbl>, Frt.Leg.Room <dbl>, Frt.Shld <dbl>, Gear.Ratio <dbl>,
# Gear2 <dbl>, HP <dbl>, HP.revs <dbl>, Height <dbl>, Length <dbl>,
# Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>, Rear.Hd <dbl>,
# Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>, Rim <fct>,
# Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>, Tires <fct>,
# Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>, Weight <dbl>,
# Wheel.base <dbl>, Width <dbl>
> filter( car90_df , Country == 'Janpan' | Country == 'USA' )
# A tibble: 39 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
2 USA 231 3.8 NA 6 42 58.5 NA 1.99 165
3 USA 231 3.8 NA 5 41 59 NA 1.99 165
4 USA 231 3.8 NA 3.5 41.5 58 NA 1.99 165
5 USA 307 5 NA 5 43 60.5 NA 1.96 140
6 USA 273 4.5 NA 6 42 59.5 NA 2.08 180
7 USA 273 4.5 NA 3 42 58 NA 2.08 180
8 USA 262 4.3 1630 5 42 61.5 2.07 2.26 150
9 USA 133 2.2 2375 3.5 42 55.5 2.83 3.18 95
10 USA 191 3.1 2085 3.5 41.5 58 2.6 2.26 140
# … with 29 more rows, and 24 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>
此外,可以将
filter.all()
、filter.if()
、filter.at()
函数与all_vars()
和any_vars()
函数等结合起来更强大。例如,筛选出 car_90 数据集中所有变量大于 100 时:
> filter_all( car90_df , all_vars( .>100 ))
# A tibble: 0 x 34
# … with 34 variables: Country <fct>, Disp <dbl>, Disp2 <dbl>, Eng.Rev <dbl>,
# Front.Hd <dbl>, Frt.Leg.Room <dbl>, Frt.Shld <dbl>, Gear.Ratio <dbl>,
# Gear2 <dbl>, HP <dbl>, HP.revs <dbl>, Height <dbl>, Length <dbl>,
# Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>, Rear.Hd <dbl>,
# Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>, Rim <fct>,
# Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>, Tires <fct>,
# Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>, Weight <dbl>,
# Wheel.base <dbl>, Width <dbl>
Warning messages:
1: In Ops.factor(Country, 100) : ‘>’ not meaningful for factors
2: In Ops.factor(Model2, 100) : ‘>’ not meaningful for factors
3: In Ops.factor(Rim, 100) : ‘>’ not meaningful for factors
4: In Ops.factor(Steering,