4. 数据采集与预处理

在KYC实体去重与客户主数据合并项目中,数据采集与预处理往往占据整个项目60%以上的工作量。许多团队在算法选型和模型调参上投入大量精力,却因为源头数据质量不佳导致合并结果不可信。本章聚焦于从数据源识别到异常值处理的完整链路,帮助学员建立可落地的数据准备方法论。

一、核心原理:为什么预处理决定去重上限

实体去重的本质是判断两条记录是否指向同一个真实世界主体。如果同一客户在不同系统中的姓名写法、证件号码格式、地址粒度不一致,任何相似度算法都会产生误判。预处理的目标不是“让数据好看”,而是消除表达差异、保留语义差异。具体而言,预处理需要解决三类问题:

  • 表达层差异:全角/半角、大小写、空格、标点符号、繁简体等。
  • 结构层差异:证件号带前缀、电话号码带国家码、地址字段顺序不同。
  • 语义层差异:同一地址的不同表述、企业名称的简称与全称、曾用名与现用名。

预处理的质量直接决定了后续分块(Blocking)和相似度计算的召回率与准确率。一个常见的经验是:预处理阶段每提升10%的标准化覆盖率,去重准确率可提升5%~8%。

二、方法流程:从数据源识别到异常值处理

2.1 数据源识别与画像

在采集之前,必须先回答三个问题:数据来自哪些系统?每个系统的权威字段是什么?数据更新频率如何?建议为每个数据源建立一份“数据源画像卡”,包含字段清单、主键、更新周期、数据量级、已知质量问题。

数据源 权威字段 更新频率 已知问题
核心银行系统 客户号、证件号、开户姓名 实时 证件号含空格、姓名有生僻字
CRM系统 联系电话、地址、邮箱 每日 地址粒度粗、电话格式不统一
反洗钱系统 受益所有人、股权结构 每周 企业名称简称与全称混用
外部工商数据 统一社会信用代码、注册地址 每月 历史变更记录缺失

2.2 数据清洗与标准化

清洗与标准化通常按字段类型分别处理。以下是一个可复用的Python预处理片段,展示证件号、姓名和电话的标准化逻辑:

import re
import unicodedata

def normalize_id_card(raw: str) -> str:
    if not raw:
        return ""
    # 全角转半角,去除空格和连字符
    s = unicodedata.normalize("NFKC", raw)
    s = re.sub(r"[\s\-]", "", s)
    return s.upper()

def normalize_name(raw: str) -> str:
    if not raw:
        return ""
    s = unicodedata.normalize("NFKC", raw)
    s = re.sub(r"\s+", "", s)
    # 繁简转换可接入 opencc 等库
    return s

def normalize_phone(raw: str) -> str:
    if not raw:
        return ""
    s = re.sub(r"[^\d]", "", raw)
    if s.startswith("86") and len(s) == 13:
        s = s[2:]
    return s
标准化规则应当版本化管理。每次规则变更都要记录变更人、生效时间和影响范围,否则后续去重结果无法复现。

2.3 缺失值处理

缺失值在KYC场景中极为常见,尤其是受益所有人、实际控制人等字段。处理策略取决于字段的重要性和缺失比例:

  1. 关键字段缺失(如证件号):标记为“不可用于自动合并”,进入人工复核队列。
  2. 辅助字段缺失(如邮箱):不参与相似度计算,但保留字段占位。
  3. 高缺失率字段(缺失率>70%):评估是否纳入去重特征,通常建议剔除。
  4. 可推断缺失:如通过工商数据补全企业注册地址,需记录数据来源和补全时间。

2.4 异常值检测与处理

异常值包括格式异常(如证件号长度不符)、逻辑异常(如出生日期晚于开户日期)和统计异常(如某字段取值分布极端)。建议采用规则+统计双通道检测:

# 规则检测示例
def check_id_card_rule(id_card: str) -> bool:
    if len(id_card) not in (15, 18):
        return False
    if len(id_card) == 18 and not re.match(r"^\d{17}[\dX]$", id_card):
        return False
    return True

# 统计检测示例:电话字段长度分布
# 若某数据源电话长度集中在11位,出现大量8位或15位则标记异常
异常值不要直接删除。KYC数据具有强监管属性,删除操作必须留痕。建议将异常记录写入独立表,并附带异常类型和检测规则编号。

三、案例场景:某银行客户主数据合并项目

某全国性银行在推进客户主数据合并时,发现核心银行系统与CRM系统中同一客户的姓名一致率仅为72%。经过排查,主要问题集中在三个方面:一是核心系统使用GBK编码,CRM使用UTF-8,导致部分生僻字显示为乱码;二是CRM中地址字段为自由文本,存在“XX路12号”与“XX路十二号”混用;三是电话号码存在带区号和不带区号两种格式。

项目组采取的预处理措施包括:统一编码为UTF-8并建立生僻字映射表;对地址进行分词和数字归一化;对电话统一去除区号并保留11位手机号。经过三轮迭代,姓名一致率提升至94%,地址一致率提升至88%,最终去重准确率从81%提升至93%。

四、误区与复盘

  • 误区一:过度清洗导致信息丢失。例如将“张先生”和“张三”都简化为“张”,反而破坏了区分度。清洗应保留原始字段,标准化结果写入新字段。
  • 误区二:忽视数据源权威性。不同系统对同一字段的权威性不同,合并时应按字段级别设定优先级,而非整条记录取舍。
  • 误区三:异常值一刀切删除。部分异常值恰恰是同一实体的不同表达,删除会降低召回率。
  • 误区四:预处理规则缺乏版本管理。规则变更后未记录,导致历史去重结果无法解释,审计时无法追溯。
复盘建议:每轮预处理后,抽取200~500条样本进行人工标注,计算标准化前后的字段一致率变化。只有可量化的预处理才是可管理的预处理。

数据采集与预处理不是一次性任务,而是伴随主数据合并全生命周期的持续过程。建立数据源画像、标准化规则库和异常值台账,才能为后续的实体去重和合并提供稳定可靠的数据基础。