数据质量初步评估:完整性、一致性、准确性、时效性
拿到一份新数据,先别急着建模。我一般会花10%的时间做一轮快速评估,看看这数据能不能用。说白了,就是检查四个维度:完整性、一致性、准确性、时效性。你想想看,如果你连字段是不是齐的、格式是不是对的都说不清,后面的特征工程全是白搭。
这一节我们就聊聊这四个概念,以及对应的检查方法。我会结合我踩过的坑来讲,有些方法看着简单,但真做起来挺容易翻车。
1. 数据完整性(Completeness)
完整性最简单——看缺失值。但我得提醒你:不是所有缺失都是缺陷。比如信用评分里的“月收入”,很多申请人会跳过不填。这时候你要区分三种情况:
- 随机缺失:没有规律,可以填充或删除
- 系统缺失:比如高收入人群更倾向不填——这本身就是信息
- 结构缺失:字段本身就不该存在(如“配偶月收入”对未婚的人就是空)
代码层面检查很简单:
# Python 快速检查缺失
import pandas as pd
df.isnull().sum() / len(df) * 100
另外,空字符串、'N/A'、'unknown'这类假值也要处理。我曾经接过一个数据集,里面“护照号”字段全是空字符串,长度0。当时我按缺失率0%报了,结果被老板骂了一顿。后来才知道——数据仓库ETL会把空值转成空字符串。所以别只看isnull,还得看空白字符。
2. 数据一致性(Consistency)
一致性是四个概念里最容易出问题的一个。我见过同一个客户在A表里性别是“男”,在B表里是“M”——这种不一致一多,后面关联查出来全是脏数据。
检查方法主要分三类:
| 类型 | 检查方法 | 举个栗子 |
|---|---|---|
| 格式一致 | 正则匹配、枚举值校验 | 手机号11位,后4位不能全零 |
| 范围一致 | 边界检查、业务逻辑验证 | 年龄0~120,超出就标记异常 |
| 跨表一致 | 主键外键关联、汇总对账 | 申请表中的用户ID必须在用户主表中存在 |
我会专门写个一致性检查脚本,跑完全量数据。遇到不一致的,先不修,而是统计分布。比如客户性别字段,如果出现“男、女、M、F、0、1”六种值,那八成是多个数据源没统一标准。
3. 数据准确性(Accuracy)
准确性和真实世界比较。比如“客户年龄”是30岁,实际他今年25——这种偏差没人能完全避免。我们能做的,是找那些明显离谱的值。
常用的方法有:
- 统计分布法:计算均值、标准差,超过3σ标记为异常
- 业务规则法:比如申请贷款时填的“月收入”和“月还款额”不能超过某个倍数
- 交叉验证法:用其他字段反推,比如用电话区号验证邮编
我印象特别深的一个案例:某合作方提供的征信报告中,“逾期金额”一列全是整数,而且全是100的倍数。一查发现,他们数据库里存的是“逾期天数×100”,根本没做转换。你说这算准确吗?在数据库层面是准的,但在业务层面完全错了。后来我加了一条规则:任何金额字段,如果所有值都是100的倍数,先报警。
4. 数据时效性(Timeliness)
时效性常被忽略,但信用评分里特别致命。一份半年前的征信报告,除了教育背景,其他基本都过时了。
检查时效性,核心就看两个指标:
- 数据采集时间 vs 系统更新时间
- 业务有效期:比如“近6个月平均使用额度”这个特征,如果采集日期是2019年,那2025年建模完全没用
我会加一个字段:data_freshness_days,计算今天距离数据最后更新日的间隔。如果超过90天,直接标记为过期样本。
四个维度对比一览
| 维度 | 核心问题 | 典型检查工具 | 个人重点提醒 |
|---|---|---|---|
| 完整性 | 字段有没有空值? | 缺失率统计、热力图 | 别漏掉空字符串和占位符 |
| 一致性 | 数据格式/取值范围统一吗? | 枚举校验、正则、主键关联 | 多源合并时最易翻车 |
| 准确性 | 数据与真实情况吻合吗? | 异常值检测、业务规则、交叉验证 | 不要迷信原始值,要反问逻辑 |
| 时效性 | 数据是否过时? | 时间戳比较、业务有效期 | 先过滤再特征工程 |
下面这张图,我把它画成四象限+中心检查流程,你自己看的时候可以对着记。
说到顺序,我推荐“完整性 → 一致性 → 准确性 → 时效性”这个流程。先解决“有没有数据”的问题,再统一格式,然后揪出异常值,最后判断时间窗口。每一步都可能淘汰一批样本,但早点淘汰总比建完模型再返工强。
好,这一轮快速评估做完,你基本上就知道数据能不能用、哪里需要修了。接下来才是真正的清洗工作。但记住:评估不是一次性活。数据每更新一次,我建议重新跑一遍这四个检查——尤其是时效性,窗口一变,整个样本集都可能要重选。