# 样本报表异常值怎么先筛出来：用 statistics 计算中位数、分位数和波动范围

## 文档明确的机制

在自动化报表上线或重跑前，先用一列订单数、耗时、金额差值等数值做小型样本质检，适合使用 Python 标准库 `statistics`。官方文档说明，该模块用于计算 numeric（`Real`-valued）数据的数理统计；除特别说明外，支持 `int`、`float`、`Decimal` 和 `Fraction`。

报表最常见的中心位置指标是 `mean()`。它返回算术平均数，即数据总和除以数据点数；输入为空时会抛出 `StatisticsError`。但文档明确提醒：均值会受到离群值强烈影响，并不必然代表一个“典型”数据点。相比之下，`median()` 使用中间值；偶数个数据点时取中间两个值的平均。文档称中位数是稳健的中心位置度量，受离群值影响较小。

要看分布边界，可使用 `quantiles()`。它把数据划分为等概率的连续区间，并返回 `n - 1` 个切点：`n=4` 是默认四分位点，`n=10` 是十分位点，`n=100` 是百分位点。文档要求结果有意义时，数据点数量应大于 `n`。切点由最近的两个样本点线性插值得到。`method` 也需要按数据含义选择：默认 `exclusive` 用于从总体抽样、样本之外可能还有更极端值的数据；`inclusive` 用于描述总体数据，或样本已知包含总体最低、最高可能值的情况。

波动范围可配合 `variance()` 与 `stdev()`。二者分别返回样本方差和样本标准差；`variance()` 的输入必须至少有两个实数值，否则抛出 `StatisticsError`。文档说明，样本方差采用 Bessel 校正，也就是 `N - 1` 自由度；只有数据点具有代表性，例如独立同分布时，结果才应作为总体方差的无偏估计。若手里是整个总体，应使用 `pvariance()` 和 `pstdev()`。

清洗规则同样由文档明确给出：混合类型集合的行为未定义且依赖实现；如果输入是混合类型，可用 `map(float, input_data)` 统一类型。`NaN` 会给会排序或计数的函数带来意外或未定义行为，受影响函数包括 `median()`、`median_low()`、`median_high()`、`median_grouped()`、`mode()`、`multimode()` 和 `quantiles()`，文档建议调用前剥离 `NaN`。

## 团队自行约定的接手建议

以下是团队接手约定，不是 `statistics` 文档宣称的功能。

第一，报表重跑前先固定一列质检输出：`mean()`、`median()`、按业务选择的 `quantiles(..., n=4)` 或 `quantiles(..., n=10)`、`stdev()`，再附上超过预设阈值的原始记录。阈值应由报表负责人在任务开始前约定，例如订单数、耗时或金额差值超过某个固定数值；不要把“落在分位数之外”直接写成错误。

第二，质检脚本先做输入整理：用统一转换处理混合数值类型，用文档示例中的 `filterfalse(isnan, data)` 思路剥离 `NaN`。清洗前后的数据量、被排除的记录数和无法转换的记录应保留在质检结果里，避免静默丢数。

第三，解释结果时把均值和中位数并列展示。若均值被极端记录明显拉偏，而中位数更靠近多数样本，应进一步查看原始记录；但这只能提示需要核查，不能自动判定业务异常。

第四，样本标准差只在数据确为样本、且满足团队对代表性的要求时使用；少于两个有效样本时不要补造波动结论。若数据就是完整批次，则改用总体方差和总体标准差。

## 边界与总结

官方文档明确说明，`statistics` 的定位是图形计算器和科学计算器级别，并不打算与 NumPy、SciPy、Minitab、SAS、Matlab 等面向专业统计人员的完整统计软件竞争。因此，它适合上线或重跑前的快速数值筛查，不应替代专业统计检验。

尤其要注意：分位数、标准差和阈值清单只能帮助定位“值得看”的记录。某个值超出预设阈值，或处在分布两端，并不单独证明该记录错误；仍要回到订单、耗时或金额差值的来源数据核查。文档也说明，`variance()` 不会验证传入的 `xbar` 是否真是样本均值，随意传入值可能导致无效结果。

因此，稳妥流程是：先统一类型并剥离 `NaN`，再计算均值、中位数、分位数和样本标准差，最后按团队预先约定的阈值输出记录清单。这样可以把“文档可直接支持的统计指标”和“团队自己定义的排查规则”分开，既提高重跑前检查的可复核性，也不把普通筛查误写成专业统计结论。

## 相关工具

[AI 工作流 ROI 诊断器](/demos/ai-workflow-roi-diagnostic/index.html) · 查看工具的输入要求、输出说明与适用范围。


来源：[样本报表异常值怎么先筛出来：用 statistics 计算中位数、分位数和波动范围](https://docs.python.org/3/library/statistics.html)
