本帖最后由 cwllsss 于 2020-9-24 15:57 编辑
百分位数的计算
1、百分位数和百分位百分位:将一组个数为n的数据值{x1,x2,x3,x4.......xn}从小到大排序。 排序后为:{x(1),x(2),x(3),x(4).......x(n)} 则第p百分位,意为:在所有测量数据中,该测量值的累计频数达p%。 累积频数(Cumulative Frequency),累积频数 就是将各类别的频数逐级累加起来。通过累积频数,可以很容易 看出某一类别(或数值)以下及某一类别(或数值) 以上的频数之和。
第p百分位所对应的测量值,称为百分位数。 2、几个常用的百分位数第25百分位数又称第一个四分位数(First Quartile),用Q1表示; 第50百分位数又称第二个四分位数(Second Quartile),用Q2表示; 第50百分位数就是中位数,与数据中心趋势有关。 第75百分位数又称第三个四分位数(Third Quartile),用Q3表示。 10%和90%分位数等与极值有关
3、百分位数的计算
numpy.quantilenumpy.``quantile(a, q, axis=None,interpolation='linear' ) array_like Input array or object that can be converted to an array. q array_like of float Quantile or sequence of quantiles to compute, which must be between 0 and 1 inclusive. interpolation{‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’} This optional parameter specifies the interpolation method to use when the desired quantile lies between two data points i < j:
linear: i + (j - i) * fraction, where fraction is the fractional part of the index surrounded by i and j. lower: i. higher: j. nearest: i or j, whichever is nearest. midpoint: (i + j) / 2.
方法一第1步:以递增顺序排列原始数据(即从小到大排列)。 第2步:计算指数i=np% 第3步: l)若 i 不是整数,将 i 向上取整。大于i的毗邻整数即为第p百分位数的位置。 2) 若i是整数,则第p百分位数是第i项与第(i+l)项数据的平均值。 import numpy as np
import pandas as pd
import math
'''
#整数、小数分离
math.modf(num)
#向上取整
math.ceil(num)
'''
def quantile(arr,p):
p_quantile = 0
#从小到大排序
arr_sort = np.sort(arr)
n = np.size(arr_sort)
#计算第p百分位的项数
i = n*(p/100.0)
print(i)
if(math.modf(i)[1] == 0):
p_quantile = (arr_sort[i-1]+arr_sort)/2.0
else:
p_quantile = arr_sort[math.ceil(i)]
return p_quantile
#生成随机数
arr1 = np.random.randint(1,100,size=111)
print(arr1)
print(np.sort(arr1))
#第50百分位数
p_quantile1 = quantile(arr1,50)
#中位数
medianarr1 = np.median(arr1)
print(p_quantile1)
print(medianarr1)
print(np.quantile(arr1,0.5))
方法二第一步:将n个变量值从小到大排列,X(j)表示此数列中第j个数。 第二步:计算指数,设(n+1)P%=j+g,j为整数部分,g为小数部分。 第三步:1)当g=0时:P百分位数=X(j); 2)当g≠0时:P百分位数=gX(j+1)+(1-g)X(j)=X(j)+g*[X(j+1)-X(j)]。
import numpy as np
import pandas as pd
import math
'''
#整数、小数分离
math.modf(num)
#向上取整
math.ceil(num)
'''
def quantile(arr,p):
p_quantile = 0
#从小到大排序
arr_sort = np.sort(arr)
n = np.size(arr_sort)
#计算指数,设(n+1)P%=i_int+i_float,i_int为整数部分,i_float为小数部分。
i = (n+1)*(p/100.0)
#分离出i的小数、整数部分
i_float = math.modf(i)[0]
i_int = int(math.modf(i)[1])
print(i,i_float,i_int)
#当i_float=0时
if(i_float == 0):
p_quantile = arr_sort[i_int]
#当i_float≠0时
else:
p_quantile = arr_sort[i_int-1]+i_float*(arr_sort[i_int] - arr_sort[i_int-1])
return p_quantile
#生成随机数
arr1 = np.random.randint(1,100,size=78)
print(arr1)
print(np.sort(arr1))
#第50百分位数
p_quantile1 = quantile(arr1,50)
#中位数
medianarr1 = np.median(arr1)
print(p_quantile1)
print(medianarr1)
print(np.quantile(arr1,0.5))
|