4. 原始数据质量探查:空值率、重复率、异常值检测SQL脚本编写与结果解读
在风控标签口径校准项目中,原始数据质量直接决定后续标签计算的准确性与稳定性。本章聚焦于数据探查的三个核心维度:空值率、重复率与异常值检测。通过标准化的SQL脚本与结果解读,快速定位数据质量问题,为清洗与校准提供依据。
核心目标:在口径校准前,对源表(如
risk_loan_order、user_profile)进行系统性质量扫描,输出可量化的质量报告。
4.1 空值率检测:字段缺失度评估
空值率反映字段信息的完整程度。在风控场景中,关键字段(如身份证号、手机号、收入)的空值可能导致标签计算偏差或模型失效。
SQL脚本示例:
-- 空值率检测:对指定表的所有字段进行空值统计
SELECT
'risk_loan_order' AS table_name,
'user_id' AS column_name,
COUNT(*) AS total_rows,
SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2) AS null_rate_pct
FROM risk_loan_order
UNION ALL
SELECT
'risk_loan_order',
'loan_amount',
COUNT(*),
SUM(CASE WHEN loan_amount IS NULL THEN 1 ELSE 0 END),
ROUND(100.0 * SUM(CASE WHEN loan_amount IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2)
FROM risk_loan_order
UNION ALL
SELECT
'risk_loan_order',
'id_card_no',
COUNT(*),
SUM(CASE WHEN id_card_no IS NULL THEN 1 ELSE 0 END),
ROUND(100.0 * SUM(CASE WHEN id_card_no IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2)
FROM risk_loan_order;
结果解读要点:
- 空值率 > 5%:标记为“待关注”,需确认是否为业务允许缺失(如非必填项)。
- 空值率 > 20%:标记为“高风险”,该字段在标签计算中可能需做填充或剔除处理。
- 关键标识字段(如身份证号)空值率 > 0%:需立即排查数据采集链路。
实战建议:将空值率检测脚本封装为存储过程,支持动态传入表名与字段列表,提升复用效率。
4.2 重复率检测:主键与业务唯一性校验
重复数据会导致标签聚合结果失真(如重复计算用户逾期次数)。重复率检测通常针对主键或业务唯一键(如订单号、用户ID+时间戳)。
SQL脚本示例:
-- 重复率检测:基于主键 order_id 统计重复行
WITH dup_stats AS (
SELECT
order_id,
COUNT(*) AS row_count
FROM risk_loan_order
GROUP BY order_id
)
SELECT
'risk_loan_order' AS table_name,
'order_id' AS key_column,
COUNT(*) AS distinct_key_count,
SUM(row_count) AS total_rows,
SUM(CASE WHEN row_count > 1 THEN row_count - 1 ELSE 0 END) AS duplicate_rows,
ROUND(100.0 * SUM(CASE WHEN row_count > 1 THEN row_count - 1 ELSE 0 END) / SUM(row_count), 2) AS duplicate_rate_pct
FROM dup_stats;
结果解读要点:
- 重复率 = 0%:主键唯一性良好。
- 重复率 > 0% 且 < 1%:可能存在偶发重复插入,需检查ETL去重逻辑。
- 重复率 > 1%:系统性问题,需优先修复数据源或增加写入前校验。
| 检测维度 | 阈值 | 风险等级 | 建议动作 |
|---|---|---|---|
| 空值率 | < 5% | 低 | 常规监控 |
| 空值率 | 5% – 20% | 中 | 评估业务影响,考虑填充策略 |
| 空值率 | > 20% | 高 | 排查数据源,标记为弱特征 |
| 重复率 | 0% | 低 | 无需处理 |
| 重复率 | 0% – 1% | 中 | 检查ETL去重机制 |
| 重复率 | > 1% | 高 | 紧急修复数据写入链路 |
4.3 异常值检测:统计分布与业务规则结合
异常值检测需兼顾统计方法与业务常识。常用手段包括:Z-Score、IQR(四分位距)以及业务阈值过滤(如年龄 > 120、贷款金额为负数)。
SQL脚本示例(IQR方法):
-- 异常值检测:基于 IQR 识别 loan_amount 的离群点
WITH stats AS (
SELECT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY loan_amount) AS q1,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY loan_amount) AS q3
FROM risk_loan_order
WHERE loan_amount IS NOT NULL
),
iqr_calc AS (
SELECT
q1,
q3,
(q3 - q1) AS iqr,
q1 - 1.5 * (q3 - q1) AS lower_bound,
q3 + 1.5 * (q3 - q1) AS upper_bound
FROM stats
)
SELECT
'loan_amount' AS field_name,
COUNT(*) AS total_valid,
SUM(CASE WHEN loan_amount < lower_bound OR loan_amount > upper_bound THEN 1 ELSE 0 END) AS outlier_count,
ROUND(100.0 * SUM(CASE WHEN loan_amount < lower_bound OR loan_amount > upper_bound THEN 1 ELSE 0 END) / COUNT(*), 2) AS outlier_rate_pct,
MIN(loan_amount) AS min_val,
MAX(loan_amount) AS max_val
FROM risk_loan_order, iqr_calc
WHERE loan_amount IS NOT NULL;
结果解读要点:
- 异常值率 < 1%:可接受,但需人工复核极端值是否合理(如单笔贷款1亿元)。
- 异常值率 1% – 5%:需结合业务规则二次过滤,避免误杀正常业务(如大额企业贷)。
- 异常值率 > 5%:数据分布异常,需检查上游系统是否存在单位错误或字段错位。
避坑提示:不要仅依赖统计方法。例如,贷款金额的右偏分布中,高净值客户的大额贷款会被IQR误判为异常。务必叠加业务白名单或阈值豁免规则。
4.4 数据质量探查流程总览
以下SVG图展示了从原始数据接入到质量报告输出的完整探查流程,包含三个并行检测分支与最终决策节点。
4.5 结果整合与报告输出
将三个维度的检测结果合并为一张质量总表,便于决策层快速定位问题表与字段。
SQL脚本示例(结果整合):
-- 质量报告整合:空值率、重复率、异常值率汇总
SELECT
'risk_loan_order' AS table_name,
'user_id' AS field_name,
null_rate_pct,
NULL AS duplicate_rate_pct,
NULL AS outlier_rate_pct
FROM null_stats WHERE field_name = 'user_id'
UNION ALL
SELECT
'risk_loan_order',
'order_id',
NULL,
duplicate_rate_pct,
NULL
FROM dup_stats WHERE key_column = 'order_id'
UNION ALL
SELECT
'risk_loan_order',
'loan_amount',
NULL,
NULL,
outlier_rate_pct
FROM outlier_stats WHERE field_name = 'loan_amount'
ORDER BY table_name, field_name;
输出示例:若
user_id 空值率 0.5%、order_id 重复率 0%、loan_amount 异常值率 2.3%,则整体质量评级为“中等”,需对 loan_amount 进行业务规则复核。
通过以上空值率、重复率、异常值检测的SQL脚本与结果解读,风控数据专家能够在口径校准前系统性地掌握数据质量全貌,为后续标签计算提供可靠的数据基础。