3. 数据质量度量指标:如何定义和计算
指标这东西,说起来简单,做起来全是坑。我见过太多团队一上来就拍脑袋定指标,结果跑了一个月发现数据质量「看起来很好」,业务部门却天天投诉数据不能用。
为什么会这样?因为指标定义没对齐业务语义。今天我们就聊聊怎么把完整率、准确率、及时率这些指标真正落地。
3.1 核心指标的定义与计算
我个人习惯把数据质量指标分成四类:完整性、准确性、及时性和一致性。这四类基本覆盖了90%的监控场景。
3.1.1 完整率
完整率衡量的是数据有没有缺失。但「缺失」的定义其实很微妙。
- 字段级完整率:某个字段非空记录数 / 总记录数 × 100%
- 记录级完整率:关键字段全部非空的记录数 / 总记录数 × 100%
- 表级完整率:预期行数 / 实际行数 × 100%(常用于增量表)
3.1.2 准确率
准确率是最难定义的指标。说白了,你得先知道「什么是正确的数据」。
我在项目中遇到过这样的场景:业务说「这个订单金额不对」,但数据仓库里存的就是业务系统传过来的值。那到底是数据不准,还是业务系统本身就有问题?
常见的准确率计算方式:
- 规则校验准确率:通过预设规则(如金额>0、日期格式正确)的记录占比
- 交叉验证准确率:与权威数据源比对一致的记录占比
- 人工抽检准确率:抽样人工核验,正确样本数 / 总样本数
3.1.3 及时率
及时率衡量数据能不能在预期时间内到达。这个指标在实时数仓场景下尤其重要。
| 类型 | 定义 | 计算公式 |
|---|---|---|
| T+1 及时率 | 次日指定时间前完成的数据占比 | 按时到达表数 / 总表数 × 100% |
| 实时延迟率 | 数据从产生到可用的延迟时间 | 延迟 ≤ 阈值记录数 / 总记录数 × 100% |
| 批次完成率 | ETL任务在SLA内完成的占比 | 按时完成任务数 / 总任务数 × 100% |
嗯,这里要注意:及时率的阈值设定不能太死。比如T+1报表,如果业务要求早上8点前看到数据,那你的SLA就得定在7:30,留出缓冲。
3.1.4 一致性
一致性检查的是不同系统、不同表之间的数据是否对得上。我见过最典型的场景:CRM系统里客户有100万,但财务系统里只有80万,两边口径不一样。
- 跨系统一致性:A系统与B系统关键指标比对,差异率 = 差异记录数 / 总记录数
- 表间一致性:主表与明细表汇总金额是否一致
- 历史一致性:当前数据与历史同期数据波动是否在合理范围
3.2 指标阈值的设定方法
指标定义好了,阈值怎么设?拍脑袋肯定不行。我总结了一套「三步走」的方法。
3.2.1 第一步:基线采集
先跑两周到一个月的历史数据,把指标的分布情况摸清楚。比如完整率,过去30天最低是多少?平均是多少?波动范围有多大?
基线采集要点:
- 采集周期至少覆盖一个完整业务周期(比如包含周末和月末)
- 排除已知的异常时间段(如系统升级、数据迁移)
- 记录指标的均值、P5、P25、P50、P75、P95分位数
3.2.2 第二步:阈值分级
我个人习惯把阈值分成三级:
| 级别 | 含义 | 阈值设定参考 | 响应方式 |
|---|---|---|---|
| Warning | 指标异常波动,需关注 | P5 ~ P25 或 P75 ~ P95 | 邮件通知,记录日志 |
| Critical | 指标明显恶化,需立即处理 | 低于P5 或 高于P95 | 短信/电话告警,触发应急流程 |
| Fatal | 数据不可用,需阻断下游 | 低于业务最低容忍线 | 自动熔断,停止数据分发 |
3.2.3 第三步:动态调整
阈值不是设完就不管了。业务在变,数据特征也在变。我建议每季度重新评估一次阈值。
- 季节性调整:双11、618期间,数据量暴增,阈值要放宽
- 业务变更调整:新业务上线、数据源切换,需要重新采集基线
- 异常事件复盘:每次告警后,复盘阈值是否合理,是否需要调整
3.3 指标体系的整体架构
下面这张图是我常用的数据质量指标体系架构,你可以参考一下。
3.4 一个完整的计算示例
光说不练假把式。我们拿一个订单表来演示一下。
假设订单表有10万条记录,我们关注三个字段:订单ID、订单金额、下单时间。
-- 完整率计算
字段完整率(订单金额) = 非空记录数 / 总记录数
= 99,500 / 100,000
= 99.5%
记录级完整率(三个字段都非空) = 99,200 / 100,000
= 99.2%
-- 准确率计算(规则校验)
规则:订单金额 > 0 且 < 100万
通过规则记录数 = 99,000
规则校验准确率 = 99,000 / 100,000 = 99.0%
-- 及时率计算(T+1场景)
预期:每天8:00前完成数据加载
过去30天按时完成天数 = 28天
T+1及时率 = 28 / 30 = 93.3%
阈值设定示例:
- 完整率:Warning < 99.0%,Critical < 98.0%
- 准确率:Warning < 98.5%,Critical < 97.0%
- 及时率:Warning < 95.0%,Critical < 90.0%
你想想看,如果完整率从99.5%掉到98.0%,意味着多了1500条缺失记录。对于订单金额这种核心字段,这1500条可能就是几十万的损失。所以阈值设得严一点,没坏处。