我花了几个月的时间分析来自传感器、调查及日志等相关数据。不管我用多少图表,设计多么复杂的算法,结果老是会与预期不一样。更糟糕的是,当你向首席执行官展现你的新发现时,他/她总会发现缺陷,你的发现与他们的理解彻底不符- 毕竟,他们是比你更了解领域的专家,而你只是数据工程师或开发人员。git
你为你的模型引入了大量脏数据,没有清理数据,你告诉你的公司用这些结果作事情,结果确定是错的。数据不正确或不一致会致使错误的结论,所以,清理和理解数据对结果的质量都会有很大影响。正则表达式
垃圾进垃圾出算法
实际上,简单算法的做用可能超过复杂的算法,由于它被赋予了足够高质量的数据。数据库
质量数据优于花哨的算法dom
出于这些缘由,重要的是要有一个分步指南,一个备忘单。首先,咱们想要实现的目标是什么?质量数据是什么意思?质量数据的衡量标准是什么?了解你想要完成的任务,在采起任何行动以前,你的最终目标相当重要。函数
· 数据质量(合法性,准确性,完整性,一致性)spa
· 工做流程(检查,清洁,验证,报告)设计
· 检查(数据分析,可视化,软件包)3d
· 清理(无关数据,重复数据,类型转换,语法错误)日志
· 验证
· 总结
除了维基百科上的质量标准以外,我找不到更好的解释质量标准。因此,我将在这里总结一下。
数据符合定义的业务规则或约束的程度。
· 数据类型约束:特定列中的值必须是特定的数据类型,例如,布尔值,数字,日期等。
· 范围约束:一般,数字或日期应在特定范围内。
· 强制约束:某些列不能为空。
· 惟一约束:字段或字段组合在数据集中必须是惟一的。
· Set-Membership约束:列的值来自一组离散值,例如枚举值。例如,一我的的性别多是男性或女性。
· 外键约束:在关系数据库中,外键列不能具备引用的主键中不存在的值。
· 正则表达式模式:必须采用特定模式的文本字段。例如,电话号码可能须要具备模式(999)999-9999。
· 跨领域验证:跨越多个领域的某些条件必须成立。例如,患者出院的日期不能早于入院日期。
数据接近真实值的程度。
虽然定义全部的值容许出现无效值,但这并不意味着它们都是准确的。
一个有效的街道地址可能实际上并不存在,一我的的眼睛颜色,好比蓝色,多是有效的,但不是真的。另外一件须要注意的是精度和精度之间的差别。
全部必需数据的已知程度。因为各类缘由,数据可能会丢失。若是可能的话,能够经过质疑原始来源来缓解这个问题,好比从新得到这个主题的数据。
数据在同一数据集内或跨多个数据集的一致程度。当数据集中的两个值相互矛盾时,就会出现不一致。
离婚后,有效年龄,例如10岁,可能与婚姻情况不符。客户被记录在具备两个不一样地址的两个不一样表中。哪个是真的?
工做流程一共四个步骤,旨在生成高质量的数据,并考虑到咱们所讨论的全部标准。
1.检查:检测不正确和不一致的数据。
2.清洁:修复或删除发现的异常。
3.验证:清洁后,检查结果以验证是否正确。
4.报告:记录所作更改和当前存储数据质量的报告。
实际上,你所看到的顺序过程是一个迭代的,无穷无尽的过程。当检测到新的缺陷时,能够从验证到检查。
检查数据很是耗时,而且须要使用许多方法来探索用于错误检测的基础数据。下面是其中的一些:
一个汇总统计有关数据的数据分析是真正有用的,它能够提供有关数据质量的整体思路。例如,检查特定列是否符合特定标准或模式。数据列是记录为字符串仍是数字?丢失了多少个值?列中有多少个惟一值及其分布?此数据集是否与另外一个数据集连接或有关系?
经过使用诸如平均值、标准误差、范围或分位数等统计方法分析和可视化数据,能够找到意外且所以错误的值。
例如,经过可视化各国的平均收入,可能会看到有一些异常值。这些异常值值得研究,不必定是不正确的数据。
使用你的语言提供的几个软件包或库将容许你指定约束并检查数据是否违反这些约束。此外,他们不只能够生成违反哪些规则的报告,还能够建立哪些列与哪些规则相关联的图表。
数据清理涉及基于问题和数据类型的不一样技术。能够应用不一样的方法,每种方法都有本身的权衡。总的来讲,不正确的数据被删除,纠正或估算。
不相关的数据是那些实际上不须要的数据,而且不适合咱们试图解决的问题。例如,若是咱们分析有关人口整体健康情况的数据,则不须要电话号码。一样,若是你只对某个特定国家/地区感兴趣,则不但愿包含全部其余国家/地区。只有当你肯定某个数据不重要时,你才能够放弃它。不然,你就须要探索特征变量之间的相关矩阵。
即便你注意到没有相关性,你应该问一个域专家。你永远不会知道,一个彷佛可有可无的特征,从实际经验来看,可能很是重要。
重复项是数据集中重复的数据点。
例如:
· 数据来自不一样来源;
· 用户可能会两次点击提交按钮,认为表单实际上没有提交;
· 提交了两次在线预订请求,纠正了第一次意外输入的错误信息。
确保将数字存储为数字数据类型,日期应存储为日期对象,或Unix时间戳(秒数),依此类推。若是须要,能够将分类值转换为数字和从数字转换。
须要注意的是,没法转换为指定类型的值应转换为NA值(或任何值),并显示警告。这表示值不正确,必须修复。
删除空格:应删除字符串开头或结尾的额外空格。
" hello world " => "hello world
填充字符串:字符串能够用空格或其余字符填充到必定宽度。例如,某些数字代码一般用前缀零表示,以确保它们始终具备相同的位数。
313 => 000313 (6 digits)
拼写错误:字符串能够经过多种不一样方式输入,毫无疑问,可能会出错。
Gender
m
Male
fem.
FemalE
Femle
这个分类变量被认为有5个不一样的类,而不是预期的2个:男性和女性。所以,咱们的职责是从上述数据中识别出每一个值是男性仍是女性。咱们能够怎么作呢?
第一种解决方案是手动将每一个值映射到“男性”或“女性”。
dataframe['gender'].map({'m': 'male', fem.': 'female', ...})
第二种解决方案是使用模式匹配。例如,咱们能够在字符串的开头查找性别中m或M的出现。
re.sub(r"\^m\$", 'Male', 'male', flags=re.IGNORECASE)
第三种解决方案是使用模糊匹配:一种算法,用于识别预期字符串与给定字符串之间的距离。它的基本实现计算将一个字符串转换为另外一个字符串所需的操做数。
Gender male female
m 3 5
Male 1 3
fem. 5 3
FemalE 3 2
Femle 3 1
此外,若是你有一个像城市名称这样的变量,你怀疑拼写错误或相似字符串应该被视为相同。例如,“lisbon”能够输入为“lisboa”,“lisbona”,“Lisbon”等。
City Distance from "lisbon"
lisbon 0
lisboa 1
Lisbon 1
lisbona 2
注意“0”,“NA”,“无”,“空”或“INF”等值,它们可能意味着一样的事情:缺乏价值。
咱们的职责是不只要识别拼写错误,还要将每一个值放在同一标准格式中。对于字符串,请确保全部值都是小写或大写。
对于数值,请确保全部值都具备特定的测量单位。例如,高度能够是米和厘米。1米的差别被认为与1厘米的差别相同。所以,这里的任务是将高度转换为单个单位。
对于日期,美国版本与欧洲版本不一样。将日期记录为时间戳(毫秒数)与将日期记录为日期对象不一样。
缩放意味着转换数据以使其适合特定的比例,例如0-100或0-1。
例如,能够将学生的考试分数从新缩放为百分比(0-100)而不是GPA(0-5)。
它还能够帮助使某些类型的数据绘图更容易。例如,咱们可能但愿减小偏斜以帮助绘图(当有这么多异常值时)。最经常使用的函数是log,square root和inverse。缩放也能够在具备不一样测量单位的数据上进行。
虽然规范化也将值从新调整为0-1的范围,但目的是转换数据以使其正常分布。为何?
由于在大多数状况下,若是咱们要使用依赖于正态分布数据的统计方法,咱们会对数据进行标准化。怎样完成?
可使用日志功能,也能够使用其中一种方法。
根据使用的缩放方法,数据分布的形状可能会发生变化。例如“标准Z分数”和“学生t统计量”保留了形状,而日志功能则没有。
规范化与缩放(使用特征缩放)
鉴于缺失值是不可避免的,让咱们在遇到它们时该怎么作。有三种或许更多的方法来处理它们。
若是列中的缺失值不多发生而且随机发生,那么最简单和最正确的解决方案是删除具备缺失值的观察值(行)。若是缺乏大多数列的值,而且随机发生,则典型的决定是删除整列。
这在进行统计分析时特别有用。
这意味着根据其余观察结果计算缺失值。有不少方法能够作到这一点:
1、使用统计值,如均值,中位数。可是,这些都不能保证得到无偏的数据,特别是在有许多缺失值的状况下。
当原始数据不偏斜时,平均值最有用,而中值更稳健,对异常值不敏感。在正态分布的数据中,能够得到与均值相差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
2、使用线性回归。根据现有数据,能够计算出两个变量之间的最佳拟合线,好比房价与面积m2。值得一提的是,线性回归模型对异常值很敏感。
3、Hot-deck:从其余相似记录中复制值。这仅在你有足够的可用数据时才有用。而且,它能够应用于数值的且已经分类的数据。
另外咱们还能够采用随机方法,用随机值填充缺失值。进一步采用这种方法,能够先将数据集分红两组,基于某些特征,好比性别,而后随机分别填写不一样性别的缺失值。
一些人认为,不管咱们使用何种插补方法,填写缺失值都会致使信息丢失。这是由于说缺乏数据自己就是信息性的,算法知道它。当丢失的数据不是随机发生时,这一点尤其重要。举一个例子,一个特定种族的大多数人拒绝回答某个问题。
丢失的数据能够用例如0填充,但在计算任何统计值或绘制分布时必须忽略这些零。虽然分类数据能够用“缺失”填写:一个新的类别,它告诉咱们缺乏这一数据。
它们的值与全部其余观察值显著不一样。远离Q1和Q3四分位数的任何数据值(1.5 * IQR)都被认为是异常值。
在被证实以前,异常值是无辜的。话虽如此,除非有充分理由,不然不该删除它们。例如,人们能够注意到一些不太可能发生的奇怪的,可疑的值,所以决定将它们删除。虽然,他们值得调查以前删除。
值得一提的是,某些模型,如线性回归,对异常值很是敏感。换句话说,异常值可能会使模型脱离大多数数据所在的位置。
这些错误是因为在同一行中有两个或多个值,或者是在彼此相互矛盾的数据集中。例如,若是咱们有一个关于城市生活成本的数据集。总列数必须等于租金,运输和食物的总和。一样,孩子不能结婚。员工的工资不能低于计算的税额。相同的想法适用于不一样数据集的相关数据。
完成后,应经过从新检查数据并确保其规则和约束确实存在来验证正确性。
例如,在填写缺失数据后,它们可能违反任何规则和约束。若是不可能,可能会涉及一些手动校订。
报告数据的健康程度对清洁一样重要。如前所述,软件包或库能够生成所作更改的报告,违反了哪些规则以及多少次。
除了记录违规外,还应考虑这些错误的缘由。为何他们发生?
我很高兴你能坚持到最后。可是,若是不接受质量文化,所提到的内容都没有价值。
不管验证和清理过程多么强大和强大,随着新数据的进入,咱们必须将继续受苦。最好是保护本身免受疾病的侵害,而不是花时间和精力去补救它。