簡體   English   中英

我在計算四分位數時做錯了什么?

[英]What am I doing wrong in calculating quartiles?

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?

你做錯的是沒有閱讀文檔 默認插值是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 ,來自相同的潛在(和未知)分布。

如果有人看到我的計算錯誤,或者可以以任何方式闡明這一點,請編輯此答案、評論等。我今天離理解區已經走了很長的一步。

np.quantile的默認插值模式是線性的(參見文檔)。

您可以通過interpolation='midpoint'獲得預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM