【数据科学笔记】第三章 数据清洗与预处理

本文介绍了数据清洗的重要步骤,包括处理缺失值(如行删除、均值插补和多重插补)和噪声数据。详细讲解了R语言中处理缺失值的方法,并演示了如何使用dplyr包进行数据预处理,如数据筛选、排序、变量选取和数据变形等操作。
摘要由CSDN通过智能技术生成

【数据科学笔记】第三章 数据清洗与预处理


前言

博客已上传为PDF资源,系统没办法直接开源,只有关注帅气的不二程序猿才能下载。(不想关注可以私信或评论,备注资源名称可以获取)

🆓资源链接:【数据科学笔记】第三章 数据清洗与预处理.pdf 428KB

3.1 数据分类

数据是数据对象及属性的集合。在大数据时代,数据的来源越来越多样化。

3.2 数据清洗

数据清洗是准备数据重要的一步,通过填补缺失值,光滑噪声数据,识别或删除离群点解决不一致性来清洗数据。

3.2.1处理缺失值

从数据缺失的分布来讲,缺失值分为完全随机缺失(Missing Completely At Random,MCAR), 随机缺失(Missing At Randon,MAR) 和完全非随机缺失(Missing Not At Random,MNAR)。

  1. 缺失数据的识别:
    在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. 缺失数据的处理
    (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, 
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值