第3章 数据质量快速评估:完整性、一致性、异常值初步判断
3.1 现象识别:下游消费异常
当业务报表、BI 大屏或下游数据管道出现以下现象时,通常意味着数据质量已在源头或加工环节出现问题:
- 仪表盘关键指标显示为 0、负值或空白。
- 不同团队对同一指标(如 GMV、DAU)统计口径对不上,反复核对仍存在差异。
- ETL 例行跑批任务频繁因 数据类型转换失败、主键冲突 而中断。
- 数据湖 / 数仓中某字段的 NULL 占比 在无业务解释的情况下陡增。
快速排查技巧:对于表格类数据,首选
SELECT COUNT(*), COUNT(column), COUNT(DISTINCT column), MIN, MAX FROM table 进行轮廓分析(Profiling),也可使用 Python pandas 的 df.describe(include='all') 获得全字段统计概览。
3.2 数据采集:信息收集与轮廓检测
在定位根因之前,必须对问题所涉及的数据集执行快速采集与概要分析。采集清单如下:
| 采集项 | 方法 | 重点关注 |
|---|---|---|
| 样本数据 | LIMIT 100 ~ 10000 | 肉眼扫描是否有明显错位、空行 |
| 列统计信息 | COUNT / NULL比率 / DISTINCT | 高缺失率 > 20% 立即标记 |
| 数据类型 | SHOW COLUMNS / df.dtypes | 业务数值与存储类型是否匹配 |
| 主键验证 | COUNT(id) vs COUNT(DISTINCT id) | 不相等则存在重复 |
| 值域范围 | MIN / MAX / 百分位数 | 是否出现业务上不可能的值 |
3.3 原因定位:三大质量维度并行排查
数据质量快速评估聚焦于三个核心维度:完整性、一致性 和 异常值。三者呈并行排查关系,各自存在独立的故障判断规则与修复路径。
排查路径口诀:“先看空值再看型,三查异常要判明;单维异常容易检,交叉维度更难行。” 单列质量问题排查是基础,多列交叉验证(如 销售额=单价×数量 不匹配)则需进入更深的链路分析。
3.4 修复动作与复测
针对三个维度定位出的具体问题,执行差异化修复策略:
- 完整性缺失: 依据业务含义选择 均值/中位数插补、前后向填充(时序数据)、或模型预测插补。若缺失率极高(> 60%)且无合适替代,考虑直接丢弃列。
- 一致性问题: 使用
CAST或转换函数对齐数据类型;制定日期、金额等字段的强制格式标准;通过GROUP BY / HAVING COUNT(*) > 1清洗重复键。 - 异常值: 对统计离群点(|Z| > 3)进行封顶(Winsorize)处理;对业务违规值(如负金额、未来时间戳)直接归为脏数据并记录日志。
常见陷阱: 严禁在不经业务研判的情况下自动化剔除异常值。例如反欺诈模型中,异常交易本身是高价值信号;建议修复前对异常样本进行人工打标确认,或设计专门的异常库分流保存。
修复完成后必须执行 复测: 重新运行数据采集阶段的轮廓查询脚本,验证 NULL 比率是否降回阈值内、数据类型是否矫正、重复键是否消失。对比修复前后的统计分布,确认未引入新的偏移。
3.5 案例:剖析销售管道金额异常
现象: 销售日报表中,字段 opp_amount(商机金额)出现大量负值且汇总数异常偏低。
数据采集日志输出:
2024-05-20 10:00:01 INFO DataValidation: opp_amount column profile:
COUNT: 1000, NULL: 150, DISTINCT: 200, MAX: 999999, MIN: -500, TYPE: STRING
原因定位(三步判断):
- 完整性: NULL 率 15%(< 20%),但需追踪是否是 ETL 字段映射丢失导致。
- 一致性: 业务字段应为
DECIMAL(10,2),但当前类型为STRING,推测存在隐式转换异常。 - 异常值: MIN 为 -500 美元,负值在金额字段中无业务含义,直接标记为业务规则违反。
修复动作:
- 对空值字段溯源:发现是 3 天前上游 CRM 系统接口字段名变更,导致新产生的记录金额为空。
- 更正数据类型:
ALTER TABLE sales_stage MODIFY opp_amount DECIMAL(10,2); - 对负值记录执行
UPDATE SET opp_amount = 0 WHERE opp_amount < 0并保留变更日志。
复测: 重新执行数据轮廓检测,确认 NULL 率降至 0%,类型变为 DECIMAL,MIN 值为 0.00。
3.6 预防:管道质量门禁
为防止同类问题再次出现,在数据管道中内嵌质量门禁是根本解决方案。推荐实现手段:
| 平台/工具 | 门禁类型 | 配置示例 |
|---|---|---|
| Great Expectations | Expectation 套件 | expect_column_values_to_not_be_null('opp_amount') |
| dbt 测试 | singular / generic 测试 | not_null, accepted_values, relationships |
| SQL 约束 | CHECK / NOT NULL | ALTER TABLE ADD CONSTRAINT ck_amount CHECK (opp_amount >= 0) |
最佳实践: 在 CI/CD 流程中集成数据质量检查脚本,一旦超出阈值(如 NULL 率 > 5%)则阻断管道下一步执行,自动触发告警并回滚失败批次,从而实现数据质量“左移”。