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:

python
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:

text
Cabang      mean  min  max  range
Bandung     50.0   48   52      4
Surabaya    50.0   15   90     75

Mean 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.

text
Varians populasi : σ^2 = Σ(x − μ)^2 / N
Varians sampel   : s^2  = Σ(x − x-bar)^2 / (n − 1)
Simpangan baku   : akar kuadrat dari varians

Mengapa 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:

python
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:

text
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.581

Mari kita telaah fungsinya satu per satu:

  1. 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.
  2. 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.
  3. np.var(...): NumPy memakai parameter ddof (delta degrees of freedom). Bawaan ddof=0 sama dengan pvariance; ddof=1 sama dengan variance.
  4. pstdev dan stdev: 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:

python
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:

text
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.0

Satu 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 #

UkuranDasar hitungTahan outlier?Kapan dipakai
RangeDua nilai terluarTidakPemeriksaan cepat, data bersih
VariansKuadrat jarak seluruh dataTidakBahan hitung lanjutan, teori
Simpangan bakuAkar variansTidakPelaporan umum data simetris
IQRSelisih Q3 − Q1YaData 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 lewat ddof=1 sebelum 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 .

Referensi #

  1. Python — statistics: Mathematical statistics functions
  2. NumPy — Absolute Beginner’s Guide