[英]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.