📦 库存预测 · 数据清洗实战

缺失值 · 重复值 · 异常值

🧹 第4课 · 让脏数据变得干净可靠

📌 一、缺失值处理

库存数据中常见空值,例如 入库量、出库日期 等字段缺失。两种主流策略:

🗑️ 删除法

  • 行删除:缺失比例 < 5% 且随机
  • 列删除:缺失 > 70% 的特征
  • 适用:简单快速,但可能丢失信息

🔄 填充法

  • 均值/中位数:数值型库存量
  • 众数:类别型(仓库区域)
  • 前向/后向填充:时间序列
  • 模型预测填充:KNN, 回归
方法适用场景优点缺点
删除缺失行缺失极少 (<1%)简单无偏样本减少
均值填充正态分布数值保持均值降低方差
中位数填充偏态分布稳健忽略分布形状
前向填充 (ffill)时间序列库存利用时序趋势可能传播异常

🐍 Python 实战代码

import pandas as pd
import numpy as np

df = pd.read_csv('inventory.csv')

# 1. 查看缺失
print(df.isnull().sum())

# 2. 删除缺失比例 > 50% 的列
df.dropna(thresh=len(df)*0.5, axis=1, inplace=True)

# 3. 数值列用中位数填充
num_cols = ['stock_qty', 'inbound_qty']
df[num_cols] = df[num_cols].fillna(df[num_cols].median())

# 4. 类别列用众数填充
df['warehouse'] = df['warehouse'].fillna(df['warehouse'].mode()[0])

# 5. 时间序列向前填充
df['record_date'] = pd.to_datetime(df['record_date'])
df.sort_values('record_date', inplace=True)
df['daily_sales'].fillna(method='ffill', inplace=True)

📌 二、重复值检测与删除

重复记录会导致库存计数虚高,影响预测。通常保留第一条,删除其余。

完全重复 关键字段重复 (SKU+日期) 自定义子集重复
# 检测重复行
dup_rows = df.duplicated().sum()
print(f"重复行数: {dup_rows}")

# 删除完全重复
df.drop_duplicates(inplace=True)

# 基于特定列去重 (保留最后一条)
df.drop_duplicates(subset=['sku', 'date'], keep='last', inplace=True)

# 查看重复值比例
dup_rate = df.duplicated().mean() * 100
print(f"重复比例: {dup_rate:.2f}%")

📌 三、异常值检测与处理

库存数据中异常值常由录入错误、传感器故障引起。常用方法:

方法阈值处理方式适用
Z-score|Z| > 3删除 / 封顶近似正态
IQR1.5倍IQR截尾 / 替换偏态分布
分位数截断1% ~ 99%截断极值敏感
领域规则业务上下限修正为边界强业务知识

📈 IQR 异常检测代码

def detect_outliers_iqr(series):
    Q1 = series.quantile(0.25)
    Q3 = series.quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    return (series < lower) | (series > upper)

outliers = detect_outliers_iqr(df['stock_qty'])
print(f"异常值数量: {outliers.sum()}")

# 处理:用中位数替换异常
median_val = df['stock_qty'].median()
df.loc[outliers, 'stock_qty'] = median_val

# 或者直接删除异常行
df_clean = df[~outliers].copy()

🧭 数据清洗流程架构

📦 原始库存 缺失 · 重复 · 异常 缺失值 删除 / 填充 重复值 完全/子集去重 异常值 IQR / Z-score ✨ 干净数据 可建模 · 高置信度 📈 预测 模型实战

✅ 清洗检查清单