8.4 如何处理缺失值和异常值

如果说前面的3节内容谈到的数据处理问题并不会在每个分析场景都能明显引起分析师的关注,那么本节讨论的“数据缺失和异常值”却是几乎在每个数据分析、挖掘实践中,分析师都会碰到的、最常见的数据问题。

8.4.1 缺失值的常见处理方法

在数据分析挖掘实践中,数据样本里的数据缺失是常见的现象,而这其中有的是数据存储错误造成的,有的是原始数据本身就是缺省的,比如用户登记的信息不全。在大多数情况下,数据分析师需要对缺失数据进行处理;在个别情况下,比如应用决策树算法的时候,该算法本身允许数据缺失值直接进入分析挖掘,因为在这种情况下缺失值本身已经被看做是一个特定的属性类别了。下列一些方法是数据分析师常用的处理数据缺失值的方法:

❑数据分析师首先应该知道数据缺失的原因,只有知根知底,才可以从容、正确地处理缺失值。不同数据的缺失有不同的原因,因此也应该有不同的解读和解决方法,而不应该一概而论,眉毛胡子一把抓。举例来说,如果用户问卷里的缺失值是因为被调查者漏掉了一个问题选项,那么这个缺失值代表了用户没有回答该问题;而一个信用卡激活日期的缺失,不能表明是“丢失”了信用卡的激活日期,按照系统的计算逻辑来看,凡是还没有激活的信用卡,其激活日期都是记为缺失的,即NULL;还有的缺失是因为系统本身的计算错误造成的,比如某个字段除以零,某个负数取对数等错误的数学运算。上述3种缺失场景有着完全不同的缺失原因,所代表的意义也不同,分析师只有真正找到了缺失的原因,才可以有的放矢,并采取相应的对策进行有效处理。

❑分析师基于数据缺失的原因进行正确查找后,还要对于数据的缺失进行判断。这种数据缺失是本身已经具有特定的商业意义呢?还是的确需要进行特别的处理。在上面所列举的3种完全不同的缺失原因里,很明显,信用卡激活日期的缺失其本身是具有特定商业意义的,这种缺失代表了该用户还没有激活信用卡,这个商业的含义非常明确,已经不用对此类缺失进行任何处理了;而诸如系统本身的计算错误所造成的缺失,比如,某个字段除以零,或某个负数取对数,就应该采取相应的措施修正计算错误,比如,重新定义计算逻辑,或者采用后面提到的一系列的处理方法。

❑直接删除带有缺失值的数据元组(或观察对象)。这种操作手法最大的好处在于删除带缺失值的观察对象后,留下来的数据全部是有完整记录的,数据很干净,删除的操作步骤也很简单方便。但是,此种操作手法最大的不足在于,如果数据缺失的比例很大,直接删除带有缺失值的观察值后剩下的用于分析挖掘用的数据集可能会太少,不足以进行有效的分析挖掘;其次,直接删除含有缺失值的观察对象很可能会丢失一些重要的信息,因为这些被删除的观察对象还可能包含了很多没有缺失的别的字段或者变量的属性,这些属性或者数据也是很有意义的;另外,在建模完成后进行业务应用时,如果用来打分的新数据也带有缺失值,那么先前完全基于不带缺失值的分析样本所搭建起来的预测模型,面对这些数据进行打分预测时,很有可能无法对此进行打分赋值。所以,直接删除带有缺失值的观察对象的方法只适用于建模样本里缺失值比例很少,并且后期打分应用中的数据的缺失值比例也很少的情况。

❑直接删除有大量缺失值的变量。这种方法是针对那些缺失值占比超过相当比例变量,比如缺失值超过20%或者更多的情况。但是采用这种方法之前需要仔细考虑,这种大规模的缺失是否有另外的商业背景和含义,比如前面提到的信用卡激活日期的缺失实际上表明这些用户还没有激活信用卡,那么这群用户是属于另外一个类别,即还未激活的用户群体,在这种情况下,轻率地删除就会丢失这群用户的重要信息,得不偿失。

