COMP9321 – Data Services Engineering- Week 2

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 FKduplicate 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)”。
  • OthersInterpretability / Time-series synchronization / Accessibility;同时传统质量定义也存在 Unmeasurable / Context-dependent / Vague 的限制

Pandas and Numpy

Assignment 1 基本就是考察的就是对pandas 和 numpy对数据的各种操作,得到想要的数据~

  1. 导入 & 概览df.info() / df.head() / df.sample()
  2. 缺失值(Missing)df.isna().sum()impute/drop 策略
  3. 重复(Duplicates)df.duplicated(subset=keys)df.drop_duplicates()
  4. 类型与域(Types & Domains):统一 unitsastype、正则校验分类字段
  5. 时间(Dates)pd.to_datetime(..., dayfirst=...);明确 mm/dd vs dd/mm,避免集成错误。
  6. 一致性(Consistency):校验 key/FD(如“DOB→Age”是否合理)
  7. 异常值(Outliers):按业务规则或统计阈值(IQR/Z-score)标记复核
  8. 记录修复日志(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]    # 需要人工复核的记录
Back to top arrow

评论

发表回复

目录