数据提取后,它很少以完美状态出现。想象一下组装家具时缺少螺丝或说明不清;你无法搭建出可靠的东西。类似地,原始数据经常包含空白,表现为缺失值。这些在数据库中可能显示为NULL,在数值库中显示为NaN(非数字),空字符串"",或其他占位符。当值缺失时,尝试进行计算(例如查找平均值)或将数据加载到具有严格规则的系统(例如要求非空值的数据库)会变得困难。处理这些空白是数据清洗的基本组成部分。缺失值的重要性缺失数据可能导致几个问题:分析偏差: 如果缺失值并非随机,忽略它们可能使结果产生偏差。例如,如果只有不满意的客户跳过填写满意度评分,仅从已回答者中计算平均分会得出过于乐观的结果。数据可用性降低: 许多分析模型和算法在输入缺失时无法正常运行。丢弃过多数据可能导致信息过少,无法得出有意义的结论。技术故障: 如果必填字段为空,将数据加载到目标系统(如数据仓库)通常会失败,因为这违反了架构约束。涉及缺失数值数据的计算可能产生错误或无意义的结果(例如,5 + NaN = NaN)。处理缺失值的策略对于缺失数据没有一个完美的单一解决方法;最佳方法取决于具体情况、缺失数据的数量以及对目标可能产生的影响。以下是最常见的策略:1. 删除这包括移除包含缺失值的数据点或整个特征(列)。行删除(列表式删除): 如果一条记录(行)在重要列中有一个或多个缺失值,你可能会选择丢弃整条记录。优点: 实施简单。确保剩余数据对于分析的列是完整的。缺点: 可能会显著减小数据集大小,特别是当缺失值普遍存在时。如果缺失数据不是随机分布的(例如,丢弃所有缺少“收入”值的记录可能会移除特定人群),可能会引入偏差。列删除: 如果某个特定特征(列)的缺失值百分比非常高,并且对于分析或目标系统而言不被认为是必需的,你可能会移除整个列。优点: 保留记录数量。比插补更简单。缺点: 丢失该特征中可能包含的有价值信息。当缺失数据比例较小(例如,小于5%)且随机分布时,或者当一列绝大部分为空且被认为不重要时,删除通常是合适的。2. 插补插补涉及用估计值或占位符替换缺失值。这允许你保留记录并可能使用更多数据。均值/中位数/众数插补:均值: 用该列中非缺失值的平均值(均值)替换缺失的数值。最适合没有极端异常值的数值数据。中位数: 用非缺失值的中位数替换缺失的数值。比均值对异常值更有效。众数: 用该列中最常出现的值(众数)替换缺失的类别(文本)值。适用于非数值数据,如城市名称或类别。优点: 简单,保留所有记录,易于实施。缺点: 可能扭曲原始数据分布(尤其是均值插补),减少方差,并削弱变量之间的关系。不考虑不确定性。让我们考虑使用均值插补缺失的“年龄”值。如果已知年龄为25、32、45、32和28,则均值为$(25+32+45+32+28)/5 = 32.4$。用32(向下取整)插补缺失年龄会改变分布,如下所示。{"layout": {"title": "均值插补前后的年龄分布", "xaxis": {"title": "年龄组"}, "yaxis": {"title": "用户数量", "range": [0, 3.5]}, "barmode": "group"}, "data": [{"x": ["20-29", "30-39", "40-49"], "y": [2, 2, 1], "type": "bar", "name": "插补前", "marker": {"color": "#339af0"}}, {"x": ["20-29", "30-39", "40-49"], "y": [2, 3, 1], "type": "bar", "name": "均值插补后 (年龄=32)", "marker": {"color": "#ff922b"}}]}柱状图显示了不同年龄组的用户数量。请注意,用均值 (32) 插补缺失年龄如何增加了“30-39”年龄组的数量。常数值插补: 用预定义的常数替换缺失值。例子: 将缺失的数值替换为0,将缺失的文本替换为“未知”或“不适用”。有时,如果下游系统能够处理,会使用超出正常范围的值(如年龄的-1)来明确标记插补值。优点: 简单,清楚表明哪些值最初是缺失的(如果使用了特殊常数)。如果缺少值有特定含义(例如,缺失表示没有折扣时,‘已应用折扣’为0),则可能是有意义的。缺点: 如果常数是任意的或与实际值差异很大,可能会显著扭曲分布和统计测量(如均值、方差)。在后续分析或建模中可能需要仔细处理。更高级的方法: 存在回归插补(根据其他列预测缺失值)或K近邻(KNN)插补等方法,但这些通常在更高级的数据科学或机器学习背景中介绍。对于ETL入门,专注于删除和简单插补通常就足够了。选择正确的策略如何处理缺失值的决定涉及权衡:缺失数据的量: 如果只有很小一部分缺失,删除可能是可接受的。如果大部分缺失,可能需要插补或列删除。数据类型: 均值/中位数适用于数字,众数适用于类别。变量重要性: 如果受影响的数据是关键的,删除行/列可能代价过高。下游用途: 目标系统会接受NULL吗?分析方法是否要求完整数据?插补是否会不可接受地扭曲结果?分布: 数据是否有异常值?(中位数优于均值)。缺失是随机的还是系统性的?处理缺失值通常是一个迭代过程。你可能会尝试一种方法,评估其影响,然后调整你的方法。目标是为转换和加载阶段准备尽可能完整和准确的数据,而不引入显著偏差或丢失过多有价值信息。