4. 数据质量度量

聊完了数据质量的问题分类和根因,接下来就是最实际的问题了——怎么量化它?

你想想看,如果连质量好坏都说不清楚,那所谓的“闭环”就是空谈。我在很多项目里都见过这种场景:业务方说数据有问题,技术方说数据没问题,两边扯皮。为什么?因为没有一把共同的尺子。

这把尺子,就是质量分数。

4.1 质量维度拆解:从哪几个角度打分?

我个人习惯把数据质量拆成六个维度。不是拍脑袋定的,是在实际项目中跟业务方一点点磨出来的。你不需要全用,但得知道有哪些选项。

维度 通俗解释 典型问题
完整性 该有的字段有没有? 手机号为空、地址缺省
准确性 数据跟真实世界一致吗? 金额多一位、日期写错
一致性 不同系统间对得上吗? CRM和ERP的客户ID不同
及时性 数据更新够快吗? T+1报表延迟到T+3
唯一性 有没有重复记录? 同一个用户出现两次
有效性 数据符合业务规则吗? 年龄200岁、性别填“未知”
我的经验:别一上来就六个维度全上。先挑业务最痛的两个维度,比如金融行业先抓“准确性”和“一致性”,电商先抓“完整性”和“唯一性”。做透了再加维度。

4.2 质量分数计算模型:怎么算出一个数?

有了维度,接下来就是算分。我见过很多团队搞得很复杂,什么加权平均、熵权法、层次分析法……说实话,在初期完全没必要。

我推荐一个四步走的模型,简单、可解释、能落地。

第一步:单字段评分

对每个字段,按维度打分。比如“手机号”字段:

  • 完整性:非空率 = 非空记录数 / 总记录数
  • 有效性:符合手机号正则的记录占比
-- 示例SQL:计算手机号字段的完整性得分
SELECT 
    COUNT(*) AS total_records,
    SUM(CASE WHEN phone IS NOT NULL AND phone != '' THEN 1 ELSE 0 END) AS non_null_count,
    ROUND(
        SUM(CASE WHEN phone IS NOT NULL AND phone != '' THEN 1 ELSE 0 END) * 1.0 / COUNT(*),
        4
    ) AS completeness_score
FROM user_profile;

第二步:维度聚合

把单字段得分按维度汇总。我习惯用最小值法——取该维度下所有字段得分的最低值。为什么?因为短板效应。一个字段烂,整个维度就烂。

-- 维度得分 = MIN(该维度下所有字段的得分)
-- 比如完整性维度有3个字段:手机号0.95、邮箱0.88、地址0.72
-- 完整性维度得分 = MIN(0.95, 0.88, 0.72) = 0.72

第三步:综合质量分数

六个维度得分出来后,怎么合成一个总分?我建议用加权平均,权重跟业务方一起定。

综合质量分数 = 
    w1 * 完整性得分 + 
    w2 * 准确性得分 + 
    w3 * 一致性得分 + 
    w4 * 及时性得分 + 
    w5 * 唯一性得分 + 
    w6 * 有效性得分

-- 其中 w1 + w2 + ... + w6 = 1
关键点:权重不是技术团队拍脑袋定的。我每次都会拉着业务负责人开个会,让他们投票。比如风控部门觉得“准确性”最重要,权重就给0.3;运营部门觉得“及时性”重要,就给0.2。这样算出来的分数,业务方认。

第四步:可视化呈现

分数算出来,怎么展示?我习惯用雷达图。一眼就能看出哪个维度是短板。

数据质量雷达图示例 完整性 0.92 准确性 0.85 一致性 0.68 及时性 0.73 唯一性 0.88 综合质量分数 = 0.92×0.2 + 0.85×0.3 + 0.68×0.15 + 0.73×0.15 + 0.88×0.2 = 0.82

4.3 阈值设定:多少分算合格?

分数算出来了,然后呢?你得告诉团队:多少分以上算绿,多少分以下算红。

阈值设定没有标准答案。但我有一套经过验证的方法论。

三级阈值体系

我习惯把质量等级分成三档:

等级 分数区间 含义 行动
🟢 优秀 ≥ 0.90 数据可信,可直接用于决策 常规监控即可
🟡 警告 0.70 ~ 0.89 数据可用,但需关注短板 触发告警,指定责任人整改
🔴 危险 < 0.70 数据不可用,必须停止下游消费 立即阻断,启动应急流程
我曾经踩过的坑:一开始我把阈值设成0.95才算合格,结果天天告警,运维团队直接麻木了。后来我改成0.70,但发现有些核心表0.75就出大问题。最后我学乖了——阈值要按表分级。核心交易表0.95才算绿,日志分析表0.70就够。别一刀切。

动态阈值 vs 静态阈值

静态阈值就是固定一个数,比如0.80。动态阈值是根据历史数据算出来的,比如取过去30天分数的P10作为下限。

我个人更推荐动静结合:

  • 静态阈值:用于判断质量水平,比如“手机号非空率必须≥0.95”
  • 动态阈值:用于发现异常波动,比如“今天完整性得分比过去7天均值低20%”
-- 动态阈值示例:计算过去7天完整性得分的均值与标准差
WITH daily_scores AS (
    SELECT 
        DATE(检查时间) AS check_date,
        AVG(completeness_score) AS avg_score
    FROM quality_checks
    WHERE 表名 = 'order_table'
    AND 检查时间 >= DATE('now', '-7 days')
    GROUP BY DATE(检查时间)
)
SELECT 
    AVG(avg_score) AS baseline,
    STDDEV(avg_score) AS std_dev,
    AVG(avg_score) - 2 * STDDEV(avg_score) AS lower_threshold
FROM daily_scores;

4.4 质量度量落地:从理论到工程

理论说完了,说说怎么落地。我建议分三步走:

  1. 定义度量指标:跟业务方一起,确定每个表的每个字段要监控哪些维度。别贪多,先覆盖核心表。
  2. 搭建自动化检查:用调度任务每天跑质量检查SQL,结果写入质量元数据表。
  3. 配置告警与看板:分数低于阈值就告警,看板上展示趋势图和雷达图。
一个小技巧:质量分数不要只给一个总分。我每次汇报都会把维度得分和趋势一起展示。比如“完整性0.92,比上周提升了5%”,这样业务方知道你在进步,而不是只看到问题。

嗯,量化数据质量这件事,说白了就是把模糊的感觉变成清晰的数字。有了分数和阈值,你才能说“这个表质量合格,可以用于报表”,或者“这个表质量太差,先别跑ETL了”。