跳转至

Lecture 3:数据预处理

学习要点

真实数据可能不完整、含噪或相互矛盾。数据预处理(data preprocessing)把原始数据转换为适合分析的数据,主要包括数据清洗、数据集成、数据变换、数据归约与数据离散化。输入数据质量会直接影响分析结果,常用原则是“垃圾进,垃圾出”(Garbage In, Garbage Out,GIGO)。

1. 抽取、转换与加载

抽取、转换与加载(Extract, Transform, Load,ETL)是把多个来源的数据汇入目标仓库的流程:先抽取所需数据,再清洗、统一和变换,最后加载到数据仓库、数据湖或应用中。实际系统也常采用 ELT,即先加载原始数据,再在目标平台中转换。

2. 数据清洗

脏数据(dirty data)常见问题:

问题 示例 常见处理
缺失(incomplete) 收入为空、字段未采集 删除少量不适用记录,或按业务与统计规则填补
噪声(noisy) 传感器误差、录入错误、极端值 核验来源,平滑数据或标记异常值
不一致(inconsistent) USA 与 usa、日期格式混杂、单位不同 统一代码、格式、单位和约束
重复(duplicate) 同一实体重复入库 按主键或业务键去重并保留可追溯规则

缺失值处理

先判断缺失原因与比例,再选择方法。可删除缺失过多且不关键的记录、用常量标记(如 unknown)、用均值或中位数填补,或按类别分组填补。需要建模推断时可使用回归或其他预测方法;填补方案应记录在数据处理流程中。

Python
import pandas as pd

df = pd.read_csv("input.csv")

# 检查各列缺失数量
print(df.isna().sum())

# 数值列以中位数填补,分类列显式标记
df["age"] = df["age"].fillna(df["age"].median())
df["occupation"] = df["occupation"].fillna("unknown")

# 按业务键去重,保留第一条记录
df = df.drop_duplicates(subset=["record_id"], keep="first")

不应机械地用均值填补所有字段:偏态分布容易被极端值影响,缺失本身也可能具有业务含义。分类标签缺失时尤其要谨慎,不能随意推断真实类别。

噪声与异常值

  • 分箱平滑(binning):先排序并分箱,再用箱均值、中位数或边界值替换箱内数据。等宽分箱每箱覆盖相同数值区间,易受离群值影响;等深分箱让每箱样本数近似相同。
  • 聚类(clustering):把相似记录分组,远离主要簇的点可作为异常候选,但需业务核实。
  • 回归(regression):拟合趋势以平滑随机波动。
  • 人工或半自动检查:结合领域规则验证可疑值。

异常值不一定是错误;应先区分录入错误、测量噪声与真实但罕见的事件。

正则表达式(regular expression,regex)用字符模式搜索、校验、提取或替换文本,常用于格式清洗:

Python
import re

text = "订单号: AB-2048,联系邮箱: [email protected]"

order_id = re.search(r"\b[A-Z]{2}-\d{4}\b", text)
email = re.search(r"[\w.+-]+@[\w-]+(?:\.[\w-]+)+", text)

print(order_id.group() if order_id else None)
print(email.group() if email else None)

# 将连续空白统一为一个空格
clean_text = re.sub(r"\s+", " ", text).strip()

常用符号:. 匹配一个字符,\d 匹配数字,\w 匹配字母/数字/下划线,\s 匹配空白;+ 表示至少一个,* 表示零个或多个,{m,n} 指定重复次数,^ 与 $ 锚定文本开头和结尾。Python 原始字符串 r"..." 可避免反斜杠被字符串语法提前处理。

校验与一致性

可利用字段类型、取值范围、唯一性、非空约束、连续性和跨字段依赖发现错误。例如年龄必须非负,结束日期不能早于开始日期,邮政编码需符合指定格式。数据审计(data auditing)可通过统计关系或聚类发现可疑记录;数据清理(data scrubbing)则使用领域规则纠正常见错误。

3. 数据集成

数据集成(data integration)将多个来源合并成一致的数据集,核心工作包括:

  • 模式集成(schema integration):统一字段名称、类型、层级与单位;
  • 实体识别(entity identification):判断不同来源的记录是否描述同一现实对象;
  • 冲突处理:解决币种、度量单位、编码或取值时间不同导致的冲突;
  • 冗余消除:识别重复字段和可由其他字段推导的属性。

例如把英寸转换为厘米、把不同日期格式转为统一标准,并根据可靠度和时间戳决定冲突记录的保留规则。

4. 数据变换

数据变换(data transformation)包括平滑、聚合、泛化、规范化和特征构造。规范化(normalization)把数值尺度调整到可比较的范围。

最小-最大规范化

把属性值线性映射到区间 \([a,b]\):

\[ v' = a + \frac{v - \min(A)}{\max(A)-\min(A)}(b-a) \]

Z 分数规范化

用均值和标准差表达观测值偏离均值的程度:

\[ v' = \frac{v-\mu_A}{\sigma_A} \]

十进制缩放

选择最小整数 \(j\),使转换后最大绝对值小于 1:

\[ v' = \frac{v}{10^j} \]

聚合(aggregation)将细粒度记录汇总,例如按季度求年度销售总额;泛化(generalization)用更高层概念替代细节,例如把年龄映射到年龄段;特征构造(feature construction)从已有字段创建有助于分析的新属性。

5. 数据归约

数据归约(data reduction)用更小的数据表示保留相同或近似的分析结论,以降低存储和计算成本。

  • 维度归约(dimensionality reduction):选择重要特征,或将高维数据映射到较低维空间;特征更少也更容易解释。
  • 数据压缩(data compression):无损压缩可完整还原;有损压缩以部分精度换取更小体积,常用于图像、音频和视频。
  • 数量归约(numerosity reduction):用模型、直方图、聚类或抽样代替完整记录。
  • 聚合:通过数据立方体或分组统计保留分析所需的汇总层级。

分层抽样(stratified sampling)先按类别或子群分层,再从每层抽样,可避免少数群体在样本中被忽略。

6. 离散化与概念层次

离散化(discretization)将连续数值范围划分为区间,并以区间标签替代原值,例如年龄转换为“青年、中年、老年”。概念层次(concept hierarchy)把低层细节逐步汇总成高层类别,例如“城市 → 地区 → 国家”。

常用离散化方法包括等宽或等深分箱、直方图分析、聚类、基于熵和信息增益的阈值选择,以及按数据范围递归划分。选择方法时要考虑类别分布和分析目标;分箱过粗会丢失信息,过细则难以简化数据。

复习要点

  • 数据清洗解决缺失、噪声、重复和不一致;数据集成解决多来源模式、实体与值冲突。
  • 规范化统一数值尺度,聚合与泛化形成更高层摘要,特征构造创建新属性。
  • 数据归约减少存储或计算规模,离散化把连续值转换为区间类别。
  • 正则表达式适合基于明确格式抽取或校验文本,但复杂文本仍需结合语境与来源验证。