我不明白使用np.boxplot获得Q1和Q3的结果

时间:2015-02-13 18:42:12

标签: python numpy

如果我定义

>>> y=np.linspace(1., 10, 10)

我做了

>>> np.percentile(y, [25, 50, 75])

我获得[3.25,5.5,7.75] 对于1,2,3,4,5,6,7,8,9,10系列,Q3 = 5.5(OK)和Q1 = 3(而不是3.25)和Q3 = 8(而不是7.75)!
对不起,我对这些基本的东西感到有些失落..希望能提前获得一些帮助。

2 个答案:

答案 0 :(得分:1)

默认情况下,numpy对百分位数使用线性插值,这意味着如果百分位数的“真实”值位于两个数据点之间,则返回它们之间的值,按比例更接近于更靠近数据点的数据点。请求百分位数。

从numpy 1.9.0开始,您可以通过将interpolation参数传递给percentile来覆盖它。您有几个选项,如记录here。 “降低”或“最近”可能是您正在寻找的。

在早期版本的numpy中,无法获得所需的行为。 scipy中有一个函数scipy.stats.scoreatpercentile,它提供“较低”和“较高”的插值方法(但不是np.percentile提供的额外“最近”和“中点”方法。)

答案 1 :(得分:1)

因为我想知道事情是如何运作的......而且因为别人可能会像我一样......

首先,我非常感谢BrenBarn的帮助以及他所花费的时间 应答。那么plt如何给出plt.boxplot()中的第一个四分位数(Q1,第25个百分位数),中位数(Q2,第50个百分位数)和第3个四分位数(Q3,75个百分位数)以及更一般地使用np.percentile()的结果? / p>

BrenBarn说阅读手册http://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html,其中写着“线性:i +(j - i)*分数,其中分数是由i和j包围的索引的小数部分。”,但是我不是很清楚,因为我,j和分数对我来说并不明显。 我们这样做:

>>> x=np.linspace(1,10,10)
>>> x
array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])
>>> np.percentile(x,[0,1,20,25,50,75,80,99,100])
[1.0, 1.0900000000000001, 2.8000000000000003, 3.25, 5.5, 7.75, 8.1999999999999993, 9.9100000000000001, 10.0]

如果我们采用numpy手册的定义,推导i,j和分数的方法是:

P:计算的百分位数。

N:数据总数。

N =((P / 100)*(N-1))+ 1。

N = K + d

k是一个整数,数组x的第i个排序数据(比如说v_i),d是百分位数()的numpy手册中描述的分数。 v_i + 1称为vj(第(i + 1)个排序数据)。 所以使用numpy手册的定义: N = +馏分。

然后使用以下方法轻松找到结果:

value =第一个排序数据(此示例中为x [0])如果P = 0

value =最后数据(此示例中为x [9])如果P = 100

value = v_i + d *(v_j-v_i)如果0<我< Ñ

以上例子:

  • 第一个百分位:

N =((1/100)*(10-1))+ 1 = 1.09

>>> x[0]+0.09*(x[1]-x[0])
1.0900000000000001

好的,正如上面的np.percentile(x,[0,1,20,25,50,75,80,99,100])所返回的那样。

  • 20日:

N =((20÷100)*(10-1))+ 1 = 2.8

>>> x[1]+0.8*(x[2]-x[1])
2.7999999999999998

好的,非常接近上面的np.percentile(x,[0,1,20,25,50,75,80,99,100])的返回。

  • 第一个四分位数:

N =((25/100)*(10-1))+ 1 = 3.25

>>> x[2]+0.25*(x[3]-x[2])
3.25

好的,正如上面的np.percentile(x,[0,1,20,25,50,75,80,99,100])所返回的那样。

  • 中位数:

N =((50/100)*(10-1))+ 1 = 5.5

>>> x[4]+0.5*(x[5]-x[4])
5.5

好的,正如上面的np.percentile(x,[0,1,20,25,50,75,80,99,100])所返回的那样。

  • 依旧......

我使用此链接https://en.m.wikipedia.org/wiki/Percentile#Microsoft_Excel_method来执行此操作,此方法称为“Microsoft Excel方法”。因为我来自自由世界,我不喜欢它,但这是这个链接中给出的名字......

希望这会对某人有所帮助,尽管我的英文写得不好。

Je suis Charlie。