3、数据质量评估(上):准确性、完整性、一致性——定义与检查方法

聊数据质量之前,我先讲个真事。

几年前我接手一个客户数据迁移项目。源系统里几百万条记录,看起来整整齐齐。结果一跑校验脚本,好家伙——20% 的地址字段是空的,还有 3% 的身份证号校验位算出来不对。业务方当时就急了,说「这数据我们用了三年啊」。

嗯,数据质量这回事,表面看不出来,一查全是坑。

今天咱们就先把数据质量评估里最核心的三个维度讲清楚:准确性、完整性、一致性。说白了,就是数据「对不对」、「全不全」、「矛不矛盾」。

3.1 准确性:数据对不对?

定义:准确性指的是数据记录的值与真实世界中的实际值是否一致。

举个例子:用户表里存了「性别=男」,但实际这位用户是女性。这就是准确性出了问题。

我个人习惯把准确性检查分成两类:

  • 语法准确性:数据格式、类型、长度对不对。比如手机号必须是 11 位数字。
  • 语义准确性:数据含义对不对。比如年龄字段不能是 200 岁。

检查方法

方法一:规则校验

这是最常用的手段。写几条规则,跑一遍数据,看哪些记录违规。

-- 检查手机号格式
SELECT COUNT(*) AS 异常数量
FROM user_info
WHERE LENGTH(phone) != 11
   OR phone NOT REGEXP '^1[3-9]\\d{9}$';

方法二:交叉验证

拿两个不同来源的数据互相核对。我在项目中遇到过,CRM 系统的客户姓名和财务系统的客户姓名对不上,一查发现是录入时用了全角半角混输。

-- 交叉验证:CRM vs 财务系统
SELECT a.customer_id, a.name AS crm_name, b.name AS fin_name
FROM crm_customer a
JOIN fin_customer b ON a.customer_id = b.customer_id
WHERE a.name != b.name;

方法三:抽样人工核查

别小看这个。自动化规则查不出的「合理但错误」的数据,只能靠人眼。比如地址写成了「北京市海淀区」但实际是「上海市浦东新区」——规则很难判断,但人一眼就能看出来。

我的经验:准确性检查一定要先做「脏数据清洗」,否则规则跑出来的结果会被大量垃圾数据淹没。我曾经在一个项目里先跑了 50 条规则,结果 80% 的记录都命中至少一条规则——根本没法定位核心问题。

3.2 完整性:数据全不全?

定义:完整性衡量的是数据缺失的程度。说白了,就是该有的字段有没有值。

完整性不是「非黑即白」的。你想想看,一个用户注册时没填「兴趣爱好」,这算不算完整性问题?

算,但要看业务场景。如果做推荐系统,这就是大问题。如果只是做登录认证,那无所谓。

检查方法

方法一:空值率统计

-- 统计每个字段的空值率
SELECT
  COUNT(*) AS 总记录数,
  SUM(CASE WHEN name IS NULL OR name = '' THEN 1 ELSE 0 END) AS name_空值数,
  ROUND(SUM(CASE WHEN name IS NULL OR name = '' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS name_空值率,
  SUM(CASE WHEN email IS NULL OR email = '' THEN 1 ELSE 0 END) AS email_空值数,
  ROUND(SUM(CASE WHEN email IS NULL OR email = '' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS email_空值率
FROM user_info;

方法二:业务规则完整性检查

有些字段单独看可以空,但组合起来必须完整。比如「订单表」里,如果「支付状态=已支付」,那「支付时间」就不能为空。

-- 业务规则:已支付的订单必须有支付时间
SELECT order_id, pay_status, pay_time
FROM orders
WHERE pay_status = 'paid'
  AND pay_time IS NULL;
避坑指南:我曾经遇到一个项目,ETL 工程师把空字符串 '' 和 NULL 混为一谈。检查完整性时,一定要把这两种情况都覆盖到。空字符串 ≠ NULL,但在业务上都是「没值」。

3.3 一致性:数据矛不矛盾?

定义:一致性指的是同一数据在不同系统、不同表、不同时间点之间是否保持逻辑统一。

我见过最典型的例子:用户表里「性别=男」,但订单表里同一用户的「称呼=女士」。这就是跨表不一致。

检查方法

方法一:跨表一致性检查

-- 检查用户性别与订单称呼是否一致
SELECT u.user_id, u.gender, o.title
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE (u.gender = '男' AND o.title = '女士')
   OR (u.gender = '女' AND o.title = '先生');

方法二:时间序列一致性检查

数据在时间轴上不能「倒流」。比如「创建时间」不能晚于「更新时间」,「出生日期」不能晚于「注册日期」。

-- 检查时间逻辑
SELECT user_id, create_time, update_time
FROM users
WHERE create_time > update_time;

方法三:参照完整性检查

外键关联的数据必须存在。比如订单表里的用户 ID,在用户表里必须能找到。

-- 检查孤儿记录
SELECT o.order_id, o.user_id
FROM orders o
LEFT JOIN users u ON o.user_id = u.user_id
WHERE u.user_id IS NULL;
核心要点:一致性检查最容易被忽视,但后果往往最严重。数据不一致会导致报表对不上、业务逻辑出错、甚至引发合规风险。我建议每个数据源接入时,先把一致性检查脚本写好,跑一遍再决定要不要用这个数据源。

知识体系总览

下面这张图把三个维度的关系画清楚了。你可以把它当成数据质量评估的「检查清单」。

数据质量评估核心三维度 准确性 数据对不对? • 语法校验 • 交叉验证 • 人工抽样核查 常见问题: 格式错误、值域越界 语义偏差 完整性 数据全不全? • 空值率统计 • 业务规则检查 • 组合字段完整性 常见问题: 必填字段缺失 业务关联字段不完整 一致性 数据矛不矛盾? • 跨表一致性 • 时间序列检查 • 参照完整性 常见问题: 数据矛盾、时间倒流 孤儿记录 三者缺一不可,共同构成数据质量评估的基础框架

好了,这一章的内容就到这儿。准确性、完整性、一致性——这三个维度是数据质量评估的基石。下次你拿到一个新数据源,别急着用,先拿这三把尺子量一量。

我的建议:把这套检查脚本做成自动化流水线,每次数据接入自动跑一遍。省心,也省得背锅。

公众号:蓝海资料掘金营,微信deep3321