长文总结数据清洗的完全指南

长文总结数据清洗的完全指南

我花了最后几个月来分析来自传感器、调查和日志的数据。无论我创建了多少张图表,运用了多么复杂的算法,结果总是令人误解且不尽人意的。

对数据生硬地使用随机森林算法就像向其注入病毒一样。一种无意的病毒,只会损害数据科学家的洞察力,就好像你的数据疯狂往外冒着垃圾一样。

更糟糕的是,当你向CEO展示新发现时,你猜怎么着?他发现了一个缺陷,有些东西听起来不对劲,你的发现与他们对域名的理解不符——毕竟,他们是域名专家,比你,作为分析师或开发人员的知识要强。

立即,鲜血涌入你的脸庞,你的手颤抖,沉默片刻,然后可能道歉。

这种情况其实也不算是最差的结果。如果没有任何人质疑你的发现,并且你的公司最终根据这些发现做出决定。你摄取了一堆混乱数据,没有清理它们,然后你告诉公司对这些结果进行处理,结果是错误的。你会遇到很多麻烦!

错误或不一致的数据会导致错误的结论。因此,清理和理解数据的程度对结果质量有很大影响。

维基百科上给出了两个真实的例子。

例如,政府可能希望分析人口普查数据,以确定哪些地区需要在基础设施和服务上进行进一步的支出和投资。在这种情况下,重要的是要访问可靠的数据,以避免错误的财务决策。

在商业世界中,不正确的数据可能会造成高昂的代价。许多公司使用客户信息数据库来记录诸如联系信息,地址和首选项之类的数据。例如,如果地址不一致,则公司将遭受重新发送邮件甚至失去客户的损失。

进去的是垃圾, 出来的还是垃圾。

实际上,如果仅凭一种简单算法就能获得足够多的高质量数据,那它可以胜过复杂算法。

质量数据胜过花哨的算法。

由于这些原因,重要的是要有逐步的指导原则,即备忘清单,该指南要逐步进行要应用的质量检查。

但是首先,我们要实现的目标是什么?有质量的数据是什么意思?它们的测量方法是什么?在采取任何行动之前,了解你要实现的目标,最终目标至关重要。

目录指引:

  • 数据质量(有效性,准确性,完整性,一致性)
  • 工作流程(检查,清洁,验证,报告)
  • 检查(数据分析,可视化,软件包)
  • 清理(无关数据,重复项,类型转换,语法错误,其他6个)
  • 验证中
  • 报告中
  • 最后的话

数据质量

坦白地说,除了Wikipedia上能查到的质量标准外,我找不到更好的质量标准解释。所以,我将在这里总结一下。

有效性

数据符合定义的业务规则或约束的程度

  • 数据类型约束:特定列中的值必须具有特定数据类型,例如布尔值,数字,日期等。
  • 范围约束:通常,数字或日期应在一定范围内。
  • 强制性约束:某些列不能为空。
  • 唯一约束:一个字段或多个字段的组合在整个数据集中必须唯一。
  • Set-Membership约束:列的值来自一组离散值,例如枚举值。例如,一个人的性别可以是男性或女性。
  • 外键约束:如在关系型数据库中一样,外键列不能具有所引用的主键中不存在的值。
  • 正则表达式模式:必须采用特定模式的文本字段。例如,可能要求电话号码的格式为(999)999–9999。
  • 跨字段验证:必须满足跨越多个字段的某些条件。例如,患者出院日期不能早于入院日期。

准确性

数据接近真实值的程度。

定义所有可能的有效值可以轻松发现无效值,但这并不意味着它们是准确的。

实际上可能一个有效的街道地址并不代表它一定存在。一个有效的人的眼睛颜色(例如蓝色)可能是有效的,但不是真实的(并不代表现实)。

要注意的另一件事是真实性和准确性之间的差异。说你生活在地球上, 是真的。但是,不精确。在地球上的哪里?说你住在特定的街道地址会更准确。

完整性

所有必需数据的已知程度。

许多各种原因都会导致数据丢失。可以通过质疑原始资料来缓解这一问题,比如说重新采访该对象。

对象可能会给出不同的答案,或者很难再次接触到。

一致性

数据在同一数据集中或在多个数据集中的一致性程度。

当数据集中的两个值相互矛盾时,就会出现不一致的情况。

离婚后的有效年龄(例如10岁)可能与婚姻状况不符。客户记录在两个具有两个不同地址的不同表中。

