
3.3 dlookr数据处理包
dlookr提供了一系列的数据诊断方法,并能够自动生成数据诊断报告,可以对数据进行探索性分析,并对异常值与缺失值进行处理,进行数据转换。
dlookr包常用的诊断函数有以下5个。
diagnose( ):提供变量的基本诊断信息。
diagnose_category( ):提供分类变量的详细诊断信息。
diagnose_numeric( ):提供数值变量的详细诊断信息。
diagnose_outlier( )和plot_outlier( ):提供对异常值的诊断与可视化。
diagnose_report( ):生成数据诊断报告。
3.3.1 所有变量的一般性诊断
使用diagnose( )函数可以对一个数据集的所有特征进行基础诊断。这里以nycflights13包中的flights数据集为例,这个数据集描述了2013年从纽约起飞的航班数据。首先对这个数据集的所有数据进行一般性诊断,将数据传入diagnose( )函数,即可生成所有数据的一般性诊断结果。

从结果中可以看到,输出内容包括变量的名称、变量的数据类型、变量的缺失值计数、变量的缺失比例、变量中唯一值的计数、变量中唯一值的占比。通过从这个结果,我们对数据有了一个初步的了解。
3.3.2 数值型变量的诊断
使用diagnose_numeric( )对数值型变量进行诊断,可以得出更多的信息。如果在调用diagnose_numeric( )函数的时候,数据集中依然有分类变量,这个函数会忽略分类变量,只对数值型变量进行分析。对数值型变量进行诊断的方法很简单,将数值型数据集传入diagnose_numeric( )函数即可生成分析结果。

从结果中可以发现,输出内容包括变量名称、变量的最小值、变量的25%分位数、变量的平均值、变量的75%分位数、变量的最大值、变量中0的计数、变量中最小值的计数、变量中异常值的数量。这样,可以对数值型变量的信息有一个比较全面的了解。
3.3.3 分类变量的诊断
diagnose_category( )函数可对分类变量进行数据诊断,从这个函数中可以得出分类变量的详细分析结果,同样,数据集中的数值型变量则会忽略掉。

从数据结果中可以看出,输出内容包括变量名字、分类变量中的每一个类别、变量的计数、某一个分类类别的计数、此类别的占比及变量类别的排名。从这里可以得出分类变量的详细信息。
3.3.4 异常值的诊断
diagnose_outlier( )提供了异常值诊断方法,plot_outlier( )用于异常值的可视化。

从数据结果中可以看出,输出内容包括变量名、异常值的数量、异常值的占比、异常值的平均值、所有数据的平均值、剔除了异常值的平均值。
plot_outlier( )用于对异常值进行可视化,调用此函数需要传递一个数据集,以及需要异常值诊断的变量。异常值可视化结果如图3.7所示。


图3.7 异常值可视化结果
这幅图包含4个子图,左上那幅子图是包含异常值的箱线图,右上那幅子图是带有异常值的直方图。下面两幅子图分别是不带异常值的箱线图和不带异常值的直方图。观察图3.7,这里分别给出了包含异常值的箱线图与直方图、不包含异常值的箱线图与直方图。如果不指定对某一个变量进行异常值可视化,则只需要传递一个数据集即可,函数会绘制所有变量的图形。
3.3.5 创建诊断报告
diagnose_report( )函数可以对数据集生成一个诊断报告,报告可以以PDF,或者HTML的形式展出。通过这个函数,我们可以快速地了解数据。创建PDF报告只需要在diagnose_report( )中传入一个数据集即可,创建HTML格式的报告只需要以下的命令,下面代码中的output_format用于指定报告以什么形式给出,可以是Word,PDF或者HTML的形式。诊断报告如图3.8所示。


