Dari empat asumsi LINE pada chapter Regression Assumptions, independensi residual paling sering luput dari pemeriksaan: plot residual terhadap ŷ yang tampak seperti awan acak belum berarti apa-apa, karena urutan pengambilan data menyimpan cerita yang tidak terbaca di plot itu. Data yang berurutan dalam waktu — harga harian, penjualan mingguan, pengunjung bulanan — membawa ingatan: galat periode ini cenderung menyerupai galat periode sebelumnya, dan pelanggaran semacam itu menjatuhkan standard error dari dasar inferensi. Statistik Durbin-Watson (DW) mengubah pelanggaran asumsi independensi menjadi satu angka yang dihitung langsung dari residual. Chapter ini menurunkan rumusnya beserta intuisinya, mengujikan contoh hitung tangan pada enam minggu penjualan, menerapkannya pada residual regresi tren harga beras dari chapter Tren dan Musiman, lalu menutup Section Korelasi dan Regresi dengan peta penanganan dan batas-batas ujinya.
Asumsi Independensi dan Data yang Berurutan #
Asumsi I pada tabel LINE menyatakan residual antar observasi saling bebas — galat pada satu observasi tidak membawa informasi tentang galat observasi lain. Pada data lintas-seksi (nilai siswa, berat sampel), asumsi ini biasanya aman karena urutan pencatatan tidak berarti apa pun. Pada data berurutan, urutan justru inti materinya. Harga beras hari ini berangkat dari harga kemarin; lonjakan permintaan minggu ini masih terasa minggu depan. Galat model — selisih data terhadap garis prediksi — mewarisi kelengketan itu: bila harga aktual berada di atas garis tren bulan ini, kelebihan itu cenderung masih ada bulan depan.
Akibatnya menimpa inferensi, bukan taksiran. Rumus standard error pada chapter Standard Error menjumlahkan kontribusi tiap observasi dengan asumsi tiap kontribusi membawa informasi baru; residual berpasangan yang mirip membawa informasi yang sama dua kali, sehingga informasi efektif lebih kecil daripada n yang tercatat. Untuk autokorelasi positif — jenis yang paling umum — standard error menjadi terlalu kecil, statistik t membesar, p-value terlihat lebih signifikan dari kenyataannya, dan confidence interval pada chapter Confidence Interval menyempit lebih dari yang semestinya. Autokorelasi negatif bekerja ke arah sebaliknya: standard error terlalu besar dan uji menjadi terlalu konservatif — kurang berbahaya bagi kesimpulan, tetapi tetap tanda model melewatkan pola.
Statistik Durbin-Watson: Rumus dan Intuisi #
Durbin-Watson membandingkan seberapa besar residual melompat antar periode berurutan dibandingkan seberapa besar residual tersebar:
DW = Σ(et - et-1)² / Σet² (kedua penjumlahan berjalan t = 2 sampai T
untuk pembilang, t = 1 sampai T untuk penyebut)Pembilang menjumlahkan kuadrat selisih residual berurutan — besar bila residual kerap berubah arah, kecil bila residual berjalan landai menempel garis sebelumnya. Penyebut menjumlahkan kuadrat seluruh residual — ukuran sebaran galat total yang sudah akrab dari SSE pada chapter Evaluasi Model Regresi. Intuisi kenapa nilai acuh berjarak tepat 2 datang dari sifat varians: bila et dan et-1 saling bebas dengan varians sama σ², varians selisihnya 2σ², sehingga rata-rata kuadrat lompatan dua kali rata-rata kuadrat residual — rasionya 2. Hubungan yang sama diringkas lewat autokorelasi lag-1:
DW ≈ 2(1 - r1), r1 = korelasi antara et dan et-1Bila residual bertetangga saling menyerupai (r1 positif), lompatannya mengecil dan DW jatuh di bawah 2; bila residual sistematik bergantian arah (r1 negatif), lompatannya membesar dan DW naik di atas 2. Skala pembacaannya:
DW : 0 ------------- 1.5 ------- 2.0 ------- 2.5 ------------- 4
autokorelasi | zona praktis | autokorelasi
positif | "cukup dekat 2" | negatif
(semakin kecil, | tanpa bukti | (semakin besar,
semakin kuat) | yang berarti | semakin kuat)Sebagai patokan praktis, nilai di antara 1.5 dan 2.5 lazim dibaca “tidak ada bukti autokorelasi yang berarti” — panduan umum buku teks, misalnya NIST/SEMATECH e-Handbook dan Penn State STAT 500. Uji formalnya memakai tabel batas bawah dan atas (dL dan dU) yang bergantung pada jumlah observasi dan jumlah prediktor; tabel itu justru memuat zona tak menyimpulkan di antara kedua batas, tema yang kembali dibahas pada bagian batas di akhir chapter.
Contoh Hitung Tangan: Enam Minggu Penjualan Kopi #
Contoh pertama sengaja dibuat kecil agar seluruh aritmetika bisa diikuti tangan. Sebuah kedai kopi fiktif mencatat penjualan mingguan (dalam lusinan gelas) selama enam minggu; permintaan sedang tumbuh sehingga garis tren naik, dan ulasan positif yang viral pada minggu ketiga-keempat sempat mengangkat penjualan di atas tren. Regresi penjualan pada waktu — persis resep chapter Simple Linear Regression dengan x diganti waktu t — menghasilkan ŷ = 10 + 2t:
| t | y | ŷ = 10 + 2t | et | et − et-1 | (et − et-1)² |
|---|---|---|---|---|---|
| 1 | 8 | 12 | −4 | — | — |
| 2 | 14 | 14 | 0 | 4 | 16 |
| 3 | 20 | 16 | 4 | 4 | 16 |
| 4 | 22 | 18 | 4 | 0 | 0 |
| 5 | 20 | 20 | 0 | −4 | 16 |
| 6 | 18 | 22 | −4 | −4 | 16 |
Dari tabel, Σet² = 16 + 0 + 16 + 16 + 0 + 16 = 64 dan Σ(et − et-1)² = 16 + 16 + 0 + 16 + 16 = 64, sehingga DW = 64/64 = 1.00. Residual berjalan −4, 0, +4, +4, 0, −4: minggu di bawah tren (ke-1 dan ke-6) dan minggu di atas tren (ke-3 dan ke-4) mengelompok bersebelahan — galat minggu ini menyerupai galat minggu lalu, ciri autokorelasi positif, dan DW = 1.00 berada jauh di bawah patokan 1.5. Seluruh hitungan diverifikasi mesin:
import statistics
penjualan = [8, 14, 20, 22, 20, 18]
minggu = [1, 2, 3, 4, 5, 6]
model = statistics.linear_regression(minggu, penjualan)
resid = [y - (model.intercept + model.slope * t) for t, y in zip(minggu, penjualan)]
for t, y, e in zip(minggu, penjualan, resid):
yhat = model.intercept + model.slope * t
print(f"t = {t} y = {y:2d} yhat = {yhat:4.1f} e = {e:+.1f}")
atas = sum((resid[t] - resid[t - 1]) ** 2 for t in range(1, len(resid)))
bawah = sum(e * e for e in resid)
print(f"pembilang = {atas:.0f} penyebut = {bawah:.0f}")
print(f"DW = {atas / bawah:.4f}")Output yang Dihasilkan:
t = 1 y = 8 yhat = 12.0 e = -4.0
t = 2 y = 14 yhat = 14.0 e = +0.0
t = 3 y = 20 yhat = 16.0 e = +4.0
t = 4 y = 22 yhat = 18.0 e = +4.0
t = 5 y = 20 yhat = 20.0 e = +0.0
t = 6 y = 18 yhat = 22.0 e = -4.0
pembilang = 64 penyebut = 64
DW = 1.0000Mari kita bedah kode di atas:
- Baris 6-7 (residual):
linear_regressionmemberi slope 2.0 dan intercept 10.0 — persis angka tangan — lalu residual dihitung selisih data terhadap garis, pola yang sama dengan chapter Simple Linear Regression. - Baris 13-14 (dua jumlah DW): pembilang menjumlahkan kuadrat lompatan antar residual berurutan lewat indeks
t - 1, penyebut menjumlahkan kuadrat seluruh residual — rumus DW diterjemahkan baris demi baris tanpa fungsi siap pakai. - Baris 16 (hasil): DW = 1.0000, identik dengan hitungan tangan 64/64.
Satu catatan tentang rumus pendekatan: pada deret sependek enam titik, r1 bernilai 16/64 = 0.25 sehingga 2(1 − r1) = 1.5 — meleset setengah poin dari DW sebenarnya, karena dua residual di ujung deret hanya muncul sekali sebagai pengurang di pembilang. Bobot ujung baru meredam pada deret panjang; pakai DW yang dihitung penuh, dan bacalah rumus 2(1 − r1) sebagai penunjuk arah, bukan pengganti.
Contoh Nyata: Residual Tren Harga Beras #
Sekarang data sungguhan section — regresi tren dua belas bulan harga beras pada chapter Tren dan Musiman, dengan b1 = 181.82 Rp/kg per bulan, b0 = 12334.85 Rp/kg, dan prediksi Desember 14516.67. Residual tiap bulan (nilai penuh dipakai sepanjang hitungan, dibulatkan pada hasil akhir):
| t | Yt | ŷt | et = Yt − ŷt |
|---|---|---|---|
| 1 | 12500 | 12516.67 | −16.67 |
| 2 | 12800 | 12698.48 | 101.52 |
| 3 | 12700 | 12880.30 | −180.30 |
| 4 | 13100 | 13062.12 | 37.88 |
| 5 | 13400 | 13243.94 | 156.06 |
| 6 | 13300 | 13425.76 | −125.76 |
| 7 | 13600 | 13607.58 | −7.58 |
| 8 | 13900 | 13789.39 | 110.61 |
| 9 | 13800 | 13971.21 | −171.21 |
| 10 | 14200 | 14153.03 | 46.97 |
| 11 | 14500 | 14334.85 | 165.15 |
| 12 | 14400 | 14516.67 | −116.67 |
Pola kolom residual sudah terlihat mata: tanda bergantian hampir setiap bulan — negatif, positif, negatif, positif — dengan lonjakan positif pada bulan ke-2, 5, 8, 11 dan penurunan negatif pada bulan ke-3, 6, 9, 12. DW dihitung dua jalur: loop eksplisit yang meniru rumus, dan fungsi durbin_watson dari statsmodels sebagai pembanding:
from statsmodels.stats.stattools import durbin_watson
beras = [12500, 12800, 12700, 13100, 13400, 13300,
13600, 13900, 13800, 14200, 14500, 14400]
t = list(range(1, 13))
n = len(beras)
st = sum(t)
st2 = sum(x * x for x in t)
sy = sum(beras)
sty = sum(x * y for x, y in zip(t, beras))
b1 = (n * sty - st * sy) / (n * st2 - st * st)
b0 = (sy - b1 * st) / n
resid = [y - (b0 + b1 * x) for x, y in zip(t, beras)]
atas = 0.0
for i in range(1, n):
atas += (resid[i] - resid[i - 1]) ** 2
bawah = sum(e * e for e in resid)
eb = sum(resid) / n
pembilang_r1 = sum((resid[i] - eb) * (resid[i - 1] - eb) for i in range(1, n))
penyebut_r1 = sum((e - eb) ** 2 for e in resid)
print(f"b1 = {b1:.2f} b0 = {b0:.2f} (persis chapter Tren dan Musiman)")
print(f"DW loop eksplisit : {atas / bawah:.4f}")
print(f"DW statsmodels : {durbin_watson(resid):.4f}")
print(f"r1 = {pembilang_r1 / penyebut_r1:.4f} -> 2(1 - r1) = {2 * (1 - pembilang_r1 / penyebut_r1):.4f}")Output yang Dihasilkan:
b1 = 181.82 b0 = 12334.85 (persis chapter Tren dan Musiman)
DW loop eksplisit : 2.8497
DW statsmodels : 2.8497
r1 = -0.4659 -> 2(1 - r1) = 2.9317Mari kita bedah kode di atas:
- Baris 8-15 (koefisien tren): empat penjumlahan Σt, Σt², ΣYt, Σ(t × Yt) dan rumus slope-intercept persis kode chapter Tren dan Musiman — b1 = 181.82 dan b0 = 12334.85 terproduksi ulang, membuktikan residual dihitung dari model yang sama.
- Baris 17-20 (DW loop eksplisit): pembilang terakumulasi satu lompatan kuadrat tiap iterasi
i, penyebut menjumlahkan kuadrat residual — rumus DW tanpa kotak hitam. - Baris 22-29 (dua verifikasi): fungsi
durbin_watson(resid)dari statsmodels menghitung statistik yang sama dan jatuh pada 2.8497 — identik dengan loop hingga empat desimal; r1 dihitung terpusat sebagai korelasi residual terhadap residualnya sendiri yang digeser satu periode.
DW = 2.85 berada jauh di atas patokan 2.5 — bukti autokorelasi negatif, arah yang berbeda dari contoh kopi. Penyebabnya terbaca pada data: beras naik tiga bulan berurutan lalu turun satu bulan, pola kuartalan yang sempat dicatat chapter Tren dan Musiman tanpa cukup pengulangan untuk klaim musiman. Garis tren lurus tidak bisa mengikuti zigzag itu, sehingga residual bergantian di atas dan di bawah garis; r1 = −0.4659 dan 2(1 − r1) = 2.93 mendekati DW, menegaskan arah yang sama. Panduan umum memang menyebut deret menanjak yang diregresikan pada waktu sering menyisakan autokorelasi positif ringan — galat yang mengembara mulus di sekitar tren; angka pada data ini berkata sebaliknya, dan angkalah yang diikuti. Baik positif maupun negatif, pesan DW sama: model linear pada waktu meninggalkan struktur berperiod pendek yang belum dimodelkan.
Ketika DW Menyala: Tiga Jalur Penanganan #
DW tidak memperbaiki apa pun — ia hanya memberi tahu bahwa residual masih memuat struktur. Tiga jalur menindaklanjutinya, dari yang paling dekat dengan regresi hingga yang paling jauh:
| Situasi | Jalur | Wujudnya |
|---|---|---|
| Struktur waktu tertinggal dari persamaan | perbaiki model meannya | tambahkan lag prediktor, suku tren kuadrat, atau dummy musiman |
| Fokus analisis adalah dinamika deret itu sendiri | pindah ke model deret waktu | Simple Exponential Smoothing, Holt dan Holt-Winters (Section Analisis Deret Waktu) |
| Koefisien tetap dipakai, inferensi yang harus dibenarkan | perbaiki standard error-nya | HAC / Newey-West, keluarga galat standar robust |
Jalur pertama bekerja pada beras: residual yang bergantian tiap empat bulan adalah undangan menambahkan struktur musiman ke persamaan — langkah yang dibahas tuntas pada Time Series Decomposition di Section Analisis Deret Waktu. Jalur kedua menyerahkan peramalan pada model yang memang dirancang untuk deret: SES merata-ratakan level terkini, Holt menambah kemiringan tren, dan Holt-Winters menampung musiman. Jalur ketiga adalah jembatan antar-section: chapter Galat Standar Robust memperkenalkan sandwich estimator Huber-White (HC) yang membenarkan standard error saat varians residual tidak konstan; versi HAC (heteroskedastisitas dan autocorrelation consistent) memperluas estimasi itu dengan kovarians antar periode, sehingga koefisien OLS tetap dilaporkan dengan p-value yang jujur. Pada statsmodels jalur ini cukup satu argumen: fit(cov_type="HAC").
Batas-batas Uji Durbin-Watson #
Patokan 1.5-2.5 adalah panduan praktis, bukan uji formal. Uji aslinya membandingkan DW dengan dua batas kritis dL dan dU dari tabel yang bergantung pada n dan jumlah prediktor, dan di antara kedua batas itu terdapat zona tak menyimpulkan — daerah tempat data tidak cukup bukti untuk kedua arah. Desain statistiknya juga menyasar autokorelasi bergaya AR(1), yaitu residual yang berkorelasi hanya dengan lag satu; pola berperiod lebih panjang atau korelasi pada lag lain dapat lolos dari perhatian DW, sehingga plot residual terhadap waktu tetap layak dilihat sebagai pasangan angkanya. Deret pendek membuat semuanya kasar — contoh enam minggu menunjukkan pendekatan 2(1 − r1) meleset setengah poin — dan pada sampel besar tabel serta patokan makin bisa dipercaya.
Dengan chapter ini, lingkar Section Korelasi dan Regresi tertutup: mengukur arah lewat kovarians, kekuatan lewat korelasi, kehati-hatian kausal pada Correlation vs Causation, model linear sederhana dan berganda, empat asumsi penopangnya, evaluasi kecocokannya, perluasan ke respons biner lewat regresi logistik, dan kini uji atas asumsi yang paling rentan pada data waktu. Slope 181.82 Rp per bulan pada regresi beras sebenarnya sudah adalah ramalan — dan peramalan itulah pekerjaan yang dinaikkan kelasnya di Section Analisis Deret Waktu: Moving Average meredam gejolak, Time Series Decomposition memisahkan musiman dari tren, SES dan Holt meramal level serta kemiringan, lalu Evaluasi Forecast mengadili ketepatannya. Panduan lanjutan tentang autokorelasi dan Durbin-Watson tersedia di NIST/SEMATECH e-Handbook dan Penn State STAT 500 ; implementasi fungsinya didokumentasikan di dokumentasi statsmodels .