2017-01-02 57 views
-1

我正在計算落入特定百分位數的數字。然而,我的等式的問題是,如果數組中的多個元素具有相同的值,則此代碼將爲這些元素中的每一個分配不同的百分位數。數組中的多個元素具有相同的值,將得到不同的百分位數

$percentile_50 = $array[round((50/100) * $count_array -.5)]; 

例如,第一列是百分,二是分數。你可以看到同一秒得到不同的百分位數,但實際上它應該是相同的。

我該如何避免這種情況?

5-1 
10-1 
15-1 
20-1 
25-2 
30-2 
35-3 
40-4 
45-4 
50-5 
55-6 
60-7 
65-9 
70-11 
75-14 
80-17 
85-23 
90-32 
95-53 

回答

0

要計算的第k個百分點,你應該:

  1. 訂購的所有數據值從最小到最大設置。
  2. 將k值乘以值的總數n。
    • 這個數字被稱爲索引。
  3. 如果步驟2中獲得的指標不是一個整數,則將其四捨五入到最接近的整數並轉到步驟4.如果步驟2中獲得的指標是整數,則轉到步驟5。
  4. 算在你的數據中設置的值從左至右(從最小到最大的值),直到你到達的第3步 指示的號碼與您的數據設置相應的值是第k個百分點
  5. 算上數據集中的值從左到右,直到達到步驟2指示的數字。 第k百分位數是數據集中對應值的平均值,以及緊跟在i後面的值噸。

(從here

轉換爲PHP:

$sData = sort($data); 
$percentile = 50/100; 
$index = ceil($percentile * count($sData)); 
$value = $sData[$index-1]; 

或更短:

$sData = sort($data); 
$value = $sData[ceil((50/100) * count($sData)) - 1] 

然而,在一個小數據集,有時百分最終是相同的。例如,以下代碼會生成以下輸出。

代碼

$data = array(74, 15, 25, 62, 45, 9, 16, 63, 60, 76, 7, 20, 67, 30, 12); 
sort($data); 
for($i=5;$i<100;$i+=5){ 
    echo $i . " - " . $data[ceil(($i/100) * count($data)) - 1]; 
    echo PHP_EOL; 
} 

輸出

5 - 7 
10 - 9 
15 - 12 
20 - 12 //same as aboce 
25 - 15 
30 - 16 
35 - 20 
40 - 20 //same as above 
45 - 25 
50 - 30 
55 - 45 
60 - 45 //same as above 
65 - 60 
70 - 62 
75 - 63 
80 - 63 //same as above 
85 - 67 
90 - 74 
95 - 76 
+0

感謝你爲這個,但是我的輸出有沒有比你差,這意味着我們都給予不同的百分比,以相同的數字 – EnexoOnoma

+0

是,那麼百分位數是如何工作的。你需要別的東西,每個數字都是唯一的。也許是Z分數? @Xalloumokkelos –

相關問題