图3.8 诊断报告
图3.8所示为最终创建出来的报告,包含的内容非常丰富,通过这份报告可以对数据集有一个充分的了解。通过这个报告,可以快速地对数据进行数据探索、数据诊断,并进行展示分享。
3.3.6 数据处理
在对数据进行一系列诊断之后,dlookr提供了一系列的数据处理工具(包括缺失值、异常值的处理工具),还提供了数据变换方法。dlookr提供的一系列数据处理函数如下。
● find_na( ) :可以找到数据集中的缺失值,并且可以使用imputate_na填补缺失值。
● find_outliers( ):可以找到数据集中的异常值,并且可以使用imputate_outlier填补异常值。
● summary.imputation( ):可以对数据集中的数据填补情况进行统计,使用plot.imputation可以对数据集中的数据填补情况进行可视化。
● transform( ):用于对数据进行转换。
● binning和binning_by( ):用于对数据进行分箱,然后可以使用 print.bins( )和summary.bins( ).plot.bins( ):查看分箱的结果并对其进行可视化。
● find_skewness( ):用于找到有偏的变量。
● transformation_report( ):用于生成数据处理报告。
3.3.7 缺失值处理
imputate_na( )用于对缺失值进行处理,同时支持对数值型变量和字符型变量进行处理。可用于填补缺失值的方法很多,修改imputate_na( )中的method参数就可以使用不同的方法进行缺失值的填补,下面做一个总结。
● mean:使用均值进行填补。
● median:使用中位数进行填补。
● mode:使用众数进行填补。
● knn:使用K近邻进行填补。
● rpart:使用决策树进行填补。
● mice:使用链式方程进行填补。
其中,mode、rpart、mice可以同时处理数值型变量与字符型变量。需要注意的是,rpart和mice需要指定目标变量,并且mice还需要指定随机种子。这里用到的数据集是VIM包中的sleep数据集,inputate_na( )的第一个参数是需要处理的数据集,第二个参数xvar是需要进行缺失值填补的特征,第三个参数yvar是数据集中的目标变量,method用于指定所使用的方法。图3.9显示了数据处理前后的分布。


图3.9 缺失值填补
如图3.9所示,这里使用了决策树的方法对sleep数据集中的NonD变量进行填补,决策树的目标变量为Danger。output是数据集填补的结果,summary(output)这一行代码对原始数据与填补之后的数据的统计量进行了一个对比,plot(output)则对原始数据与缺失值填补之后的数据分布进行了可视化。
3.3.8 异常值处理
imp utate_outlier( )用于对异常值进行检测,其可对异常值的变量进行处理,处理方式包括如下几种。
● mean :用均值进行处理。
● median:用中位数进行处理。
● mode:用众数进行处理。
● capping:将在5%分位数与95%分位数之外的数据用5%分位数和95%分位数进行填补。
这里使用sleep数据集的BodyWgt变量进行异常值的处理,处理的方法是capping,异常值处理前后数据的分布如图3.10所示。


图3.10 异常值处理前后数据的分布
在输出的结果中,iout是sleep数据集中BodyWgt变量进行异常值填补之后的结果,summary(iout)对原始数据和处理之后的数据进行了对比,plot(iout)则对数据处理前后的分布情况进行了可视化,如图3.10所示。
3.3.9 数据转换
在数据处理的过程中,很多时候需要对数据进行转换,最基本的转换就是数据的标准化,其目的之一是消除数据之间量纲的影响。在dlookr包中,transform( )函数提供了一系列的数据转换的方法,包括以下几种。
● zscore:zscore转换,其转换公式为(x-mu)/ sigma。
● minmax:标准化转换,其转换公式为(x - min)/(max - min)。
● log:log转换。
● log+1:log转换。
● sqrt :平方根转换。
● 1/x:倒数转换。
● x^2:平方转换。
● x^3:立方转换。
数据转换过程中经常遇到的一个问题是数据是有偏的。要进行数据转换,首先需要识别出数据是否存在有偏现象,然后需要对有偏的数据进行处理。dlookr中的find_skewness( )可以计算出变量的偏态值。需要注意的是,想要计算变量的偏态情况,这里需要先对数据的缺失值情况进行处理,否则计算出的偏态值为NA。

