基本数据检查测试

机器算法验证 数据集 异常值 检查
2022-02-10 22:06:12

在我的工作角色中,我经常使用其他人的数据集,非专家给我带来临床数据,我帮助他们总结并进行统计测试。

我遇到的问题是,我带来的数据集几乎总是充满错别字、不一致和各种其他问题。我很想知道其他人是否进行了标准测试来尝试检查传入的任何数据集。

我曾经绘制每个变量的直方图只是为了看看,但我现在意识到有很多可怕的错误可以在这个测试中幸存下来。例如,前几天我有一个重复测量数据集,对于某些人来说,重复测量在时间 2 和时间 1 是相同的。后来证明这是不正确的,正如你所期望的那样。另一个数据集有一个人从非常严重的无序(以高分表示)变为没有问题,以全线 0 表示。这是不可能的,尽管我无法确定地证明这一点。

那么我可以在每个数据集上运行哪些基本测试以确保它们没有拼写错误并且它们不包含不可能的值?

提前致谢!

4个回答

它有助于了解数据是如何记录的。

让我分享一个故事很久以前,许多数据集只存储在褪色的硬拷贝中。在那些黑暗的日子里,我与一个组织(拥有伟大的血统和规模;你们中的许多人可能拥有它的股票)签订了合同,将其其中一家制造厂的大约 10^5 条环境监测数据记录计算机化。为此,我亲自标记了实验室报告的架子(以显示数据的位置),创建数据输入表格,并与临时机构签约以进行识字工人将数据输入表格。(是的,您必须为能够阅读的人支付额外费用。)由于数据的价值和敏感性,我一次与两名工人并行执行此过程(他们通常每天都在变化)。花了几个星期。我编写了软件来比较两组条目,系统地识别和纠正所有出现的错误。

男孩有错误!会出什么问题?描述和测量误差的一个好方法是在基本记录的级别上,在这种情况下,它是对在给定监测点上获得的特定样品的单个分析结果(通常是某种化学物质的浓度)的描述给定日期。在比较这两个数据集时,我发现:

  • 遗漏错误:一个数据集将包含记录,另一个则不包含。这通常是因为(a)在页面底部会忽略一两行,或者(b)会跳过整个页面。

  • 明显的遗漏错误实际上是数据输入错误。记录由监测点名称、日期和“分析物”(通常是化学名称)标识。如果其中任何一个有印刷错误,它将不会与与之相关的其他记录匹配。实际上,正确的记录消失了,错误的记录出现了。

  • 假复制相同的结果可以出现在多个来源中,被多次转录,并且似乎是真正的重复测量,但实际上并非如此。重复项很容易检测,但确定它们是否错误取决于是否知道重复项是否应该出现在数据集中。有时候你就是不知道。

  • 坦率的数据输入错误“好”的很容易被抓住,因为它们改变了数据的类型:例如,使用字母“O”代表数字“0”,将数字变成非数字。其他好的错误会极大地改变值,以至于可以通过统计测试轻松检测到。(在一种情况下,“1,000,010 mg/Kg”中的前导数字被截断,留下了 10 的值。当您谈论农药浓度时,这是一个巨大的变化!)糟糕的错误很难被发现,因为它们会改变一个与其余数据相匹配(某种程度)的值,例如为“50”键入“80”。(这种错误一直发生在 OCR 软件中。)

  • 换位可以输入正确的值,但与错误的记录键相关联。这是阴险的,因为数据集的全局统计特征可能保持不变,但可以在组之间创建虚假差异。可能只有像复式输入这样的机制甚至能够检测到这些错误。

一旦您意识到这些错误并知道它们是如何发生的,或者有一个理论,您就可以编写脚本来控制您的数据集以查找可能存在的此类错误,并将它们标记为进一步关注。你不能总是解决它们,但至少你可以包含一个“评论”或“质量标志”字段,以在他们以后的分析中伴随数据。

