Peramalan Deret Waktu dengan Prophet, NeuralProphet, dan LSTM
Daftar Isi
Pendahuluan
Peramalan deret waktu (time series forecasting) merupakan salah satu penerapan ilmu data yang paling berdampak di dunia industri. Mulai dari memprediksi harga saham, konsumsi energi, hingga meramalkan permintaan produk dan beban server, kemampuan untuk mengantisipasi nilai masa depan berdasarkan pola historis sangatlah berharga.
Tutorial ini membahas tiga pendekatan andal untuk peramalan deret waktu: Facebook Prophet untuk dekomposisi aditif yang kokoh, NeuralProphet untuk peramalan berbasis jaringan saraf dengan autoregresi, dan LSTM (Long Short-Term Memory) yang dibangun dengan PyTorch untuk menangkap dependensi sekuensial yang kompleks.
Di akhir tutorial ini, Anda akan mampu membangun, mengevaluasi, dan membandingkan model peramalan berkualitas produksi menggunakan ketiga framework tersebut.
Prasyarat
- Python 3.9+
- Pemahaman dasar statistika (rata-rata, variansi, korelasi)
- Familiaritas dengan pandas dan matplotlib
Instalasi paket yang diperlukan:
pip install prophet neuralprophet torch pandas numpy matplotlib scikit-learn
Dasar-Dasar Deret Waktu
Deret waktu adalah urutan titik data yang diindeks berdasarkan urutan waktu. Sebelum membangun model apa pun, Anda harus memahami komponen-komponen utama yang menyusun sinyal deret waktu.
Komponen Deret Waktu
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Membuat deret waktu sintetis dengan komponen yang diketahui
np.random.seed(42)
dates = pd.daterange(start="2020-01-01", periods=730, freq="D")
tren = np.linspace(50, 150, 730)
musiman = 20 np.sin(2 np.pi np.arange(730) / 365.25)
noise = np.random.normal(0, 5, 730)
y = tren + musiman + noise
df = pd.DataFrame({"ds": dates, "y": y})
fig, axes = plt.subplots(4, 1, figsize=(14, 10), sharex=True)
axes[0].plot(dates, y, color="steelblue")
axes[0].settitle("Deret Waktu Teramati")
axes[1].plot(dates, tren, color="darkorange")
axes[1].settitle("Komponen Tren")
axes[2].plot(dates, musiman, color="green")
axes[2].settitle("Komponen Musiman")
axes[3].plot(dates, noise, color="red", alpha=0.6)
axes[3].settitle("Noise / Residu")
plt.tightlayout()
plt.savefig("dekomposisideretwaktu.png", dpi=150)
plt.show()
Stasioneritas
Deret waktu yang stasioner memiliki properti statistik yang konstan sepanjang waktu. Banyak metode peramalan yang mengasumsikan atau mendapat manfaat dari stasioneritas. Gunakan uji Augmented Dickey-Fuller (ADF) untuk memeriksa:
from statsmodels.tsa.stattools import adfuller
hasil = adfuller(df["y"].values)
print(f"Statistik ADF: {hasil[0]:.4f}")
print(f"p-value: {hasil[1]:.4f}")
if hasil[1] < 0.05:
print("Deret bersifat stasioner (tolak hipotesis nol).")
else:
print("Deret bersifat non-stasioner. Pertimbangkan differencing.")
Pembagian Data Latih-Uji untuk Deret Waktu
Jangan pernah menggunakan pembagian acak untuk deret waktu. Selalu bagi secara kronologis:
tanggalbatas = "2021-07-01"
data
latih = df[df["ds"] < tanggalbatas].copy()
data
uji = df[df["ds"] >= tanggalbatas].copy()
print(f"Sampel pelatihan: {len(data
latih)}")
print(f"Sampel pengujian: {len(datauji)}")