Nilai ujian 78 terdengar bagus — sampai kita tahu separuh kelas mendapat nilai di atas 85. Satu angka memperoleh makna hanya setelah diposisikan terhadap sebaran di sekitarnya, dan persentil adalah alat pemposisinya. Laporan kekinian memakainya di mana-mana: persentil ke-90 untuk ambang beasiswa, “di atas persentil ke-95” untuk deteksi transaksi tidak wajar, waktu respons situs di persentil ke-99. Pada chapter ini kita menghitung kuartil dengan statistics dan NumPy, memakai scipy.stats untuk mencari persentil sebuah nilai, lalu menyambungkan kuartil dengan boxplot yang sudah kita kenal pada Section Visualisasi Data.
Kuartil: Membagi Data Menjadi Empat #
Kuartil adalah persentil spesial yang membagi data terurut menjadi empat bagian sama banyak: Q1 memisahkan 25% data terbawah, Q2 adalah median, dan Q3 memisahkan 75% data terbawah. Kita hitung pada nilai ujian 25 siswa:
import statistics
import numpy as np
nilai = [
56, 61, 63, 65, 67, 68, 70, 71, 72, 74,
75, 76, 78, 79, 80, 81, 83, 84, 86, 87,
88, 90, 92, 94, 97,
]
q1, median, q3 = statistics.quantiles(nilai, n=4, method="inclusive")
print(f"Jumlah siswa : {len(nilai)}")
print(f"Q1 : {q1:.2f}")
print(f"Median (Q2) : {median:.2f}")
print(f"Q3 : {q3:.2f}")
print(f"IQR : {q3 - q1:.2f}")
print(f"numpy.quantile: {[f'{q:.2f}' for q in np.quantile(nilai, [0.25, 0.5, 0.75])]}")Output yang Dihasilkan:
Jumlah siswa : 25
Q1 : 70.00
Median (Q2) : 78.00
Q3 : 86.00
IQR : 16.00
numpy.quantile: ['70.00', '78.00', '86.00']Bedah kode dan hasilnya:
- Baris 10 (
statistics.quantiles(nilai, n=4, ...)): memotong data menjadi 4 bagian (artinyan=4) dan mengembalikan tiga titik potong. Argumenmethod="inclusive"kita pakai supaya hasilnya cocok dengannumpy.quantiledanpandas.describe— terlihat pada baris terakhir output, keduanya sepakat di 70, 78, dan 86. - Mengapa tepat 70, 78, 86? Dengan metode inklusif, posisi kuartil ke-i dihitung sebagai (i/4) × (n − 1) pada indeks data terurut. Untuk n = 25: Q1 di indeks 0,25 × 24 = 6 (nilai 70), median di indeks 12 (nilai 78), Q3 di indeks 18 (nilai 86) — ketiganya jatuh persis pada satu elemen sehingga tidak perlu interpolasi.
- IQR = 86 − 70 = 16: 50% siswa di tengah tersebar dalam rentang 16 poin. Bandingkan dengan range 97 − 56 = 41 poin yang rentan dipengaruhi dua siswa di ujung.
Posisi kuartil ke-i (metode inklusif) = (i/4) × (n − 1), dihitung pada indeks data terurut.
Bila posisi jatuh di antara dua elemen, kuartil diinterpolasi secara linear.Persentil: Memposisikan Satu Nilai #
Kuartil membagi data menurut posisi tetap (25, 50, 75); persentil memperluasnya ke skala 1-100 dan bekerja dua arah. Pertanyaan pertama: “nilai 88 milik Siti itu persentil berapa?” — dijawab scipy.stats.percentileofscore. Pertanyaan kedua: “nilai apa yang membatasi persentil ke-80?” — dijawab numpy.percentile:
import numpy as np
from scipy import stats
nilai = [
56, 61, 63, 65, 67, 68, 70, 71, 72, 74,
75, 76, 78, 79, 80, 81, 83, 84, 86, 87,
88, 90, 92, 94, 97,
]
nilai_siti = 88
persentil = stats.percentileofscore(nilai, nilai_siti, kind="rank")
manual = sum(1 for x in nilai if x <= nilai_siti) / len(nilai) * 100
batas_80 = np.percentile(nilai, 80)
print(f"Nilai Siti : {nilai_siti}")
print(f"Persentil Siti (scipy, rank) : {persentil:.1f}")
print(f"Hitungan manual 21/25 × 100 : {manual:.1f}")
print(f"Nilai pada persentil ke-80 : {batas_80:.2f}")Output yang Dihasilkan:
Nilai Siti : 88
Persentil Siti (scipy, rank) : 84.0
Hitungan manual 21/25 × 100 : 84.0
Nilai pada persentil ke-80 : 87.20Mari kita bedah hasilnya:
percentileofscore(nilai, 88, kind="rank"): menghitung banyaknya nilai ≤ 88 lalu menyatakannya sebagai persen dari n. Sebanyak 21 dari 25 siswa memperoleh nilai ≤ 88, sehingga Siti berada di persentil ke-84 — hanya enam siswa di atasnya.- Hitungan manual:
sum(1 for x in nilai if x <= nilai_siti)menggantikan fungsi scipy dengan logika murni, hasilnya sama persis. Argumenkind="rank"penting: tanpa argumen tersebut scipy memakai aturan yang sedikit berbeda dalam menangani nilai kembar. np.percentile(nilai, 80): arah sebaliknya. Kita mencari nilai pada posisi persentil ke-80 dan mendapat 87,20 — hasil interpolasi antara nilai 87 (indeks 19) dan 88 (indeks 20), karena posisi 0,8 × 24 = 19,2 jatuh di antara keduanya.
Dua arah tersebut saling melengkapi: percentileofscore menempatkan satu nilai di dalam kerumunan, percentile menandai batas kerumunan. Kombinasi keduanya menjadi dasar sistem seperti pemeringkatan kinerja pegawai atau ambang skor kredit.
Kuartil sebagai Kerangka Boxplot #
Pada chapter Histogram dan Boxplot kita sudah menggambar boxplot; sekarang kita bisa membaca isi kotaknya. Lima angka pembentuk boxplot adalah minimum, Q1, median, Q3, dan maksimum, sementara “janggut” (whisker) memanjang paling jauh sampai 1,5 × IQR dari kuartil terdekat. Nilai yang berada di luar janggut digambar sebagai titik tersendiri — kandidat outlier. Kita uraikan seluruh kerangka itu lewat kode pada data durasi pengiriman pesanan:
import statistics
durasi = [12, 15, 18, 14, 20, 16, 13, 22, 17, 15, 19, 21, 16, 14, 95]
q1, median, q3 = statistics.quantiles(durasi, n=4, method="inclusive")
iqr = q3 - q1
bawah = q1 - 1.5 * iqr
atas = q3 + 1.5 * iqr
outlier = [d for d in durasi if d < bawah or d > atas]
print(f"Ringkasan lima angka : min {min(durasi)}, Q1 {q1:.1f}, median {median:.1f}, "
f"Q3 {q3:.1f}, max {max(durasi)}")
print(f"Batas whisker : {bawah:.1f} sampai {atas:.1f}")
print(f"Kandidat outlier : {outlier}")Output yang Dihasilkan:
Ringkasan lima angka : min 12, Q1 14.5, median 16.0, Q3 19.5, max 95
Batas whisker : 7.0 sampai 27.0
Kandidat outlier : [95]Bedah baris-per-baris kodenya:
- Baris 3 (
durasi = [...]): lima belas pengiriman, empat belas di antaranya berkisar 12-22 menit, satu pengiriman 95 menit. - Baris 5-6 (
statistics.quantiles): menghasilkan Q1 = 14,5, median = 16, Q3 = 19,5; IQR = 5,0. - Baris 8-9 (
q1 - 1.5 * iqrdanq3 + 1.5 * iqr): batas janggut boxplot: 7,0 sampai 27,0 menit. Dalam boxplot matplotlib/seaborn, whisker berhenti pada titik data terjauh yang masih berada di dalam batas ini. - Baris 10 (
outlier = [...]): menyaring nilai di luar batas janggut. Hanya angka 95 yang lolos seleksi itu — persis titik yang akan digambar terpisah dari kotak.
Perhatikan struktur boxplot yang tersusun dari angka-angka ini: kotak dari Q1 ke Q3 (memuat separuh data tengah), garis median di dalamnya, whisker memanjang ke data terjauh yang masih wajar, dan titik 95 berdiri sendiri di luar. Membaca boxplot pada dasarnya adalah membaca lima angka ringkasan tersebut dalam bentuk gambar.
Rangkuman #
- Kuartil membagi data terurut menjadi empat bagian: Q1 (25%), median (50%), Q3 (75%); IQR = Q3 − Q1 mengukur lebar wilayah tengah.
statistics.quantiles(..., method="inclusive")menghasilkan kuartil yang cocok dengannumpy.quantiledanpandas.describe; posisinya dihitung sebagai (i/4) × (n − 1) pada indeks data terurut.scipy.stats.percentileofscore(nilai, x, kind="rank")mencari posisi nilai x dalam persen;np.percentile(nilai, p)mencari nilai pada posisi persentil ke-p — dua arah dari konsep yang sama.- Boxplot dibangun dari lima angka (min, Q1, median, Q3, max) plus batas whisker 1,5 × IQR; titik di luar batas whisker adalah kandidat outlier.
Dengan tendensi sentral dan penyebaran, perangkat deskriptif kita lengkap. Mulai chapter berikutnya kita berpindah ke fondasi kedua statistika: probabilitas — bahasa untuk menyatakan ketidakpastian, dari pelemparan dadu hingga peluang seorang pelanggan membeli kopi susu. Kita mulai dari ruang sampel dan kejadian pada chapter Probabilitas .