Python数据清洗实战:缺失数据与异常值处理全攻略
在数据分析和机器学习的工作流中数据清洗是绕不开的关键环节。粗糙的数据就像未打磨的原石即便算法再精妙也难以提炼出有价值的信息。其中缺失数据与异常值是最常见的两类问题它们不仅会干扰统计分析结果还可能导致模型训练出现偏差。本文将结合Python实战系统讲解这两类问题的处理方法。一、缺失数据看不见的“数据黑洞”缺失数据指的是数据集中存在的空白或无效值通常以NaNNot a Number或None的形式出现。它们可能源于数据采集时的遗漏、存储错误或者用户未填写等原因。1. 缺失数据的识别在Python中我们可以借助pandas库快速定位缺失值Python复制import pandas as pd import numpy as np # 创建含缺失值的示例数据集 data pd.DataFrame({ A: [1, 2, np.nan, 4], B: [5, np.nan, np.nan, 8], C: [9, 10, 11, 12] }) # 查看每个特征的缺失值数量 print(data.isnull().sum()) # 查看数据集整体缺失情况 print(data.isnull().mean() * 100) # 以百分比显示2. 缺失数据的处理策略处理缺失值没有绝对最优的方法需结合业务场景和数据分布选择合适的方案删除法适用于缺失比例极低如5%或缺失值随机分布的情况Python复制# 删除含缺失值的行 data_drop_row data.dropna(axis0) # 删除含缺失值的列 data_drop_col data.dropna(axis1)填充法最常用的处理方式分为简单填充和智能填充Python复制# 均值填充适用于正态分布的数值型数据 data_fill_mean data.fillna(data.mean()) # 中位数填充适用于存在异常值的数值型数据 data_fill_median data.fillna(data.median()) # 众数填充适用于分类数据 data_fill_mode data.fillna(data.mode().iloc[0]) # 前向填充/后向填充适用于时间序列数据 data_fill_ffill data.fillna(methodffill) # 前向填充 data_fill_bfill data.fillna(methodbfill) # 后向填充模型预测法对于缺失比例较高的特征可以用其他特征构建模型预测缺失值Python复制from sklearn.ensemble import RandomForestRegressor # 分离含缺失值的特征和其他特征 data_train data[data[A].notnull()] data_test data[data[A].isnull()] # 训练模型 model RandomForestRegressor() model.fit(data_train[[B, C]], data_train[A]) # 预测缺失值 data.loc[data[A].isnull(), A] model.predict(data_test[[B, C]])二、异常值数据中的“离群者”异常值是指与其他数据点显著偏离的值可能是真实的极端情况也可能是数据录入错误。异常值会严重影响统计分析的结果比如拉高均值、扩大方差。1. 异常值的识别常用的异常值检测方法包括统计分析法基于正态分布的3σ原则超出均值±3倍标准差的值视为异常值Python复制# 计算均值和标准差 mean data[A].mean() std data[A].std() # 识别异常值 outliers data[(data[A] mean - 3*std) | (data[A] mean 3*std)]四分位数法IQR不受分布假设影响更适合非正态分布数据Python复制# 计算四分位数和四分位距 q1 data[A].quantile(0.25) q3 data[A].quantile(0.75) iqr q3 - q1 # 识别异常值 outliers data[(data[A] q1 - 1.5*iqr) | (data[A] q3 1.5*iqr)]可视化法通过箱线图、散点图直观识别异常值Python复制import matplotlib.pyplot as plt # 绘制箱线图 plt.boxplot(data[A]) plt.title(Boxplot of Feature A) plt.show()2. 异常值的处理策略处理异常值需先判断其产生原因再选择对应策略删除法适用于异常值为数据录入错误的情况Python复制# 删除异常值所在行 data_clean data[(data[A] q1 - 1.5*iqr) (data[A] q3 1.5*iqr)]修正法若异常值为真实数据但超出合理范围可以进行截断处理Python复制# 截断异常值到合理范围 data[A] np.where(data[A] q3 1.5*iqr, q3 1.5*iqr, data[A]) data[A] np.where(data[A] q1 - 1.5*iqr, q1 - 1.5*iqr, data[A])分箱法将数值型数据划分为不同区间弱化异常值的影响Python复制# 等频分箱 data[A_bin] pd.qcut(data[A], q4, labels[Q1, Q2, Q3, Q4])保留法若异常值代表真实的极端情况如用户消费峰值可以保留并在建模时使用对异常值不敏感的算法如决策树、随机森林三、数据清洗的最佳实践先分析后处理在处理缺失值和异常值前务必先分析其产生原因和分布特征避免盲目操作记录清洗过程详细记录每一步清洗操作保证数据处理的可追溯性验证清洗效果清洗完成后通过统计指标和可视化方法验证数据质量是否提升结合业务场景所有处理方法都应服务于业务目标避免为了清洗而清洗金句数据清洗的本质不是消除所有“不完美”而是让数据更贴合业务需求为后续分析和建模提供可靠基础。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479942.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!