3、人群切片概念:什么是人群切片、切片维度(客户画像、产品类型、行业、地域)、切片粒度选择原则

3.1 什么是人群切片

人群切片(Cohort Slicing / Population Segmentation)是将一个整体资产组合按照特定维度拆解为若干个内部同质、外部异质的子群体,以便对每个子群体的风险表现进行独立归因与对比分析。切片不是简单的分组,而是有业务解释意义的、可回溯的、粒度可控的划分。

核心价值:切片让风险归因从“整体平均”下沉到“局部细节”,避免辛普森悖论——整体指标正常但各子群风险已恶化。

一个有效的切片应满足三个条件:

  • 可解释性:切片维度与业务逻辑一致,分析师能理解为什么这样切。
  • 可回溯性:切片规则可复现,历史回测时同一客户/资产能落入同一切片。
  • 可行动性:切片结果能直接指导风控策略调整或资源分配。

3.2 切片维度

实际应用中,切片维度通常来自四个核心域。下表列出各维度的典型字段与适用场景:

维度域 典型字段 适用场景 示例切片
客户画像 年龄、收入、信用评分、职业、婚姻状况 零售信贷、信用卡、消费金融 “30岁以下、收入<1万、信用分<600”
产品类型 贷款期限、利率类型、担保方式、还款方式 对公/零售贷款组合、结构化产品 “浮动利率+3年期+信用贷款”
行业 国民经济行业分类、产业链环节、企业规模 对公信贷、供应链金融、债券投资 “房地产行业+中型企业”
地域 省/市/县、城市等级、经济圈、行政区划 区域风险监控、房地产抵押品管理 “长三角+一线城市”
实践建议:切片维度可以组合使用,形成多维交叉切片。例如“客户画像 × 产品类型”能揭示特定客群在特定产品上的风险偏移。但维度组合不宜超过3层,否则切片数量爆炸,每个切片样本量不足。

3.3 切片粒度选择原则

切片粒度(Granularity)指每个切片包含的样本量或资产规模。粒度太粗会掩盖风险异质性,粒度太细则导致统计噪声过大。以下三条原则帮助确定合理粒度:

  1. 统计显著性原则:每个切片至少包含30个样本(或满足业务约定的最小样本量),确保风险指标(如违约率、损失率)的置信区间可控。
  2. 业务可解释性原则:切片边界应与业务决策单元对齐。例如风控策略通常按“客群-产品-渠道”三层划分,切片不应跨策略单元。
  3. 稳定性原则:切片在时间序列上应保持相对稳定,避免因单月样本波动导致切片频繁合并或拆分。
常见陷阱:不要为了追求“精细”而盲目增加切片数量。一个常见错误是将“年龄×收入×职业×地域”四维交叉,结果产生数百个切片,其中大量切片只有个位数样本,归因结果毫无统计意义。

3.4 切片粒度选择流程

下图展示了从原始数据到最终切片集的标准化流程:

人群切片粒度选择流程 人群切片粒度选择流程 原始资产组合 选择切片维度(1~3个) 生成初步切片集 校验:样本量≥30? 否 → 合并相邻切片 最终切片集

3.5 切片粒度选择矩阵

下表给出不同场景下的推荐粒度参考:

场景 推荐切片粒度 最小样本量 最大切片数
零售信贷月度监控 客群 × 产品 100笔 20个
对公信贷季度归因 行业 × 企业规模 30户 15个
信用卡逾期分析 信用分区间 × 年龄组 200张 25个
供应链金融风险排查 产业链环节 × 地域 50户 10个

3.6 切片维度组合示例

以下代码展示一个典型的多维切片定义(Python伪代码风格),用于说明切片规则如何落地:

# 切片定义:客户画像 × 产品类型 × 地域
slice_definitions = [
    {
        "name": "young_unsecured_urban",
        "filters": {
            "age_range": (18, 30),
            "product_type": "信用贷款",
            "region": "一线城市"
        },
        "min_sample": 100
    },
    {
        "name": "mid_income_mortgage_suburb",
        "filters": {
            "income_range": (10000, 30000),
            "product_type": "抵押贷款",
            "region": "二线城市"
        },
        "min_sample": 50
    }
]

# 切片生成逻辑
def create_slices(portfolio, slice_defs):
    slices = {}
    for sd in slice_defs:
        mask = True
        for key, val in sd["filters"].items():
            mask &= apply_filter(portfolio[key], val)
        slices[sd["name"]] = portfolio[mask]
    return slices
关键提醒:切片定义应作为风控系统的配置项,而非硬编码。每次复盘时可根据业务需求调整维度组合,但需保留历史切片定义快照,确保不同时期归因结果可比。