数据清洗与准备
环境配置
library(mlbench) # 将会使用到包中的BostonHousing数据集
library(funModeling) # 探索性数据分析工具包,本节内容中将会使用到它的status()函数,打印整体数据质量
library(tidyverse) # 数据转化工具包,本节内容中将会使用它包含的dplyr中的管道函数 %>%
library(VIM) # 缺失值可视化工具包,本节内容中将会使用到它的aggr()函数
library(mice) # 缺失值处理工具包,本节内容会使用它来进行多重插补
library(Rlof) # 用于LOF异常值检测方法,本节内容将会使用到它的lof()函数
library(fastDummies) # 用于生成dummy的包,本节内容将会使用到它的dummy_cols()函数
library(sjmisc) # 用于生成dummy的包,本节内容将会使用到它的to_dummy()函数
library(MASS) # 基于此包进行box-cox转换
library(dlookr) # 本节内容将会使用到它的transform()函数
案例数据
本文将会使用到两个数据集。
数据集1 h1n1流感问卷数据集
数据说明
目前提供的数据集来自关于h1n1流感调查问卷的部分内容,可以从这个网站上看到具体字段的详细说明:https://www.drivendata.org/competitions/66/flu-shot-learning/page/211/
数据集包含26,707个受访者数据,共有32个特征+1个标签(是否接种h1n1疫苗)。
加载并查看部分数据
首先加载数据,了解数据集大小。
h1n1_data <- read.csv("./datasets/h1n1_flu.csv", header = TRUE)
dim(h1n1_data)
我们在这32个特征中,筛选出了10个特征,作为一个子集,来学习如何使用R做数据清洗与准备。
h1n1_data <- h1n1_data[, c(1, 3, 11, 12, 15, 16, 19, 20, 22, 23, 33)]
head(h1n1_data)
数据集2 波士顿房价数据集
数据说明
据集来自mlbench
包,请提前装好。数据字段说明可从网址查看:https://blog.csdn.net/weixin_46027193/article/details/112238597
数据集包含506条房价信息,共有13个特征+1个预测字段(房屋价格)。
加载并查看部分数据
data(BostonHousing)
dim(BostonHousing)
head(BostonHousing)
重复值处理
在某些情况下,我们需要对数据进行去重处理。unique()
函数可以对数据进行整体去重,distinct()
函数可以针对某些列去重。
# 整体去重
h1n1_data_de_dup1 <- unique(h1n1_data)
# 指定根据列respondent_id,h1n1_knowledge去重,并保留所有列
h1n1_data_de_dup2 <- distinct(h1n1_data, respondent_id, h1n1_knowledge, .keep_all = T)
缺失值识别与处理
现实环境中,由于数据来源及搜集过程,可能有各种不规范,导致数据往往会存在缺失。缺失值识别与处理,无论是在统计还是数据管理中,往往是数据清洗的第一步。
缺失值识别
常用识别方法
在R语言中,惯用会把缺失值表示为NA,一般可使用is.na(a)
,!complete.cases(a)
来识别a
是否为缺失值。
# 假设定义的一个变量中存在缺失值
y <- c(1, 2, 3, NA)
# 用is.na在识别是否为缺失值
is.na(y)
# 用!complete.cases()在识别是否为缺失值
!complete.cases(y)
缺失值统计
统计缺失值总数。
# 数据集中总缺失数据量
sum(is.na(h1n1_data))
# 数据集中某一列缺失数据量
sum(is.na(h1n1_data["h1n1_knowledge"]))
如果想按行或按列统计,可以写函数。
pMiss <- function(x) {
sum(is.na(x)) / length(x) * 100
}
apply(h1n1_data, 2, pMiss) # 按列统计缺失比率%
# apply(h1n1_data,1,pMiss) #按行统计缺失比率%
或调用一些现成的包。比如,我们可以使用funModeling
包中的status()
函数,直接观测案例数据中包含的0值,缺失值(NA),在每个特征中的分布情况。以h1n1 flu数据集为例:
data_quality <- status(h1n1_data)
data_quality %>% mutate(across(where(is.numeric), ~ round(., 3))) # 保留4位小数
结合案例数据h1n1 flu来看,存在缺失值的有5个特征字段。
missing_Value <- data_quality[which(data_quality$p_na > 0), ]
missing_Value$variable
缺失值机制与分析
统计学家通常将缺失数据分为3类,为了更好的处理缺失值,我们可以基于缺失值机制来识别以下3种缺失模式:
- MCAR(完全随机缺失):如果数据的缺失与任何值(观察或缺失)之间没有关系,则为MCAR。
- MAR(随机缺失):考虑MAR与MCAR有何不同,如果缺失和观测值之间存在系统关系,则为MAR。例如-男性比女性更容易告诉自己的体重,因此体重就是MAR。“ Weight”变量的缺失取决于变量"Sex"的观测值。
- MNAR(非随机缺失):若缺失数据不属于MCAR和MAR,数据的缺失依赖于不完全变量本身,则数据为非随机缺失。例如,抑郁程度高的人更不容易填写抑郁调查问卷。
MNAR是最复杂的情况,处理 MNAR的策略是找到更多有关缺失原因的数据,或者执行假设分析,查看结果在各种情况下的敏感程度。大部分处理缺失数据的方法都假定数据是MCAR或MAR,此时,可以忽略缺失数据的生成机制,在替换或删除缺失数据后,直接对感兴趣的关系进行建模。
以下介绍几种可视化分析缺失数据关联的方法:
我们用VIM
包里的aggr()
函数,直观看一下具体的缺失情况。
aggr(h1n1_data, cex.axis = .6, oma = c(9, 5, 5, 1)) # cex.axis调整轴字体大小,oma调整外边框大小
通过用VIM
包里的矩阵图matrixplot()