异常值的基本概念
异常值指的是数据集中偏离整体数据分布规律的极端数值,这些数值可能是由于数据采集错误、记录失误或者真实的特殊业务场景产生的。在实际的数据处理流程中,我们需要先判断异常值的产生原因,再选择合适的处理方式,避免错误删除有价值的真实数据。

常见异常值识别方法
1. 基于3σ原则识别
3σ原则适用于符合正态分布的数据集,根据正态分布的规律,数值落在均值±3倍标准差范围内的概率超过99.7%,超出这个范围的数值就可以被判定为异常值。
import numpy as np
import pandas as pd
# 生成示例数据
data = pd.Series(np.random.normal(loc=0, scale=1, size=1000))
# 加入几个异常值
data.iloc[0] = 10
data.iloc[1] = -10
# 计算均值和标准差
mean_val = data.mean()
std_val = data.std()
# 识别异常值
outliers = data[(data < mean_val - 3 * std_val) | (data > mean_val + 3 * std_val)]
print(f"识别到的异常值数量:{len(outliers)}")
print(f"异常值具体数值:{outliers.values}")
2. 基于箱线图分位数识别
箱线图方法不需要数据符合正态分布,通过计算上下四分位数确定异常值范围,适合大多数数值型数据的异常识别。异常值的判定规则是小于下四分位数-1.5倍四分位距,或者大于上四分位数+1.5倍四分位距的数值。
# 计算四分位数和四分位距
q1 = data.quantile(0.25)
q3 = data.quantile(0.75)
iqr = q3 - q1
# 确定异常值上下边界
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
# 识别异常值
box_outliers = data[(data < lower_bound) | (data > upper_bound)]
print(f"箱线图方法识别到的异常值数量:{len(box_outliers)}")
常见异常值处理方法
1. 直接删除异常值
当确定异常值是由于采集错误、记录失误等人为因素产生,且占比不高时,可以直接删除这些异常值,避免影响后续分析。
# 删除异常值,保留正常范围的数据
clean_data = data[(data >= lower_bound) & (data <= upper_bound)]
print(f"删除异常值后的数据量:{len(clean_data)}")
2. 盖帽法替换异常值
如果异常值可能是真实存在的业务数据,或者数据集本身样本量较小,删除会影响数据分布,可以采用盖帽法,将异常值替换为上下边界的数值。
# 盖帽法处理异常值
capped_data = data.copy()
capped_data[capped_data < lower_bound] = lower_bound
capped_data[capped_data > upper_bound] = upper_bound
print(f"盖帽法处理后的数据最大值:{capped_data.max()}")
print(f"盖帽法处理后的数据最小值:{capped_data.min()}")
3. 均值/中位数替换
也可以用正常数据的均值或者中位数替换异常值,这种方法可以保留数据的整体分布特征,适合对数据连续性要求较高的场景。
# 用中位数替换异常值
median_val = data[(data >= lower_bound) & (data <= upper_bound)].median()
median_replaced_data = data.copy()
median_replaced_data[(data < lower_bound) | (data > upper_bound)] = median_val
print(f"中位数替换后的异常值位置数值:{median_replaced_data[outliers.index]}")
处理异常值的注意事项
处理异常值之前一定要先明确业务背景,不能盲目删除所有被判定为异常的数值。比如用户消费数据中偶尔出现的超高额消费,可能是真实的高价值用户行为,这类异常值需要结合业务判断是否保留。另外处理完成后要验证数据的分布是否符合预期,避免处理过程引入新的数据偏差。