Week 2 Data Cleansing 这周很多基本都是概念性问题,Assignment 会用考察代码对数据的各种操作
什么是数据清洗(What)
- 定义(Definition):找出并纠正/移除影响数据质量与可用性的内容,目标是让数据达到 consistent / complete / accurate / uniform(一致/完整/准确/统一)。
- 定义:数据清洗是数据分析的重要前置步骤,旨在识别并处理数据集中的无效数据、矛盾、不完整、重复或格式错误等问题,从而创造高质量的数据集。
- 核心目标:创造一个高质量、可供分析的数据集,避免因错误数据导致分析结果出现偏差。
- 优势:
- 提高数据质量:修正错误数据,提升数据准确性,为后续分析提供保障。
- 提高数据可用性:通过补充有效信息和创建新特征,使数据更易于理解和利用。
- 降低数据处理成本:删除冗余或无效数据,简化处理范围,从而降低成本。
- 典型“DB-hard”例子:
- 常见应用场景: 包括客户数据、日志数据、社交媒体数据及金融数据的清洗。
- Missing Data:查不到 Apple 的市值,因为条目缺失。
- Entity Resolution(实体对齐):“IBM” 与 “International Business Machines” 未统一,导致查询不到。
- Unit Mismatch(单位/尺度不一致):把“406Bn / 392Bn / $194Bn”混成“406 / 392 / 194”,导致 MAX 被假的“460”(霍格沃茨)“赢了”。
脏数据从哪儿来(Where it comes from)
- Statistics view:数据生成过程→现实里有 distortion / selection bias / censoring / dependence 等非理想采样;建模需在 accuracy vs simplicity 间权衡。
- Database view:拿到数据后发现 missing/corrupted/wrong/duplicated 值;提升数据值本身的质量能直接改善结果。
- Domain expert view:基于领域知识的“语义模型(semantic expectations)”来断定“不合理”(如澳洲室外温度不可能 -180°C)。
- Data scientist view:综合以上三种。数据源头本身存在问题。
- 在ETL(抽取、转换、加载)的数据转换过程中引入错误。
- 在数据集成阶段,由于不同数据源格式、粒度、标准不一而产生问题。
- 数据清洗的核心问题
- 缺失值: 需要决定是删除含有缺失值的行,还是采用插补法进行填充。
- 异常值/噪声数据: 通常是录入或测量错误导致,例如年龄超过合理范围、日期格式错误等,需要被识别并修正。
- 重复记录: 由于多种原因可能导致重复,需要进行去重处理以保证数据唯一性。
- 数据格式问题: 包括不同来源的格式不统一,如日期格式(日月年 vs 月日年)、单位(公制 vs 英制)、不同货币的汇率问题等,需要进行标准化转换。
- 数据错误: 如拼写错误、不同大小写表现同一实体(如Sydney/sydney/Sydney),需要进行统一和校正。
应用场景(Scenarios)
比如说有下列这种的数据,实际可能有上千行数据,每行的数据id是唯一的不会有重复的,然后是Name 有的数据,带逗号的可能是last-name,first-name这样排布,不带逗号的话,可能是First-name和last-name这样排列。Birthday有一些是格式的问题,Phone number有一些人的号码是错误的。Assignment 1要处理的内容就是会处理下面这些内容

