3. 数据基础:用户行为数据、交易数据、收益数据的采集与清洗规范

收益评估人群切片组合风险复盘的核心前提是数据质量。原始数据通常来自多个异构系统,存在格式不统一、字段缺失、时间戳漂移、重复记录等问题。本章定义三类核心数据的采集范围、采集规范与清洗规则,确保后续切片组合计算建立在干净、可追溯的数据基础之上。

3.1 三类数据采集范围与字段定义

数据采集覆盖用户行为、交易流水、收益表现三个维度,每类数据按业务实体与事件时间进行采集。下表列出每类数据的核心字段与采集粒度要求:

数据类别 核心字段 采集粒度 数据来源系统
用户行为数据 user_id, event_type, event_time, page_id, device_id, session_id, duration_sec 单次事件(点击/浏览/停留) 埋点系统、APP SDK、Web日志
交易数据 user_id, order_id, product_id, trade_time, trade_amount, trade_type, status, channel 单笔订单(含撤销/退款) 交易核心、支付网关、账务系统
收益数据 user_id, product_id, settle_date, income_amount, cost_amount, net_profit, yield_rate 日终结算(T+1) 核算系统、资管平台、对账中心
采集时效要求:用户行为数据延迟不超过 5 分钟;交易数据要求实时(秒级)接入;收益数据允许 T+1 批量采集。三类数据统一使用 UTC+8 时间戳,且必须携带数据源标识(source_tag),用于后续血缘追踪。

3.2 数据清洗规范与规则

原始数据进入清洗层后,按以下四步规则链执行清洗。每步规则均需记录清洗日志(清洗前记录数、清洗后记录数、剔除原因分布)。

  1. 格式标准化:统一 user_id 为字符串类型(去除前后空格、统一大小写);时间字段统一为 yyyy-MM-dd HH:mm:ss 格式;金额字段统一为 decimal(18,4),负值保留符号。
  2. 去重与去噪:按主键(user_id + event_time + event_type 或 order_id)去重,保留最早一条记录;剔除 event_time 超出当前时间 24 小时以上的异常事件;剔除 trade_amount ≤ 0 且 status 为“成功”的矛盾记录。
  3. 缺失值处理:关键字段(user_id、event_time、trade_amount)缺失时直接剔除整条记录;非关键字段(device_id、channel)缺失时填充默认值“unknown”或“-1”。
  4. 一致性校验:交易数据与收益数据按 user_id + product_id + settle_date 进行交叉校验,若收益数据中的 net_profit 与交易数据汇总偏差超过 0.01 元,则标记为“待人工复核”并暂不进入切片计算。
清洗规则示例(SQL 片段):
-- 用户行为数据去重
WITH dedup_behavior AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY user_id, event_time, event_type
      ORDER BY ingestion_time ASC
    ) AS rn
  FROM raw_user_behavior
  WHERE event_time <= CURRENT_TIMESTAMP
    AND event_time >= CURRENT_TIMESTAMP - INTERVAL '24' HOUR
)
SELECT * FROM dedup_behavior WHERE rn = 1;

3.3 数据采集与清洗架构

下图展示从数据源到清洗后数据层的完整采集与清洗链路,包含三类数据的采集通道、清洗节点与数据存储目标。

数据采集与清洗架构图 用户行为数据源 交易数据源 收益数据源 Kafka 实时采集通道 Kafka 实时采集通道 批量采集通道(T+1) 统一清洗层(格式标准化 → 去重去噪 → 缺失处理 → 一致性校验) 清洗日志记录 | 异常标记 | 待人工复核队列 清洗后数据仓库(行为宽表 / 交易宽表 / 收益宽表)

3.4 数据质量监控与异常处理

清洗后的数据需接入实时质量监控看板,监控指标包括:

  • 数据完整性:每类数据每日记录数波动不超过历史均值的 ±20%,否则触发告警。
  • 字段合规率:关键字段(user_id、trade_amount、net_profit)非空率需 ≥ 99.9%。
  • 交叉一致性:交易数据与收益数据按日对账偏差率 ≤ 0.01%。
  • 时效性:行为数据从事件发生到进入清洗后层延迟 ≤ 10 分钟;交易数据延迟 ≤ 30 秒。
常见清洗陷阱:
  • 用户行为数据中 session_id 可能因 APP 后台切换而断裂,清洗时需按 user_id + device_id + 时间间隔 ≤ 30 分钟进行会话合并,而非简单按 session_id 分组。
  • 交易数据中的退款记录(trade_type='refund')不应直接剔除,需保留并标记为负值,用于计算净交易金额。
  • 收益数据中的 yield_rate 若为百分比格式(如 5.2%),需统一转换为小数(0.052)后再入库,避免后续计算单位不一致。

3.5 数据血缘与版本管理

每张清洗后的宽表需记录数据血缘信息,包括:数据源表名、采集时间、清洗规则版本号、清洗执行人(调度任务 ID)。建议使用以下元数据字段:

-- 清洗后宽表公共元数据字段示例
source_system      VARCHAR(50)   COMMENT '数据来源系统标识',
source_table       VARCHAR(100)  COMMENT '原始表名',
batch_id           VARCHAR(32)   COMMENT '采集批次ID',
clean_rule_version VARCHAR(10)   COMMENT '清洗规则版本号,如 v3.2',
clean_timestamp    TIMESTAMP     COMMENT '清洗完成时间',
data_quality_flag  VARCHAR(10)   COMMENT '质量标记:PASS / REVIEW / REJECT'

当清洗规则发生变更时,必须升级 clean_rule_version,并对历史数据按新规则重新清洗一次,确保切片组合复盘的数据口径一致。