从那时起,我就开始关注数据质量问题,并有更多机会对大型统计数据集进行全面检查。没有一个是完美的;他们都受益于质量检查。我多年来为此制定的一些原则包括

  1. 只要有可能,在数据输入和数据转录过程中创建冗余:校验和、总计、重复输入:任何支持自动内部一致性检查的东西。

  2. 如果可能,创建和利用另一个描述数据应该是什么样子的数据库:计算机可读的元数据。 例如,在药物实验中,您可能事先知道每位患者将被看 3 次。这使您可以创建一个数据库,其中包含所有正确的记录及其标识符以及等待填写的值。用给定的数据填写它们,然后检查重复、遗漏和意外数据。

  3. 无论您计划如何格式化数据集以进行分析,始终对您的数据进行规范化(具体而言,将它们至少转换为第四范式)。这迫使您为正在建模的每个概念上不同的实体创建表。(在环境案例中,这将包括监测位置、样品、化学品(特性、典型范围等)、这些样品的测试(测试通常涵盖一套化学品)以及这些测试的个别结果的表格。在这样做的过程中,您可以对数据质量和一致性进行许多有效检查,并识别许多可能丢失、重复或不一致的值。

    这项工作(需要良好的数据处理技能,但很简单)非常有效。如果您渴望分析大型或复杂的数据集,并且对关系数据库及其理论没有很好的工作知识,请尽快将其添加到您的学习清单中。它将在您的整个职业生涯中带来红利。

  4. 始终尽可能多地执行“愚蠢”检查这些是对明显事物的自动验证,例如日期落在预期的时期内,患者(或化学品或其他)的数量总是正确地加起来,值总是合理的(例如,pH 值必须在 0 到 14 之间,并且可能在例如,血液 pH 值读数的范围要窄得多)等。这是领域专业知识可以提供最大帮助的地方:统计学家可以无所畏惧地向专家提出愚蠢的问题,并利用答案来检查数据。

当然可以说的更多——这个主题值得一本书——但这应该足以激发想法。

@whuber 提出了很好的建议;我只会添加这个:地块,地块,地块,地块。散点图、直方图、箱线图、线图、热图和任何你能想到的东西。当然,正如您发现的那样,有些错误在任何情节上都不明显,但它们是一个很好的起点。只要确保您清楚您的软件如何处理丢失的数据等。

根据上下文,您可以发挥创意。对于多变量数据,我喜欢做的一件事是拟合某种因子模型/概率 PCA(对缺失数据进行多重插补的东西),并查看尽可能多的组件的分数。在不太重要的组件/因素上得分高的数据点通常是您可能看不到的异常值。

我倾向于检查的大事:

  1. 变量类型 - 查看数字是数字,而不是因子/字符(可能表明输入的数据有问题)
  2. 一致的值级别 - 查看名称为“t1”的变量没有再次找到名称为“t1”或“t 1”的变量
  3. 异常值 - 看到值的范围是有意义的。(你的血压值是 0 还是负值?)。在这里,我们有时会发现有人将 -5 编码为缺失值,或类似的东西。
  4. 线性限制。我不使用它,但有些人发现他们希望对某些列的依赖关系进行重构(列 A、B 必须添加到 C 或类似的东西)。为此,您可以查看deducorrect 包(我在上次用户会议上遇到了演讲者 Mark van der Loo - 他的包给我留下了深刻的印象)
  5. 随机性太小。有时值必须四舍五入到某个值,或者在某个点被截断。这些类型的东西在散点图中通常更清楚。
  6. 缺失值 - 确保缺失与其他变量无关(随机缺失)。但我没有经验法则可以在这里给出。
  7. 空行或大部分没有值的行。这些应该(通常)找到并省略。

顺便说一句,好问题 - 我希望阅读其他人在这件事上的经验。

当您有时间测量(“纵向数据”)时,检查梯度和边缘分布通常很有用。这个梯度可以在不同的尺度上计算。更一般地,您可以对数据(傅立叶、小波)进行有意义的转换,并检查转换后数据的边缘分布。