第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 原因定位:三大质量维度并行排查

数据质量快速评估聚焦于三个核心维度:完整性、一致性 和 异常值。三者呈并行排查关系,各自存在独立的故障判断规则与修复路径。

排查路径口诀:“先看空值再看型,三查异常要判明;单维异常容易检,交叉维度更难行。” 单列质量问题排查是基础,多列交叉验证(如 销售额=单价×数量 不匹配)则需进入更深的链路分析。
数据质量快速评估故障树排查流程 现象识别 数据采集 并行排查(故障树展开) 完整性检查 缺失值比率 > 20% 一致性检查 类型 / 格式 / 约束 异常值检测 统计离群 / 业务规则 修复与验证闭环 修复动作 复测 预防

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

原因定位(三步判断):

  1. 完整性: NULL 率 15%(< 20%),但需追踪是否是 ETL 字段映射丢失导致。
  2. 一致性: 业务字段应为 DECIMAL(10,2),但当前类型为 STRING,推测存在隐式转换异常。
  3. 异常值: 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 ExpectationsExpectation 套件expect_column_values_to_not_be_null('opp_amount')
dbt 测试singular / generic 测试not_null, accepted_values, relationships
SQL 约束CHECK / NOT NULLALTER TABLE ADD CONSTRAINT ck_amount CHECK (opp_amount >= 0)
最佳实践: 在 CI/CD 流程中集成数据质量检查脚本,一旦超出阈值(如 NULL 率 > 5%)则阻断管道下一步执行,自动触发告警并回滚失败批次,从而实现数据质量“左移”。