# 4.6.2 异常值检测与处理

异常值是指数据中偏离正常范围的极端值，可能是由于测量错误、数据录入错误或其他原因导致的。这些异常值如果不加以处理，可能会影响计算的准确性和分析结果。本节的核心 API 是序列（Series）的 `quantile()` 函数，用于计算数据的分位数。分位数是将数据按指定百分比划分的值，用于分析数据的分布情况。通过 `quantile()` 可以计算出 25%、75% 等常用分位数；25% 和 75% 分位数分别称为第一和第三四分位数，记为 Q1、Q3。调用形式为 `data.quantile(0.25)`、`data.quantile(0.75)`，参数是 0 到 1 之间的比例，不是百分数 25、75。

课程用四分位数范围（IQR）识别异常值：`IQR = Q3 - Q1`。判定规则：小于 `Q1 - 1.5 * IQR` 或大于 `Q3 + 1.5 * IQR` 的观测视为异常值。完整步骤是：先求 Q1、Q3 和 IQR，再算下界 `lower_bound = Q1 - 1.5 * IQR`、上界 `upper_bound = Q3 + 1.5 * IQR`，然后用布尔索引 `outliers = (data < lower_bound) | (data > upper_bound)` 得到与原序列等长的布尔序列，True 表示该位置是异常值。这里用 `|`（或）连接两个条件，且每个条件都必须加圆括号，这与 4.2.3 多条件联合筛选的写法一致。

【例4-1】编写程序识别序列对象的异常值，并用均值替代异常值。对 `data = pd.Series([10, 12, 15, 20, 100, 25, 30, 200])`，按上述规则识别后，先计算「不包含异常值」的均值 `mean_value = data[~outliers].mean()`，再用 `data[outliers] = mean_value` 写回。对本例，Q1 为 14.25、Q3 为 47.5、IQR 为 33.25，下界约 -35.63、上界约 97.38，故 100 与 200 为异常值；`~outliers` 取反后只保留 10、12、15、20、25、30，均值约为 18.67，再把该均值赋给异常位置。布尔赋值会直接修改原序列，序列长度不变。

易错点：`quantile` 参数必须写 `0.25`/`0.75`；IQR 是 Q3 减 Q1，上下界必须乘 1.5，不能把「小于 Q1 或大于 Q3」直接当异常值；替换用的均值必须先剔除异常值，否则 100、200 会把均值拉高；`|` 两侧漏括号会因运算符优先级出错；`~` 是对布尔序列按元素取反，不要写成减号。异常值、缺失值、重复值是三类不同问题：本节处理的是偏离正常范围的极端值，不要与 `isna()`/`dropna()`/`fillna()` 或 `duplicated()`/`drop_duplicates()` 混用。

## 关键要点
- 异常值：偏离正常范围的极端值，可能来自测量错误、数据录入错误等；不处理会影响计算准确性和分析结果。
- 核心 API：`quantile()` 计算分位数；`quantile(0.25)`、`quantile(0.75)` 分别得到第一、第三四分位数 Q1、Q3。
- IQR 公式：`IQR = Q3 - Q1`。异常值判定：小于 `Q1 - 1.5 * IQR` 或大于 `Q3 + 1.5 * IQR`。
- 识别写法：`outliers = (data < lower_bound) | (data > upper_bound)`，每个条件必须加圆括号。
- 例4-1 处理：`mean_value = data[~outliers].mean()`，再 `data[outliers] = mean_value`（均值不含异常值；布尔赋值直接改原序列）。
- 易错：参数写 0.25 不是 25；上下界要乘 1.5；均值须先剔除异常值；不要与缺失值、重复值的处理方法混淆。
