Median memberi kita satu titik potong distribusi, tetapi analisis nyata sering menuntut titik potong lain: ambang nilai untuk 25% data terbawah, target untuk masuk kelompok 10% teratas, atau kuartil untuk laporan ringkas. Keluarga fungsi percentile dan quantile menyelesaikan masalah itu. Keduanya sebenarnya fungsi yang sama; perbedaannya hanya terletak pada skala argumen yang diterima.

Satu Keluarga, Dua Skala #

np.percentile menerima q pada skala 0-100, sedangkan np.quantile menerima q pada skala 0-1. Keduanya menghitung titik yang sama: percentile 75 identik dengan quantile 0.75. Mari kita buktikan pada data nilai ujian tujuh mahasiswa:

python
import numpy as np

nilai = np.array([65, 70, 72, 78, 85, 88, 92])

p75 = np.percentile(nilai, 75)
q75 = np.quantile(nilai, 0.75)

print("percentile 75 :", p75)
print("quantile 0.75 :", q75)
print("hasil sama    :", p75 == q75)

kuartil = np.percentile(nilai, [25, 50, 75])
print("kuartil       :", kuartil)
print("median        :", np.median(nilai))

Output yang Dihasilkan:

text
percentile 75 : 86.5
quantile 0.75 : 86.5
hasil sama    : True
kuartil       : [71.  78.  86.5]
median        : 78.0

Poin-poin penting dari kode di atas:

  1. Baris 5-6: argumen diberikan dalam skala berbeda (75 versus 0.75), tetapi hasilnya identik 86.5, sehingga perbandingan p75 == q75 bernilai True.
  2. Baris 12: bila q berupa list atau array, hasilnya pun array — [71. 78. 86.5] berisi Q1, Q2, dan Q3 sekaligus.
  3. Baris 14: nilai median 78.0 sama dengan percentile 50; definisi median sebagai titik potong 50% sudah kita bahas pada Chapter mean, median, dan percentile.
python
import numpy as np

nilai = np.array([65, 70, 72, 78, 85, 88, 92])

try:
    np.quantile(nilai, 75)
except ValueError as e:
    print("ValueError:", e)

Output yang Dihasilkan:

text
ValueError: Quantiles must be in the range [0, 1]

Lima Metode Interpolasi #

Bagaimana bila titik potong jatuh di antara dua data? NumPy menentukan posisi teoretis dengan rumus posisi = q × (n − 1), lalu menyelesaikannya sesuai metode interpolasi yang dipilih. Metode bawaan linear menginterpolasi antara dua data tetangga; empat metode lainnya memilih data yang memang ada. Mari kita amati kelimanya pada data lima elemen dengan q = 0.3:

python
import numpy as np

data = np.array([10, 20, 30, 40, 50])
posisi = 0.3 * (len(data) - 1)
print("posisi:", posisi)

for metode in ["linear", "lower", "higher", "midpoint", "nearest"]:
    hasil = np.quantile(data, 0.3, method=metode)
    print(f"{metode:9s}: {hasil}")

Output yang Dihasilkan:

text
posisi: 1.2
linear   : 22.0
lower    : 20
higher   : 30
midpoint : 25.0
nearest  : 20

Posisi teoretis 1.2 berada di antara indeks 1 (nilai 20) dan indeks 2 (nilai 30), lebih dekat ke indeks 1. Setiap metode menyelesaikan fraksi 0.2 itu dengan caranya sendiri:

MetodeCara menentukan hasilNilai pada posisi 1.2
linearinterpolasi: 20 + 0.2 × (30 − 20)22.0
lowerambil data pada indeks 120
higherambil data pada indeks 230
midpointrata-rata lower dan higher: (20 + 30) / 225.0
nearestdata terdekat ke posisi (indeks 1, karena 0.2 < 0.5)20

Perhatikan juga tipe data hasil pada output: linear dan midpoint selalu mengembalikan float, sedangkan lower, higher, dan nearest mengembalikan elemen data asli sehingga tetap int64 untuk input integer.

IQR — Mengukur Sebaran dan Menemukan Nilai Ekstrem #

Kuartil pertama (Q1) dan ketiga (Q3) memotong data pada 25% dan 75%. Selisih keduanya, IQR (interquartile range), mengukur sebaran 50% data tengah dan menjadi dasar penyaringan nilai ekstrem yang tahan terhadap pencilan. Prosedur lengkapnya:

  1. Hitung Q1 dan Q3 dengan np.percentile.
  2. Hitung IQR = Q3 − Q1.
  3. Tentukan batas: Q1 − 1.5 × IQR dan Q3 + 1.5 × IQR.
  4. Nilai di luar kedua batas diperlakukan sebagai outlier.
python
import numpy as np

nilai = np.array([62, 70, 75, 68, 90, 85, 78, 73, 95, 66, 80, 25])

q1 = np.percentile(nilai, 25)
q3 = np.percentile(nilai, 75)
iqr = q3 - q1

bawah = q1 - 1.5 * iqr
atas = q3 + 1.5 * iqr

print("Q1 :", q1)
print("Q3 :", q3)
print("IQR:", iqr)
print("batas bawah :", bawah)
print("batas atas  :", atas)
print("outlier     :", nilai[(nilai < bawah) | (nilai > atas)])

Output yang Dihasilkan:

text
Q1 : 67.5
Q3 : 81.25
IQR: 13.75
batas bawah : 46.875
batas atas  : 101.875
outlier     : [25]

Mari kita bedah langkah demi langkah:

  1. Baris 5-6: Q1 bernilai 67.5 dan Q3 81.25; keduanya dihitung dengan interpolasi linear bawaan.
  2. Baris 7 (q3 - q1): IQR 13.75 menggambarkan rentang 12 nilai tengah — jauh lebih stabil daripada selisih maksimum-minimum karena tidak menyentuh nilai ekstrem sama sekali.
  3. Baris 9-10: batas bawah 46.875 dan batas atas 101.875 menjadi pagar tempat data yang wajar berada.
  4. Baris 17 (masker boolean): nilai 25 berada di bawah batas bawah sehingga tertangkap sebagai outlier, sementara sebelas nilai ujian lainnya masih dalam pagar.

Teknik ini memakai kombinasi yang sudah kita kenal: percentile sebagai fondasi dan masker boolean untuk pemilihan elemen.