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场景中极为常见,尤其是受益所有人、实际控制人等字段。处理策略取决于字段的重要性和缺失比例:
- 关键字段缺失(如证件号):标记为“不可用于自动合并”,进入人工复核队列。
- 辅助字段缺失(如邮箱):不参与相似度计算,但保留字段占位。
- 高缺失率字段(缺失率>70%):评估是否纳入去重特征,通常建议剔除。
- 可推断缺失:如通过工商数据补全企业注册地址,需记录数据来源和补全时间。
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位则标记异常
三、案例场景:某银行客户主数据合并项目
某全国性银行在推进客户主数据合并时,发现核心银行系统与CRM系统中同一客户的姓名一致率仅为72%。经过排查,主要问题集中在三个方面:一是核心系统使用GBK编码,CRM使用UTF-8,导致部分生僻字显示为乱码;二是CRM中地址字段为自由文本,存在“XX路12号”与“XX路十二号”混用;三是电话号码存在带区号和不带区号两种格式。
项目组采取的预处理措施包括:统一编码为UTF-8并建立生僻字映射表;对地址进行分词和数字归一化;对电话统一去除区号并保留11位手机号。经过三轮迭代,姓名一致率提升至94%,地址一致率提升至88%,最终去重准确率从81%提升至93%。
四、误区与复盘
- 误区一:过度清洗导致信息丢失。例如将“张先生”和“张三”都简化为“张”,反而破坏了区分度。清洗应保留原始字段,标准化结果写入新字段。
- 误区二:忽视数据源权威性。不同系统对同一字段的权威性不同,合并时应按字段级别设定优先级,而非整条记录取舍。
- 误区三:异常值一刀切删除。部分异常值恰恰是同一实体的不同表达,删除会降低召回率。
- 误区四:预处理规则缺乏版本管理。规则变更后未记录,导致历史去重结果无法解释,审计时无法追溯。
数据采集与预处理不是一次性任务,而是伴随主数据合并全生命周期的持续过程。建立数据源画像、标准化规则库和异常值台账,才能为后续的实体去重和合并提供稳定可靠的数据基础。