- Integration 跨源整合、Deduplication 去重纠错、Migration 迁移到新 schema、Structuring 半结构/非结构化变结构化(如网页数据)。
- 为什么重要(Importance):No quality data, no quality decisions;低质量数据会误导统计与决策。
质量问题的“层级”(Schema vs Instance)
模式层和非模式层两类模式层 和实例层
- Schema-level:可通过更好的 schema design/translation/integration 预防;如 data type 错、dangling FK、duplicate keys 等(RDBMS 多可拦截) 。但 categorical/spatial/temporal/name/structural conflicts 往往超出 RDBMS 的“自动防护”。
- 模式层问题:关注数据列的定义和约束。可利用DBMS自带的约束(如主键唯一、非空)规避的模式相关问题;以及模式设计无法强制触发的错误(如将城市“中国”误填入“city”字段),这需要在应用层处理。
- Instance-level:
- Single record:缺失、错误值、拼写、嵌入/错位字段、歧义地址等;
- Multiple records:重复、相互矛盾、非标准化(如“Al-Banna, Morty” vs “Morty Al-Banna”)。
- 实例层问题:关注每条数据记录本身存在的问题,包括单条记录的缺失、拼写错误(spelling errors)或语义歧义,以及多条记录间存在的关联错误(如不同的人记录了相同的电话号码)
数据质量的关键维度(Key Dimensions)
- Accuracy(准确性)
- Syntactic accuracy语法准确性(语法层面对域的贴合,如编辑距离)与 Semantic accuracy语义准确性(贴近真实值/正确性,需要真值) 。
- Completeness(完整性)
- 三类:Schema / Column / Population;
- Schema Completeness 模式中的概念及其属性完整性
- Column Completeness 表中特定属性或列值的缺失
- Population completeness 整体数据上的缺失值的百分比
- Completeness of relational data 对于空数据的理解
- Null 的含义要分清:不知道 vs 不存在 vs 不适用;OWA/CWA 决定“表外事实”的真值可判定性 。
- OWA(开放世界假设)更接近现实,承认数据局限性和外部系统的存在
- CWA(封闭世界假设)CWA是数据库默认逻辑,查不到即视为不存在
- Uniqueness(唯一性)
- Time-related(时效性)
- Currency / Volatility / Timeliness(“最新”≠“及时”) 。
- Consistency(自洽/一致性)
- 满足 domain/key/FD/INCLUSION 等完整性约束与统计“规则检查(data edits)”。
- Others:Interpretability / Time-series synchronization / Accessibility;同时传统质量定义也存在 Unmeasurable / Context-dependent / Vague 的限制
Pandas and Numpy
Assignment 1 基本就是考察的就是对pandas 和 numpy对数据的各种操作,得到想要的数据~
- 导入 & 概览:
df.info() / df.head() / df.sample() - 缺失值(Missing):
df.isna().sum()→ impute/drop 策略 - 重复(Duplicates):
df.duplicated(subset=keys)→df.drop_duplicates() - 类型与域(Types & Domains):统一 units、
astype、正则校验分类字段 - 时间(Dates):
pd.to_datetime(..., dayfirst=...);明确 mm/dd vs dd/mm,避免集成错误。 - 一致性(Consistency):校验 key/FD(如“DOB→Age”是否合理)
- 异常值(Outliers):按业务规则或统计阈值(IQR/Z-score)标记复核
- 记录修复日志(Data lineage):记录每一步清洗操作,便于复现与审计
Python
import pandas as pd
import numpy as np
df = pd.read_csv("data.csv")
# 1) 概览
print(df.info()); print(df.sample(5))
# 2) 缺失
na_report = df.isna().sum().sort_values(ascending=False)
# 例如:用中位数/众数/固定值填充
for col in ["price", "qty"]:
df[col] = df[col].fillna(df[col].median())
df["country"] = df["country"].fillna("UNKNOWN")
# 3) 去重(按业务主键)
df = df.drop_duplicates(subset=["customer_id", "dob"])
# 4) 统一单位:把“Bn”转为数字
def parse_market_cap(x):
if pd.isna(x): return np.nan
s = str(x).strip().lower().replace("$", "")
if s.endswith("bn"): return float(s[:-2]) * 1e9
if s.endswith("m"): return float(s[:-1]) * 1e6
return pd.to_numeric(s, errors="coerce")
df["market_cap_num"] = df["market_cap"].apply(parse_market_cap)
# 5) 时间/日期一致化(防 mm/dd vs dd/mm)
df["date"] = pd.to_datetime(df["date"], errors="coerce", dayfirst=True)
# 6) 简单一致性检查:年龄 vs 出生年
bad_age = (pd.Timestamp("today").year - pd.to_datetime(df["dob"], errors="coerce").dt.year) - df["age"]
suspicious = df[bad_age.abs() > 2] # 需要人工复核的记录
发表回复
要发表评论,您必须先登录。