3. 数据准备与探索:数据源类型、质量检查与缺失值异常值处理

在额度模型与分群评分沙盘实战中,数据是模型的生命线。本章聚焦于数据源类型识别、数据质量检查以及缺失值与异常值的系统化处理。只有经过严格清洗与探索的数据,才能支撑后续稳健的额度测算与分群评分。

3.1 数据源类型:征信、行为、三方

额度模型通常融合三类数据源,每类数据在风险刻画中扮演不同角色。下表对比了三者的核心特征与典型字段:

数据源类型 核心特征 典型字段示例 更新频率
征信数据 央行/百行征信等权威机构提供,反映历史信贷履约记录 逾期天数、贷款余额、查询次数、担保信息 月度/季度
行为数据 用户在自有平台上的实时交互与交易记录 登录频次、消费金额、还款方式、APP使用时长 日/实时
三方数据 外部数据服务商提供的补充画像与反欺诈信息 多头借贷指数、设备指纹、社交关系、黑名单命中 周/月
实战提示:征信数据是“硬信息”,行为数据是“软信息”,三方数据是“补充信息”。在额度模型中,征信数据权重通常最高,但行为数据对分群评分有更强的区分能力。
额度模型数据源融合架构 额度模型数据源融合架构 征信数据 央行/百行 行为数据 自有平台 三方数据 外部服务商 特征融合与衍生 额度模型 / 分群评分

3.2 数据质量检查

数据质量检查是数据准备的第一步,直接影响模型稳定性。检查维度包括完整性、准确性、一致性与时效性。以下为沙盘实战中常用的质量检查清单:

  • 完整性检查:统计每个字段的空值比例,设定阈值(如缺失率 > 50% 的字段考虑剔除)。
  • 准确性检查:验证字段值域是否合理(如年龄 0-120、金额非负),识别异常编码(如性别字段出现“未知”以外的值)。
  • 一致性检查:跨表关联时,检查主键唯一性、时间戳对齐、分类标签统一(如“已婚”与“M”是否映射一致)。
  • 时效性检查:检查数据时间戳是否在预期窗口内,是否存在未来日期或过期数据。
沙盘实战要点:在额度模型开发中,建议对每个字段生成质量报告(Data Quality Report),包含缺失率、唯一值数量、均值、标准差、最大最小值。该报告是后续特征筛选与分群设计的基础。

3.3 缺失值处理

缺失值处理需结合缺失机制与业务含义。常见方法包括删除、填充与模型预测。下表总结了不同场景下的推荐策略:

缺失类型 缺失比例 推荐策略 适用场景
完全随机缺失 < 5% 删除缺失样本或均值/中位数填充 征信查询次数、年龄
随机缺失 5% - 20% 多重插补(MICE)或模型预测填充 收入、职业信息
非随机缺失 > 20% 单独编码为“缺失类”或使用缺失指示变量 三方数据中的黑名单命中
业务含义缺失 任意比例 保留缺失状态作为分群特征 无信贷记录(征信白户)
注意:在分群评分场景中,缺失值本身可能包含重要信息。例如,征信白户的缺失状态直接决定了分群策略。切勿盲目填充所有缺失值,应先分析缺失模式与目标变量的关系。

3.4 异常值处理

异常值处理的目标是识别并修正那些偏离正常分布的数据点,避免模型被极端值主导。常用方法包括统计分布法、箱线图法与业务规则法。

  • 统计分布法:基于均值±3倍标准差或百分位数(如1%和99%分位)截断。
  • 箱线图法:以四分位距(IQR)为基准,识别超出 Q1-1.5*IQR 或 Q3+1.5*IQR 的点。
  • 业务规则法:根据业务常识设定硬阈值(如单笔消费金额不超过100万)。
异常值处理流程 异常值处理流程 原始数据 异常检测 统计/箱线图/业务规则 正常数据 模型训练 异常处理 截断/替换/删除 处理原则 保留业务含义 避免信息损失

3.5 数据探索与可视化

在完成质量检查与处理后,需进行探索性数据分析(EDA),以理解数据分布、变量关系与分群潜力。常用方法包括:

  • 单变量分析:绘制直方图、箱线图,观察分布形态与异常点。
  • 双变量分析:计算相关系数矩阵,识别与目标变量(如逾期标签)强相关的特征。
  • 分群视角:按征信分、收入水平等维度分组,比较各组的额度使用率与违约率差异。
沙盘实战输出:数据探索阶段应产出变量分布报告、相关性热力图、分群对比表。这些材料将直接用于后续的额度测算与分群评分卡设计。
# 数据质量检查与缺失值处理示例代码(Python)
import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('credit_data.csv')

# 1. 数据质量检查
print("缺失率报告:")
print(df.isnull().mean().sort_values(ascending=False))

# 2. 异常值检测(基于箱线图)
def detect_outliers_iqr(data, column):
    Q1 = data[column].quantile(0.25)
    Q3 = data[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)]
    return outliers

# 3. 缺失值填充(中位数填充)
df['income'].fillna(df['income'].median(), inplace=True)

# 4. 异常值截断(99%分位)
upper_limit = df['loan_amount'].quantile(0.99)
df['loan_amount'] = df['loan_amount'].clip(upper=upper_limit)

print("数据清洗完成,剩余样本数:", len(df))
实战建议:在沙盘实战中,建议将数据探索与清洗过程封装为可复用的Pipeline,便于后续迭代与模型更新。每次清洗后,重新生成数据质量报告,确保处理效果可追溯。