You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义百分位函数有误?还是numpy.percentile调用方式不当?

百分位计算:自定义函数与numpy.percentile结果差异问题

背景定义

根据Ross《统计学导论》(第3版)中第100p百分位的定义:
“假设样本量为n的数据按从小到大排序,确定样本第100p百分位需找到满足以下条件的数据值:

  1. 至少有np个数据值小于或等于该值;
  2. 至少有n(1−p)个数据值大于或等于该值。”(第90页)

自定义实现的函数

import numpy as np
import math

def calculate_percentile(data, p):
    sorted_data = np.sort(data)
    n = len(data)

    if (n * p).is_integer() == True:
       percentile = (data[(n * p) - 1] + data[(n*p)])/2  
                                                          
    else:
       percentile = data[math.ceil((n * p) - 1)]
    
    return percentile

测试场景

使用以下数据集测试时,结果出现不一致:

data1 = np.array([
    19, 34, 25, 34, 23, 20, 24, 31, 34, 34, 28, 27,     32, 39, 31, 19, 24, 21, 19,
    30, 37, 32, 20, 20, 35, 28, 28, 40, 20, 21, 18, 33, 35, 30, 40, 29, 31, 36,
    27, 21, 34, 38, 21, 29, 37, 27, 18, 35, 36, 40, 23, 25, 35, 19, 29, 20, 28,
    26, 30, 28, 19, 37, 37, 36, 40, 37, 19, 19, 40, 36, 22, 24, 38, 21, 40, 19,
    35, 18, 19, 22, 29, 25, 22, 18, 34, 20, 35, 34, 24, 22, 20, 30, 40, 32, 38,
    33, 26, 35, 22, 21, 26, 33, 25, 19, 39, 18, 18, 22, 24, 39, 38, 24, 30, 20,
    21, 23, 19, 23, 28, 20, 35, 25, 30, 22, 22, 27, 19, 26, 39, 18, 20, 19, 27,
    18, 30, 31, 28, 26, 27, 18, 22, 21, 34, 30, 20, 19, 38, 35, 24, 26, 21, 19,
    18, 35, 39, 35, 18, 37, 22, 19, 25, 33, 29, 40, 27, 38, 20, 25, 26, 27, 29,
    18, 37, 25, 19, 34, 39, 21, 32, 29, 23, 31, 36, 27, 32, 25, 29, 40, 28, 31,
    28, 31, 39, 39, 28, 21, 35, 29, 35, 37, 37, 21, 21, 37, 32, 25, 32, 36, 20,
    28, 32, 40, 24, 36, 28, 28, 29, 28, 39, 38, 28, 25, 39, 22, 33, 18, 32, 24,
    28, 27, 34, 22, 32, 29, 36, 23, 38, 34, 39, 19, 20, 18, 21, 36, 29, 40, 26,
    28, 24, 40, 25, 26, 35, 24, 20, 23, 25, 18, 19, 28, 30, 28, 37, 31, 26, 30,
    34, 29, 31, 40, 37, 24, 21, 27, 40, 23, 20, 19,   23, 37, 36, 31, 33, 29, 40
])
  • 自定义函数调用calculate_percentile(data1, 0.03)返回结果为34
  • numpy函数调用np.percentile(data1, 0.03)返回结果为18.0

问题原因分析

1. numpy.percentile参数使用错误

np.percentile的第二个参数接受的是0-100范围内的百分比数值,而非0-1的小数。如果要计算3%的百分位,正确调用应为np.percentile(data1, 3),而非0.03。传入0.03实际是计算0.03%的百分位,此时结果为数据集最小值18完全符合逻辑。

2. 自定义函数逻辑错误

  • 取值对象错误:函数内已对数据排序得到sorted_data,但后续取值却使用原未排序的data,导致索引对应的数值完全错误。
  • 索引计算逻辑偏差:按照Ross的定义,当n*p为整数时,无需取两个值的平均——只需找到满足"至少np个值≤它,至少n(1-p)个值≥它"的最小数值即可。以测试数据集为例,n=200,p=0.03,np=6,排序后前16个值都是18,完全满足条件,正确结果应为18,而非34。

修正后的自定义函数示例

import numpy as np
import math

def calculate_percentile(data, p):
    sorted_data = np.sort(data)
    n = len(data)
    idx = math.ceil(n * p) - 1
    # 严格匹配定义:取第一个满足至少np个值≤它的数
    percentile = sorted_data[idx]
    return percentile

内容的提问来源于stack exchange,提问作者Dan Öz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:15:58