3. 精算数据模型设计:保单、理赔、客户维度与坏样本标签生成逻辑

在实时坏样本归因系统中,数据模型是分析的基础。本章定义保单、理赔、客户三个核心维度的关键字段,并阐述欺诈、高赔付等坏样本标签的生成逻辑。清晰的数据模型与标签规则,是后续Flink作业进行特征计算与归因分析的先决条件。

3.1 保单维度关键字段

保单维度记录每份保险合同的核心属性,是风险定价与赔付分析的基础。以下为实时流中必须采集的关键字段:

字段名 类型 说明 示例
policy_id String 保单唯一标识 POL20250301001
product_code String 险种代码(如车损险、三者险) CAR_DAMAGE
underwriting_date Timestamp 承保日期 2025-03-01 10:00:00
premium_amount Decimal 总保费(元) 4500.00
sum_insured Decimal 保险金额(元) 200000.00
deductible_rate Decimal 免赔率(0~1) 0.10
policy_status String 保单状态(有效/终止/满期) ACTIVE
实时采集要点: 保单维度数据通常从核心承保系统通过CDC(变更数据捕获)或消息队列(如Kafka)接入Flink。需关注policy_status变更事件,以触发保单生命周期的状态更新。

3.2 理赔维度关键字段

理赔维度记录报案、查勘、定损、赔付全流程数据,是坏样本识别最直接的信号源。

字段名 类型 说明 示例
claim_id String 理赔案件唯一标识 CL20250315001
policy_id String 关联保单ID POL20250301001
report_date Timestamp 报案时间 2025-03-15 08:30:00
loss_amount_estimated Decimal 预估损失金额(元) 15000.00
loss_amount_settled Decimal 最终赔付金额(元) 12000.00
claim_status String 案件状态(报案/查勘/定损/结案) SETTLED
accident_type String 事故类型(碰撞/水淹/盗抢) COLLISION
关键关联: 理赔维度通过policy_id与保单维度关联,形成“一单多赔”或“一单多案”的星型模型。在Flink中,可使用intervalJoin或lookupJoin将理赔流与保单维表关联,以获取承保信息。

3.3 客户维度关键字段

客户维度描述投保人/被保险人的属性与历史行为,用于刻画客户画像与风险分层。

字段名 类型 说明 示例
customer_id String 客户唯一标识 CUST10086
age_group String 年龄段(如25-35) 25-35
occupation_code String 职业代码 PROFESSIONAL
claim_frequency_3y Integer 近3年出险次数 2
total_claim_amount_3y Decimal 近3年累计赔付金额(元) 35000.00
credit_score Integer 信用评分(300-850) 720
customer_tenure_days Integer 客户在保天数 365
数据隐私注意: 客户维度字段需遵循数据最小化原则,避免采集姓名、身份证号等敏感信息。建议使用脱敏后的客户ID,并严格控制字段访问权限。

3.4 坏样本标签生成逻辑

坏样本标签是归因分析的目标变量。本教程定义两类核心坏样本:欺诈标签与高赔付标签。标签生成逻辑需结合业务规则与统计阈值,并支持实时计算。

3.4.1 欺诈标签(Fraud Flag)

欺诈标签用于标记疑似欺诈的理赔案件。生成逻辑基于以下规则组合(满足任一即标记):

  1. 报案延迟异常: 报案时间距事故时间超过72小时,且无合理解释。
  2. 损失金额突增: 预估损失金额超过同类事故平均值的3倍标准差。
  3. 历史关联风险: 同一客户或车辆在30天内发生2次及以上理赔。
  4. 黑名单匹配: 客户ID或车牌号命中内部黑名单库。
实时计算示例(Flink SQL):
-- 欺诈标签生成逻辑(简化版)
INSERT INTO fraud_label_sink
SELECT
  c.claim_id,
  c.policy_id,
  CASE
    WHEN c.report_date - c.accident_date > INTERVAL '72' HOUR THEN 1
    WHEN c.loss_amount_estimated > (SELECT AVG(loss_amount_estimated) * 3 FROM claim_stats WHERE accident_type = c.accident_type) THEN 1
    WHEN h.claim_count_30d >= 2 THEN 1
    WHEN b.customer_id IS NOT NULL THEN 1
    ELSE 0
  END AS is_fraud
FROM claim_stream c
LEFT JOIN (SELECT customer_id, COUNT(*) AS claim_count_30d FROM claim_stream GROUP BY customer_id, HOP(proctime, INTERVAL '1' DAY, INTERVAL '30' DAY)) h
  ON c.customer_id = h.customer_id
LEFT JOIN blacklist b
  ON c.customer_id = b.customer_id;

3.4.2 高赔付标签(High Loss Flag)

高赔付标签用于标记赔付金额显著高于预期的保单或客户。生成逻辑基于赔付率阈值:

  • 保单级高赔付: 累计赔付金额 / 总保费 > 1.5(赔付率超过150%)。
  • 客户级高赔付: 近1年累计赔付金额 > 该险种平均赔付金额的2倍。
  • 动态阈值: 阈值可根据险种、地区、季节动态调整,通过配置表加载。
阈值管理: 建议将阈值存储在外部配置中心(如Nacos或Redis),Flink作业定期拉取更新,避免因业务变化导致标签失效。

3.5 数据模型关系与标签生成流程

下图展示了保单、理赔、客户三个维度的关联关系,以及坏样本标签的生成流程:

精算数据模型与坏样本标签生成流程 数据模型关联与坏样本标签生成流程 保单维度 policy_id, premium, sum_insured 理赔维度 claim_id, loss_amount, status 客户维度 customer_id, credit_score 坏样本标签生成规则 欺诈标签:报案延迟 >72h | 损失金额突增 >3σ | 30天内重复理赔 >=2次 | 黑名单匹配 高赔付标签:保单赔付率 >150% | 客户年赔付 >险种均值×2 | 动态阈值配置 输出:坏样本标签 (is_fraud / is_high_loss) 下游应用:实时预警 | 归因分析 | 风控决策 Flink CEP + 规则引擎 + 特征存储

3.6 实时数据流架构示意

以下架构图展示三个维度数据如何通过Kafka接入Flink,经过关联与规则计算后输出坏样本标签:

实时数据流架构 Flink实时坏样本标签计算架构 保单Kafka Topic policy_events 理赔Kafka Topic claim_events 客户Kafka Topic customer_events Flink 实时作业 多流关联 (intervalJoin) 规则引擎 (CEP) 标签计算 (SQL/ProcessFunction) 状态管理 (ValueState/MapState) 输出Sink Kafka (标签结果) ClickHouse (OLAP)
架构要点总结:
  • 三个维度数据通过独立的Kafka Topic接入,保持解耦。
  • Flink作业使用intervalJoin按policy_id和customer_id进行多流关联。
  • 规则引擎基于CEP或Flink SQL实现欺诈与高赔付标签的实时判定。
  • 标签结果同时写入Kafka(供下游预警)和ClickHouse(供OLAP归因分析)。

3.7 字段与标签的实时性保障

实时坏样本归因对数据时效性要求极高。以下为关键保障措施:

维度 延迟要求 Flink实现方式
保单变更 < 5秒 CDC + Kafka,Flink Table API实时读取
理赔报案 < 3秒 直接推送Kafka,Flink分配事件时间水位线
客户画像更新 < 30秒 定时维表加载 + 广播状态
标签生成 < 10秒 基于事件时间窗口 + 规则即时计算
最佳实践: 建议为每个维度数据设置独立的水位线策略,避免因某个Topic延迟导致整个作业阻塞。使用allowedLateness处理迟到数据,确保标签生成的鲁棒性。