2. 特征缺失问题:缺失值的定义、金融场景中缺失值的来源

在金融数据特征工程中,缺失值是最常见的数据质量问题之一。理解缺失值的定义及其在金融场景中的具体来源,是构建可靠特征巡检体系的第一步。本章将从定义出发,深入剖析金融业务中缺失值的三大典型来源,并给出对应的Spark SQL识别思路。

2.1 缺失值的定义与分类

缺失值(Missing Value)指数据集中某个特征的取值未被记录或不可用。在金融数据中,缺失值并非简单的“空值”,其背后往往隐藏着业务逻辑或系统状态。根据缺失机制,通常分为三类:

缺失类型 英文术语 含义 金融场景举例
完全随机缺失 MCAR 缺失与数据本身无关,纯属偶然 某笔交易因网络抖动未记录时间戳
随机缺失 MAR 缺失与其他已观测变量相关 高收入客户更倾向不填写职业信息
非随机缺失 MNAR 缺失与缺失值本身相关 坏账客户故意不提供联系方式
巡检要点: 在Spark SQL特征巡检中,NULL 和 NaN 是最常见的缺失表示。对于数值型特征,还需关注 0 或 -999 等业务约定的“伪缺失值”。

2.2 金融场景中缺失值的三大来源

金融数据链路长、环节多,缺失值的产生往往与系统架构和业务流程紧密相关。以下从数据采集、传输、处理三个阶段进行归纳。

2.2.1 来源一:数据采集失败

数据采集是特征生成的起点,也是最容易产生缺失的环节。常见原因包括:

  • 埋点缺失: 前端页面或移动端SDK未正确触发事件,导致用户行为特征(如页面停留时长、点击次数)为空。
  • 接口超时: 调用外部征信、风控或行情接口时,因响应超时未返回数据。
  • 硬件故障: 交易终端、ATM或POS机离线,导致交易流水特征缺失。
  • 日志截断: 日志系统因磁盘满或配置限制,丢弃部分字段。

2.2.2 来源二:传输延迟

在实时或准实时特征计算中,数据从产生到落入数仓存在时间差,导致在巡检时刻特征值为空。

  • 消息队列积压: Kafka或RocketMQ消费滞后,特征表尚未更新。
  • 批处理窗口未闭合: T+1离线任务尚未完成,当日特征暂不可用。
  • 跨数据中心同步延迟: 异地多活架构下,特征数据同步存在秒级到分钟级延迟。

2.2.3 来源三:业务逻辑过滤

这是金融场景中最具领域特色的缺失来源。特征值本身存在,但被业务规则主动过滤或置空。

  • 权限过滤: 非授权用户或低信用等级客户,不展示或返回敏感特征(如授信额度、黑名单标签)。
  • 业务分支逻辑: 只有申请信用卡的用户才有“信用卡额度”特征,纯贷款用户该字段为空。
  • 数据脱敏: 合规要求下,身份证号、手机号等隐私字段在特征层被置空或哈希。
  • 条件计算: 某些衍生特征仅在满足特定条件时计算(如“逾期天数”仅在逾期状态为“是”时才有值)。
实战提示: 在Spark SQL巡检中,对于业务逻辑过滤导致的缺失,不能简单视为“数据质量差”,而应通过元数据或业务字典判断其是否为“合法缺失”。例如:WHERE feature IS NULL AND biz_type = 'loan_only' 可能是正常业务分支。

2.3 缺失来源全景图

下图展示了金融特征从采集到落表过程中,缺失值产生的三个主要环节及其典型原因。

金融特征缺失来源全景图 ① 数据采集 埋点缺失 接口超时 硬件故障 日志截断 ② 传输延迟 消息队列积压 批处理窗口未闭合 跨数据中心同步延迟 ③ 业务逻辑过滤 权限过滤 业务分支逻辑 数据脱敏 条件计算 特征表缺失值 巡检时需区分“系统异常缺失”与“业务合法缺失”,避免误报 Spark SQL可通过关联元数据表或业务字典进行智能过滤

2.4 Spark SQL 缺失巡检基础示例

以下Spark SQL代码展示了如何对特征表进行缺失值巡检,并初步区分缺失来源。

-- 1. 统计各特征缺失率
SELECT
  COUNT(*) AS total_rows,
  SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) AS user_id_missing,
  SUM(CASE WHEN credit_score IS NULL THEN 1 ELSE 0 END) AS credit_score_missing,
  SUM(CASE WHEN income IS NULL THEN 1 ELSE 0 END) AS income_missing,
  ROUND(SUM(CASE WHEN credit_score IS NULL THEN 1 ELSE 0 END) / COUNT(*), 4) AS credit_score_missing_rate
FROM fin_feature_table;

-- 2. 结合业务字典判断“合法缺失”
-- 假设业务字典表 biz_dict 记录了特征 feature_name 在特定 biz_type 下允许为空
SELECT
  a.feature_name,
  a.biz_type,
  COUNT(*) AS missing_count,
  CASE
    WHEN b.allow_null = 'Y' THEN '合法缺失'
    ELSE '异常缺失'
  END AS missing_type
FROM fin_feature_table a
LEFT JOIN biz_dict b
  ON a.feature_name = b.feature_name
  AND a.biz_type = b.biz_type
WHERE a.feature_value IS NULL
GROUP BY a.feature_name, a.biz_type, b.allow_null;
避坑指南: 金融特征巡检中,切勿对所有缺失值一刀切处理。建议在巡检脚本中增加“业务字典关联”步骤,将业务逻辑过滤导致的缺失标记为“合法缺失”,避免误触发告警或错误的数据修复。

2.5 本章小结

缺失值的定义在金融场景中需要结合业务上下文理解。其来源可归纳为数据采集失败、传输延迟和业务逻辑过滤三大类。在Spark SQL特征巡检中,通过统计缺失率、关联业务字典等方式,可以有效区分“系统异常缺失”与“业务合法缺失”,为后续的缺失值处理提供准确依据。