测量数据质量并不是一个新领域。数据分析工具已经上市很多年,旨在帮助数据工程师更好地了解他们的数据中有什么以及他们可能需要修复什么。在数据分析的早期,尽管此类工具可以提供丰富的功能来查看数据集的质量,但回答这些简单的问题并不容易:
•这个数据集的整体质量有多好?
•这两个数据集哪一个数据质量更好?
•与上个月相比,该数据集的数据质量如何?
即使在使用早期的单一数据分析工具时,您也可以使用不同的功能从不同角度查看数据,从而评估数据集的质量:
您可以使用数据分析器收集的统计数据来确定在数据集中检测到的哪些值或格式在每一列中应被视为有效或无效。
您可以将每列的域有效性定义为有效值的最小/最大范围,或者将其指向参考值列表。
您可以检测或分配每一列的数据类,并搜索与预期数据类不匹配的值。
您可以查看缺失的值。
您可以识别主键候选并搜索意外的重复值。
您可以识别表之间的主外键 (PK-FK) 关系,并在外键列中搜索关系主键上未找到的孤立值。
您可以定义数据规则来对数据设置任何非平凡的额外期望。
尽管这些特征本身都很强大,可以为专家提供有趣的单独指标但它们的结果并不适合回答本文介绍中列出的简单问题。主要原因是人们不擅长将多维指标相互比较,尤其是当这些结果不包含完全相同的指标,或者从具有不同行数、列数或应匹配不同约束/规则的不同数据集计算得出时。
由于数据湖、数据科学、数据治理以及所有这些围绕数据的新型活动的出现,数据目录变得越来越重要,数据质量不仅对专家用户来说很重要,而且需要让非专家也能理解。
在之前的文章中,我展示了如何自动采集、分析、分类、管理大量数据集,并将其提供给数据科学家或数据分析师等消费者。这些用户需要以自助服务模式找到具有正确质量的正确数据集。对于这种情况,显然需要一个更简单的指标来很好地了解数据集的质量水平,而不必查看详细信息,即使这些详细信息在第二次查看时仍然可用。
但是如何设计一个好的数据质量分数呢?
鉴于数据质量可以从很多不同的角度看待,并且可以通过不同的指标进行衡量,因此计算质量分数的公式并不明显。为了更好地理解如何计算质量分数,让我们首先看一下对此类分数的要求:
数据质量分数应该简单易懂:当在目录中查看大量数据集时,应该能够快速识别高质量或低质量的数据集,而无需查看详细信息。
数据质量分数不应该取决于数据集的行数、列数或设置的约束:例如,如果通过分析数据集的所有行来计算大型数据集的数据质量分数,那么该分数应该大致相同,就像在较小的样本上计算一样——假设采样足够好,具有统计代表性。
数据质量分数应该与其他数据质量分数具有可比性,即使每个分数使用的指标不同和/或比较的数据集具有不同的行数和列数。
数据质量分数应该是标准化的:它应该提供一个明确的最低和最高分数范围,以便用户可以看到数据集的数据质量与理想质量相差多远。
为了定义一个公式,将各种数据质量函数计算出的不同指标转换为符合这些要求的分数,我们首先需要形式化我们对一般数据质量概念和具体数据质量分数的理解。
数据质量有很多定义。但一个简单的定义可能是:测量数据集的数据质量就是测量数据集与您对数据的期望的匹配程度。
这意味着数据质量分数只能取决于您对数据的期望,而不是一些原始的发现。
这听起来可能很明显,但这意味着如果我们在某一列中发现大量缺失值,但我们确实预计该列中会有缺失值,或者我们不关心那里的缺失值,那么数据集的数据质量得分不应该因为发现缺失值而降低。这也意味着,如果我们对数据没有具体的期望,那么无论数据中有什么,数据质量得分都应该是最大的。这些简单而明显的事实对于建立分数的架构非常重要。
约束和数据质量问题的概念
让我们定义一些在数据质量分数计算中起重要作用的概念:
我们对数据的期望就是所谓的约束。约束可以用不同的形式来表达:
它可以是设置在列上的简单标志,以指示此列中的值不应为空,或者应不同,或者不应有符号。
它可以是列的域有效性的定义,设置为最终的最小或最大允许值,或者指向定义列的可接受域的参考值列表的指针它可以是分配给列的数据类,它不仅描述列的内容,还可以用来识别不符合列预期域的值。
它可以是两个数据集之间的已识别关系,设置多列之间的相关性或功能依赖性。
它可以是一个表达非平凡类型约束的数据规则,甚至可能涉及多个表。
无论何时,只要数据不满足任一约束条件,就会存在数据质量问题。
数据质量问题是指针对数据集的单个单元格、单个行、单个列或一组列或整个数据集报告的特定数据质量问题类型。数据质量问题报告的数据质量问题类型取决于数据未满足的约束类型。
可以以一定的频率在列或数据集上检测到数据质量问题。相对频率(以具有质量问题的列/数据集的所有值的百分比计算)就是我们所说的问题的普遍性。
例如,如果数据集有 100 行,并且在标记为必填或不可空的列中检测到 15 个缺失值,则该列将报告问题类型为“缺失值”的数据质量问题,发生率为15%。
隐式或显式约束以及数据质量问题的置信度概念
除了普遍性之外,数据质量问题还可能与置信度相关。置信度表示所报告的问题是真实问题的概率。
为了更好地理解这个概念,你需要明白,并非所有对数据设置的约束都是由人指定或确认的明确约束——我们将这种指定或确认的约束称为显式约束。
如果数据质量仅基于明确的约束来衡量,那么我们就不需要置信度的概念,因为所有由人指定而某些数据不遵守的约束都会导致置信度 100% 的数据质量问题——我们确信该问题是一个真正的问题,因为有人已经指定任何不满足此约束的事物都应被视为数据质量问题。
但如果我们只考虑明确的约束,那么所有数据集的得分都会从 100% 开始,直到有人花时间查看并指定约束。这会导致要么有大量数据集具有高质量的假象,要么导致需要管理员仔细审查每个摄取的数据集,这对于大量导入来说并不好。
因此,在数据质量分析期间,系统可能会根据数据中看到的内容尝试猜测一些约束。例如,如果一列的大多数数据不为空,或者它们使用相同的格式或具有任何可识别的模式(即使某些值不遵循这些模式),则系统可能会假设存在隐式约束,并且不满足该约束的值可能是数据质量问题。
由于隐式约束是系统根据数据中看到的内容推断出来的,因此它与置信度的概念相关,确定系统对这是一个真实约束的确定程度。
例如,如果某列中 95% 的值都是 5 位数字,但 5% 的值格式完全不同,则系统可能会(根据设置)假设此列存在隐式约束,即值应为 5 位数字,置信度为 95%。如果用户查看并确认此隐式约束,则它将成为显式约束,置信度为 100%。
检测到的质量问题的普遍性和置信度都将用于计算实际质量分数。
将其整合成统一的质量得分
现在我们已经介绍了在数据质量分数中发挥作用的所有重要概念,让我们通过一个简单的示例来了解如何计算分数:
假设有一个简单的数据集,有 3 列 6 行,并且已识别出以下数据质量问题:
第 1 行违反了数据规则。由于数据规则是由用户指定的,因此它是一个显式约束,问题的置信度为100%。
第 3 行是重复行,但没有明确的约束表明不应允许重复行。然而,根据数据,分析确定该数据集不应出现重复行的可能性为 70%。=> 数据集上有一个隐式约束,以70% 的置信度表明不应有任何重复记录。
第 2 行和第 Col1 列的单元格不满足置信度为 80% 的隐式约束,该约束定义了有效域应该是什么。例如,如果分析确定了此列的推断数据类,置信度为 80%,并且该单元格中的值与数据类不匹配,则可能出现这种情况。
列 Col 2已设置显式约束,表明此列中的所有值应不同,但分析发现其中有 20% 的重复值。这导致置信度为 100%且普遍率为 20% 的数据质量问题。
除此之外,第 4 行第 2 列的值缺失,并且存在90% 的置信度隐含约束,即此列中不应出现缺失值。
最后,第 5 行/第 3 列的单元格似乎是此列的异常值,置信度为 60%。异常值始终是隐式约束,因为没有硬性规则定义某个值是否为异常值。
单个单元格的数据质量评分
请注意,单个单元格、列或行可能存在多个数据质量问题,并且如果可能的话,该问题不应重复计算:如果单个值同时违反其预期数据类和预期格式,则不应对列或数据集的数据质量分数进行双重标记,因为只有一个值是无效的,无论该值有多少个问题。
基于此,数据集中单个单元格的得分可以计算为该值完全没有问题的概率。这可以计算为 100% 减去单元格上检测到的每个问题的置信度。为了说明这一点:如果我们例如 90% 确信某个单元格存在问题,那么值没有问题的概率就是 100–90=10%。如果问题的置信度为 100%(对于明确约束),那么值没有问题的概率就是 100–100=0%
对于在数据集中各个单元上报告的数据质量问题,计算单元分数的公式如下。
仅考虑单元格级别报告的问题的单个细胞质量评分,假如某个区域出现2个问题,一个置信度为80%,另一个置信度为60%,那么根据概率定律,第一个问题不是真实的概率为100%-80%=20%,第二个问题不是真实的概率为100%-60%=40%,而所有问题都不是真实的、该区域没有数据质量问题的概率只有20%乘以40%=8%。
现在回想一下,我在本文开头提到过,数据质量问题也可以针对整行、整列或整组数据集进行报告。我们需要将这些问题的影响分布到单元格的分数上。
对于针对整行报告的问题,这很容易,因为如果该行无效,我们可以假设该行的所有值都是无效的。此类问题对单元格分数的影响可以按以下方式计算:
仅考虑行级报告的问题的单元格质量得分,conf(pb[row])在这里表示针对正在测量的单元格的行报告的一行级数据质量问题的置信度。
但是,完整列报告的问题需要根据问题的普遍性在该列的所有值之间平均分配。普遍性告诉我们,n%的值受到该问题的影响,尽管我们不知道哪些值存在问题,哪些值不存在问题。因此,每个值的分数都会降低一个因子,该因子等于普遍性乘以问题真实性的置信度,如以下公式所示:
仅考虑列级别报告的问题的质量得分,conf(pb[col])表示针对被测量单元格的列报告的一个列级数据质量问题的置信度,而prev(pb[col])表示其普遍性 - 即列中存在该问题的值的百分比。
针对整个数据集报告的数据质量问题的影响在所有单元中以相同的方式分布:
质量得分仅考虑数据集级别报告的问题,考虑到细胞本身、其列、其行或数据集上报告的所有问题,单个细胞的最终数据质量得分可以计算如下:
考虑所有问题的细胞质量得分
某列的数据质量分数
上述公式为计算数据集中每个单元格标准化为 0% 到 100% 之间的数据质量得分奠定了基础。基于此,计算任何列的数据质量得分变得像计算该列每个值的数据质量得分的平均值一样简单。
某一行的数据质量分数
以相同的方式,可以通过对行中每个单元格计算的分数取平均值来计算数据集中任意行的分数。
数据集的数据质量分数
计算数据集的数据质量分数就变得像计算每列分数的平均值或每行分数的平均值一样简单。
注意,这也与计算所有单元格得分的平均值相同。由于公式的对称性,所有这些计算都将返回相同的结果,这使其变得优雅。
例子:
让我们将这些公式应用到我们之前的具体例子上: