为什么要做数据清理呢?因为90%以上的原始数据因为各种原因都存在错误。如果在数据分析前,没有把这些问题清理好,很有可能导致后面数据分析不出真实的结果。数据清理就是把“脏”的“清理掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。
数据清理是对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在的错误,并提供数据一致性,然后进行必要的权重调整等,以满足后续的计量回归的需要。目前国内各大研究机构释放出来的数据很多,如CHNS、CGSS、CFPS、CHFS等等,那么数据清理需要进行哪些步骤呢?
一、读取数据——数据转码Unicode
比如常见的我们在stata14进行数据读取时,结果是乱码。然后用Unicode analyze 对其进行分析,结果说该文件需要进行Unicode translate。此时,关键是要设对需要转换文件的原始编码类型。例如,如果原始数据中变量标签为中文,用stata14打开时,变量标签无法识别。此时,需要设定编码类型。命令为 Unicodeencoding set gb18030,即设定编码类型为国标18030,即简体中文。然后,用Unicode analyze filename. dta 分析文件是否需要转换,如结果为需要,那么继续用Unicode translate filename. dta来转换数据文件中不可识别的中文汉字。成功以后,原始数据中不能识别的中文则可以在stata14中识别了。
其实,在实际数据读取过程中,我们只是偶然会遇到这种情况。更多的情况是各种不同数据格式之间的转换,比如一些数据库的原始数据是SAS数据或者SPSS数据甚至直接就是Excel数据,此时我们需要转换成Stata可以读取的dta格式,这里Excel数据可以用Stata软件直接转换,其他的推荐Stata translate软件进行转换。
二、查看识别变量——isid、duplicates
重复记录是数据清理中一个非常常见的问题,可能就是因为该问题太常见了,所以Stata开发了一整套识别、描述和移除重复记录的命令。
一般而言,每个数据集都有唯一一个识别每条记录的识别符(重复测量的长型数据除外)。Stata检查唯一识别符是否唯一的命令为isid(或许是is this an ID的缩写)。isid允许同时检查多个唯一识别符,如果没有返回值,就说明是唯一的(没有消息就是好消息);如果不唯一,就会出现红色提示variable *** does not uniquely identify the observations。如采用下面例子中的查重方式:
如果出现重复记录就需要详细查看重复记录的情况。深入检查数据集重复记录的Stata命令为duplicates,对应的Stata菜单操作方式为Data → Data utilities → Manageduplicate observations。Stata是这样描述duplicates命令的:duplicates命令用来报告、查看、标示和删除重复记录。具体应用,大家可以在Stata软件命令栏中输入help duplicates查看。
在数据清理时,我们会根据常识及专业知识对连续变量间的关系进行核对,以识别可能的错误。如调查对象的出生日期应小于或等于调查日期(常识),妇女的生育年龄肯定不能小于月经初潮年龄(专业知识)。还有一些具有经济意义的数据,如个人年消费总额肯定不能为负,数据样本中我国省级行政单位数目肯定不能超过34等等。这些需要学术研究者认真研究和比对,可以采用list命令列举的方式,或者scatter命令看散点图等简单处理后运用专业知识或者常识来判别。对于调查数据来说,缺失值是司空见惯的。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据每种缺失都会对统计分析产生不同的影响,数据清理时需要对每种缺失值采用不同的处理方式。那么,Stata中有哪些命令可以快速查看数据的缺失值呢?这里为大家简单介绍几个与查看缺失值相关的命令。命令misstable可以快速查看变量的缺失值,它会以表格的形式呈现数据缺失的样本量,该命令的语法结构为:misstable summarize[varlist][if][in][, summarize_options]运行命令misstable和选项all可以直接输出指定变量串中所有变量的缺失情况。如果变量本身没有缺失值,表格结果显示为空;由于misstable只能识别数值型变量的缺失值,无法识别字符型变量的缺失值,所以,对于字符型变量来说,表格结果显示为“(string variable)”。nmissing是第三方用户写的命令,该命令的语法结构为:nmissing [varlist] [if exp] [in range] [, min(#) obs piasm trim]运行命令nmissing不仅可以给出指定变量串中的数值型变量的缺失值的个数,还可以给出字符型变量的缺失值的个数。选项min(#)可以显示缺失值个数超过#的变量及其缺失值情况。命令mdesc也是一个查看变量缺失情况的第三方命令,它的语法结构为:mdescvarlist [if] [in] [, abbreviate(#) any all none]该命令可以识别数值型变量和字符型变量,它不仅可以查看变量缺失值的样本量,还可以看其分布。对于数据中的异常值,我们通常的处理方式有以下几种:
- 方法一:直接删除----适合缺失值数量较小,并且是随机出现的,删除它们对整体数据影响不大的情况。
- 方法二:使用一个全局常量填充---譬如将缺失值用“Unknown”等填充,但是效果不一定好,因为算法可能会把它识别为一个新的类别,一般很少用。
- 方法三:使用均值或中位数代替----优点:不会减少样本信息,处理简单。缺点:当缺失数据不是随机数据时会产生偏差.对于正常分布的数据可以使用均值代替,如果数据是倾斜的,使用中位数可能更好。
- 随机插补法----从总体中随机抽取某个样本代替缺失样本
- 多重插补法----通过变量之间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理
- 热平台插补----指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。这样做的优点是:简单易行,准去率较高。缺点:变量数量较多时,通常很难找到与需要插补样本完全相同的样本。但我们可以按照某些变量将数据分层,在层中对缺失值实用均值插补
- 拉格朗日差值法和牛顿插值法(简单高效,数值分析里的内容)
- 方法五:建模法可以用回归、使用贝叶斯形式化方法的基于推理的工具或决策树归纳确定。例如,利用数据集中其他数据的属性,可以构造一棵判定树,来预测缺失值的值。
以上方法各有优缺点,具体情况要根据实际数据分分布情况、倾斜程度、缺失值所占比例等等来选择方法。一般而言,建模法是比较常用的方法,它根据已有的值来预测缺失值,准确率更高异常值(outlier)是指一组测定值中与平均值的偏差超过两倍标准差的测定值,与平均值的偏差超过三倍标准差的测定值,称为高度异常的异常值。通常面对样本时需要做整体数据观察,以确认样本数量、均值、极值、方差、标准差以及数据范围等。其中的极值很可能是异常值,此时如何处理异常值会直接影响数据结果。那么我们在Stata中应该如何识别异常值呢?、拿到数据后可以对数据进行一个简单的描述性统计分析,譬如最大最小值可以用来判断这个变量的取值是否超过了合理的范围,如客户的年龄为-20岁或200岁,显然是不合常理的,为异常值。这种方法我们可以在Stata中summarize命令来实现。summarize命令用来计算及展示一组单变量的概要统计,若后面不指定变量,则计算当前数据集中所有变量的概要统计。若觉得某个变量的极值不符合常识,可选择detail选项,则显示变量的额外统计量,包括skewness、kurtosis、4个最小值、4个最大值,以及各种百分比。这就很容易以查看极值找到异常值。我们也可以在Stata中采用scatter命令,通过画散点图的方法,直接观察是否存在异常值。box图分为四个分位点,75th和25th比较简单。箱式图检验就是摘除大于Q3+3/2*(Q3-Q1),小于Q1-3/2*(Q3-Q1)外的数据,并认定其为异常值;这里的具体操作过程,可以查看Stata中的graph box命令来更多了解。当数据服从正态分布:根据正态分布的定义可知,距离平均值3δ之外的概率为 P(|x-μ|>3δ) <= 0.003 ,这属于极小概率事件,在默认情况下我们可以认定,距离超过平均值3δ的样本是不存在的。因此,当样本距离平均值大于3δ,则认定该样本为异常值。当数据不服从正态分布:当数据不服从正态分布,可以通过远离平均距离多少倍的标准差来判定,多少倍的取值需要根据经验和实际情况来决定。
- 方法一:直接删除。这只一种非常粗暴的方法。由于异常值对于统计推断的影响巨大,这种做法目前已经不多采用了,尤其当样本量规模不大甚至比较小的时候。当然如果数据量样本足够大而异常值并不多的情况下,慎行。
- 方法二:替换成均值或者中位数这是一种非常偷懒的做法,如果是做回归那么就在回归时改成用中位数回归,不过这也确实是一种很不错的办法。
- 方法三:将异常值视为缺失值,交给缺失值处理方法来处理。缺失值的处理方式本文前面已经详细介绍,在此不再赘述。
winsorize是用相应分位数的值替代分位数之外的值,而不是删掉,这样可以最大限度的保存数据信息。主要是根据已有文献来的,如果别人用winsorize你也要用,否则你的结论和别人的没有可比性。目前来看,至少在金融领域,使用winsorize比较普遍,删除异常值的做法越来越少的被使用了。Stata中有现成的winsorize程序,打开Stata,在命令行输入ssc install winsor2,replace,自动安装 winsor2。安装完之后,winsor2命令的基本格式为:winsor2 变量名 变量名, replace cuts(1 99)p()里的数字可以自己设,一般是0.01。当然,0.01就是在1%的异常变量,也可以设定5%,就是p里面写成0.05。这个命令把最高1%和最低1%替换成离他们最近的值,不删除或变成缺失。这个命令也可以将识别出来的异常值直接删除,命令形式如下:winsor2 变量名 变量名, replace cuts(199) trim这里插一句:数据清理永无止境,需要不断反复,有时候觉得数据很干净了,没问题了,过一段时间之后还是会发现一些小错误,有的能被修正过来,而有的只能保持错误状态。这个世界上很难找到完美的调查和数据,因此每次做清理时都要假定这个变量有问题,而不是这个变量没问题。经过上面那么多道程序之后,你是否觉得自己拿到手的数据(比如CGSS、CHNS、CFPS、CHIPS等等)已经可以做回归分析了?这里只能说相当抱歉!真的还差得远!如果真的要采用这些数据进行回归,你可能还要经历一下的过程:在这里,我们以CHNS数据为例,在进行完前两步的工作之后,对接下来个的工序进行详细解释。CHNS调查数据是中国疾病预防控制中心营养与食品安全所(原中国预防医学科学院营养与食品卫生研究所)与美国北卡罗来纳大学人口中心合作的追踪调查项目,其目的在于探讨中国社会的经济转型和计划生育政策的开展对国民健康和营养状况的影响。该调查始于1989年,到目前为止共进行了十次,包括1989、1991、1993、1997、2000、2004、2006、2009、2011、2015年数据。范围覆盖了9个省的城市和农村地区,内容涉及人口特征,经济发展、公共资源和健康指标。除此之外,还有详细的社区数据,包括食品市场、医疗机构和其他社会服务设施的信息。目前CHNS数据上面这些优点使得CHNS具有独特的应用价值。该调查采用多阶段分层整群随机抽样方法。为了理清接下来的数据处理过程,我们可能还需要知道:一、首先明确,所研究的问题是否需要一个真正的长期面板在数据调研过程中,样本丢失是一种非常常见的现象。比如原样本家庭访户的去世,原企业在原有领域的退出等等。然而依据我们所要研究的主题的差异,我们需要对数据样本进行选择。如果只是研究X与Y之间的因果性问题,那么所有样本可用。而如果要研究样本某个特征的长期趋势,那么我们可能需要只研究数据库中存在的长期样本。比如刘志军(2017)中的研究主题是收入流动性的长期趋势,那么他便在在所有调查的样本数据中,只保留有长期追踪调查的样本,根据研究的需要构造三个平衡面板数据。一是1989-2000年期间含有在9个调查年份中同时都出现的样本量;二是1989-2000年期间同时含有5个调查年份数据;三是2000-2011年期间同时含有所有5个调查年份数据。每个数据库在数据调查过程中,都采用了特定的抽样方法,如CHNS采用的是多阶段分层整群随机抽样方法。这里对于不同的地区和样本进行了权重赋予,因此我们在重新使用过程中,需要利用这些权重对调查出的数据进行重新调整,以保证数据的随机性。在进行完上面的过程之后,我们的数据已经基本能用了,但是如果研究的主题是样本某特征的长期趋势,我们可能还要进行下一步工作:很多数据库的调查年份的间隔并不是等距的,中间可能有多少一两年的差别。这时候为了能够更好地反映样本某特征的长期演化趋势,可以进一步我们采取一种方法将非调查年度的某特征数据补充完整:首先根据期初和期末收入计算出在此时间跨度中的每个样本i的年均收入增长速度g;接着再利用前一轮次的调查数据和增长速度计算缺失年份的数据来补充数据有助于反映某特征数据的全貌。总结:以上便是本人在学习过程中了解到的数据清理过程,分享给大家,欢迎批评指正,互相进步。另外,在学习与研究的初级阶段,数据清理大致占据了论文写作整体过程70%-80%的时间,可谓费时费力,希望大家不辞辛劳,咬牙坚持住;数据清理是论文写作的第一步,加油吧,不要吝惜自己去 dirty your hands,你会收货颇丰的,加油!共勉O(∩_∩)O哈哈~PS:本文并不包括出数据处理的所有步骤,如阅读数据库的相关调查问卷,给相关变量重新命名或者添加注释等基础工作,相信大家都了解,就不说了………………