数据准备与探索性分析:打好建模的地基
各位同学,咱们今天聊聊数据准备。说实话,很多做风控建模的朋友,一上来就急着调参、跑模型,结果模型上线就崩。我见过太多这样的案例了。其实,建模就像盖房子,数据准备就是打地基。地基不牢,房子再漂亮也得塌。
这一章,我会带着大家把数据源类型、质量检查、缺失值异常值处理、单变量分布分析这些事儿,掰开揉碎了讲清楚。嗯,都是我在项目里踩过的坑,你们听完能少走不少弯路。
核心观点: 数据准备占建模工作量的60%以上。别嫌烦,这一步做扎实了,后面模型调参就是水到渠成的事。
1. 数据源类型:征信、行为、三方数据
风控模型的数据源,说白了就三大类:征信数据、行为数据、三方数据。我习惯把它们比作「三驾马车」,各有各的用处。
- 征信数据: 比如央行征信报告、百行征信等。这类数据权威性高,但更新慢,覆盖人群有限。我在做银行项目时,征信数据是必选项,但光靠它不够,因为很多年轻人没有信贷记录。
- 行为数据: 用户在平台上的操作日志、交易流水、APP使用习惯等。这类数据实时性强,能反映用户当下的状态。举个例子,一个用户突然频繁修改密码、大额转账,这可能是欺诈的前兆。
- 三方数据: 比如运营商数据、电商数据、社保公积金数据等。这类数据能补充征信的盲区。我记得有个项目,用户征信一片空白,但通过他的电商消费记录,我们发现他经常购买高端电子产品,最终模型给了较高的额度。
这里有个避坑指南:三方数据质量参差不齐。我曾经对接过一家数据供应商,号称有2亿用户画像,结果一检查,重复率高达30%。所以,数据源的稳定性、覆盖率、更新频率,一定要在前期评估清楚。
2. 数据质量检查:别让脏数据毁了模型
数据质量检查,我一般分四步走:完整性、准确性、一致性、时效性。听起来很学术,其实做起来就是「查漏补缺」。
| 检查维度 | 具体内容 | 常见问题 |
|---|---|---|
| 完整性 | 字段是否有空值、缺失率 | 身份证号缺失、手机号为空 |
| 准确性 | 数据是否符合业务逻辑 | 年龄为负数、收入为0 |
| 一致性 | 同一字段在不同表中是否一致 | 用户性别在A表是男,B表是女 |
| 时效性 | 数据是否在有效期内 | 征信报告是3年前的 |
我个人习惯用Python的pandas-profiling库做快速扫描,几秒钟就能生成一份质量报告。但注意,自动检查只是第一步,关键还是要结合业务逻辑去判断。比如,一个用户的「月收入」字段是0,可能是他真的没收入,也可能是数据没采集到。这时候,我会去看他的「职业」字段,如果职业是「学生」,那收入为0就合理;如果是「企业高管」,那大概率是数据异常。
小技巧: 对于分类变量,可以用value_counts()查看每个类别的频次。如果某个类别占比超过99%,那这个变量基本没有区分度,可以考虑剔除。
3. 缺失值与异常值处理
缺失值和异常值,是数据清洗的两大「拦路虎」。处理不好,模型会学偏。
缺失值处理
我一般分三种情况处理:
- 缺失率低于5%: 直接删除。比如用户ID缺失,这种记录留着也没用。
- 缺失率在5%-30%: 填充。连续变量用中位数或均值,分类变量用众数。但要注意,填充后要加一个「是否缺失」的标识变量。为什么?因为「缺失」本身可能就是一个信号。我在做反欺诈模型时,发现「单位电话缺失」的用户,欺诈率是正常用户的3倍。
- 缺失率超过30%: 这个变量基本废了。除非它有很强的业务含义,否则我建议直接剔除。
异常值处理
异常值,说白了就是「离谱」的数据。比如年龄200岁、月收入1个亿。处理异常值,我常用两种方法:
- 3σ原则: 适用于正态分布的数据。超出均值±3倍标准差的值,视为异常。
- 箱线图法: 适用于偏态分布。用IQR(四分位距)来界定,超出Q1-1.5IQR或Q3+1.5IQR的值,视为异常。
我曾经遇到过一个案例:某个用户的「近6个月逾期次数」是100次。这明显是数据录入错误。我查了原始日志,发现是系统把「逾期天数」和「逾期次数」搞混了。所以,处理异常值时,一定要追溯源头,别盲目删除。
警告: 不要把所有异常值都删掉。在风控场景中,异常值往往代表高风险用户。比如「短期内频繁申请贷款」的用户,虽然数据异常,但恰恰是我们要重点关注的。
4. 单变量分布分析
单变量分布分析,就是看看每个变量长什么样。这一步能帮我们快速发现数据问题,也能为后续的分箱提供依据。
我一般会画两个图:直方图(连续变量)和柱状图(分类变量)。直方图看分布形态,柱状图看类别占比。
import matplotlib.pyplot as plt
import seaborn as sns
# 连续变量:年龄分布
plt.figure(figsize=(10, 6))
sns.histplot(data['age'], bins=30, kde=True)
plt.title('年龄分布直方图')
plt.show()
# 分类变量:性别分布
plt.figure(figsize=(6, 4))
data['gender'].value_counts().plot(kind='bar')
plt.title('性别分布柱状图')
plt.show()
你想想看,如果年龄分布图显示大部分用户集中在18-25岁,那说明我们的客群偏年轻。这时候,模型就要更关注年轻人的行为特征,比如消费习惯、社交网络等。
另外,我还会关注变量的「峰度」和「偏度」。偏度绝对值大于1,说明数据严重偏态,可能需要做对数变换。峰度太高,说明数据集中在某个区间,区分度可能不够。
经验之谈: 单变量分析时,别忘了看「好/坏样本」的分布差异。比如「近3个月查询次数」这个变量,好样本集中在0-3次,坏样本集中在5次以上。这种变量就是建模的「黄金变量」。
知识体系总览
下面这张图,是我自己总结的数据准备与探索性分析的核心流程。你们可以保存下来,每次做项目前对照着走一遍。
好了,这一章的内容就到这里。数据准备虽然繁琐,但它是整个建模流程中最值得花时间的一步。记住我的一句话:好数据胜过好模型。下一章,我们会进入变量筛选环节,到时候你们会发现,数据准备做得越扎实,变量筛选就越轻松。