哪一个是对的?

均匀度

使用相同度量单位指定数据的程度。

重量可以磅或千克记录。日期可能遵循美国格式或欧洲格式。货币有时是美元,有时是日元。

因此,必须将数据转换为单个度量单位。

数据清洗的流程

清洗流程由三个步骤组成,旨在产生高质量的数据并考虑到我们所讨论的所有标准。

  1. 检查:检测意外,不正确和不一致的数据。
  2. 清洗:修复或删除发现的异常。
  3. 验证:清洗后,检查结果以验证正确性。
  4. 报告:记录有关所做更改和当前存储数据质量的报告。

你现在看到的是这个是一个单向过程,但实际上,这是一个反复无休止的过程。当发现新缺陷时,可以从验证到检查重新来一遍。

检查

检查数据非常耗时,并且需要使用许多方法来探索基础数据以进行错误检测。这里是其中的一些:

数据描述

关于数据的摘要统计信息(称为数据描述,  data profiling)确实有助于给出有关数据质量的一般信息。

例如,检查特定的列是否符合特定的标准或样式。数据列是否记录为字符串或数字?

有多少缺少值?一列中有多少个唯一值及其分布?该数据集是否链接到另一个数据集或与另一个数据集有关系?

可视化

通过使用统计方法(例如均值,标准差,范围或分位数)分析和可视化数据,可以发现意外的值,从而发现错误的值。

例如,通过可视化各个国家/地区的平均收入,可能会发现有一些离群值(链接有图像)。有些国家的人的收入比其他任何人都要多。这些离群值值得调查,不一定是错误的数据。

软件包 (Software Packages)

你可以使用几种可用语言的软件包或库来指定约束条件,并检查数据是否违反这些约束条件。

此外,这些软件包不仅可以生成关于违反了哪些规则以及违反了多少次的报告,还可以创建与哪些规则相关联的列的图形。

例如,年龄不能为负,因此身高不能为负。其他规则可能涉及同一行中或跨数据集的多个列。

清洗

数据清洗涉及基于问题和数据类型的不同技术。可以采用不同的方法,每种方法都有自己的利弊。

总体而言,不正确的数据将被删除,更正或重新估算。

不相关的数据

不相关的数据是那些实际上并不需要的数据,并且不适合我们要解决的问题。

例如,如果我们正在分析有关人群总体健康状况的数据,则无需按列方式使用电话号码。

同样,如果你仅对一个特定国家/地区感兴趣,则不希望包括所有其他国家/地区。或者,仅研究那些接受过手术的患者,我们不会逐行列出所有人。

仅在确定不重要的数据时,才可以删除它。否则,探索特征变量之间的相关矩阵。

即使你没有发现任何相关性,你也应咨询领域专家。你永远都不会知道,从领域角度(例如临床角度)来看,似乎不相关的功能可能非常相关。

重复项

重复项是在数据集中重复的数据点。

它经常发生在例如:

  • 数据来自不同来源
  • 用户可能会两次以为未实际提交表单而点击了“提交”按钮。
  • 两次提交了在线预订请求,以更正第一次误输入的错误信息。

一个常见的症状是两个用户具有相同的标识号。或者,同一篇文章报废了两次。

因此,只需将其删除。

类型转换

确保将数字存储为数字数据类型。日期应存储为日期对象或Unix时间戳(秒数),依此类推。

如果需要,可以将分类值转换为数字。

可以通过查看摘要中每一列的数据类型来快速发现(我们已经在上面讨论过)。

请注意,不能转换为指定类型的值应转换为NA值(或任何值),并显示警告。这表明该值不正确,需要修改。

语法错误

删除空格:应删除字符串开头或结尾的多余空格。

" hello world " => "hello world

填充字符串:字符串可以用空格或其他字符填充到一定宽度。例如,某些数字代码通常以前缀零表示,以确保它们始终具有相同的位数。

313 => 000313 (6 digits)

修正拼写错误:字符串可以用许多不同的方式输入,而且也难怪会出错。

GendermMalefem.FemalEFemle

该类别变量被认为具有5个不同的类别,而不是预期的2个类别:男性和女性,因为每个值都不同。

条形图对于可视化所有唯一值很有用。可以注意到有些值是不同的,但确实是同一件事,即“ information_technology”和“ IT”。或者,也许只是在大小写上有所不同。

因此,我们的职责是从上述数据中识别每个值是男性还是女性。 我们该怎么做?

