数据质量六大维度:从定义到可量化度量
聊数据质量,绕不开这六个维度。我做了这么多年数据治理,见过太多团队一上来就搞「数据质量评分」,结果连完整性都没搞清楚就开始打分——那分数能信吗?
今天我把这六个维度掰开揉碎了讲。每个维度我都会说清楚:它到底在衡量什么?怎么算?实际项目中容易踩什么坑?
核心原则:数据质量不是「好」或「坏」的定性判断,而是可量化的度量。你给不出数字,就谈不上治理。
1. 完整性:数据有没有「缺胳膊少腿」
完整性衡量的是数据缺失程度。说白了,就是该有的字段有没有值,该有的记录有没有漏掉。
定义:数据集中非空值记录占应填记录的比例。
度量方法:
- 字段级完整性 = 非空记录数 / 总记录数 × 100%
- 记录级完整性 = 所有必填字段均非空的记录数 / 总记录数 × 100%
- 表级完整性 = 实际记录数 / 预期记录数 × 100%
-- 字段级完整性示例:检查客户手机号字段
SELECT
COUNT(*) AS total_records,
COUNT(phone) AS non_null_phone,
ROUND(COUNT(phone) * 100.0 / COUNT(*), 2) AS completeness_pct
FROM customer;
我的经验:完整性阈值不要一刀切。核心业务字段(如订单金额)要求 99.9% 以上,辅助字段(如备注)可以放宽到 80%。我曾经见过一个项目,硬性要求所有字段 100% 完整,结果业务方为了达标,大量填入「无」「N/A」这类垃圾值——完整性上去了,数据质量反而更差了。
2. 准确性:数据是不是「对的」
完整性只告诉你有没有值,不告诉你值对不对。准确性才是真正衡量数据「靠谱程度」的维度。
定义:数据值与真实值或公认标准值的一致程度。
度量方法:
- 抽样比对法:抽取样本与权威数据源比对,计算一致率
- 规则校验法:预定义业务规则,统计违反规则的数据占比
- 偏差度量法:适用于数值型字段,计算误差范围
| 方法 | 适用场景 | 度量公式 | 示例 |
|---|---|---|---|
| 抽样比对 | 有外部权威数据源 | 一致样本数 / 总样本数 | 客户地址与工商系统比对 |
| 规则校验 | 有明确业务规则 | 通过规则数 / 总规则数 | 年龄在 0-120 之间 |
| 偏差度量 | 数值型连续数据 | 1 - (|实际值-标准值|/标准值) | 库存数量误差率 |
注意:准确性度量最容易被「造假」。我见过有人把规则写得极其宽松,准确率刷到 99%,但实际数据一塌糊涂。记住:准确性度量规则必须经过业务方评审,不能由技术团队自己定。
3. 一致性:数据「打架」了没有
同一个客户,在 CRM 系统里叫「张三」,在订单系统里叫「张 三」(中间多了个空格),在财务系统里叫「张先生」——这数据能用吗?
定义:同一数据在不同系统、不同表、不同字段之间保持逻辑统一的程度。
度量方法:
- 跨系统一致性:比对两个系统的关键字段,计算匹配率
- 表内一致性:检查同一表中逻辑关联字段是否矛盾
- 格式一致性:检查同一类数据的格式是否统一
-- 跨系统一致性检查:CRM与订单系统的客户名称比对
SELECT
COUNT(*) AS total_pairs,
SUM(CASE WHEN c.customer_name = o.customer_name THEN 1 ELSE 0 END) AS matched,
ROUND(SUM(CASE WHEN c.customer_name = o.customer_name THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS consistency_pct
FROM crm_customer c
JOIN order_customer o ON c.customer_id = o.customer_id;
我个人习惯把一致性检查分成三个等级:
- 严格一致:字符级完全匹配(包括大小写、空格)
- 宽松一致:去除空格、统一大小写后匹配
- 语义一致:通过映射表或同义词库匹配
你想想看,如果一开始就要求严格一致,业务方肯定叫苦。我建议从宽松一致起步,逐步收紧。
4. 及时性:数据是不是「过期的」
数据再准确,如果来得太晚,就是废纸。及时性衡量的是数据从产生到可用的时间差。
定义:数据在预期时间窗口内被更新或可用的程度。
度量方法:
- 延迟时间:数据产生时间戳 到 数据可用时间戳 的差值
- 及时率:在 SLA 规定时间内完成更新的数据量 / 总数据量 × 100%
- 时效性衰减:某些数据(如实时风控)的价值随时间指数级下降
| 数据场景 | 典型 SLA | 度量粒度 | 常见问题 |
|---|---|---|---|
| 实时风控 | < 100ms | 毫秒级 | 网络抖动、队列积压 |
| 交易对账 | T+1 08:00 前 | 小时级 | 上游系统延迟 |
| 报表分析 | T+1 10:00 前 | 天级 | ETL 任务失败 |
| 数据归档 | 月度 | 周级 | 存储空间不足 |
避坑指南:我曾经负责一个实时数仓项目,业务方要求「实时」,但没说具体多少秒。结果我们做到了 5 秒延迟,业务方却说「太慢了」。后来才搞清楚,他们说的「实时」是 500 毫秒以内。所以,及时性的 SLA 必须白纸黑字写清楚,精确到数字。
5. 唯一性:数据有没有「重复造轮子」
唯一性衡量的是数据集中是否存在重复记录。这是数据治理里最容易被忽视、但破坏力最大的维度。
定义:数据集中每条实体记录有且仅有一个唯一标识的程度。
度量方法:
- 主键唯一性:主键字段是否有重复值
- 业务唯一性:业务逻辑上不应重复的记录是否重复
- 重复率:重复记录数 / 总记录数 × 100%
-- 检查业务唯一性:同一身份证号是否出现多次
SELECT
id_card,
COUNT(*) AS dup_count
FROM customer
GROUP BY id_card
HAVING COUNT(*) > 1
ORDER BY dup_count DESC;
嗯,这里要注意:唯一性检查不能只看主键。主键通常由系统生成(如自增 ID),不会重复。真正要查的是业务唯一键——比如身份证号、手机号、订单号。
我遇到过最离谱的情况:一个客户表里,同一个手机号出现了 47 次,原因是每次业务员录入时都「新建」了一条记录,没人去查重。结果这个客户收到了 47 份同样的营销短信——投诉直接打到 CEO 那里。
6. 有效性:数据是不是「合规的」
有效性检查的是数据是否符合预定义的格式、类型、取值范围等约束条件。
定义:数据满足预定义语法规则和业务约束的程度。
度量方法:
- 格式校验:是否符合正则表达式或模板(如手机号 11 位、邮箱含 @)
- 值域校验:是否在允许的枚举值或数值范围内
- 类型校验:数据类型是否与字段定义一致
- 依赖校验:字段间的逻辑依赖关系是否成立
-- 有效性检查:手机号格式与省份代码校验
SELECT
COUNT(*) AS total,
SUM(CASE WHEN phone ~ '^1[3-9]\\d{9}$' THEN 1 ELSE 0 END) AS valid_format,
SUM(CASE WHEN province_code IN ('11','12','13','14','15') THEN 1 ELSE 0 END) AS valid_province
FROM customer;
关键提醒:有效性规则不是越多越好。规则过严会导致大量数据被标记为「无效」,业务方会抱怨「系统太死板」。我建议采用「渐进式」策略:先上线核心规则(如手机号格式、金额非负),运行一个月后再逐步增加辅助规则。每次新增规则前,必须评估对业务的影响。
六个维度的度量优先级
实际项目中,不可能六个维度同时铺开。我建议按以下优先级推进:
- 第一梯队:完整性 + 唯一性——这是数据可用的基础门槛
- 第二梯队:准确性 + 有效性——确保数据「靠谱」
- 第三梯队:一致性 + 及时性——提升数据价值的上限
为什么这么排?你想想看,数据都不完整、重复一大堆,谈准确性和一致性就是空中楼阁。先把基础打牢,再谈优化。