数据清洗的主要步骤有哪些?为什么数据清洗对数据分析很重要?
数据清洗的主要步骤与重要性一、为什么数据清洗至关重要1. 垃圾进垃圾出Garbage In, Garbage Out分析模型不会区分数据的好坏——错误的数据会被当作事实参与计算得出的结论看似精确实则偏差巨大。脏数据 → 错误统计 → 错误结论 → 错误决策 → 业务损失2. 典型后果对照不清洗的后果具体表现指标失真重复订单使销售额虚高 30%结论偏颇异常值拉高均值掩盖真实水平模型失效缺失值导致回归系数偏移预测准确率下降决策失误地域编码不一致导致区域排名错误信任崩塌决策者发现一次数据错误后不再信任后续分析3. 一条数据错误的影响链1条薪资1,500,000元的录入错误实际应为15,000 → 部门平均薪资虚高 3 倍 → 薪酬对标结论失真 → 调薪方案偏差 → 人力成本超支二、数据清洗的主要步骤Step 1数据摸底 — 了解全貌清洗前先看一遍建立对数据的整体认知。检查项方法数据量行数、列数、文件大小字段含义数据字典、业务确认数据类型数值型、文本型、日期型、布尔型时间范围起止时间、时间粒度基本分布各字段的唯一值数、空值率、极值# Python 快速摸底示例importpandasaspd dfpd.read_csv(orders.csv)# 行列数print(f shape:{df.shape})# 各字段类型 非空数print(df.info())# 描述统计快速发现异常范围print(df.describe())# 缺失率print(df.isnull().mean().sort_values(ascendingFalse))Step 2缺失值处理策略适用场景操作删除缺失比例极低5%且非关键字段删除含缺失的行或列填充常数分类字段用未知、其他填充填充统计量数值型字段均值正态分布、中位数偏态、众数分类前后填充时间序列用前一个有效值填充前向填充 ffill插值填充时间序列、连续变量线性插值、样条插值模型预测缺失较多且字段重要用其他特征建模预测填充# 缺失值处理示例# 删除缺失率 60% 的列thresholdlen(df)*0.6dfdf.dropna(axis1,threshthreshold)# 数值列用中位数填充num_colsdf.select_dtypes(includenumber).columns df[num_cols]df[num_cols].fillna(df[num_cols].median())# 分类列用未知填充cat_colsdf.select_dtypes(includeobject).columns df[cat_cols]df[cat_cols].fillna(未知)原则填充方式必须符合业务逻辑。例如已取消订单的取消原因留空是正常的不应填充。Step 3重复值处理类型识别方式处理完全重复所有字段值完全一致直接去重业务重复关键字段相同如同一订单号出现多次按业务规则保留最新/最早一条部分重复部分字段相同如同一人多条地址判断是否为合法变动不盲目删除# 完全重复dfdf.drop_duplicates()# 按订单号去重保留最新记录dfdf.drop_duplicates(subset[order_id],keeplast)# 查看重复情况不删除先确认dupdf[df.duplicated(subset[order_id],keepFalse)]print(dup.sort_values(order_id))Step 4异常值处理异常值不等于错误值——有些是真实的极端情况需要判断。识别方法方法原理适用3σ 原则超出 μ±3σ 的值正态分布下概率 0.3%近似正态分布的数值字段箱线图(IQR) Q1-1.5×IQR 或 Q31.5×IQR任意分布更稳健业务规则年龄150、金额0、未来日期有明确业务边界的字段孤立点检测Isolation Forest 等算法多维异常、无明确规则# IQR 方法Q1df[amount].quantile(0.25)Q3df[amount].quantile(0.75)IQRQ3-Q1 lowerQ1-1.5*IQR upperQ31.5*IQR outliersdf[(df[amount]lower)|(df[amount]upper)]print(f异常值数量:{len(outliers)})处理策略策略适用场景修正录入错误如 15000 → 1,500,000能确认正确值的截断(Winsorize)极端值真实但影响分析截到合理上限分箱将连续值分段减少极端值影响标记保留极端值可能本身有价值如大客户单独标记后参与分析删除确认错误且无法修正占比极低Step 5格式与类型统一问题示例处理日期格式不一2026-01-15 / 01/15/2026 / 20260115统一为标准格式数值存为文本“1,500” “3.2%”去千分位、去百分号转为数值编码不一致“北京”/“北京市”/“BJ”建立映射表统一大小写混用“iPhone”/“IPHONE”/“iphone”统一小写或标题格式空白字符 张三 strip 去首尾空格电话格式138-1234-5678 / 13812345678统一格式# 格式统一示例df[date]pd.to_datetime(df[date],formatmixed)df[amount]df[amount].str.replace(,,).astype(float)df[city]df[city].str.strip().str.replace(市,)df[city]df[city].map({北京:BJ,上海:SH}).fillna(df[city])Step 6逻辑一致性校验检查数据是否违反业务逻辑校验规则示例时间先后下单时间 ≤ 发货时间 ≤ 签收时间数值大小折后价 ≤ 原价数量 ≥ 0状态衔接已发货的订单必须有支付记录关联一致订单明细金额合计 订单总金额唯一性同一用户同一时刻不应有两笔活跃订单# 逻辑校验示例# 发货时间早于下单时间bad_logicdf[df[ship_time]df[order_time]]print(f逻辑矛盾记录:{len(bad_logic)})# 金额为负negativedf[df[amount]0]print(f金额为负记录:{len(negative)})# 订单明细合计 ≠ 订单总额order_totaldf_items.groupby(order_id)[line_amount].sum()mergeddf_orders.merge(order_total,onorder_id)mismatchmerged[abs(merged[total_amount]-merged[line_amount])0.01]Step 7数据整合与标准化将多个来源的数据合并为统一的分析数据集操作说明多表关联用主键/外键 JOIN 多张表纵向拼接多个时间段的同类数据上下堆叠列名统一不同来源的同名字段统一命名量纲统一金额统一为元、重量统一为kg粒度对齐一张表是日数据、一张是月数据需聚合对齐三、清洗流程总览数据摸底 → 缺失值处理 → 重复值处理 → 异常值处理 → 格式统一 → 逻辑校验 → 整合标准化 → 清洗后数据集每一步的核心要求要求说明留痕每步操作记录原因和处理方式便于审计和复现可复现用脚本而非手动操作下次拿到新数据可一键重跑不丢数据处理前备份原始数据宁可多标记、少删除业务确认拿不准的异常值和逻辑矛盾找业务方确认而非主观判断四、数据质量检查清单清洗完成后用此清单自查检查项通过标准缺失值关键字段缺失率 1%非关键字段有合理填充重复值业务主键无重复异常值已识别并处理极端值有标记格式日期、数值、编码格式统一逻辑业务规则校验全部通过字段类型数值列不含文本日期列已是 datetime 类型关联多表关联无意外丢失验证 join 后行数合理可复现全流程有脚本可从原始数据重跑