Dua cabang Toko Kopi Kita sama-sama menjual rata-rata 50 gelas per hari. Berdasarkan angka itu saja, kedua cabang tampak identik — sampai kita melihat catatan hariannya: cabang Bandung stabil di 48-52 gelas, sedangkan cabang Surabaya melonjak dari 15 sampai 90 gelas. Pusat data yang sama bisa menutupi karakter data yang jauh berbeda. Pada chapter ini kita mengukur seberapa lebar data menyebar memakai range, varians, simpangan baku, dan IQR, sekaligus membahas jebakan pembagi N versus n−1 yang sering membuat angka analisis tidak konsisten.
Range: Jarak Nilai Terluar #
Range (rentang) adalah ukuran penyebaran paling sederhana: nilai terbesar dikurangi nilai terkecil. Kita terapkan pada catatan penjualan sepuluh hari kedua cabang:
import statistics
bandung = [48, 52, 50, 51, 49, 50, 52, 48, 50, 50]
surabaya = [20, 80, 35, 65, 50, 90, 15, 60, 45, 40]
print(f"{'Cabang':9s} {'mean':>6s} {'min':>4s} {'max':>4s} {'range':>6s}")
for nama, data in (("Bandung", bandung), ("Surabaya", surabaya)):
print(f"{nama:9s} {statistics.mean(data):6.1f} {min(data):4d} {max(data):4d} "
f"{max(data) - min(data):6d}")Output yang Dihasilkan:
Cabang mean min max range
Bandung 50.0 48 52 4
Surabaya 50.0 15 90 75Mean kedua cabang tepat sama di 50,0, tetapi range membedakan keduanya dengan telak: 4 gelas lawan 75 gelas. Bagi manajemen, angka 75 itu berarti stok dan barista Surabaya harus siap menghadapi hari 15 gelas sekaligus hari 90 gelas. Kelemahan range langsung terlihat: ukuran ini hanya menatap dua angka terluar sehingga satu hari tidak wajar (misalnya 300 gelas karena ada pesanan pesta) akan merusaknya.
Varians dan Simpangan Baku #
Varians memperbaiki kelemahan range dengan memakai seluruh data: setiap nilai dihitung jaraknya dari rata-rata, dikuadratkan, lalu dirata-rata. Simpangan baku adalah akar kuadrat varians sehingga satuannya kembali sama dengan data asli.
Varians populasi : σ^2 = Σ(x − μ)^2 / N
Varians sampel : s^2 = Σ(x − x-bar)^2 / (n − 1)
Simpangan baku : akar kuadrat dari variansMengapa kuadrat? Jarak bertanda (x − mean) akan saling meniadakan bila dijumlah; kuadrat membuat semua jarak positif sekaligus menghukum jarak jauh lebih berat. Satu hal yang membedakan rumus populasi dan sampel: pembaginya N untuk populasi, tetapi n − 1 untuk sampel. Kita buktikan lewat kode:
import statistics
import numpy as np
lima_hari = [48, 52, 50, 51, 49]
print("Data lima hari pertama cabang Bandung:", lima_hari)
print()
print(f"pvariance (pembagi N = 5) : {statistics.pvariance(lima_hari):.3f}")
print(f"variance (pembagi n - 1 = 4) : {statistics.variance(lima_hari):.3f}")
print(f"np.var ddof=0 : {np.var(lima_hari):.3f}")
print(f"np.var ddof=1 : {np.var(lima_hari, ddof=1):.3f}")
print(f"pstdev : {statistics.pstdev(lima_hari):.3f}")
print(f"stdev : {statistics.stdev(lima_hari):.3f}")Output yang Dihasilkan:
Data lima hari pertama cabang Bandung: [48, 52, 50, 51, 49]
pvariance (pembagi N = 5) : 2.000
variance (pembagi n - 1 = 4) : 2.500
np.var ddof=0 : 2.000
np.var ddof=1 : 2.500
pstdev : 1.414
stdev : 1.581Mari kita telaah fungsinya satu per satu:
statistics.pvariance: varians populasi dengan pembagi N = 5. Lima deviasi dari mean 50 adalah −2, +2, 0, +1, −1; kuadratnya 4, 4, 0, 1, 1 berjumlah 10, dibagi 5 hasilnya 2,000.statistics.variance: varians sampel dengan pembagi n − 1 = 4, hasilnya 10/4 = 2,500. Pembagi yang lebih kecil ini disebut koreksi Bessel; rata-rata sampel sendiri ditaksir dari data yang sama sehingga simpangan data terhadapnya cenderung understate — pembagi n − 1 mengoreksinya.np.var(...): NumPy memakai parameterddof(delta degrees of freedom). Bawaanddof=0sama dengan pvariance;ddof=1sama dengan variance.pstdevdanstdev: akar kuadrat dari masing-masing varians — 1,414 dan 1,581.
IQR: Sebaran yang Tahan Outlier #
Interquartile range (IQR) memotong dua ekor distribusi: Q3 dikurangi Q1, yaitu lebar wilayah yang memuat 50% data di tengah. Karena ekor kiri dan kanan dibuang, IQR nyaris tidak terganggu nilai ekstrem. Kita bandingkan IQR dan simpangan baku pada data durasi pengiriman pesanan, sebelum dan sesudah satu pengiriman 95 menit ikut tercatat:
import statistics
durasi = [12, 15, 18, 14, 20, 16, 13, 22, 17, 15, 19, 21, 16, 14, 95]
durasi_bersih = [d for d in durasi if d != 95]
def ringkas(data, label):
q1, median, q3 = statistics.quantiles(data, n=4, method="inclusive")
print(f"{label:14s}: IQR = {q3 - q1:.2f}, stdev = {statistics.stdev(data):.2f}")
ringkas(durasi_bersih, "14 pesanan wajar")
ringkas(durasi, "15 pesanan (+95)")
q1, median, q3 = statistics.quantiles(durasi, n=4, method="inclusive")
iqr = q3 - q1
print()
print(f"Lima angka: min {min(durasi)}, Q1 {q1:.1f}, median {median:.1f}, "
f"Q3 {q3:.1f}, max {max(durasi)}")
print(f"IQR = {q3:.1f} - {q1:.1f} = {iqr:.1f}")Output yang Dihasilkan:
14 pesanan wajar: IQR = 4.50, stdev = 3.06
15 pesanan (+95): IQR = 5.00, stdev = 20.46
Lima angka: min 12, Q1 14.5, median 16.0, Q3 19.5, max 95
IQR = 19.5 - 14.5 = 5.0Satu pengiriman 95 menit membuat simpangan baku melonjak dari 3,06 menjadi 20,46 — hampir tujuh kali lipat — sementara IQR nyaris tidak terpengaruh, dari 4,50 menjadi 5,00. Penjelasannya ada pada cara kerja keduanya: stdev memberi bobot kuadrat pada jarak sehingga nilai 95 (berjarak sekitar 78 dari median) mendominasi total; IQR hanya membaca posisi kuartil yang tidak tergeser oleh satu angka di ujung.
Baris statistics.quantiles(data, n=4, method="inclusive") membagi data menjadi empat bagian sama banyak dan mengembalikan tiga titik potong Q1, Q2 (median), Q3. Argumen method="inclusive" dipilih agar hasilnya cocok dengan kuartil versi numpy.quantile dan pandas.describe yang akan kita pakai pada chapter Persentil dan Kuartil
.
Memilih Ukuran Penyebaran #
| Ukuran | Dasar hitung | Tahan outlier? | Kapan dipakai |
|---|---|---|---|
| Range | Dua nilai terluar | Tidak | Pemeriksaan cepat, data bersih |
| Varians | Kuadrat jarak seluruh data | Tidak | Bahan hitung lanjutan, teori |
| Simpangan baku | Akar varians | Tidak | Pelaporan umum data simetris |
| IQR | Selisih Q3 − Q1 | Ya | Data miring atau mengandung outlier |
Kombinasi yang lazim di lapangan: laporkan median + IQR untuk data timpang, mean + simpangan baku untuk data yang relatif simetris. Pasangan ukuran pusat dan penyebaran yang sejenis menjaga laporan tetap konsisten.
Rangkuman #
- Range = max − min: cepat tetapi hanya menatap dua nilai terluar.
- Varians merata-ratakan kuadrat jarak dari mean; pembagi N untuk populasi, n − 1 untuk sampel; simpangan baku adalah akarnya.
statistics.variance()bawaan memakai n − 1,np.var()bawaan memakai N — samakan lewatddof=1sebelum mencampur keduanya.- IQR = Q3 − Q1 memuat 50% data tengah dan nyaris tak terganggu outlier, pasangan alami median.
Median, Q1, dan Q3 yang baru saja muncul sebenarnya adalah anggota keluarga yang lebih besar: persentil. Berapa persen data berada di bawah nilai tertentu, dan bagaimana kuartil membentuk kerangka boxplot? Kita bahas tuntas pada chapter Persentil dan Kuartil .