(译)The Ultimate Guide to Data Cleaning-数据清理指南

(译)The Ultimate Guide to Data Cleaning-数据清理指南
数据的质量好坏对于最后应用的效果起着重要的影响,垃圾数据绝对产出不了好的结果,但是质量高的数据却可以弥补算法的软弱性。
(译)The Ultimate Guide to Data Cleaning-数据清理指南
所以了解有关数据质量的相关问题。对于我们接下来使用的算法和关键,本文博主主要从以下几个方面讲述了有关数据清理的东西。
(译)The Ultimate Guide to Data Cleaning-数据清理指南

Data Quality

首先我们来看一下,什么样特质的数据可以被称为高质量的数据。

Validity(有效性)
我们使用的数据应该满足某些规则的约束:比如它要满足数据类型的限制、取值范围的限制、满足某些强制性约束(比如主键非空)、唯一性约束、子集成员约束(比如性别只能从男、女中选)、外键约束(比如在关系数据库中,外键不能引用主键没有的值)、常规的表达模式(比如电话号码的规范等)、跨域验证(比如出院日期不应该早于入院日期)

Accuracy(准确性)
我们的数据应该接近真实情况:不是数据中看起来真实的值都是有效的,以及需要清楚准确和精确的分别(比如你说你住在地球上是准确的,但不是精确的)

Completeness(完整性)
我们所需要的数据应该是都有的:数据中的缺失是很常见的,但是要通过一些办法去找到这些缺失值,比如重新调查等等

Consistency(一致性)
我们的数据可能是来自于多个数据源,但是要保证一致性:如果不同的数据源中的同一类的数据有歧义,需要判断哪一个符合真实情况

Uniformity(均匀性)
我们同一类型不同数据源的数据应该使用同一种衡量标准:比如长度使用米,重量使用公斤等等

在数据清理中,主要的工作可分为以下四步,它可能是一个连续的过程,有时也是一个迭代的过程
(译)The Ultimate Guide to Data Cleaning-数据清理指南

Inspection(检查)

数据的检查工作是一个很费时的过程,通常又很多的方法可供我们选择使用
Dataprofiling:数据的统计信息(称为数据分析)对于了解数据的质量非常有帮助。例如检查特定列是否符合特定的标准或模式;数据列记录为字符串还是数字;缺失了多少个值;列中有多少个惟一值及其分布;这个数据集是链接到另一个数据集还是与另一个数据集有关系
Visualization:通过可视化数据,我们可以对数据的分布有一个整体的把握,而且可以发现某些离群点
Software packages:在很多编程语言中,提供了很多的库来方便用户指定约束,并检查数据是否违反了这些约束

Cleaning

数据清理基于不同的问题和数据类型的有不同技术,每种方法都有自己的优缺点,我们需要根据实际情况选择合适的技术。总的来说,不正确的数据要么被删除,要么被纠正,要么被估算。

如今有大量的商业工具可供我们使用,进行数据的清理工作,比如数据清洗工具、数据审计工具、数据迁移工具、ETL工具……或者根据我们具体的业务,用户可以自己定制相应的工具使用,完善相应的需求。

接下来看一下如何处理数据清理中所可能遇到的一系列问题:

Irrelevant Data: 在数据集中有些数据和我们的研究问题是无关的(比如我们研究中国的经济发展,那么其他国家的数据就是无关数据),或者有些可以通过其他的推算出(比如年龄可以通过生日计算出来,就没有必要年龄和生日两个属性的数据同时存在)。如果你没有把握判断某些数据是否是无关的,可以研究特征变量之间的相关矩阵或是向相关领域的专家咨询。

有些无关或是冗余的数据可以通过相关性分析检测到,对于标称数据,我们可以使用卡方检验,对于数值属性,我们可以使用相关系数和协方差,它们都评估一个属性值是如何随另一个变化的,此外也可以使用散点图来观察属性之间的相关性。

Duplicates: 可能因为很多原因产生重复的数据,对此只需要简单的移除即可

Type conversion : 确保数字存储为数值数据类型,日期应该存储为date对象,或者Unix时间戳(秒数),等等。不能转换为指定类型的值应该转换为NA值(或任何值),并显示警告,这表示该值不正确,必须被修复。

