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)
欺诈标签用于标记疑似欺诈的理赔案件。生成逻辑基于以下规则组合(满足任一即标记):
- 报案延迟异常: 报案时间距事故时间超过72小时,且无合理解释。
- 损失金额突增: 预估损失金额超过同类事故平均值的3倍标准差。
- 历史关联风险: 同一客户或车辆在30天内发生2次及以上理赔。
- 黑名单匹配: 客户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 数据模型关系与标签生成流程
下图展示了保单、理赔、客户三个维度的关联关系,以及坏样本标签的生成流程:
3.6 实时数据流架构示意
以下架构图展示三个维度数据如何通过Kafka接入Flink,经过关联与规则计算后输出坏样本标签:
架构要点总结:
- 三个维度数据通过独立的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处理迟到数据,确保标签生成的鲁棒性。