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;
方法三:抽样人工核查
别小看这个。自动化规则查不出的「合理但错误」的数据,只能靠人眼。比如地址写成了「北京市海淀区」但实际是「上海市浦东新区」——规则很难判断,但人一眼就能看出来。
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;
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