3. 数据采集与预处理:商户交易数据、商户画像数据、外部征信数据、数据清洗与缺失值处理
在商户风险评分卡构建中,数据是模型的基础。本章聚焦于数据采集的来源、类型以及预处理的核心技术。高质量的数据输入是保证评分卡区分度和稳定性的前提。我们将从三大数据源出发,系统讲解数据清洗与缺失值处理的工程实践。
3.1 数据采集:三大核心数据源
商户风险评分卡通常依赖以下三类数据源,它们从不同维度刻画商户的风险画像:
| 数据源 | 核心内容 | 采集频率 | 典型字段示例 |
|---|---|---|---|
| 商户交易数据 | 交易流水、交易对手、交易时间、金额、频次 | 日/实时 | 交易金额、交易笔数、失败率、大额交易占比 |
| 商户画像数据 | 工商信息、经营时长、行业类别、法人信息 | 月/季 | 注册年限、注册资本、经营地址、行业代码 |
| 外部征信数据 | 央行征信、第三方黑名单、多头借贷、司法涉诉 | 周/月 | 征信查询次数、逾期记录、被执行人信息 |
实践提示:交易数据时效性最强,对短期风险敏感;画像数据反映商户基本面,适合刻画长期信用;外部征信数据则用于交叉验证和风险兜底。三者结合可覆盖商户风险的“行为-属性-信用”三角。
3.2 数据采集流程架构
下图展示了从原始数据源到预处理阶段的整体采集与整合流程:
3.3 数据清洗:常见问题与处理策略
原始数据通常包含噪声、重复、格式不一致等问题。数据清洗的目标是提升数据质量,避免“垃圾进,垃圾出”。
3.3.1 常见数据质量问题
- 重复数据:同一商户在短时间内产生多条完全相同的交易记录。
- 格式不一致:日期格式混用(2024-01-01 vs 2024/01/01)、金额单位不统一(元 vs 分)。
- 逻辑错误:交易金额为负数、交易时间晚于当前时间、年龄字段为负数。
- 异常值:单笔交易金额远超商户正常交易量级(如日交易额突然放大100倍)。
3.3.2 清洗处理步骤
- 去重:基于商户ID、交易流水号、交易时间戳进行精确去重。
- 格式标准化:统一日期格式为
YYYY-MM-DD,金额统一为“分”或“元”,文本字段去除首尾空格。 - 逻辑校验:剔除交易金额 ≤ 0 的记录,剔除时间戳异常(如未来时间)的记录。
- 异常值截断:对连续变量采用
均值 ± 3σ或IQR 1.5倍规则进行截断或标记。
代码示例:使用 Python 进行基础清洗
import pandas as pd
import numpy as np
# 加载原始交易数据
df = pd.read_csv('merchant_transactions.csv')
# 1. 去重
df = df.drop_duplicates(subset=['merchant_id', 'txn_id', 'txn_time'])
# 2. 格式标准化
df['txn_time'] = pd.to_datetime(df['txn_time'], format='%Y-%m-%d')
df['amount'] = df['amount'].astype(float)
# 3. 逻辑校验
df = df[(df['amount'] > 0) & (df['txn_time'] <= pd.Timestamp.now())]
# 4. 异常值截断(基于3σ)
mean_amt = df['amount'].mean()
std_amt = df['amount'].std()
df['amount'] = df['amount'].clip(lower=mean_amt - 3*std_amt, upper=mean_amt + 3*std_amt)
print(f"清洗后数据量: {len(df)} 条")
3.4 缺失值处理:策略与选择
缺失值是评分卡建模中的常见挑战。处理不当会导致样本偏差或模型性能下降。处理策略需结合缺失率、数据分布和业务含义综合判断。
3.4.1 缺失值处理策略对比
| 策略 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 直接删除 | 缺失率 < 5%,且缺失完全随机 | 简单、不影响分布 | 可能损失样本量 |
| 均值/中位数填充 | 连续变量,缺失率 < 20% | 计算快、稳定 | 可能降低方差 |
| 众数填充 | 分类变量,缺失率 < 20% | 保留类别分布 | 可能引入偏差 |
| 模型预测填充 | 缺失率 20%~50%,变量间相关性强 | 精度高、利用变量关系 | 计算成本高、可能过拟合 |
| 标记缺失(哑变量) | 缺失本身具有业务含义(如“未申请”) | 保留缺失信息 | 增加特征维度 |
3.4.2 缺失值处理流程
下图展示了在评分卡项目中推荐的缺失值处理决策流程:
注意:在评分卡建模中,对于缺失率超过 50% 的字段,建议直接删除,因为填充后的信息量不足以支撑稳定的风险区分。对于缺失率在 5%~50% 之间的字段,优先使用中位数填充(对异常值鲁棒),并额外生成一个“是否缺失”的哑变量,以捕捉缺失本身可能蕴含的风险信号。
3.5 数据预处理后的质量评估
完成清洗与缺失值处理后,需要对数据质量进行量化评估,确保进入特征工程阶段的数据集是可靠的。建议从以下四个维度进行验证:
- 完整性:各字段缺失率是否已控制在预设阈值(如 < 5%)以内。
- 准确性:抽样检查字段值是否符合业务逻辑(如交易金额分布是否合理)。
- 一致性:不同数据源关联后的主键匹配率是否达到 95% 以上。
- 时效性:数据时间窗口是否覆盖建模所需的最短观察期(通常至少 12 个月)。
质量评估报告示例:
数据质量评估报告(商户交易宽表)
--------------------------------
总记录数:1,200,000 条
商户数:8,500 个
时间跨度:2023-01-01 ~ 2024-06-30
字段完整性:
- txn_amount: 缺失率 0.0% ✅
- merchant_age: 缺失率 2.1% ✅
- credit_score: 缺失率 12.5% ⚠️(已用中位数填充)
- legal_case_count: 缺失率 67.3% ❌(已删除该字段)
主键匹配率:98.7% ✅
异常值占比:0.3% ✅(已截断处理)
通过以上步骤,我们完成了从原始数据到高质量建模宽表的转化。下一阶段将基于清洗后的数据开展特征工程与分箱操作,为评分卡开发奠定基础。