当前位置 > CPDA数据分析师 > “数”业专攻 > 什么是数据清洗?揭秘数据清洗的方法

什么是数据清洗?揭秘数据清洗的方法

来源:数据分析师 CPDA | 时间:2016-11-25 | 作者:admin

数据清洗是将重复、多余的数据筛选清除,将缺失的数据补充完整,将错误的数据纠正或删除,最后整理成为我们可以进一步加工、使用的数据。

 

为何进行数据清洗

调查数据从问卷上的回答转化为数字编号,再输入计算机成为数据文件的过程中,难免会出现一些错误,因此,在数据输入完成后,需要进行数据核对和清洗,以提高数据的质量,降低数据统计过程中的出错率。核对和清洗工作是在计算机的帮助下进行的,主要包括对数据有效范围的清洗、数据逻辑一致性的清洗和数据质量的抽查。

 

有效范围的清洗

有效范围的清洗,主要是指对数据中的奇异值进行清洗。对于问卷中的任何一个答案来说,它的有效编码值往往都在某一个范围之内,当数据中的数字超出这一范围时,可以肯定这个数字一定是错误的。比如,在数据文件的“性别”的答案中,根据编码规定“性别”的编码值是“1=男,2=女”。如果数字中出现了1/2以外的数字,则马上可以判定这是错误的编码值,此时,对于超出这两者范围的其他编码值肯定是错误的,就要对其进行检查、核对和纠正。

 

由于数据从受访者的回答到转化为数据文件要经历多个阶段,因此,这种错误的产生发生不同的阶段。

 

首先,可能是原始问卷中的答案出现了问题。例如,有一项调查,要求调查对象是1986年之后出生的年轻人,而问卷中出现了1968,但其他的信息显示受访者不可能是1968年出生的,而应应该是1986年,那可能是因为受访者在回答这一问题时发生笔误,把1986写成1968,这一错误来源于受访者,这种错误是可以进行纠正或作适当处理的。

 

其次,错误可能发生在计算机输入人员输入数据的过程中。由于输入人员的任何一点马虎或疏忽,都可能造成输入错误。比如,要输入“2”,但因为手的位置稍微偏上一点,就敲成了“5”,这个超出有效范围的错误就来自于输入人员。

假设在某次调查中,关于性别变量的有效值只有“1=男,2=女”两个,但是统计结果中出现了5和7这样的取值,这明显超出了编码所规定的有效范围,这就需要将这些问卷找出来,根据问卷信息,针对不同的错误,要做相应的处理。

 

逻辑一致性的清洗

除了数据输入的奇异值之外,还有一种较为复杂的工作就是逻辑一致性的清洗。其基本思路是依据问卷中的问题相互之间所存在的逻辑联系,来检查前后数据之间的合理性,主要针对的是相倚问题和多项限选题。

1.相倚问题

比如,某城市手机市场情况调查问卷中有这样一堆相倚问题。其过滤性问题是“请问您现在是否拥有手机”答案为“A有B没有”。而后续问题是:“您已经使用手机_年”那么,对于那些在前一问题中的答案“B没有”的人,后面的问题不适用,应该不作答。如果在回答了“没有拥有手机”的人中,有的人又对第二个问题做了回答,那么这些问卷的数据就一定有问题,因此应对这些问题进行查找、核对和清洗。

 

2.多项限选题

对于采用多重分类法编码的多项限选题,要检查其输入顺序。假设某多选题,最多选3项、如果只会回答一个,则输入在第一个变量中,而其余两个变量则不输入任何值(空白代表缺失值);如果答了两个,则输入在第一,第二个变量中,而第三个变量不输入任何值。

 

数据质量的抽查

尽管采用了上述两种方法对数据进行核对和清洗,但仍会有一些错误的数据无法查出来。比如某个问卷调查的数据在“性别”这一变量上出错了,问卷上填答的答案是“1”(男性),但数据录入时却敲成了“2”(女性)。因为2这个答案在正常有效的编码值范围中,所以有效范围的清洗检查不出这个错误。同时,这一变量值与其它变量之间又没有诸如“性别”与“怀孕次数”“未婚”与“有孩子”那样的逻辑关系。因此,逻辑一致性的清洗也用不上。

 

在这种情况下,查出这类的输入错误的唯一办法是拿着原始问卷卓分的、逐个答案进行校对。但实际调查中却没有一个人这么去做,因为这样工作量太大,人们往往采用随机抽查的办法。从调查问卷的全部个案中,抽取一部分,对这些调查问卷参照原始问卷进行校对。用这部分调查问卷校对的结果,来估计和评价全部数据的质量。根据全部调查问卷中个案数目的多少,以及每份问卷中题目数和总字符数的多少,一般抽取2%-5%的个案进行核对。例如,一个调查共1000个个案,一份问卷的数据个数为200,研究者随机抽取了3%的个案,以及30分调查问卷进行核查,结果发现有2个数据输入错误,这样2/(200*30)=0.033%,就说明数据的做无虑在0.033%左右,在总共20万个数据中,有66个左右的错误。虽然无法查出他们,进行修改,但知道他们占了多大的比例,以及对调查结果有多大的影响。

 

数据抽样的方法

在Excel中数据抽样使用RAND()函数,RAND()函数返回【0,1】的均匀分布随机数,而且每次计算工作表时都返回一个新的数值。当然,RAND()函数也可以表示大于1的数据范围。如随机数在60-70之前的取值,可以用公式“=RAND()*10+60”,其中“RAND()*10”RAND()区间扩大了10倍,即从【0.1】扩大到【0,10】,后面再加上60,就变成了【60,70】;要取整可以用公式“=intRAND()*10+60”.

 

可以用a、b分别代表两个数字,其中a<B,若要生成a与b之前的随机实数,可以用公式“=RAND()*(B-A)+A