Setiap interval pada chapter sebelumnya berdiri di atas satu pasangan: taksiran titik dan standard error-nya. Rumus SE = s/√n bekerja rapi pada data sembilan siswa, tetapi membawa asumsi yang jarang diperiksa: data kira-kira simetris dan tidak ada satu nilai yang mendominasi perhitungan s. Data pendapatan tujuh pedagang dari chapter Skewness melanggar asumsi itu — satu nilai 400 menarik mean ke 147.14 sekaligus menggelembungkan s menjadi 112.80 — sehingga SE yang dihasilkan mengukur pencilan, bukan sebaran. Chapter ini membangun penaksir robust untuk lokasi (median, trimmed mean, winsorized mean) dan skala (IQR, MAD), mengujinya lewat uji coba kontaminasi, lalu menutup dengan sandwich estimator untuk standard error regresi saat varians residual tidak konstan.
Asumsi Tersembunyi di Balik SE = s/√n #
Chapter Standard Error merumuskan SE(x̄) ≈ s/√n sebagai simpangan baku distribusi sampling mean. Rumus itu benar, tetapi datang bersama tiga syarat diam-diam: observasi saling bebas; sebaran data kira-kira simetris dan mendekati lonceng, sehingga mean layak menjadi pusat dan Central Limit Theorem bekerja seperti janjinya; dan s menggambarkan sebaran tipikal seluruh data, tanpa satu observasi yang menyumbang porsi besar dari jumlah deviasi kuadrat.
Ketiga syarat itu bukan formalitas. Chapter Point Estimation membuktikan mean lebih efisien daripada median pada populasi normal — varians median 36 persen lebih besar — sehingga pasangan mean + s/√n memang optimal saat asumsi terpenuhi. Penaksir robust bukan penaksir yang selalu lebih baik; penaksir robust adalah asuransi yang dibayar sedikit efisiensi pada saat data tidak menurut.
Kerapuhan Rumus Klasik pada Data Pendapatan #
Kita pakai ulang data pendapatan harian tujuh pedagang pasar (dalam ribuan Rp) dari chapter Skewness: 80, 90, 100, 110, 120, 130, 400. Ringkasan klasiknya sudah terverifikasi di sana; sekarang bawa satu langkah lebih jauh ke standard error (nilai penuh dipakai sepanjang hitungan, dibulatkan pada hasil akhir):
data : 80, 90, 100, 110, 120, 130, 400 (n = 7)
mean = 1030/7 = 147.14
median = 110
s = 112.80
SE mean = 112.80/√7 = 42.63SE 42.63 mengatakan taksiran 147.14 tipikalnya meleset ±42.6 dari μ — untuk data yang enam dari tujuh nilainya berkumpul pada rentang 80 sampai 130, angka itu tidak masuk akal. CI 95%-nya lebih gamblang lagi: t(6) = 2.4469 memberi margin 104.32 dan interval [42.82, 251.47] — rentang yang nyaris tidak menyingkirkan kemungkinan apa pun. Akar masalahnya terukur: kuadrat deviasi nilai 400, (400 − 147.14)² ≈ 63937, menyumbang 83.75 persen dari total 76343. Standar deviasi yang seharusnya mengukur sebaran tipikal justru sibuk mengukur satu pedagang.
Tanda-tandanya sebenarnya sudah terbaca lebih awal. Chapter Z-Score menghitung z = 2.24 untuk nilai 400, dan aturan 1.5 × IQR dari chapter Rentang dan Interquartile Range memberi batas atas 190 — kedua alat sepakat 400 adalah outlier. Tetapi menandai tidak otomatis memperbaiki mean dan s; keduanya sudah tergeser sejak nilai itu masuk.
Penaksir Lokasi Robust: Median, Trimmed Mean, Winsorized Mean #
Median, kenalan dari chapter Median, tahan terhadap nilai ekstrem: selama lebih dari separuh data tidak berubah, median tidak bergeser. Dua kerabatnya menempuh jalan berbeda menuju ketahanan yang sama.
Trimmed mean memangkas persentase tertentu dari kedua ujung data terurut sebelum dirata-ratakan. Pangkasan 20% pada data pendapatan — k = int(0.20 × 7) = 1 nilai tiap ujung:
terurut : 80, 90, 100, 110, 120, 130, 400
dipangkas : 80 (terkecil) dan 400 (terbesar)
dipertahankan : 90, 100, 110, 120, 130
trimmed 20% = 550/5 = 110Hasilnya 110, tepat sama dengan median — bukan kebetulan: lima nilai yang tersisa simetris di sekitar 110. Trimmed mean mempertahankan sifat “rata-rata” (memakai seluruh nilai yang tersisa, bukan hanya urutan) sambil membuang pengaruh ekor.
Winsorized mean tidak membuang nilai ekstrem, melainkan menggantinya dengan nilai terdekat yang dipertahankan: 80 diganti 90, 400 diganti 130, sehingga data menjadi [90, 90, 100, 110, 120, 130, 130] dengan rata-rata 770/7 = 110. Seluruh n dipertahankan — berguna saat setiap observasi harus tetap dihitung. Ketiga penaksir lokasi ini sepakat pada 110, jauh lebih masuk akal sebagai pendapatan tipikal pedagang dibandingkan 147.14 yang ditarik satu pedagang tunggal.
Penaksir Skala Robust: IQR dan MAD #
Masalah lokasi hanya separuh cerita; s yang membengkak adalah bahan baku SE, sehingga skala juga harus diperbaiki. IQR sudah tersedia dari chapter Kuartil dan Persentil — dengan metode posisi (n + 1) × k/4 pada n = 7:
posisi Q1 = 8 × 1/4 = 2 -> data ke-2 = 90
posisi Q3 = 8 × 3/4 = 6 -> data ke-6 = 130
IQR = 130 - 90 = 40Nilai 400 tidak pernah masuk perhitungan: IQR hanya membaca 50 persen data di tengah. MAD (median absolute deviation) menempuh logika yang sama pada deviasi:
median = 110
|x - 110| : 30, 20, 10, 0, 10, 20, 290
terurut : 0, 10, 10, 20, 20, 30, 290
MAD = median deviasi = 20Setengah pedagang menyimpang paling banyak 20 ribu Rp dari median; deviasi 290 milik nilai 400 hanya menjadi satu nilai ekstrem di urutan deviasi dan tidak memengaruhi mediannya. scipy menyediakan scipy.stats.median_abs_deviation untuk hitungan ini; kita menghitung manual agar setiap langkah terlihat.
MAD mengukur sebaran dalam satuan data. Untuk mengubahnya menjadi taksiran σ, kalikan konstanta 1.4826: σ̂ = 1.4826 × 20 = 29.65. Asal konstantanya terhitung: pada distribusi normal, |X − μ| berada di bawah 0.6745σ dengan peluang tepat 0.5, sehingga median deviasi absolut jatuh di 0.6745σ — membalik hubungan itu memberi σ = MAD/0.6745 = 1.4826 × MAD. Kakak konstanta yang sama, 1.349 = 2 × 0.6745, berlaku untuk IQR: σ̂ = IQR/1.349 = 40/1.349 = 29.65. Verifikasi berikut menguji konstanta itu pada data normal bersih dan terkontaminasi, memakai populasi sintetis chapter Point Estimation (μ = 72.5, σ = 8.5391):
import numpy as np
import statistics
from scipy.stats import norm
def mad(data):
tengah = statistics.median(data)
return statistics.median([abs(x - tengah) for x in data])
print(f"norm.ppf(0.75) = {norm.ppf(0.75):.4f}")
print(f"konstanta = 1 / 0.6745 = {1 / norm.ppf(0.75):.4f}")
rng = np.random.default_rng(42)
normal = rng.normal(72.5, 8.5391, size=1000).tolist()
terkontaminasi = normal.copy()
terkontaminasi[0] = 400.0
print(f"normal bersih : s = {statistics.stdev(normal):.4f}, sigma_MAD = {1.4826 * mad(normal):.4f}")
print(f"normal + 400 : s = {statistics.stdev(terkontaminasi):.4f}, sigma_MAD = {1.4826 * mad(terkontaminasi):.4f}")
pendapatan = [80, 90, 100, 110, 120, 130, 400]
print(f"pendapatan : s = {statistics.stdev(pendapatan):.4f}, sigma_MAD = {1.4826 * mad(pendapatan):.4f}")Output yang Dihasilkan:
norm.ppf(0.75) = 0.6745
konstanta = 1 / 0.6745 = 1.4826
normal bersih : s = 8.4470, sigma_MAD = 8.0480
normal + 400 : s = 13.3703, sigma_MAD = 8.0702
pendapatan : s = 112.7999, sigma_MAD = 29.6520Mari kita bedah kode di atas:
- Baris 5-7 (function
mad): median data dihitung lebih dulu, lalu median dari deviasi absolut terhadap median itu — persis hitungan manual di atas. - Baris 9-10 (konstanta):
norm.ppf(0.75)mengambil kuantil 75% distribusi normal standar, hasil 0.6745; kebalikannya 1.4826 tercetak sebagai konfirmasi asal konstanta. - Baris 12-19 (dua situasi + laporan): 1000 data normal dengan seed tetap dibuat, lalu satu nilai pertama diganti 400; s dan σ̂_MAD dicetak berdampingan untuk data bersih, data terkontaminasi, dan data pendapatan.
Pada 1000 data normal bersih, s = 8.4470 dan σ̂_MAD = 8.0480 — keduanya di sekitar σ = 8.5391, konstanta 1.4826 bekerja. Setelah satu nilai diganti 400, s melonjak 58 persen ke 13.3703, sedangkan σ̂_MAD nyaris diam di 8.0702: menggeser MAD butuh lebih dari separuh data terkontaminasi. Pada data pendapatan, σ̂_MAD = 29.65 berbanding s = 112.80 — taksiran sebaran enam pedagang yang berkelompok normal, tanpa satu pencilan menentukan angkanya.
Ketahanan tiap penaksir diringkas satu angka: breakdown point — fraksi data yang boleh dibuat sembarang ekstrem sebelum hasil penaksir melaju tanpa batas. Mean dan s breakdown 0 persen; trimmed mean 20% breakdown 20 persen; IQR 25 persen; median dan MAD 50 persen — batas teoretis tertinggi, karena penaksir wajib membaca mayoritas data.
Uji Coba Kontaminasi: Satu Kesalahan Ketik #
Ketahanan paling meyakinkan dilihat lewat eksperimen kecil. Bayangkan data sembilan siswa [68, 75, 75, 81, 84, 88, 90, 92, 97] diketik ulang dan nilai 97 kelebihan satu angka nol menjadi 300 — kesalahan entri yang paling sering terjadi di dunia nyata. Seluruh angka pada tabel berikut dihitung ulang dari data mentah:
| Ukuran | Data asli | 97 menjadi 300 | Perubahan |
|---|---|---|---|
| mean | 83.33 | 105.89 | naik 22.56 |
| median | 84 | 84 | tidak bergeser |
| trimmed mean 20% | 83.57 | 83.57 | tidak bergeser |
| s | 9.41 | 73.22 | 7.8 kali lipat |
| SE = s/√n | 3.14 | 24.41 | 7.8 kali lipat |
| MAD | 8 | 8 | tidak bergeser |
| σ̂ = 1.4826 × MAD | 11.86 | 11.86 | tidak bergeser |
Mekanismenya singkat. Setelah diurutkan, 300 duduk di ujung kanan sehingga median (data ke-5) tetap 84. Pangkasan 20% membuang 68 dan 300, menyisakan tujuh nilai tengah yang identik dengan versi asli — trimmed mean tetap 585/7 = 83.57. MAD tetap 8 karena deviasi 216 milik 300 hanya satu dari sembilan deviasi terurut. Mean melompat 22.56 poin (sekitar 2.4 kali simpangan baku asli) dan s membengkak hampir 8 kali lipat, karena kuadrat deviasi 300 menyumbang kira-kira 88 persen dari jumlah deviasi kuadrat. Seluruh jalur inferensi klasik ikut berubah hanya karena satu angka nol.
Standard Error Penaksir Robust: Tidak Ada Rumus Plug-in #
Pasangan klasik (x̄, s/√n) berharga karena SE-nya gratis: satu rumus, langsung jadi. Penaksir robust memutus kesepakatan itu. SE median dan SE trimmed mean tidak punya bentuk tertutup yang sederhana — rumus asimtotiknya ada, tetapi bergantung pada bentuk distribusi yang justru tidak kita ketahui, dan pada n kecil rumus asimtotik tidak bisa dipercaya.
Jalan pintas bisa dicoba: ganti s dengan skala robust di dalam SE = s/√n, memberi 29.65/√7 = 11.21 — jauh lebih masuk akal daripada 42.63. Dua kelemahan tetap harus diakui. Pertama, angka itu masih menaksir SE dari mean, dan mean-nya (147.14) sudah bukan ringkasan yang tepat — SE kecil untuk taksiran yang salah tetap salah. Kedua, plug-in mengandaikan mayoritas data normal, asumsi yang perlu diperiksa, bukan diterima. Jawaban yang jujur untuk SE median maupun SE trimmed mean: berhenti mencari rumus dan taksir sebarannya lewat simulasi terhadap data itu sendiri — metode bernama bootstrap resampling, satu chapter setelah ini. Sebelum sampai ke sana, satu masalah kerabat menunggu di dunia regresi.
Heteroskedastisitas dan Sandwich Estimator (Huber-White) #
Chapter Regression Assumptions mencantumkan homoskedastisitas — varians residual sama pada semua tingkat x — sebagai asumsi E dari mnemonik LINE. Saat asumsi itu gagal (plot residual vs fitted melebar seperti corong), standard error klasik slope menjadi salah: rumusnya memakai satu s² untuk seluruh data, padahal slope terutama ditentukan data di ujung x, tempat sebaran residual bisa berbeda. Sandwich estimator — disebut juga Huber-White — membangun varians slope tanpa asumsi varians konstan: setiap kuadrat residual diberi bobot sesuai posisi x observasinya. Namanya berasal dari bentuk rumus (X’X)⁻¹ X’Ω X (X’X)⁻¹, yang menyandwich matriks tengah dengan dua keping sama; versi HC1 menambahkan koreksi sampel kecil n/(n − k). Kita uji pada regresi enam siswa chapter Simple Linear Regression (x = jam belajar 2-7, y = [65, 70, 75, 82, 86, 91]):
import pandas as pd
import statsmodels.formula.api as smf
data = pd.DataFrame({
"jam": [2, 3, 4, 5, 6, 7],
"nilai": [65, 70, 75, 82, 86, 91],
})
klasik = smf.ols("nilai ~ jam", data=data).fit()
sandwich = smf.ols("nilai ~ jam", data=data).fit(cov_type="HC1")
print(f"slope b1 : {klasik.params['jam']:.4f} (R2 = {klasik.rsquared:.4f})")
for nama, model in (("klasik", klasik), ("HC1", sandwich)):
ci = model.conf_int().loc["jam"]
print(f"SE {nama:6}: {model.bse['jam']:.4f} t = {model.tvalues['jam']:.2f}")
print(f"CI {nama:6}: [{ci[0]:.4f}, {ci[1]:.4f}]")Output yang Dihasilkan:
slope b1 : 5.2857 (R2 = 0.9961)
SE klasik: 0.1650 t = 32.04
CI klasik: [4.8277, 5.7437]
SE HC1 : 0.0855 t = 61.83
CI HC1 : [5.1182, 5.4533]Mari kita bedah kode di atas:
- Baris 1-7 (data): enam pasangan jam belajar-nilai dimuat ke
DataFramekarena formula API statsmodels membaca data bentuk tabel. - Baris 9-15 (dua fit + laporan): model yang sama di-fit dua kali; satu-satunya perbedaan adalah argumen
cov_type="HC1", yang memerintahkan statsmodels memakai sandwich estimator — slope, R², SE, t, dan CI lalu dicetak berdampingan.
Slope 5.2857 dan R² 0.9961 persis angka yang dipublikasikan chapter Simple Linear Regression — yang berubah hanyalah ukuran ketidakpastiannya: SE klasik 0.1650 jatuh menjadi 0.0855 pada HC1. Arah perbedaannya layak dibaca jujur. Residual terbesar (1.19) milik siswa dengan 5 jam belajar — dekat x̄ = 4.5, daya ungkit rendah — sedangkan residual pada x ekstrem (0.05 pada jam 2, −0.38 pada jam 7) nyaris nol; sandwich membebankan ketidakpastian sesuai posisi x dan menilai slope lebih presisi. Pada pola residual yang melebar di ujung x, perbedaannya berbalik arah. Yang tetap: hanya sandwich yang tidak bergantung pada asumsi varians konstan; kedua interval sama-sama jauh di atas nol sehingga kesimpulan contoh ini tidak berubah — yang berubah adalah laporan presisi.
Panduan Praktik: Memilih Penaksir #
| Penaksir | Breakdown point | Perilaku terhadap outlier | Saat tepat dipakai |
|---|---|---|---|
| mean | 0% | tertarik penuh ke arah ekstrem | data simetris tanpa outlier, atau ketika total memang bermakna |
| trimmed mean 20% | 20% | tahan selama jumlah outlier tidak melebihi pangkasan | data kira-kira simetris dengan ekor berat |
| winsorized mean | mengikuti persentase pangkasan | nilai ekstrem diganti tetangga terdekat | seluruh n harus dipertahankan |
| median | 50% | hampir tidak bergeser | data miring atau memuat outlier |
| s | 0% | membengkak karena deviasi outlier dikuadratkan | data bersih yang mendekati normal |
| IQR | 25% | ekor tidak ikut dibaca | pasangan median untuk ringkasan sebaran |
| σ̂ = 1.4826 × MAD | 50% | stabil | pengganti s saat menyiapkan SE robust |
Satu catatan pada baris pertama: mean tetap tepat ketika total memang menjadi pertanyaan — anggaran total pendapatan pasar memang butuh mean, karena nilai 400 adalah uang yang nyata. Robust bukan doktrin anti-mean; robust adalah pencocokan penaksir dengan pertanyaan dan kondisi data.
Perkakas lokasi dan skala kini tersedia dalam versi tahan kontaminasi. Satu komponen masih hilang: angka ketidakpastian. Median pendapatan jatuh di 110 dan trimmed mean sembilan siswa di 83.57 — tetapi berapa standard error kedua angka itu? Jawaban yang jujur bukan menurunkan rumus baru, melainkan mensimulasikan proses pengambilan sampel itu sendiri — itulah isi chapter Bootstrap Resampling berikutnya. Rujukan lanjutan: NIST/SEMATECH e-Handbook , OpenIntro Statistics , Penn State STAT 500 , dan dokumentasi scipy.stats .