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 缺失来源全景图
下图展示了金融特征从采集到落表过程中,缺失值产生的三个主要环节及其典型原因。
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特征巡检中,通过统计缺失率、关联业务字典等方式,可以有效区分“系统异常缺失”与“业务合法缺失”,为后续的缺失值处理提供准确依据。