Sebagian besar data yang kita olah sebelumnya diperlakukan sebagai kumpulan baris yang setara: satu baris transaksi tidak lebih penting daripada baris lain, dan mengacak urutannya tidak mengubah isi informasinya. Data deret waktu (time series) menentang asumsi tersebut: urutan kemunculan justru membawa makna, dan nilai hari ini terkait dengan nilai kemarin. Pada chapter ini kita kenali ciri khas deret waktu, membangun deret pertama dengan pola yang kita rancang sendiri, lalu membuktikan lewat angka bahwa urutan menyimpan informasi — bekal penting sebelum masuk ke tren, musiman, dan peramalan pada chapter-chapter berikutnya.
Apa yang Membedakan Deret Waktu #
Deret waktu adalah rangkaian pengamatan yang dicatat berurutan menurut waktu dengan jarak yang teratur: penjualan harian sebuah kafe, harga cabai per minggu di pasar, suhu kota per jam, hingga jumlah kunjungan situs per hari. Dua ciri membedakannya dari data tabular biasa. Pertama, urutan bermakna: baris 8 Februari harus berada setelah 7 Februari; menukar posisi dua baris sama saja merusak ceritanya. Kedua, autokorelasi (autocorrelation): nilai pada satu titik waktu berkorelasi dengan nilai pada titik waktu sebelumnya — penjualan Sabtu yang ramai kemungkinan diikuti Minggu yang juga ramai.
| Aspek | Data tabular biasa | Data deret waktu |
|---|---|---|
| Urutan baris | Tidak membawa makna | Menentukan makna |
| Hubungan antarbaris | Umumnya dianggap saling bebas | Terkait (autokorelasi) |
| Pengacakan baris (shuffle) | Aman untuk sampling | Merusak informasi |
| Pertanyaan khas | “Segmen mana paling menguntungkan?” | “Berapa penjualan minggu depan?” |
| Alat khas | groupby, klasifikasi, regresi | Pemulusan, dekomposisi, model deret |
Ciri tersebut lahir dari kasus bisnis yang nyata: pemilik Toko Kopi Kita ingin tahu stok biji kopi untuk pekan depan, dinas koperasi ingin memantau harga beras bulanan, dan tim operasional ingin memperkirakan lonjakan pelanggan jelang akhir pekan. Semua pertanyaan itu berbau forecasting — menebak nilai masa depan dari pola masa lalu — dan hanya bisa dijawab bila data diperlakukan sebagai deret, bukan kantong angka acak.
Membangun Deret Waktu Pertama Kita #
Kita akan memakai satu dataset kecil yang sama untuk seluruh section ini: penjualan harian Toko Kopi Kita selama 42 hari (enam pekan penuh). Polanya kita buat eksplisit lewat rumus — tren naik pelan, musiman akhir pekan, dan noise — supaya kita tahu persis apa yang harus ditemukan alat analisis kita nanti.
import numpy as np
import pandas as pd
rng = np.random.default_rng(42)
n = 42
tanggal = pd.date_range("2025-01-06", periods=n, freq="D") # mulai hari Senin
bobot_hari = np.array([0, 1, 2, 3, 8, 14, 11], dtype=float) # Senin .. Minggu
gelas = (
40
+ 0.6 * np.arange(n) # tren: naik 0.6 gelas per hari
+ bobot_hari[tanggal.dayofweek] # musiman: akhir pekan lebih ramai
+ rng.normal(0, 4.0, n) # noise
)
deret = pd.Series(gelas.round().astype(int), index=tanggal, name="gelas")
tabel = pd.DataFrame({"gelas": deret})
print(tabel.iloc[:7])
print("...")
print(tabel.iloc[-3:])
print()
print("Rata-rata :", round(deret.mean(), 1), "gelas per hari")
print("Rentang : {} sampai {} gelas".format(deret.min(), deret.max()))Output yang Dihasilkan:
gelas
2025-01-06 41
2025-01-07 37
2025-01-08 46
2025-01-09 49
2025-01-10 43
2025-01-11 52
2025-01-12 55
...
gelas
2025-02-14 74
2025-02-15 81
2025-02-16 78
Rata-rata : 58.2 gelas per hari
Rentang : 37 sampai 81 gelasMari kita telaah baris-baris kode di atas:
pd.date_range("2025-01-06", periods=42, freq="D")membuat indeks waktu harian yang berurutan. Menempatkannya sebagaiindexmembuat pandas mengenalideretsebagai data waktu — aksesor.index.dayofweek, pengurangan tanggal, hinggaresample()langsung tersedia (pembahasanto_datetimedanresampleyang lebih rinci sudah kita tuntaskan pada chapter Analisis Data Waktu ).bobot_hari[tanggal.dayofweek]memetakan tiap tanggal ke bobot musimannya:dayofweekbernilai 0 untuk Senin sampai 6 untuk Minggu, dan arraybobot_harimemberi tambahan 0-14 gelas sesama harinya — Sabtu paling ramai.rng.normal(0, 4.0, n)menyuntikkan noise dengan generator berseed42, sehingga hasilnya sama setiap kali dijalankan. Seed inilah yang membuat seluruh contoh pada section ini dapat direproduksi.gelas.round().astype(int)membulatkan ke bilangan bulat gelas — penjualan memang tercatat dalam satuan gelas, bukan pecahan.
Perhatikan ringkasan di bawah tabel: rata-rata 58,2 gelas dengan rentang 37 sampai 81. Rentang selebar itu bukan tanda data bermasalah, melainkan gabungan tren naik dan lonjakan akhir pekan — dua pola yang akan kita urai satu per satu.
Autokorelasi: Nilai Hari Ini Terkait Kemarin #
Ciri kedua deret waktu, autokorelasi, bisa kita buktikan dengan percobaan sederhana: hitung korelasi antara deret dan salinannya yang digeser satu hari (shift(1)). Sebagai pembanding, kita acak urutan deret dengan rng.permutation lalu hitung korelasi lag-1-nya. Bila urutan memang tidak bermakna, kedua angka harus mirip.
import numpy as np
import pandas as pd
rng = np.random.default_rng(42)
n = 42
tanggal = pd.date_range("2025-01-06", periods=n, freq="D")
bobot_hari = np.array([0, 1, 2, 3, 8, 14, 11], dtype=float)
gelas = 40 + 0.6 * np.arange(n) + bobot_hari[tanggal.dayofweek] + rng.normal(0, 4.0, n)
deret = pd.Series(gelas.round().astype(int), index=tanggal, name="gelas")
korelasi_asli = deret.corr(deret.shift(1))
acak = pd.Series(rng.permutation(deret.values), index=deret.index, name="gelas")
korelasi_acak = acak.corr(acak.shift(1))
print(f"Korelasi lag-1 data asli : {korelasi_asli:.3f}")
print(f"Korelasi lag-1 data diacak : {korelasi_acak:.3f}")Output yang Dihasilkan:
Korelasi lag-1 data asli : 0.773
Korelasi lag-1 data diacak : 0.013Kontras kedua angka itu padat dengan makna:
deret.shift(1)menggeser seluruh nilai satu langkah ke bawah, sehingga baris 8 Februari kini menampilkan nilai 7 Februari. Korelasi antara deret asli dan hasil geser inilah autokorelasi lag-1.- Korelasi 0,773 pada data asli menandakan hubungan positif yang kuat: hari yang ramai cenderung didahului hari yang juga ramai. Inilah bahan bakar utama peramalan — masa lalu sungguh memuat informasi tentang kini.
rng.permutation(...)mengacak urutan nilai (tetap dengan seed yang sama sehingga deterministik). Setelah diacak, korelasi lag-1 jatuh ke 0,013 — nyaris nol. Kesimpulannya tegas: informasi itu hidup di urutan, dan mengacak baris deret waktu sama saja menghapusnya.
Rangkuman #
- Deret waktu adalah data terurut menurut waktu; urutannya bermakna dan tidak boleh diacak.
- Autokorelasi mengukur hubungan nilai kini dengan nilai lampau; pada data penjualan kita, korelasi lag-1 mencapai 0,773, jauh di atas 0,013 milik data yang diacak.
- Indeks waktu pandas (
DatetimeIndexdenganfreq) membuka akses.dt,resample, dan pergeseranshift(). - Dataset uji coba kita dibangun dari rumus eksplisit — tren 0,6 gelas/hari, bobot musiman per hari, noise berseed 42 — sehingga setiap teknik pada section ini bisa diuji terhadap pola yang sudah diketahui.
Kita sekarang tahu bahwa deret penjualan memuat struktur yang bisa dimanfaatkan. Struktur itu sendiri punya dua wajah yang paling sering muncul di dunia nyata — tren jangka panjang dan musiman yang berulang — dan keduanya akan kita bedah serta pisahkan pada chapter berikutnya, Tren dan Musiman .