3. 数据采集与预处理:商户交易数据、商户画像数据、外部征信数据、数据清洗与缺失值处理

在商户风险评分卡构建中,数据是模型的基础。本章聚焦于数据采集的来源、类型以及预处理的核心技术。高质量的数据输入是保证评分卡区分度和稳定性的前提。我们将从三大数据源出发,系统讲解数据清洗与缺失值处理的工程实践。

3.1 数据采集:三大核心数据源

商户风险评分卡通常依赖以下三类数据源,它们从不同维度刻画商户的风险画像:

数据源 核心内容 采集频率 典型字段示例
商户交易数据 交易流水、交易对手、交易时间、金额、频次 日/实时 交易金额、交易笔数、失败率、大额交易占比
商户画像数据 工商信息、经营时长、行业类别、法人信息 月/季 注册年限、注册资本、经营地址、行业代码
外部征信数据 央行征信、第三方黑名单、多头借贷、司法涉诉 周/月 征信查询次数、逾期记录、被执行人信息
实践提示:交易数据时效性最强,对短期风险敏感;画像数据反映商户基本面,适合刻画长期信用;外部征信数据则用于交叉验证和风险兜底。三者结合可覆盖商户风险的“行为-属性-信用”三角。

3.2 数据采集流程架构

下图展示了从原始数据源到预处理阶段的整体采集与整合流程:

数据采集与预处理流程架构 商户交易数据 商户画像数据 外部征信数据 数据整合层:主键关联(商户ID + 时间戳) 数据预处理:清洗 → 缺失值处理 → 异常值检测 输出:清洗后的宽表(用于特征工程)

3.3 数据清洗:常见问题与处理策略

原始数据通常包含噪声、重复、格式不一致等问题。数据清洗的目标是提升数据质量,避免“垃圾进,垃圾出”。

3.3.1 常见数据质量问题

  • 重复数据:同一商户在短时间内产生多条完全相同的交易记录。
  • 格式不一致:日期格式混用(2024-01-01 vs 2024/01/01)、金额单位不统一(元 vs 分)。
  • 逻辑错误:交易金额为负数、交易时间晚于当前时间、年龄字段为负数。
  • 异常值:单笔交易金额远超商户正常交易量级(如日交易额突然放大100倍)。

3.3.2 清洗处理步骤

  1. 去重:基于商户ID、交易流水号、交易时间戳进行精确去重。
  2. 格式标准化:统一日期格式为 YYYY-MM-DD,金额统一为“分”或“元”,文本字段去除首尾空格。
  3. 逻辑校验:剔除交易金额 ≤ 0 的记录,剔除时间戳异常(如未来时间)的记录。
  4. 异常值截断:对连续变量采用 均值 ± 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% 的字段,建议直接删除,因为填充后的信息量不足以支撑稳定的风险区分。对于缺失率在 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% ✅(已截断处理)

通过以上步骤,我们完成了从原始数据到高质量建模宽表的转化。下一阶段将基于清洗后的数据开展特征工程与分箱操作,为评分卡开发奠定基础。