【问题标题】:What am I doing wrong in calculating quartiles?我在计算四分位数时做错了什么?
【发布时间】:2020-09-07 05:57:11
【问题描述】:
x = np.array([1, 3, 7, 11])
print(np.quantile(x, 0.75))
print(np.quantile(x, 0.25))
8.0
2.5

我如何得到这些作为答案?我究竟做错了什么?我真的很笨还是 q1 和 q3 9 和 2?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您做错的不是阅读documentation。默认插值是linear;你似乎期待midpoint

    x = np.array([1, 3, 7, 11])
    print(np.quantile(x, 0.75, interpolation="midpoint"))
    print(np.quantile(x, 0.25, interpolation="midpoint"))
    

    输出:

    9.0
    2.0
    

    在您最初的尝试中,您使用了默认的“线性”插值,它使用由两个最近点表示的跨度的分数。我花了大约一个小时研究那个分数。 NumPy 文档说:

    线性:i + (j - i) * 分数,其中分数是由 i 和 j 包围的索引的小数部分。

    index这个词在这个页面上没有定义,在一些相关的方法中我也找不到它。我第一次在这个答案中发布的假设是错误的——现在被删除了。我终于放弃了,并尝试通过将index 的值计算为(j - i) / fraction 来对概念进行逆向工程:

    print(f'{" q":3} {" val":4} {" i":3} {"j":3} {"frac"}  {"index"}')
    x = np.array([0, 1, 3, 6, 10])
    lo = [0, 0, 0, 1, 1, 3, 3, 3,  6,  6, 10]
    hi = [0, 1, 1, 3, 3, 3, 6, 6, 10, 10, 10]
    for q in range(0, 11):
        interp = np.quantile(x, q/10)
        i, j = lo[q], hi[q]
        fraction = 0 if i == j else (interp - i) / (j - i)
        index    = 0 if i == j else (j - i) / fraction
        print(f'{round(q/10, 1):3} {round(interp, 1):4} {i:2} {j:2}   {round(fraction, 1):<3}  {round(index, 2):6.2f}')
    

    输出:

     q   val  i  j   frac  index
    0.0  0.0  0  0   0      0.00   # i == j
    0.1  0.4  0  1   0.4    2.50
    0.2  0.8  0  1   0.8    1.25
    0.3  1.4  1  3   0.2   10.00
    0.4  2.2  1  3   0.6    3.33
    0.5  3.0  3  3   0      0.00   # i == j
    0.6  4.2  3  6   0.4    7.50
    0.7  5.4  3  6   0.8    3.75
    0.8  6.8  6 10   0.2   20.00
    0.9  8.4  6 10   0.6    6.67
    1.0 10.0 10 10   0      0.00   # i == j
    

    此时,我对解释“分数”概念感到茫然。我确实理解这是对分位数值的最佳估计的统计尝试,假设更多的观察将被添加到集合x,来自相同的潜在(和未知)分布。

    如果有人发现我的计算有误,或者可以以任何方式说明这一点,请编辑此答案、评论等。我今天离我的理解范围还有很长的路要走。

    【讨论】:

    • 你能解释一下你是如何得到分数的吗?我还看到 8 是从 7 到 11 的 25%,但 2.5 是从 1 到 3 的 75%。
    • 我通过应用文档中给出的公式得到分数。您在哪里不理解 fraction 的上下文定义?
    • 我想我不明白“其中小数部分是由 i 和 j 包围的索引的小数部分”是什么意思。
    • 啊,哈!我现在明白了;我碰巧理解它,但 ninnies 没有在此页面上定义该术语。这需要几分钟;晚饭后我得去做。同时,你想要midpoint,所以我不担心你的个人进步。
    • 老实说,我不完全明白你做了什么。然而,我确实在另一个网站上得到了答案,并认为我会分享它来看看你的想法。第一个四分位数的从零开始的索引是 index = (n - 1) * q,或 index = 0.75。对于第三个四分位数,它将是 2.25。 Fraction = index - int(index),因此对于 q3,fraction = 0.25。
    【解决方案2】:

    np.quantile的默认插值模式是linear (参见文档)。

    您可以通过interpolation='midpoint'获得预期结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      相关资源
      最近更新 更多