4. 数据准备与清洗:额度策略收益评估所需的数据源、数据清洗规则、数据质量检查
额度策略收益评估的准确性,高度依赖底层数据的质量。未经清洗的原始数据通常包含缺失值、异常值、重复记录和逻辑冲突,直接使用会导致收益计算偏差、策略误判甚至模型失效。本节系统梳理评估所需的核心数据源、标准清洗规则及质量检查框架。
4.1 核心数据源清单
额度策略收益评估需要整合用户维度、授信维度、用款行为、还款表现及外部征信五类数据。下表列出各数据源的关键字段与用途:
| 数据类别 | 典型数据表 | 关键字段 | 评估用途 |
|---|---|---|---|
| 用户画像 | user_profile | user_id, age, income_level, occupation, city_level | 风险分层、额度基准定价 |
| 授信记录 | credit_decision | user_id, credit_limit, decision_date, product_code, risk_grade | 额度分配、策略分组 |
| 用款行为 | loan_drawdown | user_id, drawdown_amount, drawdown_date, loan_term, interest_rate | 资金使用率、利息收入计算 |
| 还款表现 | repayment_schedule | user_id, due_date, paid_amount, overdue_days, repayment_status | 逾期损失、回收率、收益修正 |
| 外部征信 | credit_report | user_id, credit_score, query_count, existing_debt, public_record | 风险校准、额度上限约束 |
数据时间窗口提示: 收益评估通常需要至少 12 个月的完整表现期数据。对于新上线策略,可使用 3-6 个月短期数据做初步评估,但需在报告中明确标注“观察期不足”的风险。
4.2 数据清洗规则
清洗规则按处理优先级分为四个层级,每层解决一类典型问题。以下为各层级的核心规则与 SQL 示例:
4.2.1 第一层:缺失值处理
- 关键标识缺失: user_id 为空或格式异常 → 直接剔除该记录。
- 数值字段缺失: income_level、credit_score 等连续变量缺失 → 使用行业均值或同风险等级中位数填充,并生成缺失标记列。
- 类别字段缺失: occupation、city_level 等分类变量缺失 → 归入“未知”类别,不直接删除。
-- 缺失值填充示例:收入字段用同风险等级中位数填充
UPDATE user_profile t1
JOIN (
SELECT risk_grade, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY income_level) AS median_income
FROM user_profile
WHERE income_level IS NOT NULL
GROUP BY risk_grade
) t2 ON t1.risk_grade = t2.risk_grade
SET t1.income_level = t2.median_income, t1.income_imputed_flag = 1
WHERE t1.income_level IS NULL;
4.2.2 第二层:异常值检测与截断
- 额度异常: credit_limit 超过产品上限 3 倍或为负数 → 截断至产品上限,并记录异常标记。
- 利率异常: interest_rate 超出 [0, 0.5] 区间 → 视为录入错误,替换为同产品平均利率。
- 逾期天数异常: overdue_days 为负值或超过 999 → 修正为 0 或截断至 999。
4.2.3 第三层:重复与逻辑冲突
- 重复授信: 同一 user_id 在同一 decision_date 出现多条授信记录 → 保留最新一条,其余标记为重复并剔除。
- 用款日期冲突: drawdown_date 早于授信 decision_date → 视为数据错乱,剔除该笔用款记录。
- 还款金额矛盾: paid_amount 大于应还总额 → 截断至应还总额,并记录超额还款标记。
4.2.4 第四层:格式与一致性标准化
- 日期格式统一: 所有日期字段转为 YYYY-MM-DD 标准格式。
- 金额单位统一: 所有金额字段统一为“分”或“元”,避免跨表单位不一致。
- 枚举值映射: repayment_status 统一为 0-正常、1-逾期、2-核销、3-结清。
4.3 数据质量检查框架
清洗完成后,必须执行系统化的质量检查。检查维度分为完整性、准确性、一致性和时效性四项。以下 SVG 图展示了质量检查的完整流程与关键指标:
4.4 数据质量检查脚本示例
以下 Python 脚本展示了自动化质量检查的核心逻辑,适用于每日数据管道后的质量验证:
import pandas as pd
import numpy as np
def run_data_quality_checks(df, table_name):
"""
执行数据质量检查,返回检查结果字典
"""
results = {}
total_rows = len(df)
# 1. 完整性检查
missing_rate = df.isnull().sum().mean() / total_rows
results['missing_rate'] = round(missing_rate, 4)
results['completeness_pass'] = missing_rate < 0.05
# 2. 准确性检查:金额字段必须为正数
amount_cols = ['credit_limit', 'drawdown_amount', 'paid_amount']
for col in amount_cols:
if col in df.columns:
negative_count = (df[col] < 0).sum()
if negative_count > 0:
results[f'{col}_negative_flag'] = True
results['accuracy_pass'] = False
break
else:
results['accuracy_pass'] = True
# 3. 一致性检查:主键唯一性
if 'user_id' in df.columns:
dup_count = df['user_id'].duplicated().sum()
results['duplicate_rate'] = round(dup_count / total_rows, 4)
results['consistency_pass'] = dup_count == 0
# 4. 时效性检查
if 'decision_date' in df.columns:
max_date = df['decision_date'].max()
days_lag = (pd.Timestamp.today() - pd.Timestamp(max_date)).days
results['data_lag_days'] = days_lag
results['timeliness_pass'] = days_lag <= 1
results['overall_pass'] = all([
results.get('completeness_pass', False),
results.get('accuracy_pass', False),
results.get('consistency_pass', False),
results.get('timeliness_pass', False)
])
return results
# 使用示例
# quality_report = run_data_quality_checks(loan_data, 'loan_drawdown')
# print(quality_report)
常见清洗陷阱: 不要对缺失值直接填充 0 或删除整行,这会导致收益计算中的“幸存者偏差”。建议保留缺失标记列,在后续建模或统计中单独评估缺失模式对收益的影响。另外,清洗规则必须版本化记录,每次策略迭代后需重新评估规则是否仍然适用。
4.5 清洗后数据验证清单
在将清洗后数据投入收益评估前,建议逐项确认以下清单:
| 检查项 | 验证方法 | 通过标准 |
|---|---|---|
| 用户数完整性 | 对比清洗前后 user_id 去重计数 | 差异 < 2% |
| 授信总额勾稽 | 汇总 credit_limit 与业务系统总授信额对比 | 偏差 < 0.5% |
| 用款金额分布 | 检查 drawdown_amount 的 1%/99% 分位数 | 无极端离群值 |
| 逾期率稳定性 | 计算清洗前后整体逾期率 | 变化 < 0.3% |
| 时间序列连续性 | 按月统计记录数,检查无断月 | 连续 12 个月无缺失 |
完成上述数据准备与清洗工作后,即可进入下一阶段的训练集切分与收益评估建模。数据质量是额度策略收益评估的基石,建议将清洗与检查流程固化为自动化管道,每次策略迭代时自动触发,确保评估结果始终基于可靠的数据基础。