p分位数的原理及计算

目录

1.统计上的分位数概念

2.分位数的计算方法及举例

2.1确定p分位数的位置

2.2 确定的p分位数位置处的具体值

2.3 举例分析

3.python、R、excel中分位数的计算及结果

3.1 python

3.2 R

3.3 excel

4.p分位数在python中的应用——等频分箱


1.统计上的分位数概念

        统计上,分位数亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数百分位数等。分位数指的就是连续分布函数中的一个点,这个点对应概率p。若概率0<p<1,随机变量X或它的概率分布的分位数Za,是指满足条件p(X≤Za)=α的实数。

四分位数(Quartile)是统计学分位数的一种,即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

1)第一四分位数(Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;

2)第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;

3)第三四分位数(Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

第三四分位数与第一四分位数的差距又称四分位距

2.分位数的计算方法及举例

为了更一般化,这里考虑四分位。即当p=0.25 0.5 0.75 时,所求得的分位数值。过程分为三步:

  1. 将数据从小到大排列
  2. 确定p分位数的位置
  3. 确定p分位数具体的数值

为了更好得说明,这里我们设n表示数据的长度,Q1Q2Q3分别表示所求的第1分位数、第2分位数、第3分位数。position()表示分位数的位置,figure()表示分位数处的值。将n个数据从小到大排列,记排序前的数据为before_data;排序后的数据为data,简记为a[1]~a[n]

2.1确定p分位数的位置

p分位数的位置公式如下:

position = 1+(n-1)*p 

由公式,第1分位数、第2分位数、第3分位数的位置分别为:

\\{\color{Red} position(Q1)} = 1 +(n-1)* 0.25\\ {\color{Red} position(Q2)} =1 +(n-1)* 0.5\\ {\color{Red} position(Q3)} =1 +(n-1)* 0.75

2.2 确定的p分位数位置处的具体值

p分位数的值的计算公式如下:

figure(Q1) data[ ⌊position(Q1)⌋ ] +(data[ ⌊position(Q1)⌋+1] - data[ ⌊position(Q1)⌋])*(position(Q1)-⌊position(Q1)⌋)

                  = a[ ⌊1 +(n-1)* 0.25⌋ ] +( a[ ⌊1 +(n-1)* 0.25⌋+1 ]-a[ ⌊1 +(n-1)* 0.25⌋ ])*(1 +(n-1)* 0.25 - ⌊1 +(n-1)* 0.25⌋)

figure(Q2) data[ ⌊position(Q2)⌋ ] +(data[ ⌊position(Q2)⌋+1] - data [ ⌊position(Q2)⌋])*(position(Q2)-⌊position(Q2)⌋)

                  = a[ ⌊1 +(n-1)* 0.5⌋ ] +( a[ ⌊1 +(n-1)* 0.5⌋+1 ]-a[ ⌊1 +(n-1)* 0.5⌋ ]) * (1 +(n-1)* 0.5 - ⌊1 +(n-1)* 0.5 ⌋)

figure(Q3) data[ ⌊position(Q3)⌋ ]+(data[ ⌊position(Q3)⌋+1] - data[ ⌊position(Q3)⌋])*(position(Q3)-⌊position(Q3)⌋)

                  = a[ ⌊1 +(n-1)* 0.75⌋ ] +( a[ ⌊ 1 +(n-1)* 0.75⌋+1 ]-a[ ⌊1 +(n-1)* 0.75⌋ ])*(1 +(n-1)* 0.75 - ⌊1 +(n-1)* 0.75⌋)

也就是说,将数据从小到大排列,p分位数位置的值 = 位于p分位数取整后位置的值 + (位于p分位数取整下一位位置的值 - 位于p分位数取整后位置的值)*(p分位数位置 - p分位数位置取整)

:其中 Q 表示对 Q 值向下取整

2.3 举例分析

实例1:

给出一组数据before_data:6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36,一共11项

从小到大排序后结果data:6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49

\\{\color{Red} position(Q1)} = 1+(11-1)*0.25 = 3.5\\ {\color{Red} position(Q2)} = 1+(11-1)*0.5 = 6\\ {\color{Red} position(Q3)} = 1+(11-1)*0.75 = 8.5

figure(Q1) data[ ⌊position(Q1)⌋ ] +(data[ ⌊position(Q1)⌋+1] -data[ ⌊position(Q1)⌋])*(position(Q1) - ⌊position(Q1)⌋)

                 = a[ ⌊ 3.5⌋ ] +( a[ ⌊ 3.5⌋+1 ]-a[ ⌊ 3.5⌋ ])*(3.5 - ⌊ 3.5 ⌋)

                 = a[3] + (a[4] - a[3]) * (3.5-3)

                 = 15+(36-15)*(3.5-3)

                 = 25.5

figure(Q2) data[6] = 40 

figure(Q3) data[ ⌊position(Q3)⌋ ]+(data[ ⌊position(Q3)⌋+1] - data[ ⌊position(Q3)⌋])*(position(Q3) - ⌊position(Q3)⌋)

                 = a[ ⌊8.5⌋ ] +( a[ ⌊ 8.5⌋+1 ]-a[ ⌊ 8.5⌋ ])*(8.5 - ⌊8.5⌋)

                 = a[8] + (a[9] - a[8]) * (8.5-8)

                 = 42+(43-42)*(8.5-8)

                 = 42.5

实例2:

给出一组数据before_data:7, 15, 36, 39, 40, 41,20,18,一共8项

从小到大排序后结果data:7,15,18,20,36,39,40,41

\\{\color{Red} position(Q1)}=1+(8-1)* 0.25=2.75\\ {\color{Red} position(Q2)}=1+(8-1)* 0.5=4.5\\ {\color{Red} position(Q3)}=1+(8-1)* 0.75=6.25

figure(Q1) data[ ⌊position(Q1)⌋] + (data[ ⌊position(Q1)⌋+1] - data[ ⌊position(Q1)⌋]) * (position(Q1) - ⌊position(Q1)⌋)

                  = a[2] + (a[3] - a[2] ) * (2.75-2)

                  = 15 + (18-15)*(2.75-2)

                  = 17.25

figure(Q2) data[ ⌊position(Q2)⌋] + (data[ ⌊position(Q2)⌋+1] - data[⌊position(Q2)⌋]) * (position(Q2) - ⌊position(Q2)⌋)     

                  = 20 + (36-20)*(4.5-4)

                  = 28

figure(Q3) data[ ⌊position(Q3)⌋] + (data[ ⌊position(Q3)⌋+1] - data[ ⌊position(Q3)⌋]) * (position(Q3) - ⌊position(Q3)⌋)

                 = 39 + (40-39)*(6.25-6)

                 = 39.25

备注:p分位数位置的计算还有很多形式,因为我并没有遇到,所以这里不多做介绍。感兴趣的可参阅

p分位数​​​​​的估算类型——截取自 上面链接

3.python、R、excel中分位数的计算及结果

3.1 python

numpy和pandas中都有计算p分位数的方法,numpy中用 percentile,pandas中用 quantile,两种方法计算结算结果一样。

import numpy as np
import pandas as pd

# array数据处理
test1 = np.array([6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36])
test2 = np.array([7, 15, 36, 39, 40, 41, 20, 18])  # 不需要从小到大排序

# 法一:用numpy中的percentile
print("实例1,numpy中第一分位数为:",np.percentile(test1, 25))
print("实例1,numpy中第二分位数为:",np.median(test1))
print("实例1,numpy中第三分位数为:",np.percentile(test1, 75))
# 法二:用pandas中的quantile
b1 = pd.DataFrame(test1)  # 数据转化
print("实例1,pandas中第一分位数为:",b1.quantile(0.25))
print("实例1,pandas中第二分位数为:",b1.median())
print("实例1,pandas中第三分位数为:",b1.quantile(0.75))


# 法一:用numpy中的percentile
print("实例2,numpy中第一分位数为:",np.percentile(test2, 25))
print("实例2,numpy中第二分位数为:",np.median(test2))
print("实例2,numpy中第三分位数为:",np.percentile(test2, 75))  
# 法二:用pandas中的quantile
b2 = pd.DataFrame(test2)  # 数据转化
print("实例2,pandas中第一分位数为:",b2.quantile(0.25))
print("实例2,pandas中第二分位数为:",b2.median())
print("实例2,pandas中第三分位数为:",b2.quantile(0.75))

python运行结果如下:

3.2 R

3.3 excel

可见,在python、R、excel下计算结果与2中计算结果相同。

4.p分位数在python中的应用——等频分箱

import numpy as np
import pandas as pd

#百分位数实现数据分箱
data = pd.DataFrame(columns=['l','s'])
data['l'] = np.random.randint(0,999,size = 1000)  #生成给定上下限范围的随机数
data['s'] = 1  #便于下一步的统计总数
#print(data)

#通过np.percentile找到分位点
l_bin=[]
for i in range(0,101,10):
    l_bin.append(np.percentile(data['l'],i))

#对随机数进行切分,right=False时左闭右开
data['box']=pd.cut(data['l'],l_bin,right=False)
tj=data.groupby('box')['s'].agg('sum')
print('分箱统计')
print(tj)

结果如下:

可见在每个分箱内,其总数值在100左右。说明实现了等频分箱,且可知分箱的上下限。进而可以实现自定义标签的应用。

 

参考链接:

https://www.cnblogs.com/gispathfinder/p/5770091.html

https://blog.csdn.net/u011327333/article/details/71263081?locationNum=14&fps=1

利用python 计算百分位数实现数据分箱

数理统计

茆诗松《概率论与数理统计》

  • 26
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值