在了解了检测缺失数据的方法以及删除和填充(使用均值、中位数或众数)等基本技术之后,一个实际问题出现了:您应该选择哪种策略?没有一个单一的通用答案。最佳方法很大程度上取决于您的特定数据集和分析目标。做出明智的决定需要考虑多个因素。让我们了解在选择处理缺失值的合适方法时,哪些考量将指导您。缺失数据的数量与分布首先要评估的是实际缺失了多少数据。按列百分比: 计算每列中缺失值的百分比。如果一列缺失了非常高的百分比(例如,60%、70% 或更多),用一个计算出的单一值(如均值或中位数)来填充这些空缺可能会引入明显的偏差或噪声。填充的值可能无法很好地代表真实的基础数据,可能扭曲模式和关联。在这种情况下,删除整列可能是一个更直接的做法,承认该特征提供的信息可靠性低。按行百分比: 同样,检查行。如果特定行(代表单个观测值或记录)在多列中都存在缺失值,则它可能包含很少有用信息用于分析。删除此类行(行删除)可能是一个合理的选择,特别是如果您的总行数中只有一小部分受影响。总体缺失量: 考虑整个数据集中缺失值的总百分比。如果只有极小一部分(例如,少于 1-5%)的数据点缺失,并且这些缺失看起来是随机分布的,那么删除受影响的行通常是一个简单且可接受的方案。这不太可能明显偏倚您的结果或大幅减少数据集大小。然而,如果很大比例的行至少有一个缺失值,行删除可能会丢弃太多数据,从而降低分析的统计效力,并且如果缺失并非完全随机,则可能引入偏差。变量(列)的性质列中数据的类型影响填充策略。数值数据: 对于包含数字(整数或浮点数)的列,使用 均值 或 中位数 进行填充很常见。如果数据分布大致对称(如钟形曲线),则使用 均值。如果分布偏斜(一侧有长尾)或包含明显异常值,则优先使用 中位数。中位数受极端值的影响小于均值。分类数据: 对于包含类别或标签的列(如表示城市名称、产品类型或“是/否”回答的字符串),使用均值或中位数没有意义。这里最合适的简单填充策略是使用 众数(最常出现的类别)。用众数填充数值列,或用均值填充分类列,将导致后续分析中的荒谬结果和错误。填充策略应始终与数据类型匹配。缺失机制(简要提及)数据为何缺失也可能是一个因素,尽管详细分析这方面通常更复杂。简言之,数据缺失可能因为:完全随机缺失 (MCAR): 一个值缺失的概率与变量本身和数据集中其他变量都无关。这是删除的理想情况,因为引入偏差的可能性较小。随机缺失 (MAR): 一个值缺失的概率仅取决于数据集中 其他已观测变量,而非缺失值本身。简单删除可能在此处引入偏差,因此可能偏好填充。非随机缺失 (MNAR): 一个值缺失的概率取决于缺失值本身或未观测到的因素。这是最具挑战性的情况,因为删除和简单的填充方法都可能导致明显偏差。作为入门内容,我们主要关注数据的数量和类型。然而,了解缺失的 原因 会影响不同处理策略的有效性,这一点很有用。对您目标的影响考虑您的数据工作的目的。分析和报告: 如果您正在进行描述性统计或创建报告,填充值可能会轻微改变汇总统计量(如均值或标准差)。请注意这一点,并可能报告填充前后的结果,或清楚说明缺失数据是如何处理的。机器学习模型: 许多机器学习算法无法直接处理缺失值。删除数据会减少可用于训练模型的信息量。填充允许您保留数据,但可能引入人为模式或降低特征的真实方差。选择会影响模型性能,有时需要同时尝试删除和不同的填充方法。实际考量与权衡选择策略涉及平衡相互竞争的优先事项:删除(行或列):优点: 实现简单,避免对缺失数据做假设。缺点: 减少数据集大小(可能丢失有价值信息),如果数据并非完全随机缺失,则可能引入偏差。填充(均值、中位数、众数):优点: 保留所有行和列,通常允许算法无错误运行。缺点: 可能扭曲原始数据分布,降低方差,削弱变量之间的关联,并通过做出假设(例如,假设均值是一个好的替代)可能引入偏差。以下流程图提供了一个基于缺失数据量和类型而简化的决策指南:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fontcolor="#495057"]; edge [fontname="sans-serif", color="#495057", fontcolor="#495057"]; Start [label="在列 'X' 中发现\n缺失数据"]; CheckPercent [label="列 'X' 缺失\n多少百分比?", shape=diamond, color="#1c7ed6", fontcolor="#1c7ed6"]; HighPercent [label="高百分比缺失\n(例如,> 50-70%)"]; LowPercent [label="低百分比缺失\n(例如,< 5%)"]; ModeratePercent [label="中等百分比缺失"]; DropCol [label="考虑删除\n列 'X'", shape=ellipse, color="#f03e3e", fontcolor="#f03e3e"]; CheckRows [label="整体有多少行\n受影响?", shape=diamond, color="#1c7ed6", fontcolor="#1c7ed6"]; FewRows [label="受影响行数少"]; ManyRows [label="受影响行数多"]; DropRows [label="考虑删除\n受影响的行", shape=ellipse, color="#f76707", fontcolor="#f76707"]; ImputeDecision [label="考虑填充"]; CheckType [label="列 'X' 是数值型\n还是分类型?", shape=diamond, color="#7048e8", fontcolor="#7048e8"]; Numeric [label="数值型"]; Categorical [label="分类型"]; ImputeMeanMedian [label="用均值或中位数\n填充", shape=ellipse, color="#12b886", fontcolor="#12b886"]; ImputeMode [label="用众数\n填充", shape=ellipse, color="#12b886", fontcolor="#12b886"]; CheckSkew [label="分布是否\n偏斜?", shape=diamond, color="#7048e8", fontcolor="#7048e8"]; Skewed [label="是"]; NotSkewed [label="否"]; UseMedian [label="优先中位数", shape=ellipse, color="#ae3ec9", fontcolor="#ae3ec9"]; UseMean [label="均值可行", shape=ellipse, color="#ae3ec9", fontcolor="#ae3ec9"]; Start -> CheckPercent; CheckPercent -> HighPercent [label="高"]; CheckPercent -> LowPercent [label="低"]; CheckPercent -> ModeratePercent [label="中等"]; HighPercent -> DropCol; LowPercent -> CheckRows; CheckRows -> FewRows [label="少"]; CheckRows -> ManyRows [label="多"]; FewRows -> DropRows; ManyRows -> ImputeDecision; ModeratePercent -> ImputeDecision; ImputeDecision -> CheckType; CheckType -> Numeric [label="数值型"]; CheckType -> Categorical [label="分类型"]; Categorical -> ImputeMode; Numeric -> CheckSkew; CheckSkew -> Skewed [label="是"]; CheckSkew -> NotSkewed [label="否"]; Skewed -> UseMedian; UseMedian -> ImputeMeanMedian [label="使用中位数"]; NotSkewed -> UseMean; UseMean -> ImputeMeanMedian [label="使用均值"]; }一个流程图,概述了处理列中缺失数据的基本决策过程,其中考虑了缺失百分比和数据类型。作为初学者,可以从这些简单的策略开始。计算缺失数据的百分比。如果一列大部分缺失,考虑删除它。如果缺失值很少且分散,考虑删除行或对数值数据使用中位数填充,对分类数据使用众数填充。始终记录您的选择及其原因,因为这是可重复数据工作的重要组成部分。