1 关于数据清洗
无论是数据分析还是模型开发都绕不开准备数据这一环。有人说,整个数据科学的工作有70%甚至80%的时间都花在了数据准备上。
我将数据准备分为四个环节——数据整合、数据清洗、数据转换、探索性数据分析,这是一个互相迭代的闭环过程,例如,我们做完探索性数据分析后,可能又要进行数据转换或者数据清洗工作,之后又开始探索性数据分析。
数据准备过程是从数据收集开始的,通常我们将其称为ETL过程(Extract Transform Load)。我们可能需要操作多个一对一,一对多或多对多的关系表,将不同来源的数据整合在一起,通过KEY 键将数据汇聚成所需的分析级别。
数据清洗是整合数据后所需要进行的数据预处理工作。在这一步,我们将脏数据清理为相对比较规整的数据,数据如果不清洗,那很可能是garbage in & garbage out了。
不同的数据,可能有不同的清洗方法,但无论是何种数据,在整个数据清洗过程中,总是有那么一些步骤和方法是通用的,例如缺失值分析和处理。
那有没有一种工具,可以完成数据清洗的这些通用流程,减少数据清洗的时间和简化繁琐的清洗流程呢?答案当然是有的,那就是R语言creditmodel
包里的数据清洗模块。
如果掌握了这一数据清洗神器,你就可以鄙视那些在数据预处理阶段花了70%的时间的人了。
2 creditmodel包的data_cleansing模块简介
creditmodel
是汉森老师开发的一个强大的R语言数据科学工具包,有数据预处理、变量衍生、数据分析、数据可视化、自动化建模五大功能模块。
code{data_cleansing}
函数是数据清洗模块的主函数,这是一个简单的数据清理函数,封装了creditmodel
包里面的众多数据清洗函数,例如remove_duplicated
,null_blank_na
, entry_rate_na
, low_variance_filter
, process_nas
, process_outliers
,char_to_num
,time_transfer
。
这个函数所能做的数据清洗工作如下:
- 检查数据表和目标变量的格式
- 删除所有值都缺失的变量
- 删除低方差的变量
- 用NA替换空、NULL或blank,-9999或其他代表缺失的值
- 将唯一值比例大于一定阈值(95%)的变量二值化
- 对缺失值比例大于一定阈值的变量进行二值化处理
- 合并类别个数超过一定数目(10)的变量类别
- 将字符变量(实际是时间的变量)转换为时间格式
- 将字符变量(实际上是包含字符串的数值型)转换为数值变量
- 删除重复的观察样本
- 处理异常值
- 处理缺失值
3 data_cleansing
函数简介
Data Cleaning
Description
The data_cleansing
function is a simpler wrapper for data cleaning functions, such as remove_duplicated
,null_blank_na
, entry_rate_na
, low_variance_filter
, process_nas
, process_outliers
,char_to_num
,time_transfer
and so on.
Usage
data_cleansing(dat, target = NULL, obs_id = NULL, occur_time = NULL,
pos_flag = NULL, x_list = NULL, ex_cols = NULL,
miss_values = NULL, remove_dup = TRUE, outlier_proc = TRUE,
missing_proc = "median", low_var = 0.999, missing_rate = 0.98,
merge_cat = 30, note = TRUE, parallel = FALSE, save_data = FALSE,
file_name = NULL, dir_path = tempdir())
4 如何使用data_cleansing进行数据清洗?
4.1 示例数据集介绍
我们使用creditmodel默认数据集lendingclub来演示数据清洗模块。lendingclub原始数据如下图所示,其实是比较脏的一个数据集。例如,日期数据issue_d是string类型的,dti_joint变量本来是数据类型变量却是string格式。缺失值有用"Missing"表示的,也有NA表示的,有的甚至是空格表示缺失,然后zip_code变量类别过多,很多类别只有十几个样本,还有一些变量有明显的异常值,例如年annual_inc。
4.2 使用data_cleansing进行数据清洗
只需要加载安装creditmodel包,然后使用data_cleansing()
函数进行清洗数据就可以了。你需要设置一些关键的参数,这些参数的具体解释,可以参考第3小节。
具体如下所示:
#安装和加载creditmodel包
install.packages("creditmodel")
library(creditmodel)
#数据清洗
lendingclub_cl = data_cleansing(dat = lendingclub,
target = "loan_status",
obs_id = "id",
occur_time = "issue_d",
pos_flag = "1|bad",
x_list = NULL,
ex_cols = "^mo_sin_",
miss_values = c("Missing",-1,-9999),
remove_dup = TRUE,
outlier_proc = TRUE,
missing_proc = "median",
low_var = 0.999,
missing_rate = 0.99,
merge_cat = 20,
note = TRUE,
parallel = FALSE,
save_data = FALSE,
file_name = "lendingclub",
dir_path = tempdir())
4.3 结果展示
运行完程序,我们发现清洗后的数据已经相当规整,issue_d这一时间变量被识别,并转换为时间格式;本来为类别变量的dti_joint也被识别,而转换为数值型变量;缺失值经过了缺失值分析和处理,对于信息缺失的类别变量,缺失值被填充为"missing",而数值型变量填充为 -1。异常值也进行了分析和处理,zip_code的样本数过少的类别被统一归到"other"等等。