从结果中可以看出,BodyWgt、BrainWgt都存在左偏现象,后面几个因为有缺失值,所以都是NA。可以对BodyWgt绘制密度曲线图,观察其分布,如图3.11所示。


图3.11 数据分布
从图3.11中可以看到,数据的分布非常靠左。接下来对数据进行对数转换,数据转换所使用的函数是transform( ),第一个参数是需要进行转换的数据,第二个参数是method,用于指定进行何种转换。转换之后观察数据的分布。箱线图如图3.12所示。


图3.12 箱线图
从图3.12中可以看到,经过转换之后的数据非常接近正态分布。log变换是一种常常用于解决数据有偏问题的方法。
3.3.10 数据分箱
数据分箱是对连续数据进行的转化,即将连续数据划分为不同的间隔,从而将连续数据转变为分类数据。这样做的好处是可以减小数据中的噪声,从而让数据的分布趋势更加明显。在信用评分卡建模中,数据分箱是连续变量必须要做的数据转换。常用的数据分箱方法很多,如等比分箱、等距分箱。dlookr包中的binning( )函数提供了很多方法对数据进行分箱,包括以下几种。
● quantile:使用分位数进行分箱。
● equal:等距分箱。
● pretty:等比分箱。
● kmeans:使用K均值进行分箱。
● bclust:使用层次聚类进行分箱。
这里对sleep数据集的Gest特征进行分箱,结果如图3.13所示。


图3.13 数据分箱
另外,binning_by( )提供了一种最佳的分箱方法,这种方法在信用评分模型中也经常用到,使用这种分箱方法可以让变量有最大的IV值(IV值是衡量变量重要性的一个指标)。这里用到的数据集是scorecard的german数据集。这个数据集中的creditability 是目标变量,其有两个取值,即bad、good,分别表示好坏客户。下面的代码首先加载了scorecard包,然后加载所需要的german数据集,因为german原始的变量名称非常长,因此这里对数据集的第二个特征进行重命名,后续对第二个特征进行分箱。binning_by( )的第一个参数是所使用的数据集,这里指定为germancredit,第二个参数是y,表示目标变量,第三个参数是x,表示用于分箱的变量。箱线图如图3.14所示。


图3.14 箱线图
需要注意的是,这个函数要求变量名称不能包含“.”。图3.14(a)显示的是数据的分布。图3.14(b)显示不同区间内数据量的占比。图3.14(c)显示不同区间内坏样本的占比。图3.14(d)显示不同区间内证据权重的结果。
可以看出,数据集被划分成了3段:(4,11]、(11,33]、(33,72]。从图3.14中可以看到,图3.14(a)是好坏客户中duration的箱线图。可以发现,当目标变量为1时,存在一些极端值,也就是箱子外面的那些点;当目标变量为0时,Distribution的范围更大。图3.14(b)显示的是不同区间内样本的比例,(11,33]这个区间内的样本量最多。图3.14(c)显示的是不同区间内坏样本的比例,可以看到,坏样本的比例和区间是正相关的。图3.14(d)显示的是不同区间的WoE值。
3.3.11 创建数据转换报告
dlookr可以快速地生成一份数据转换报告,生成报告的函数是transformation_report( ),这里依然使用sleep数据集,使用此数据来生成数据转换报告。生成的数据转换报告如图3.15所示。


图3.15 生成的数据转换报告
图3.15就是一个完整的数据转换报告。最后一部分就是数据的异常值的处理。异常值的处理与缺失值类似,一般有3种解决方案。
● 剔除异常值。
● 用一个统计量来替代异常值。
● 用模型来估计异常值。
这些方法与缺失值的处理是类似的。需要注意的是,如果异常值的比例比较高,那么需要考虑的是这并不是异常值了,更有可能是数据本身就来自两个分布,这时就需要对数据进行划分,将数据划分为两个数据集,而不是将异常值当作一个需要解决的问题。