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,便于后续迭代与模型更新。每次清洗后,重新生成数据质量报告,确保处理效果可追溯。