Python - Pandas - describe() 方法的百分位数计算公式是什么?
有人能解释一下describe()方法是怎么计算百分位数的吗?
不同的资料用不同的方法来解释这个问题。那么,具体的计算方式是什么呢?
比如,看看下面这段代码:
l=[10,13,15,19,21,25]
s=pd.Series(l)
s.describe()
输出结果是:
count 6.000000
mean 17.166667
std 5.528713
min 10.000000
**25% 13.500000**
50% 17.000000
75% 20.500000
max 25.000000
有人能解释一下25%(也就是第一四分位数Q1)是怎么计算出来的吗?
2 个回答
0
这个内容在quantile
的文档中有说明(默认情况下,插值是线性的):
线性插值的公式是:i + (j - i) * (x-i)/(j-i)
其中,(x-i)/(j-i) 是被 i 和 j 包围的索引的分数部分。
i
是通过 interpolation='lower'
得到的,而 j
是通过 interpolation='higher'
得到的。
所以在这里 i = 13 ; j = 15 ; (x-i)/(j-i) = 0.25
:
13 + (15 - 13) * 0.25 = 13.5
1
我在这里找到了一些解释:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.quantile.html
df.quantile()这个函数有几个参数,可以用来计算不同插值方式下的分位数。对于df.describe(),默认使用的方式似乎是线性插值,具体可以参考这里:
s.quantile([.25, .5, .75], interpolation="linear")
这段代码的结果是:
0.25 13.5
0.50 17.0
0.75 20.5
你也可以使用:
s.quantile([.25, .5, .75], interpolation="nearest")
来得到:
0.25 13
0.50 15
0.75 21
"nearest"(最近邻)是我也期待的结果。根据文档,线性插值的公式是:
线性插值:i + (j - i) * fraction,其中fraction是夹在i和j之间的索引的小数部分。