百分位计算器

粘一组数据、填一个百分位 p,一次性给出三种分位数定义的结果——最近秩法、线性插值(R type 7 / Excel PERCENTILE.INC)、Excel PERCENTILE.EXC——并顺带算出 Q1、Q2、Q3、IQR 与 Tukey 离群点。

示例共 12 个数,Ctrl+Enter(Mac 用 Cmd+Enter)触发计算。

0 取最小值,100 取最大值;示例填 90。

演示:n=12,p=90%。最近秩法 38.00、线性插值 37.70、PERCENTILE.EXC 39.40,三法极差 1.70;Q1=19.50、Q2=26.50、Q3=33.50、IQR=14.00,Tukey 上下须 −1.50 / 54.50,无离群点。数值仅作演示,与下方对照表 p=90 那一行同源。

同一组 12 个数据、p 从 5% 到 60% 每 5% 一行,默认显示 12 行
百分位 p最近秩法线性插值(INC)PERCENTILE.EXC
5%12.0013.65不适用
10%15.0015.3012.90
15%15.0016.9514.85
20%18.0018.4016.80
25%18.0019.5018.50
30%20.0020.6019.80
35%22.0021.7021.10
40%22.0023.2022.60
45%25.0024.8524.55
50%25.0026.5026.50
55%28.0028.1028.30
60%30.0029.2029.60

使用方法

  1. 在数据集框里粘入你的样本,一行一个数,也可以直接粘 Excel 的一列、或用逗号 / 空格 / 分号 / 制表符分隔。示例是 12、15、18、20、22、25、28、30、33、35、38、40 共 12 个数。
  2. 在「百分位 p」填 0 到 100 之间的数,示例 90,表示「第 90 百分位」,也就是约 90% 的观测不超过的那个数值。
  3. 按「计算」,或在数据集框里按 Ctrl+Enter(Mac 用 Cmd+Enter);单行的 p 输入框则直接按裸 Enter。
  4. 看结果区四格:三种定义各自给一个数——最近秩法、线性插值、PERCENTILE.EXC——以及 IQR 与离群点判定。
  5. 下方说明行会写出 n、均值、Q1、Q2、Q3、IQR 和 Tukey 上下须,点「复制结果」复制的就是这一行。

这个百分位计算器能解决什么问题

第一类场景是报数口径对齐。「P95 响应时间 200 毫秒」这类 SLA 指标,不同监控系统用的分位数定义可能不同:同一份数据、同一个 p=95,最近秩法给 40.00、线性插值给 38.90,差了 1.10。本页把三种定义并排摆出来,就是在你拿去写报告之前先把口径摊开。

第二类场景是定位一个值在分布里的位置。已知某接口耗时 37 毫秒,想知道它在历史样本里算不算慢:把样本粘进来,看到第 90 百分位是 37.70,就知道 37 已经贴着头部 10% 的边缘。

第三类场景是排查离群值。Q1、Q3 与 IQR 出来后,Tukey 上下须一并给出,落在须外的数会被逐个点名,适合先筛一遍再决定是修正还是剔除。

第四类场景是核对别人的结果。Excel 里 =PERCENTILE.INC(区域,0.9) 与 =PERCENTILE.EXC(区域,0.9) 常常给出两个不同的数,很多人以为是自己写错了公式。本页两列都算,可以直接对着看。

这个百分位计算器不做的事也说清楚:它不做正态假设下的百分等级换算(那是「均值 + 标准差」的另一套口径),不做加权分位数,不做分组频数表的分位数,也不画图——要看分布形状请用图表类工具。

原理与规则说明

三种定义的差别全在「位置 h 怎么算」。设排序后的样本为 x₁ ≤ x₂ ≤ … ≤ xₙ,q = p/100。

最近秩法(NIST/SEMATECH 统计方法手册的定义):取 r = Math.ceil(q * n),答案就是 a[r-1]。它永远返回样本里真实存在的一个数,不做插值。示例 n=12、p=90 时 r = ceil(10.8) = 11,第 11 个数是 38。

