3. 数据采集与清洗:催收系统数据源与清洗规则

催收触达异常波动的根因定位,高度依赖底层数据的完整性与准确性。本章聚焦催收系统三大核心数据源(CTI、IVR、催收系统日志)的采集要点,以及数据清洗的三大规则(去重、异常值处理、时间窗口对齐),确保看板指标可追溯、可归因。

3.1 催收系统三大数据源

催收触达数据分散在多个子系统,采集时需明确各数据源的定义、字段及采集粒度。

数据源 核心字段 采集粒度 典型问题
CTI(计算机电话集成) 坐席工号、外呼号码、通话开始/结束时间、通话时长、接通状态(0-未接通/1-接通/2-振铃无应答) 逐通电话 重复记录、接通状态编码不一致
IVR(交互式语音应答) 客户按键轨迹、IVR流程节点ID、进入/退出时间、转人工标识 逐次交互 超时未按键导致记录截断
催收系统日志 案件ID、催收员操作(外呼/短信/信函)、操作时间、案件状态变更 逐笔操作 日志时间戳与CTI时间戳偏差
采集建议:CTI与IVR数据优先通过API实时拉取,催收系统日志建议采用增量同步(每5分钟一次),避免全量抽取造成系统压力。

3.2 数据清洗三大规则

原始数据存在重复、异常、时间不同步等问题,必须经过清洗才能进入看板计算。以下为催收场景下的清洗规则。

3.2.1 去重规则

  • CTI去重:以“坐席工号 + 外呼号码 + 通话开始时间(精确到秒)”为唯一键,保留最早一条记录。
  • IVR去重:以“客户号码 + IVR流程ID + 进入时间(精确到秒)”为唯一键,剔除重复按键轨迹。
  • 催收日志去重:以“案件ID + 操作类型 + 操作时间(精确到秒)”为唯一键,合并相同操作。

3.2.2 异常值处理

  • 通话时长异常:通话时长 < 0秒 或 > 3600秒(1小时)视为异常,标记为“无效通话”,不参与接通率计算。
  • IVR按键异常:按键序列包含非数字字符或长度超过20位,视为“按键异常”,剔除该次交互。
  • 时间戳异常:操作时间早于案件创建时间或晚于当前时间+5分钟,视为“时间戳漂移”,需回退至最近一次有效时间戳。

3.2.3 时间窗口对齐

CTI、IVR、催收日志的时间戳来自不同系统,存在毫秒级偏差。对齐规则如下:

  1. 统一基准:以催收系统日志的时间戳为基准(通常为数据库写入时间)。
  2. CTI对齐:CTI通话开始时间与催收日志中的“外呼操作时间”匹配,允许偏差 ≤ 2秒。
  3. IVR对齐:IVR进入时间与催收日志中的“IVR触发时间”匹配,允许偏差 ≤ 1秒。
  4. 未匹配处理:超出偏差范围的记录标记为“时间窗口未对齐”,单独存储供人工核查。
清洗后输出:生成一张“催收触达事实表”,包含字段:案件ID、客户号码、触达类型(外呼/短信/IVR)、触达时间、接通状态、通话时长、催收员ID、时间窗口对齐标识。

3.3 数据采集与清洗流程架构

以下SVG图展示从数据源采集到清洗输出的完整链路,包含三大数据源、清洗规则模块及最终事实表。

催收数据采集与清洗流程架构 CTI数据源 外呼记录 / 通话状态 IVR数据源 按键轨迹 / 流程节点 催收系统日志 操作记录 / 状态变更 数据清洗规则引擎 去重(唯一键匹配) 异常值处理(阈值过滤) 时间窗口对齐(偏差匹配) 催收触达事实表 案件ID / 触达类型 / 接通状态 / 时间窗口标识 催收触达看板(指标计算)

3.4 清洗规则代码示例(Python伪代码)

以下为催收数据清洗的核心逻辑,包含去重、异常值过滤及时间窗口对齐。

import pandas as pd
from datetime import timedelta

# 1. 加载原始数据
cti_df = pd.read_csv('cti_records.csv')
ivr_df = pd.read_csv('ivr_records.csv')
log_df = pd.read_csv('collection_log.csv')

# 2. 去重规则
cti_df.drop_duplicates(subset=['agent_id', 'customer_phone', 'call_start_time'], keep='first', inplace=True)
ivr_df.drop_duplicates(subset=['customer_phone', 'ivr_flow_id', 'enter_time'], keep='first', inplace=True)
log_df.drop_duplicates(subset=['case_id', 'operation_type', 'operation_time'], keep='first', inplace=True)

# 3. 异常值处理
cti_df = cti_df[(cti_df['call_duration'] >= 0) & (cti_df['call_duration'] <= 3600)]
ivr_df = ivr_df[ivr_df['key_sequence'].str.match(r'^[0-9]{1,20}$')]
log_df = log_df[(log_df['operation_time'] >= log_df['case_create_time']) &
                (log_df['operation_time'] <= pd.Timestamp.now() + timedelta(minutes=5))]

# 4. 时间窗口对齐(以催收日志为基准)
merged = pd.merge_asof(
    log_df.sort_values('operation_time'),
    cti_df.sort_values('call_start_time'),
    left_on='operation_time',
    right_on='call_start_time',
    direction='nearest',
    tolerance=pd.Timedelta(seconds=2)
)
merged['time_window_aligned'] = merged['call_start_time'].notna()
注意:时间窗口对齐时,若CTI与催收日志时间偏差超过2秒,该条记录将被标记为“未对齐”,需人工核查系统时钟同步情况。建议每日检查NTP服务状态。

3.5 数据质量监控指标

清洗完成后,需建立数据质量监控看板,确保后续分析可信。

指标 计算方式 阈值 告警动作
去重率 (原始记录数 - 去重后记录数)/ 原始记录数 < 5% 检查数据源是否重复推送
异常值占比 异常记录数 / 总记录数 < 2% 排查CTI/IVR系统配置
时间窗口对齐率 对齐记录数 / 总记录数 ≥ 98% 检查NTP同步及系统时间偏差
最佳实践:建议在每日凌晨执行数据清洗任务,并生成数据质量报告。若对齐率低于98%,当日看板指标需标注“数据质量待确认”,避免误判触达异常。