Syntax errors: 数据可能有拼写错误,我们可以通过模式匹配、模糊匹配等方法解决

Standardize:确保每个值以相同的标准格式输入。比如对于字符串,确保所有值都是小写或大写;对于数值,确保所有的数值都有一个特定的测量单元

Scaling/Transformation:缩放意味着转换数据,使其符合特定的缩放范围,例如0-100或0-1,解决不同范围的数据的比较问题

Normalization:虽然标准化还将值重新划分为0-1的范围,但这里的目的是转换数据,使其服从正态分布。因为在大多数情况下,如果我们想要使用依赖于正态分布数据的统计方法,我们就需要对数据进行标准化。为此我们可以使用log函数,其他的方法(https://en.wikipedia.org/wiki/Normalization_(statistics)#Examples)。 根据使用的缩放方法,数据分布的形状可能会发生变化。例如,“Standard Z score”和“Student’s t-statistic”保持了数据的形式,而log函数可能没有
(译)The Ultimate Guide to Data Cleaning-数据清理指南
• Missing values:
○ Drop:如果列中缺失的值很少,而且缺失是随机的,那么最简单、最直接的解决方案是删除缺失值的观察值(行)。如果列的大多数值都丢失了,并且是随机的,那么通常的决定是删除整个列。这在进行统计分析时特别有用,因为填充缺失的值可能会产生意想不到的或有偏差的结果

○ Impute:根据其他观测值估算缺失值。有很多方法可以做到这一点。
(1)使用统计值,比如平均值,中位数。然而如果有许多缺失的值,这些都不能保证数据是无偏斜的。均值在原始数据不偏斜的情况下最有用;中值更鲁棒,它对异常值不敏感,因此在数据偏斜的情况下使用。在正态分布中,可以得到离均值两个标准差以内的所有值。接下来,通过在(mean- 2 * std) & (mean + 2 * std) 之间生成随机数来填充缺失的值,比如:

rand = np.random.randint(average_age - 2*std_age, average_age + 2*std_age, size = count_nan_age)
	dataframe["age"][np.isnan(dataframe["age"])] = rand

(2)使用线性回归:根据现有的数据,我们可以计算出最适合的两个变量之间的拟合线,比如房价与尺寸m²。但线性回归模型对异常值非常敏感

(3)Hot-deck:从其他类似记录复制值。这只有在您有足够的可用数据时才有用。它可以应用于数值和分类数据,可以使用随即填充或是找其近邻的方法。

○ Flag:有时数据丢失本身就是一种信息,算法应该知道它。否则我们只是通过其他特性来强化已经存在的模式。当丢失的数据不是随机发生的时候,这一点尤其重要。但注意缺失值与默认值不同。例如零可以解释为缺失或默认值,但不能同时解释为两者,缺失的值不是“unknown”

○ Outliers:理论上认为任何距离Q1和Q3四分位数大于(1.5 * IQR)的数据值都被认为是异常值,但在没有确定它是无用的之前,不能简单的将其删除。一些模型,如线性回归,对异常值非常敏感。换句话说,异常值可能会使模型偏离大部分数据所在的位置

○ In-record & cross-datasets errors:这些错误是由于同一行或数据集中有两个或多个相互矛盾的值造成的

Verifying

当完成时,应该通过重新检查数据并确保它的规则和约束成立来验证正确性。例如,在填写了缺失的数据之后,它们可能违反了任何规则和约束。如果不可能的话,可能需要进行一些手工修正

Reporting

报告数据的健康程度对清理工作同样重要。如前所述,软件包或库可以生成所做更改的报告、违反了哪些规则以及违反了多少次。除了记录违规之外,还应该考虑这些错误的原因。它们为什么会发生呢?

最后为了得到高质量的数据,我们应该常常问这么几个问题:

How the data is collected, and under what conditions?
What does the data represent?
What are the methods used to clean the data and why?
Do you invest the time and money in improving the process?.

原文链接: https://towardsdatascience.com/the-ultimate-guide-to-data-cleaning-3969843991d4