哈喽,大家好~
咱们今天来聊聊数据清洗,其中最重要的两个方面:缺失值和异常值~
数据清洗(Data Cleaning)是指在数据预处理中,通过一系列技术手段来识别并修正或删除错误数据、缺失数据、异常数据的过程,以提高数据质量和分析准确性。
脏数据(Dirty Data)不仅影响建模效果,还可能导致完全错误的商业决策。
处理缺失值
缺失值的来源
缺失值处理技术
删除缺失值
简单粗暴,适用于缺失占比很低的情况。
若数据集 ,定义:
若 (如5%),则直接删除。
均值/中位数/众数填充
最常见的方法。
回归填补
使用其他特征预测缺失值。
步骤 :
若有特征集 ,目标变量 ,则:
使用回归系数估算缺失值。
插值法(Interpolation)
适合时间序列数据。
常用方法 :
公式(线性插值) :
设缺失点在 和 之间:
缺失类型分类(重要)
处理异常值(Outliers)
异常值的来源
异常值检测技术
统计学方法
(1)标准差法
若数据服从正态分布, 为均值, 为标准差,则:
之外的数据是异常值。
(2)箱型图法(IQR)
基于模型的方法
适合大规模、高维度数据。
处理异常值方法
一个完整案例
数据集
import numpy as np
import pandas as pd
np.random.seed(42)
n = 200
X = np.linspace(0, 100, n)
y = 0.5 * X + np.random.normal(0, 5, n)
# 加入缺失值
y[np.random.choice(n, 10, replace=False)] = np.nan
# 加入异常值
y[np.random.choice(n, 5, replace=False)] += np.random.normal(50, 10, 5)
# 组装成DataFrame
data = pd.DataFrame({'X': X, 'Y': y})
缺失值处理
# 缺失值可视化
import missingno as msno
import matplotlib.pyplot as plt
# 绘制缺失矩阵
msno.matrix(data)
plt.show()
# 用中位数填充
data['Y'] = data['Y'].fillna(data['Y'].median())
异常值检测与处理
# 计算IQR
Q1 = data['Y'].quantile(0.25)
Q3 = data['Y'].quantile(0.75)
IQR = Q3 - Q1
# 判定异常
outlier_condition = (data['Y'] < Q1 - 1.5 * IQR) | (data['Y'] > Q3 + 1.5 * IQR)
# 替换异常值为中位数
data.loc[outlier_condition, 'Y'] = data['Y'].median()
拟合回归曲线并绘图
from sklearn.linear_model import LinearRegression
# 拟合模型
model = LinearRegression()
model.fit(data[['X']], data['Y'])
y_pred = model.predict(data[['X']])
import seaborn as sns
plt.figure(figsize=(16,12))
plt.suptitle('Data Cleaning and Analysis', fontsize=22, color='navy')
# 1. 原始数据分布
plt.subplot(2,2,1)
sns.scatterplot(x='X', y='Y', data=data, color='blue')
plt.title('Scatter plot after cleaning')
plt.xlabel('X')
plt.ylabel('Y')
# 2. 残差图
plt.subplot(2,2,2)
residuals = data['Y'] - y_pred
sns.histplot(residuals, kde=True, color='red')
plt.title('Residuals distribution')
plt.xlabel('Residuals')
# 3. 拟合曲线
plt.subplot(2,2,3)
sns.scatterplot(x='X', y='Y', data=data, color='green')
plt.plot(data['X'], y_pred, color='purple', linewidth=2)
plt.title('Regression Line')
plt.xlabel('X')
plt.ylabel('Predicted Y')
# 4. 误差分布热图
plt.subplot(2,2,4)
sns.heatmap(np.abs(residuals.values.reshape(20,10)), cmap='coolwarm')
plt.title('Heatmap of Absolute Errors')
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()