4、特征类型与分布分析:连续型特征与离散型特征、特征分布形态(正态、偏态、长尾)、使用描述性统计与直方图进行初步探索
在催收模型的特征筛选中,理解每个特征的数据类型和分布形态是决定后续处理策略的基础。连续型与离散型特征需要不同的统计量描述,而分布形态(正态、偏态、长尾)直接影响特征是否需要变换、分箱或异常值截断。本节将系统讲解如何通过描述性统计与可视化手段完成这一关键步骤。
4.1 特征类型:连续型 vs 离散型
特征类型决定了可用的统计量、可视化方式以及后续建模时的输入形式。催收场景中常见的特征类型如下表所示:
| 特征类型 | 定义 | 催收场景示例 | 常用统计量 | 可视化方式 |
|---|---|---|---|---|
| 连续型 | 在某个区间内可取任意实数值 | 逾期天数、欠款金额、客户年龄、收入 | 均值、中位数、标准差、分位数 | 直方图、箱线图、密度图 |
| 离散型 | 取值有限且可枚举(有序或无序) | 逾期期数(1/2/3)、催收次数、地区编码 | 频数、占比、众数 | 柱状图、饼图、频数表 |
| 二值型 | 离散型的特例,仅取0/1 | 是否失联、是否承诺还款、是否复催 | 正例率、负例率 | 堆叠柱状图、比例条 |
实操提示: 在催收数据中,逾期天数虽然是连续型,但常因合同期限不同而呈现多峰分布;催收次数虽为离散型,但若取值超过20个,可近似按连续型处理。建议在特征筛选初期先按类型分组,再统一进行分布分析。
4.2 特征分布形态:正态、偏态与长尾
分布形态决定了特征是否需要做变换或分箱。催收数据中,绝大多数特征呈现右偏态或长尾分布,例如欠款金额、逾期天数等。理解分布形态有助于选择正确的统计量和后续处理策略。
- 正态分布: 数据对称,均值≈中位数≈众数。催收中较少见,常见于经过标准化处理的评分或部分客户画像特征。
- 偏态分布: 数据不对称,分为左偏(负偏)和右偏(正偏)。催收中右偏极为常见,即大部分客户集中在低值区间,少数客户有极高值。
- 长尾分布: 偏态分布的极端形式,尾部拖得很长,存在极端异常值。例如逾期金额超过100万的客户虽然占比极低,但会严重拉高均值。
关键判断指标: 偏度系数(Skewness)> 1 通常视为强偏态;峰度系数(Kurtosis)> 3 提示存在厚尾或极端值。在催收模型中,偏度 > 2 的特征建议优先考虑对数变换或分箱处理。
4.3 描述性统计初步探索
在绘制直方图之前,先用描述性统计量快速了解特征的基本面貌。以下是一组催收数据中“逾期天数”特征的描述性统计示例:
# Python 示例:计算连续型特征的描述性统计
import pandas as pd
import numpy as np
# 假设 df 包含催收数据,'overdue_days' 为逾期天数
stats = df['overdue_days'].describe(percentiles=[0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99])
print(stats)
# 额外计算偏度和峰度
skewness = df['overdue_days'].skew()
kurtosis = df['overdue_days'].kurtosis()
print(f"偏度系数: {skewness:.2f}")
print(f"峰度系数: {kurtosis:.2f}")
输出解读示例:
| 统计量 | 值 | 业务含义 |
|---|---|---|
| count | 50,000 | 有效样本量 |
| mean | 45.3 天 | 平均逾期天数,受长尾影响偏大 |
| median (50%) | 22.0 天 | 中位数,更能代表典型客户 |
| std | 68.7 天 | 标准差大,说明离散程度高 |
| 1% 分位 | 1.0 天 | 极早期逾期客户 |
| 99% 分位 | 365.0 天 | 尾部极端值,需关注是否异常 |
| skewness | 3.45 | 强右偏,需做变换 |
| kurtosis | 15.2 | 厚尾,存在极端异常值 |
避坑提醒: 不要仅依赖均值判断特征中心。在强偏态分布下,均值可能被尾部极端值拉高数倍,此时中位数和分位数才是更稳健的集中趋势度量。建议在特征筛选报告中同时报告均值和中位数。
4.4 直方图初步探索
直方图是观察分布形态最直观的工具。通过调整分箱(bin)数量,可以揭示数据的集中区域、尾部厚度以及潜在的多峰结构。以下是对同一“逾期天数”特征绘制的直方图分析:
# Python 示例:绘制直方图
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 5))
sns.histplot(df['overdue_days'], bins=50, kde=True, color='#3498db')
plt.axvline(df['overdue_days'].mean(), color='#e74c3c', linestyle='--', label=f'均值: {df["overdue_days"].mean():.1f}')
plt.axvline(df['overdue_days'].median(), color='#2ecc71', linestyle='-', label=f'中位数: {df["overdue_days"].median():.1f}')
plt.xlabel('逾期天数')
plt.ylabel('频数')
plt.title('逾期天数分布直方图(含KDE曲线)')
plt.legend()
plt.show()
直方图观察要点:
- 集中趋势: 峰值出现在哪个区间?是否与中位数一致?
- 偏态方向: 右侧尾部是否明显长于左侧?均值是否远大于中位数?
- 多峰性: 是否存在两个或多个明显的峰值?可能暗示不同客群(如M1、M2、M3+)的混合。
- 异常值: 最右侧是否存在孤立的长条?是否与业务常识相符?
4.5 离散型特征的分布分析
离散型特征(如逾期期数、催收次数)的分布分析重点在于频数分布和类别平衡性。对于有序离散特征,还需关注其单调性趋势。
| 离散特征 | 取值 | 频数占比 | 是否平衡 | 处理建议 |
|---|---|---|---|---|
| 逾期期数 | M1, M2, M3, M4+ | 45%, 30%, 15%, 10% | 不平衡 | 保留有序性,可做WOE编码 |
| 催收次数 | 0,1,2,3,4,5+ | 20%, 35%, 25%, 12%, 5%, 3% | 不平衡 | 合并尾部类别,或做频数编码 |
| 地区编码 | 华东, 华南, 华北… | 30%, 25%, 20%, 15%, 10% | 不平衡 | 低频类别合并为“其他” |
离散特征筛选要点: 对于频数占比低于5%的类别,建议合并到“其他”类别,避免模型过拟合稀疏类别。同时检查类别与目标变量(如是否还款)的交叉分布,剔除与目标无关的类别。
4.6 连续型与离散型特征的联合探索
在实际催收模型中,连续型特征常与离散型特征组合分析。例如,按“逾期期数”分组后,观察“欠款金额”的分布差异。这种联合探索有助于发现特征间的交互效应。
# Python 示例:按离散特征分组查看连续特征分布
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 5))
sns.boxplot(data=df, x='overdue_stage', y='amount_owed',
palette=['#3498db', '#2ecc71', '#f39c12', '#e74c3c'])
plt.xlabel('逾期期数')
plt.ylabel('欠款金额(元)')
plt.title('不同逾期期数下的欠款金额分布')
plt.show()
联合探索的输出解读:
- 若M1组的中位数金额显著低于M4+组,说明金额与逾期阶段正相关,该特征组合有强预测力。
- 若各组分布高度重叠,则说明该连续特征对区分不同逾期阶段贡献有限,可考虑剔除或做交互特征。
4.7 分布分析在特征筛选中的决策应用
完成分布分析后,需根据结果做出以下筛选决策:
| 分布特征 | 发现的问题 | 筛选决策 | 处理方式 |
|---|---|---|---|
| 严重右偏(偏度>3) | 均值被极端值严重拉高 | 需变换后保留 | 对数变换、Box-Cox变换或分箱 |
| 双峰/多峰分布 | 存在不同客群混合 | 保留并考虑交互 | 按峰值分群后分别建模或做交叉特征 |
| 离散特征类别过多 | 稀疏类别导致过拟合 | 合并低频类别 | 频数<5%的类别合并为“其他” |
| 特征取值几乎不变 | 方差接近0,无区分度 | 直接剔除 | 删除该特征 |
| 存在明显异常值 | 尾部极端值影响模型稳定性 | 截断或单独处理 | 99%分位数截断或单独标记为异常类别 |
最佳实践: 建议在特征筛选报告中为每个特征建立“分布档案”,包含:类型标记、偏度/峰度值、均值/中位数对比、直方图缩略图、以及基于分布形态的处理建议。这有助于后续建模团队快速理解每个特征的特性。