4. 数据准备与预处理:数据采集、数据清洗、缺失值处理、异常值检测与处理
在坏样本归因分析中,数据准备与预处理是决定分析质量的基础环节。原始数据往往来自多个异构源,包含噪声、缺失、异常和格式不一致等问题。本章将系统讲解从数据采集到清洗、缺失值处理、异常值检测与处理的完整流程,确保后续归因建模的数据质量。
4.1 数据采集
数据采集是归因分析的第一步,目标是从业务系统、日志、数据库、第三方接口等渠道获取与坏样本相关的原始数据。根据归因场景的不同,采集的数据通常包括以下几类:
| 数据类别 | 典型来源 | 采集内容示例 |
|---|---|---|
| 交易数据 | 订单系统、支付网关 | 交易时间、金额、商品ID、支付方式、退款状态 |
| 用户行为数据 | 埋点日志、APP/Web SDK | 点击流、页面停留时长、浏览路径、搜索关键词 |
| 设备与环境数据 | 设备指纹、IP库、UA解析 | 设备型号、操作系统、IP地址、网络类型、地理位置 |
| 业务标签数据 | 风控系统、客服系统 | 坏样本标签(欺诈/逾期/退货)、处置结果、风险等级 |
采集原则:优先采集与坏样本直接相关的特征维度,避免过度采集无关字段。建议在采集阶段保留原始时间戳和唯一标识符,便于后续数据对齐与回溯。
4.2 数据清洗
数据清洗主要处理格式错误、重复记录、逻辑冲突和不一致数据。常见清洗操作包括:
- 去重:基于主键或业务唯一标识(如订单号、用户ID)去除完全重复或部分重复的记录。
- 格式标准化:统一日期格式(如 yyyy-MM-dd HH:mm:ss)、金额单位(统一为分或元)、枚举值映射(如性别:0/1 → 男/女)。
- 逻辑校验:检查字段间的业务约束,如“下单时间”应早于“支付时间”,“年龄”应在合理范围内(0-120)。
- 字段裁剪:删除与归因分析无关的冗余字段(如内部备注、临时标记列)。
# 数据清洗示例(Python伪代码)
import pandas as pd
df = pd.read_csv('raw_data.csv')
# 去重
df = df.drop_duplicates(subset=['order_id'])
# 日期标准化
df['create_time'] = pd.to_datetime(df['create_time'], format='%Y-%m-%d %H:%M:%S')
# 逻辑校验:过滤异常年龄
df = df[(df['age'] >= 0) & (df['age'] <= 120)]
# 删除冗余列
df = df.drop(columns=['internal_note', 'temp_flag'])
4.3 缺失值处理
缺失值是数据预处理中的常见问题。处理策略需结合缺失率、字段业务含义和后续模型需求综合选择。常用方法如下:
| 缺失率范围 | 推荐策略 | 适用场景 |
|---|---|---|
| < 5% | 删除缺失记录(行删除) | 样本量充足,缺失随机分布 |
| 5% - 30% | 均值/中位数/众数填充 | 数值型用中位数,分类型用众数 |
| 30% - 60% | 模型预测填充(KNN、回归) | 字段与其他特征相关性较强 |
| > 60% | 删除字段或标记为“缺失”类别 | 字段信息量过低,保留可能引入噪声 |
注意:在坏样本归因场景中,缺失值本身可能携带信息。例如,风控系统中“审核人字段”缺失可能意味着该笔交易未经人工审核,这本身就是一条重要线索。建议在填充前先分析缺失模式。
# 缺失值处理示例
# 数值型字段:用中位数填充
df['amount'].fillna(df['amount'].median(), inplace=True)
# 分类型字段:用众数填充
df['channel'].fillna(df['channel'].mode()[0], inplace=True)
# 高缺失率字段:标记为缺失类别
df['risk_level'].fillna('UNKNOWN', inplace=True)
4.4 异常值检测与处理
异常值是指明显偏离正常分布的数据点,在坏样本归因中,异常值可能是真正的欺诈/异常行为,也可能是数据采集错误。检测方法需根据数据分布特征选择:
- Z-Score 方法:适用于近似正态分布的数据,通常取 |Z| > 3 为异常。
- IQR 四分位距法:适用于偏态分布,取 Q1 - 1.5×IQR 或 Q3 + 1.5×IQR 之外为异常。
- 孤立森林(Isolation Forest):适用于高维数据,基于随机分割的异常检测算法。
- 业务规则法:基于领域知识设定阈值,如单笔交易金额 > 100 万视为异常。
关键区别:在归因分析中,异常值不一定是“坏数据”。例如,一笔 500 万的交易在正常业务中可能是异常值,但恰好是坏样本的典型特征。因此,建议先标记异常值,而非直接删除,在后续归因建模中作为独立特征使用。
# 异常值检测示例(IQR法)
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 标记异常值,不直接删除
df['amount_outlier'] = ((df['amount'] < lower_bound) | (df['amount'] > upper_bound)).astype(int)
4.5 数据预处理总结
数据准备与预处理是坏样本归因分析中耗时最长但回报最高的环节。一个经过充分清洗和特征工程的数据集,能够显著提升后续归因模型的准确性和可解释性。以下为本章核心要点:
| 阶段 | 核心目标 | 常见陷阱 |
|---|---|---|
| 数据采集 | 获取全面、准确的原始数据 | 遗漏关键维度,采集字段过多导致噪声 |
| 数据清洗 | 去除重复、格式错误、逻辑冲突 | 过度清洗导致信息丢失 |
| 缺失值处理 | 合理填充或删除缺失数据 | 忽略缺失模式中的业务含义 |
| 异常值检测 | 识别并标记偏离正常分布的数据点 | 直接删除异常值,丢失坏样本关键线索 |
最佳实践:在完成数据预处理后,建议输出一份《数据质量报告》,包含各字段缺失率、异常值比例、分布统计等信息。这份报告既是数据质量的凭证,也是后续归因分析中特征选择的参考依据。