第一种解决方案是将每个值手动映射到“男性”或“女性”。

dataframe['gender'].map({'m': 'male', fem.': 'female', ...})

第二种解决方案是使用模式匹配。例如,我们可以在字符串的开头查找性别中m或M的出现。

re.sub(r"\^m\$", 'Male', 'male', flags=re.IGNORECASE)

第三种解决方案是使用模糊匹配:一种算法,用于识别预期字符串与给定字符串之间的距离。它的基本实现计算将一个字符串转换为另一个字符串需要进行多少次操作。

Gender male femalem 3 5Male 1 3fem. 5 3FemalE 3 2Femle 3 1

此外,如果你有类似城市名称的变量,则怀疑在其中键入错误或类似字符串应被视为相同。例如,“lisboa”可以输入为“lisbona”,“Lisbon”等。

City Distance from "lisbon"lisbon 0lisboa 1Lisbon 1lisbona 2london 3...

如果是这样,那么我们应该将所有表示同一事物的值替换为一个唯一值。在这种情况下,将前4个字符串替换为“ lisbon”。

注意诸如“ 0”,“Not Applicable”,“ None”,“无”,“Null”或“ INF”之类的值,它们可能含义相同:该值丢失。

标准化

我们的职责不仅是识别拼写错误,而且还要将每个值都设置为相同的标准化格式。

对于字符串,请确保所有值均为小写或大写。

对于数值,请确保所有值都具有特定的度量单位。

例如,最高高度可以是米和厘米。1米的差异被认为与1厘米的差异相同。因此,这里的任务是将高度转换为一个单位。

对于日期,美国版本与欧洲版本不同。将日期记录为时间戳(以毫秒为单位)与将日期记录为日期对象不同。

缩放/转换 (Scaling/Transformation)

缩放意味着转换数据,使其适合特定的比例,例如0–100或0–1。

例如,可以将学生的考试分数重新缩放为百分比(0-100),而不是GPA(0-5)。

它还可以帮助简化某些类型的数据的绘制。例如,我们可能希望减少偏斜度以帮助绘图(当具有如此多的异常值时)。最常用的函数是对数,平方根和反函数。

也可以对具有不同度量单位的数据进行缩放。

由于两项考试的评分范围不同,因此无法比较不同考试的学生分数,例如SAT和ACT。1 分SAT分数的差异被认为与1分 ACT分数的差异相同。在这种情况下,我们需要重新定标SAT和ACT分数才能得出数字,例如介于0-1之间。

通过缩放,我们可以绘制和比较不同的分数。

正常化

虽然规范化还将值重新缩放为0–1的范围,但此处的目的是转换数据以使其以正态分布。为什么?

在大多数情况下,如果我们要使用依赖于正态分布数据的统计方法,则可以对数据进行标准化。怎么样?

一个可以使用log函数,或者也许使用以下方法之一。

根据所使用的缩放方法,数据分布的形状可能会发生变化。例如,“标准Z分数”和“学生的t统计法”保留了形状,而对数函数则不保留。

标准化与缩放(使用特性缩放)源

缺失值

鉴于缺少价值是不可避免的事实,这使我们面临着在遇到价值时该怎么办的问题。忽略丢失的数据与在船上挖洞相同。它会下沉。

有三种或可能更多的方式来处理它们。

第一,  下降。

如果一列中的缺失值很少发生并且是随机发生的,那么最简单,最向前的解决方案是删除具有缺失值的观察值(行)。

如果大多数列的值都丢失并且随机出现,则通常的决定是删除整列。

这在进行统计分析时特别有用,因为填写缺失值可能会产生意外或有偏差的结果。

第二,  归因。

这意味着根据其他观察结果计算缺失值。有很多方法可以做到这一点。

第一个是使用平均值,中位数等统计值。但是,这些都不保证数据的公正性,尤其是在缺少许多值的情况下。

均值在原始数据不偏斜时最有用,而中位数更健壮,对异常值不敏感,因此在数据偏斜时使用。

在正态分布的数据中,可以得到与平均值相差2个标准偏差以内的所有值。接下来,可以在(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

第二个是使用线性回归。根据现有数据,人们可以计算两个变量之间的最佳拟合线,例如,房价与面积m²。

值得一提的是,线性回归模型对异常值敏感。

第三个是Hot-deck:从其他类似记录中复制值。这个方法仅仅适用于当你有足够的可用数据时。并且,它可以应用于数值和分类数据。

可以采用随机方法,在该方法中,我们使用随机值填充缺失值。进一步采取这种方法,可以先根据某个特征(例如性别)将数据集分为两组(分层),然后随机分别填充不同性别的缺失值。

在顺序Hot-desk插补中,将根据辅助变量对包含缺失值的列进行排序,以使具有相似辅助功能的记录顺序出现。 接下来,每个缺少的值都将填充以下第一条可用记录的值。

更有意思的是,也可以使用�最近邻归集法,该归类法对相似的记录进行分类并将它们放在一起。然后通过首先找到最接近具有缺失值的记录的�个记录来填充缺失值。接下来,从最接近的邻居中选择一个值(或从中计算出一个值)。在计算的情况下,可以使用诸如均值的统计方法(如前所述)。

第三,标记。

有人认为,无论我们使用哪种估算方法,填写缺失值都会导致信息丢失。

那是因为说数据丢失本身是有用的,算法应该知道这一点。否则,我们只是在增强其他功能已经存在的模式。

当丢失数据不是随机发生时,这一点尤其重要。以一项进行调查为例,大多数来自特定种族的人拒绝回答某个问题。

丢失的数字数据可以用0填充,但是在计算任何统计值或绘制分布图时必须忽略这些零。

虽然分类数据可以用“Missing”(缺少)来填充:这是一个新类别,它表明缺少这部分数据。

下面这些情况也需要被考虑到…

缺少的值与默认值不同。

例如,零可以解释为缺失或默认值,但不能两者都解释为零。

缺失值不是“未知”。一些人不记得自己是否在学校被欺负的一项进行的研究应被视为“未知且不失踪”。

每次我们降低或估算值时,我们都会丢失信息。因此,举报可能会有所帮助。

离群值 (Outliers)

它们的值与所有其他观察值有显着差异。与Q1和Q3四分位数相差超过(1.5 * IQR)的任何数据值均被视为离群值。

在证明有罪之前,离群值是无辜的。话虽如此,除非有充分的理由,否则不应将其删除。

例如,人们可能注意到一些不太可能发生的怪异,可疑的价值,因此决定删除它们。不过,在删除之前,值得进行调查。

还值得一提的是,某些模型(例如线性回归)对异常值非常敏感。换句话说,离群值可能会使模型脱离大多数数据所在的位置。

记录中和跨数据集错误

这些错误是由于在同一行或跨数据集相互矛盾的两个或多个值引起的。

例如,如果我们有一个关于城市生活成本的数据集。总栏必须等于房租,交通和食物的总和。

city rent transportation food totallibson 500 20 40 560paris 750 40 60 850

同样,孩子不能结婚。员工的薪水不得低于所计算的税金。

同样的想法适用于跨不同数据集的相关数据。

验证

完成后,应通过重新检查数据并确保其规则和约束确实有效来验证正确性。

例如,在填写丢失的数据后,它们可能违反任何规则和约束。

否则,可能需要进行一些手动更正。

报告

报告数据的健康程度对于清洗同样重要。

如前所述,软件包或库可以生成所做更改,违反了哪些规则以及执行多少次的报告。

除了记录违规之外,还应考虑这些错误的原因。为什么它们首先发生?

最后的话……

如果你做到了那么远,我很高兴你能够坚持到最后。但是,所提及的内容如果不拥抱质量文化,就没有任何价值。

无论验证和清除过程多么强大和强大,随着新数据的传入,人们将继续遭受痛苦。

最好是预防疾病,而不要花时间和精力去纠正它。

这些问题有助于评估和改善数据质量

如何收集数据,以及在什么条件下?收集数据的环境确实很重要。环境包括但不限于位置,时间,天气状况等。

向受试者询问关于他们在上班途中的任何事情的意见与在家里时不同。在研究中使用平板电脑回答问卷有困难的患者可能会放弃结果。

数据代表什么?它包括所有人吗?只有城市里的人吗?或者,也许只有那些选择回答的人,因为他们对该主题有强烈的见解。

清除数据的方法有哪些,为什么? 在不同情况下或使用不同的数据类型时,不同的方法可能更好。

你是否花费时间和金钱来改进流程? 投资人和过程与投资技术一样关键。

原文作者:Omar Elgabry
翻译作者:Chen
美工编辑:过儿
校对审稿:Dongdong
原文链接:https://towardsdatascience.com/the-ultimate-guide-to-data-cleaning-3969843991d4