❑对缺失值进行替换(Substitute)。这种方法包括利用全集中的代表性属性,诸如众数或者均值等,或者人为定义的一个数据去代替缺失值的情况。具体来说,包括:对于类别型变量(Category)而言,用众数或者一个崭新的类别属性来代替缺失值;对于次序型变量(Ordinal)和区间型变量(Interval)而言,用中间值、众数、最大值、最小值、用户定义的任意其他值、平均值或仅针对区间型变量来代替缺失值。上述对缺失值进行替换的做法最大的好处在于简单、直观,并且有相当的依据,比如说,众数本身就说明了该值出现的几率最大。但是,不管怎么说,这种替换毕竟是人为的替换,不能完全代表缺少数据本身真实的含义,所以也属于“不得已而为之”的策略。

❑对缺失值进行赋值(Impute)。这种方法将通过诸如回归模型、决策树模型、贝叶斯定理等去预测缺失值的最近替代值,也就是把缺失数据所对应的变量当做目标变量,把其他的输入变量作为自变量,为每个需要进行缺失值赋值的字段分别建立预测模型。从理论上看,该种方法最严谨,但是成本较高,其包括时间成本和分析资源的投入成本。是否采用该方法,取决于具体数据挖掘的业务背景、数据资源质量以及需要投入的力度。

8.4.2 异常值的判断和处理

数据样本中的异常值(Outlier)通常是指一个类别型变量(Category)里某个类别值出现的次数太少、太稀有,比如出现的频率只占0.1%或更少,或者指一个区间型变量(Interval)里某些取值太大,比如,互联网买家用户最近30天在线购买的交易次数,个别用户可以达到3000次,平均每天购买100次,相比数据全集里该字段均值为2次而言,这里的3000交易次数就属于异常值。

通常来讲,如果不把异常值清理掉,对于数据分析结论或者挖掘模型效果的负面影响是非常大的,很可能会干扰模型系数的计算和评估,从而严重降低模型的稳定性。

对于异常值的判断内容如下:

❑对于类别型变量(Category)来说,如果某个类别值出现的频率太小,太稀有,就可能是异常值。具体拿经验值来参考,一般某个类别值的分布占比不到1%或者更少就很可能是异常值了。当然,这还需要数据分析师根据具体项目的业务背景和数据实际分布作出判断和进行权衡。有些情况下,纵然某个类别值的占比很少,但是如果跟目标变量里的目标事件有显著的正相关关系,这种稀有类别值的价值就不是简单的异常值所可以代表的。

❑对于区间型变量(Interval)来说,最简单有效的方法就是把所有的观察对象按照变量的取值按从小到大的顺序进行排列,然后从最大的数值开始倒推0.1%甚至更多的观察值,这些最大的数值就很可能属于异常值,可再结合业务逻辑加以判断。另外一个常用的判断异常值的方法就是以“标准差”作为衡量的尺度,根据不同的业务背景和变量的业务含义,把超过均值n个标准差以上的取值定义为异常值,这里n的取值范围取决于具体的业务场景和不同变量的合理分布,比如超过均值在正负4个标准差以上的数值就要认真评估,确定其是否是异常值。

对于异常值的处理相对来说就比较简单,主要的措施就是直接删除。

需要提醒读者的是,在数据挖掘实践中,对于“异常值”的处理是辩证的,在多数情况下,异常值的删除可以有效降低数据的波动,使得处理后的建模数据更加稳定,从而提高模型的稳定性。但是,在某些业务场景下,异常值的应用却是另一个专门的业务方向。比如在前面章节里提到的信用体系中的恶意欺诈事件,从数据分析的角度来看那也是对异常值的分析挖掘应用。对这些有价值的异常值的分析应用包括利用聚类分析技术识别异常值,利用稀有事件的预测模型搭建去监控、预测异常值出现的可能性等。这些应用,将在第9章和第10章专门进行介绍。