资讯动态

数据清洗技巧:缺失值处理与异常值检测

发布时间:2026/8/15 0:42:50 来源:尧图企业网站定制
在数据科学项目中我们常说“Garbage In, Garbage Out”垃圾进垃圾出。据行业估算数据科学家约80%的时间都花在了数据清洗上而真正用于建模和分析的时间寥寥无几。缺失值和异常值是阻碍我们获得高质量数据集的两大“拦路虎”。如果处理不当它们会导致模型偏差、预测失真甚至得出完全错误的业务结论。今天我们就来聊聊数据清洗中那些必须掌握的实战技巧并附上完整的Python代码助你打造高质量数据集为什么数据清洗如此重要数据清洗不仅仅是简单的“打扫卫生”它直接关系到后续分析的准确性和可靠性。提升模型性能干净的数据能让机器学习算法收敛更快准确率更高。保证决策正确在商业分析中异常值可能导致平均值的严重偏斜误导业务决策。节省时间前期清洗做得好后期Debug的时间就能大幅减少。缺失值处理的5种实用方法附代码面对缺失值我们不能简单地“一刀切”删除而是要根据数据的特性和业务场景选择合适的策略。1. 简单填充策略这是最基础也是最常用的方法适用于缺失比例较小的情况。均值/中位数/众数填充均值适用于数据分布较为均匀的情况。中位数如果数据存在偏态或异常值中位数更稳健。众数适用于分类变量如性别、城市。前向/后向填充在时间序列数据中用前一个或后一个时间点的值进行填充非常有效。常数填充用0或-999等特定值填充有时“缺失”本身就是一种信息。代码实战import pandas as pd import numpy as np # 创建示例数据 data { Age: [25, 30, np.nan, 35, np.nan, 40], City: [Beijing, Shanghai, Beijing, np.nan, Guangzhou, Shanghai], Salary: [5000, 6000, 5500, np.nan, 7000, 12000], # 12000可能是异常值 Date: pd.date_range(2023-01-01, periods6) } df pd.DataFrame(data) # 1. 均值填充 (Age) df[Age_Mean] df[Age].fillna(df[Age].mean()) # 2. 中位数填充 (Age - 更稳健) df[Age_Median] df[Age].fillna(df[Age].median()) # 3. 众数填充 (City) df[City_Mode] df[City].fillna(df[City].mode()[0]) # 4. 前向填充 (适用于时间序列) df[Salary_Fill] df[Salary].fillna(methodffill) # 5. 常数填充 df[City_Unknown] df[City].fillna(Unknown) print(df)2. 模型驱动填充当缺失值较多且与其他特征存在相关性时我们可以利用模型来预测缺失值。K近邻算法找到与缺失样本最相似的K个样本用它们的均值填充。回归预测利用其他完整特征建立回归模型预测缺失值。多重插补通过多次模拟生成多个完整数据集最后汇总结果这种方法能更好地保留数据的不确定性。代码实战from sklearn.impute import KNNImputer # 初始化KNN插补器n_neighbors3表示找3个最近邻 imputer KNNImputer(n_neighbors3) # 注意KNNImputer只能处理数值型数据所以这里只选取数值列 # 我们选取Age和Salary两列进行演示 df_numeric df # 执行插补 df_imputed imputer.fit_transform(df_numeric) # 转换回DataFrame并查看Age列的填充结果 df[Age_KNN] df_imputed[:, 0] print(df)3. 删除处理策略虽然不推荐随意删除数据但在某些极端情况下删除确实是必要的处理方式。以下是两种常见的删除场景及具体操作建议整行删除样本删除适用条件当某行数据中存在大量缺失值如超过80%的特征值缺失该样本在整体数据集中重要性较低如异常样本或边缘案例样本量足够大删除少量样本不会影响模型训练。操作示例假设分析电商用户数据时发现某些用户记录缺失了90%的特征值如注册信息、浏览记录、购买行为等且这些用户都是未完成注册的访客则可考虑删除这些不完整的记录。整列删除特征删除适用条件当某列数据的缺失比例极高通常超过50%该特征难以通过插值、均值填充等方式合理补充特征重要性评估显示该列对模型预测贡献很小。操作示例在房价预测数据集中若发现地下室面积特征有65%的缺失值且该特征与其他面积特征高度相关则可考虑直接移除该特征。但在删除前应进行相关性分析确认删除不会损失关键信息。注意事项删除前务必进行缺失模式分析记录删除操作及删除比例评估删除对数据分布的影响考虑使用标记变量记录删除操作代码实战# 删除包含任何缺失值的行 df_drop_row df.dropna() # 删除缺失值超过2个的列 df_drop_col df.dropna(axis1, thresh2) # 只删除特定列如Age为空的行 df_drop_subset df.dropna(subset[Age])异常值检测的4大关键技术附代码异常值离群值可能是录入错误也可能是珍贵的机遇。识别它们是处理的第一步。1. 统计方法检测Z-score方法基于正态分布假设。如果一个值距离均值超过3个标准差3σ通常被视为异常。IQR法则基于四分位距Q3-Q1。凡是小于Q1-1.5×IQR或大于Q31.5×IQR的值都被标记为异常。这种方法对非正态分布数据更稳健。代码实战# --- Z-Score 方法 --- from scipy import stats # 计算Z-score z_scores np.abs(stats.zscore(df[Salary])) # 筛选出Z-score大于3的异常值索引 outliers_z np.where(z_scores 3)[0] print(fZ-Score检测到的异常值索引: {outliers_z}) # --- IQR 方法 --- Q1 df[Salary].quantile(0.25) Q3 df[Salary].quantile(0.75) IQR Q3 - Q1 # 定义上下界 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR # 筛选异常值 outliers_iqr df print(fIQR检测到的异常值:\n{outliers_iqr}) # 处理异常值这里演示用上下界进行截断Capping # 如果工资超过上限就设为上限如果低于下限就设为下限否则保持不变 df[Salary_Capped] np.where(df[Salary] upper_bound, upper_bound, np.where(df[Salary] lower_bound, lower_bound, df[Salary]))2. 可视化检测方法有时候一张图胜过千言万语。箱线图是可视化异常值的绝佳工具。箱线图通过五个统计量来展示数据分布第一四分位数Q1箱体下边缘表示25%的数据位于此值以下第三四分位数Q3箱体上边缘表示75%的数据位于此值以下四分位距IQR Q3 - Q1箱线图的上下须Whiskers通常定义为上边缘Q3 1.5×IQR下边缘Q1 - 1.5×IQR边缘内的数据被认为是正常数据点而超出边缘的点则被视为异常值。箱线图的主要用途比较不同组别数据的分布如不同班级的考试成绩检测数据中的异常值如金融交易中的可疑交易观察数据的偏态如箱体不对称显示数据偏斜不受极端值影响比简单的均值更能反映数据真实分布可以同时展示多个数据集的分布情况便于快速识别数据的离散程度和异常情况代码实战import matplotlib.pyplot as plt import seaborn as sns # 设置绘图风格 sns.set(stylewhitegrid) plt.figure(figsize(10, 6)) # 绘制箱线图 sns.boxplot(xdf[Salary]) plt.title(Salary Distribution (Boxplot)) plt.show()3. 机器学习检测对于高维数据传统的统计方法可能失效这时机器学习算法就派上用场了。孤立森林是一种基于树结构的异常检测算法通过随机分割特征空间来隔离样本点。异常点通常因特征值稀少而能被更快隔离路径长度较短。算法流程数据准备使用sklearn生成合成数据或加载真实数据集。示例采用make_blobs生成带离群点的数据模型训练调用IsolationForest类进行训练关键参数包括n_estimators树的数量和contamination异常比例估计值预测与评估获取异常分数和标签负分数表示异常可能性更高结果可视化使用matplotlib绘制结果突出显示异常点。参数说明n_estimators增加树的数量可提升稳定性但计算成本更高。max_samples控制每棵树的样本量默认auto256。contamination根据实际场景调整预期异常比例。代码实战# 数据生成 from sklearn.datasets import make_blobs X, _ make_blobs(n_samples300, centers1, cluster_std0.5, random_state42) X[-10:] 5 # 人为制造10个异常值 # 模型训练与预测 from sklearn.ensemble import IsolationForest model IsolationForest(n_estimators100, contamination0.03, random_state42) model.fit(X) labels model.predict(X) scores model.decision_function(X) # 可视化 import matplotlib.pyplot as plt plt.figure(figsize(10, 6)) plt.scatter(X[:, 0], X[:, 1], clabels, cmapviridis, s20) plt.colorbar(labelAnomaly Score) plt.title(Isolation Forest Anomaly Detection) plt.show()数据清洗的最佳实践流程为了保证清洗工作的系统性和可复现性建议遵循以下流程数据质量评估先用df.info()和df.describe()了解数据的整体情况。缺失值分析识别缺失模式判断是随机缺失还是完全随机缺失。异常值识别结合统计方法和可视化手段交叉验证异常点。处理方法选择根据业务逻辑选择最合适的策略。例如电商中的大额订单可能是真实的大客户不能简单当作异常值删除。效果验证清洗后再次检查数据分布确保没有引入新的错误。常用工具与资源推荐在Python生态中我们有强大的工具库来辅助清洗Pandas数据清洗的核心库提供丰富的数据操作功能。Scikit-learn包含SimpleImputer、KNNImputer等强大的预处理工具。NumPy数值计算的基础用于处理数组运算。Seaborn/Matplotlib可视化库用于绘制箱线图和散点图。结语数据清洗是一个需要反复优化和调整的迭代过程很难存在放之四海而皆准的标准答案。在实际业务场景中最佳的数据清洗方案往往需要结合具体的业务需求、数据特征和使用场景来制定。记住干净的数据是准确分析的基石

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价