线性插值法(R type 7、numpy.percentile 默认、Excel PERCENTILE.INC):位置 h = (n - 1) * q(0 基),在 a[floor(h)] 与 a[floor(h)+1] 之间按小数部分插值。为什么用 (n−1) 而不是 (n+1):(n−1) 让 q=0 与 q=1 恰好落在首、末两个元素上,端点封闭,这正是 INC 里 INC 的含义。示例 h = 11 × 0.90 = 9.9,在第 10 个数 35 与第 11 个数 38 之间取 0.9 处:35 + 0.9 × 3 = 37.70。

PERCENTILE.EXC:位置 h = (n + 1) * q(1 基)。用 (n+1) 是为了让中位数正好落在序列正中间,代价是两端取不到——它只在 1/(n+1) < q < n/(n+1) 时有定义。n=12 时这个开区间是 (7.69%, 92.31%),所以 p=5、95、98、99、100 时 EXC 一列显示「不适用」。这不是程序出错,是函数定义本身如此(Excel 在这些位置返回 #NUM!)。示例 p=90 时 h = 13 × 0.90 = 11.7,在第 11 个数 38 与第 12 个数 40 之间取 0.7 处:38 + 0.7 × 2 = 39.40。

还有一个容易被忽略的实现细节:排序必须写成 a.sort(function (m, n) { return m - n; })。Array.prototype.sort 不传比较函数时会把元素转成字符串按 UTF-16 码位排,[10, 2] 会被排成 [10, 2](因为 '1' < '2'),分位数立刻全错。这是本页唯一一处必须显式传参的调用。

遵循的来源分别是:最近秩定义出自 NIST/SEMATECH《e-Handbook of Statistical Methods》;INC 与 EXC 出自 Excel 的 PERCENTILE.INC / PERCENTILE.EXC 函数定义,INC 与 R 的 type 7 一致;IQR 与 1.5×IQR 的须长出自 John W. Tukey 1977 年《Exploratory Data Analysis》的箱线图;数值按 IEEE 754 双精度。

输入到输出的完整链条:文本按 [\s,,;;]+ 切分 → 丢掉空串 → Number() 转换 → 过滤掉 NaN 与非有限值 → 升序排序 → 三个函数各算一次 → 结果 toFixed(2);四分位一律走线性插值(INC)口径,避免同一页里出现两套 Q1。

最常见的误用是把百分位当成名次或得分。「第 90 百分位 = 38」说的是数值 38,不是「排第 90 名」,也不是「考了 90 分」;同一份数据里第 90 百分位可以是 38,也可以是 3.8,取决于量纲。第二个误用是混用定义:示例 p=90 下三法给 38.00、37.70、39.40,极差 1.70,报数时不写清用的是哪一个,对方复算必然对不上。

完整示例(数值仅作演示)

默认数据是 12、15、18、20、22、25、28、30、33、35、38、40(n = 12),p = 90。这 12 个数与下方对照表的全部行同源,p=90 落在展开后的第 18 行。

把 p 换成 50 再看一次:最近秩法给 25.00,线性插值和 EXC 都给 26.50——三法在中位数附近容易碰头,而在两端分歧最大,这正是「样本越少、定义差异越刺眼」的直观体现。

输入范围与对照表

数据集至少 2 个数、最多 20000 个;单个数值允许负数与小数,绝对值不超过 1e15。百分位 p 接受 0 到 100,步长 0.01。下面这张表用默认的 12 个数,把 p 从 5% 扫到 60%,用来观察三种定义的分歧随 p 怎么变。

对照表口径说明(数值仅作演示)
项目取值说明
样本 n12与表单默认值一致
扫描区间p:5% → 60%步长 5%,共 12 行
最近秩法12.00 → 30.00只在样本值上跳变,阶梯状
线性插值13.65 → 29.20连续变化
EXC 有效区间(7.69%, 92.31%)区间外显示「不适用」
加载更多p:65% → 100%再补 10 行,共 22 行

点「加载更多」把表补到 22 行;点「导出对照表 CSV」下载带 BOM 的文件(Excel 双击打开中文不乱码);点「复制对照表 TSV」把整张表复制成制表符分隔文本,可直接粘进表格软件。

边界与精度说明

样本量小于 2 时拒收并提示「至少需要 2 个数」——n=1 时三个定义全部退化成那一个数,没有分位可言。n=2 时最近秩法在 p=50 给较小的那个数(示例 [10,20] 给 10.00),线性插值给 15.00,差 5.00;样本越小定义差异越大,这不是 bug。

p 超出 0 到 100 拒收;p 填非数字或留空拒收。数据集里混进文字时不会整体失败,而是跳过无法解析的片段并在说明行告诉你丢掉了几项;但如果丢掉的数量超过一半,本页会直接报错让你检查格式,避免你在不知情的情况下拿残缺样本算分位数。

EXC 越界时显示「不适用」而不是留空或写 0:留空会被误读成「算不出来」,写 0 会被误读成「答案是 0」,两者都比明确的「不适用」更危险。

精度方面所有结果保留 2 位小数。参与运算的是完整双精度值,只有显示层四舍五入;但 IEEE 754 的安全整数上限是 2^53 = 9007199254740992,超过它的整数不再能精确表示,长 ID 一类的数据请换算成相对量再粘进来。

还有一条与插值有关的边界:样本存在重复值时,线性插值可能返回一个「样本里不存在」的数(示例 37.70 就不在那 12 个数里),这是插值的正常结果;如果你要求结果必须落在真实观测上,就取最近秩法那一列。

常见问题

第 90 百分位和「考了 90 分」是一回事吗?

不是。百分位是一个数值,含义是「约 90% 的观测不超过它」。它可以是 38,也可以是 3.8,取决于你测的是什么;90 分是一个得分,两者没有换算关系。

三个结果该用哪一个?

看对标对象:与 Excel PERCENTILE.INC 或 Python numpy.percentile 对齐用「线性插值」;与 Excel PERCENTILE.EXC 对齐用第三列;规范要求「必须是真实观测值」时(例如某些 SLA 约定)用最近秩法。示例 p=90 下三者是 38.00、37.70、39.40。

为什么 PERCENTILE.EXC 有时显示「不适用」?

因为它的定义域是开区间 (1/(n+1), n/(n+1))。n=12 时即 (7.69%, 92.31%),所以 p=5、95、98、99、100 都不适用;Excel 在这些位置返回 #NUM!,本页显示「不适用」。

数据需要我先排序吗?

不用,本页会先排序再算,而且传的是数值比较函数而不是默认的字符串排序——默认排序会把 [10, 2] 排成 [10, 2],分位数会全错。

只有两个数能算吗?

能,但要留意分歧。[10, 20] 在 p=50 时最近秩法给 10.00、线性插值给 15.00,差 5.00。样本越小定义差异越大,报数时越要注明用的是哪一列。

IQR 和那个 1.5 倍系数是哪来的?

IQR = Q3 − Q1;1.5×IQR 的须长出自 Tukey 1977 年《Exploratory Data Analysis》的箱线图约定。示例 Q1=19.50、Q3=33.50、IQR=14.00,须为 −1.50 与 54.50,全部观测落在须内。

数据里混了文字或多余空格会怎样?

无法解析的片段会被跳过,说明行告诉你丢了几项;丢掉超过一半会直接报错让你检查格式。纯空格与空行不算数据,多个分隔符连在一起也只算一个。

粘进去的数据会被上传吗?

不会。解析、排序、三个分位数函数全在页面内存里完成,不发任何网络请求;开发者工具的 Network 面板里除页面自身资源外不会出现新请求,刷新后输入即清空。

相关工具

百分位计算器只解决「一组数的分位数」这一件事,数的来源与结果的呈现各有专门页面。