1. 异常值定义与基本概念归纳总结

咱们先聊聊“什么是异常值”。
说白了,异常值就是那些明显偏离数据集整体趋势的“刺头”。
我刚开始做数据清洗的时候,经常盯着散点图发呆:
“那几个孤零零的点,到底该不该删?”
后来我明白了一个道理——
异常值没有绝对的对错,关键看它背后的原因。


1.1 异常值的长相

先给个直观印象。
假设你有一组学生考试成绩:[60, 62, 65, 70, 72, 68, 100]。
那个 100 就是异常值——大部分人在60~72之间晃悠,它突然冒出一个满分。
再比如传感器采集的室温数据,正常情况下在22~26°C波动,突然跳出一个 -10°C,那大概率是传感器抽风了。

异常值的本质: 与数据集中绝大多数样本的分布规律不一致,且可能由不同的生成机制导致。

1.2 异常值是怎么来的?

我在好几个项目里遇到过“假异常”——你以为它错了,其实它是对的。
所以搞清楚来源非常重要。
常见来源可以归纳为四类:

来源类型具体原因典型例子
数据录入错误人工敲错、复制粘贴失误年龄字段录入“230”
测量/传感器误差设备故障、噪声干扰温度瞬间跳变到 -50°C
自然变异罕见但真实的事件信用卡一天刷100笔大额交易(可能是诈骗)
故意造假/异常行为僵尸粉、爬虫、攻击同一个IP每秒请求1000次API

记得有一回,我接手一个客户流失预测项目,发现某个特征值异常高。
一开始我想把它当脏数据删掉,结果一查——那人是公司最大客户,消费确实就是那么高。
幸好没删,不然模型就废了。所以我现在的习惯是:先判断来源,再决定去留。


1.3 为什么异常值这么重要?

说白了,异常值会“带歪”你的模型。
就拿均值来说,一组数据 [1,2,3,4,5,100],均值为19.17。可大部分数据才3左右。
模型如果学了这个均值,预测全乱套。

我总结过三条铁律:

  • 对统计指标的影响: 均值、方差、相关系数全被拉偏;中位数和稳健估计相对扛造。
  • 对机器学习模型的影响: 线性回归、K-means、PCA 等受异常值扰动很大;树模型相对鲁棒。
  • 对业务决策的影响: 财务对账多了一笔异常交易,可能导致风险误判。
个人经验: 做异常检测时,别只看一个指标。把箱线图、Z-score、IQR 同时摆出来,交叉验证。我吃过“单一方法误杀”的亏。

1.4 快速识别异常值的上手方法

这里给三个最常用的入门手段,代码写出来也不复杂。

方法一:箱线图 + IQR

import numpy as np

data = [10, 12, 13, 14, 15, 16, 17, 18, 20, 100]
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = [x for x in data if x < lower or x > upper]
print("异常值:", outliers)  # 输出 [100]

方法二:Z-score(假设数据近似正态)

import numpy as np
from scipy import stats

data = np.array([10, 12, 13, 14, 15, 16, 17, 18, 20, 100])
z_scores = np.abs(stats.zscore(data))
threshold = 3
outliers = data[z_scores > threshold]
print("异常值:", outliers)  # 输出 [100]
注意: 如果数据本身是偏态分布(比如收入数据),用Z-score会误标大量正常数据为异常。这时候我更推荐使用修正的Z-score(MAD法)或者基于分位数的方法。

1.5 处理异常值的基本策略

你想想看,识别出来之后该怎么处置?
我常用的思路就四条:

  1. 直接删除 – 仅当确定是错误数据且数量很少时使用。
  2. 修正/填补 – 用邻近值、均值、中位数替换,适用于录入错误。
  3. 保留不动 – 用于金融诈骗、罕见疾病等“异常即是信号”的场景。
  4. 单独建模 – 如果异常值形成一个群体,可以单独练一个模型(比如离群点检测本身就是目标)。

我曾经在电商订单数据里发现一批“单价为0”的记录。
一开始想全删,后来发现是内部测试订单。于是改成“标记为测试数据”再删除——这才是正确的做法。


异常值检测与过滤基本概念框架 原始数据 正常值 异常值 识别方法 判定标准 处理策略 核心:判断异常值靠的是“统计原理+业务理解”,不能只看数据本身

1.6 我的几个心法

最后,把我自己总结的几个小原则分享给你:

  • 可视化先行。 先画散点图、箱线图,眼睛是第一道防线。
  • 业务规则兜底。 比如“年龄不能超过150”,这种硬性约束比统计更可靠。
  • 永远保留“溯源能力”。 不要直接把异常值从数据库里删除,先打标签再归档。万一以后发现判断错了,还能找回来。

嗯,“异常值检测”这门课,咱们就从这里开始打地基。
后面会用更扎实的方法往下走,但今天这些概念会在每一行代码里反复出现,值得你牢牢记住。