Untuk mengikuti tulisan kali ini diharapkan membaca dulu bagian scraping data agar contoh dataset yang digunakan dapat diambil dengan benar ...( baca disini )
ARIMA (AutoRegressive Integrated Moving Average) adalah model statistik yang banyak digunakan untuk peramalan deret waktu. Model ini sangat efektif untuk data deret waktu univariat, yang tujuannya adalah untuk memprediksi nilai masa depan berdasarkan pengamatan masa lalu. Dalam konteks prediksi lalu lintas, ARIMA dapat digunakan untuk meramalkan parameter lalu lintas seperti jumlah kendaraan, kecepatan, atau tingkat kemacetan di persimpangan atau di sepanjang ruas jalan.
Di bawah ini, saya akan menjelaskan ARIMA secara terperinci, membahas komponen-komponennya, dan menunjukkan bagaimana ARIMA dapat diterapkan pada prediksi lalu lintas.
Apa itu ARIMA?
ARIMA merupakan kombinasi dari tiga komponen utama:
AutoRegressive (AR):
Menangkap hubungan antara pengamatan dan sejumlah pengamatan yang tertinggal (nilai masa lalu).
Parameter "p" menentukan jumlah istilah yang tertinggal yang akan disertakan.
Integrated(I):
Mengacu pada pembedaan data untuk membuatnya stasioner (misalnya, menghilangkan tren dan musim).
Parameter "d" menentukan berapa kali data dibedakan.
Moving Average (MA):
Menggunakan ketergantungan antara pengamatan dan kesalahan residual dari model rata-rata bergerak yang diterapkan pada pengamatan yang tertunda.
Parameter "q" menentukan ukuran jendela rata-rata bergerak.
Model ARIMA dilambangkan sebagai ARIMA(p, d, q) , di mana:
p : Jumlah suku autoregresif.
d : Derajat perbedaan.
q : Jumlah suku rata-rata bergerak.
Mengapa Menggunakan ARIMA untuk Prediksi Lalu Lintas?
ARIMA sangat cocok untuk prediksi lalu lintas karena:
- Peramalan Univariat: Bekerja langsung dengan data lalu lintas historis (misalnya, jumlah kendaraan dari waktu ke waktu) tanpa memerlukan fitur tambahan.
- Penanganan Tren dan Musiman: Pola lalu lintas sering kali menunjukkan siklus harian, mingguan, atau musiman. ARIMA dapat menangkap tren berulang ini.
- Interpretabilitas: Tidak seperti model pembelajaran mendalam, ARIMA memberikan hasil yang dapat diinterpretasikan, sehingga lebih mudah untuk memahami pola yang mendasarinya.
- Kesederhanaan: ARIMA relatif mudah diimplementasikan dan memerlukan sumber daya komputasi minimal dibandingkan dengan model pembelajaran mesin.
Namun, ARIMA memiliki keterbatasan:
- Bermasalah dengan input multivariat (misalnya, menggabungkan data cuaca atau kejadian dengan data lalu lintas).
- Mungkin tidak berfungsi dengan baik untuk pola lalu lintas yang sangat kompleks atau non-linier.
Langkah-langkah untuk Menerapkan ARIMA untuk Prediksi Lalu Lintas
Langkah 1: Pengumpulan Data
Kumpulkan data lalu lintas historis (misalnya, jumlah kendaraan, kecepatan, atau tingkat kemacetan) secara berkala (misalnya, setiap 5, 15, atau 60 menit).
Pastikan data bersih (tidak ada nilai yang hilang atau outlier).
Langkah 2: Visualisasikan Data
Buat plot data deret waktu untuk mengidentifikasi tren, musim, dan gangguan.
Contoh koding:
import matplotlib.pyplot as plt plt.plot(traffic_data) plt.title("Traffic Counts Over Time") plt.show()
Langkah 3: Periksa apakah data Stasioner
ARIMA mengasumsikan bahwa deret waktu bersifat stasioner (nilai rata-rata, varians, dan autokorelasi konstan dari waktu ke waktu).
Gunakan uji statistik seperti uji Augmented Dickey-Fuller (ADF) untuk memeriksa stasioneritas:
Contoh koding:
from statsmodels.tsa.stattools import adfuller result = adfuller(traffic_data) print(f"ADF Statistic: {result[0]}, p-value: {result[1]}")
Jika data tidak stasioner, terapkan differencing (d > 0) untuk membuatnya stasioner.
Langkah 4: Tentukan Parameter ARIMA (p, d, q)
Gunakan alat seperti plot Autocorrelation Function (ACF) dan Partial Autocorrelation Function (PACF) untuk memperkirakan p dan q:
Contoh koding:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf plot_acf(traffic_data) plot_pacf(traffic_data) plt.show()
Plot ACF membantu menentukan q (lag yang melampaui batas korelasi), dan plot PACF membantu menentukan p.
Langkah 5: Melatih Model ARIMA
Sesuaikan model ARIMA menggunakan parameter yang diidentifikasi:
Contoh koding:
from statsmodels.tsa.arima.model import ARIMA model = ARIMA(traffic_data, order=(p, d, q)) model_fit = model.fit() print(model_fit.summary())
Langkah 6: Buat Prediksi
Gunakan model yang telah dilatih untuk memperkirakan nilai lalu lintas di masa mendatang:
Contoh koding:
forecast = model_fit.forecast(steps=10) # Predict next 10 time steps print(forecast)
Langkah 7: Mengevaluasi Model
Bandingkan nilai prediksi dengan data aktual menggunakan metrik seperti:
Mean Absolute Error (MAE):
from sklearn.metrics import mean_absolute_error mae = mean_absolute_error(actual_values, predicted_values) print(f"MAE: {mae}")
Root Mean Square Error (RSME):
from sklearn.metrics import mean_squared_error rmse = mean_squared_error(actual_values, predicted_values, squared=False) print(f"RMSE: {rmse}")
#Load and Preprocess the Dataimport pandas as pd# Load the dataset, skipping the first two rows (headers)data = pd.read_csv('data_bandung.csv', header=None, skiprows=2, names=['Wilayah', 'Year', 'Month', 'Day', 'Golongan', 'Jumlah'])# Display the first few rows to verifyprint(data.head())# Filter the data for 'Golongan' equal to "I"filtered_data = data[data['Golongan'] == "II"]# Create a datetime column for time-series analysis#filtered_data['Date'] = pd.to_datetime(filtered_data[['Year', 'Month', 'Day']])filtered_data = filtered_data.assign(Date=pd.to_datetime(filtered_data[['Year', 'Month', 'Day']]))# Sort the data by datedata = filtered_data.sort_values(by='Date').reset_index(drop=True)# Display the cleaned dataprint(data.head())
Wilayah Year Month Day Golongan Jumlah 0 Kabupaten Bandung 2020 1 2 I 35576 1 Kabupaten Bandung 2020 1 3 I 36028 2 Kabupaten Bandung 2020 1 4 I 37828 3 Kabupaten Bandung 2020 1 5 I 33637 4 Kabupaten Bandung 2020 1 6 I 33657 Wilayah Year Month Day Golongan Jumlah Date 0 Kabupaten Bandung 2020 1 1 II 340 2020-01-01 1 Kabupaten Bandung 2020 1 2 II 1149 2020-01-02 2 Kabupaten Bandung 2020 1 3 II 1649 2020-01-03 3 Kabupaten Bandung 2020 1 4 II 1483 2020-01-04 4 Kabupaten Bandung 2020 1 5 II 893 2020-01-05
# Visualize the Dataimport matplotlib.pyplot as plt# Plot the time seriesplt.figure(figsize=(12, 6))plt.plot(data['Date'], data['Jumlah'], label='Traffic Data')plt.title('Traffic Data Over Time')plt.xlabel('Date')plt.ylabel('Jumlah')plt.legend()plt.show()
#Check for Stationarityfrom statsmodels.tsa.stattools import adfuller# Perform ADF testresult = adfuller(data['Jumlah'])print(f"ADF Statistic: {result[0]}")print(f"p-value: {result[1]}")# Interpretationif result[1] <= 0.05:print("The data is stationary.")else:print("The data is non-stationary. Differencing may be required.")
ADF Statistic: -4.2035830664815785 p-value: 0.0006497583886865874 The data is stationary.
#if non stationarydata['Value_Diff'] = data['Jumlah'].diff().dropna()# Plot the differenced dataplt.figure(figsize=(12, 6))plt.plot(data['Date'][1:], data['Value_Diff'], label='Differenced Data')plt.title('Differenced Traffic Data')plt.xlabel('Date')plt.ylabel('Differenced Value')plt.legend()plt.show()
#Build the ARIMA Model!pip install pmdarima
from pmdarima import auto_arima# Fit the auto_arima model to find optimal parametersmodel = auto_arima(data['Jumlah'], seasonal=True, m=12, trace=True, error_action='ignore', suppress_warnings=True)print(model.summary())
#train the arima modelfrom statsmodels.tsa.arima.model import ARIMA# Extract optimal parameters from auto_arimaorder = model.order# Train the ARIMA modelarima_model = ARIMA(data['Jumlah'], order=order)arima_fit = arima_model.fit()# Print model summaryprint(arima_fit.summary())
ARIMAX Results ============================================================================== Dep. Variable: Jumlah No. Observations: 1813 Model: ARIMA(0, 1, 2) Log Likelihood -14093.174 Date: Sun, 16 Mar 2025 AIC 28192.348 Time: 03:48:09 BIC 28208.854 Sample: 0 HQIC 28198.439 - 1813 Covariance Type: opg ============================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ ma.L1 -0.7766 0.020 -39.006 0.000 -0.816 -0.738 ma.L2 -0.1608 0.020 -7.989 0.000 -0.200 -0.121 sigma2 3.331e+05 1.03e+04 32.290 0.000 3.13e+05 3.53e+05 =================================================================================== Ljung-Box (L1) (Q): 0.00 Jarque-Bera (JB): 332.12 Prob(Q): 0.98 Prob(JB): 0.00 Heteroskedasticity (H): 1.69 Skew: -1.02 Prob(H) (two-sided): 0.00 Kurtosis: 3.45 =================================================================================== Warnings: [1] Covariance matrix calculated using the outer product of gradients (complex-step).
# Forecast for the next 365 days (or desired horizon)forecast_steps = 365forecast = arima_fit.forecast(steps=forecast_steps)# Create a date range for the forecast periodforecast_dates = pd.date_range(start='2025-01-01', periods=forecast_steps, freq='D')# Combine forecast dates and values into a DataFrameforecast_data = pd.DataFrame({'Date': forecast_dates, 'Forecasted_Value': forecast})# Display the forecasted dataprint(forecast_data.head())# Plot the forecastplt.figure(figsize=(12, 6))plt.plot(data['Date'], data['Jumlah'], label='Historical Data')plt.plot(forecast_data['Date'], forecast_data['Forecasted_Value'], label='Forecasted Data', color='red')plt.title('Traffic Data Forecast for 2025')plt.xlabel('Date')plt.ylabel('Value')plt.legend()plt.show()
Date Forecasted_Value 1813 2025-01-01 1791.804722 1814 2025-01-02 1798.622821 1815 2025-01-03 1798.622821 1816 2025-01-04 1798.622821 1817 2025-01-05 1798.622821
- Dapat ditafsirkan: Mudah dipahami dan dijelaskan kepada pemangku kepentingan.
- Efisien: Memerlukan daya komputasi yang lebih sedikit dibandingkan dengan model pembelajaran mendalam.
- Menangani Tren dan Musiman: Efektif untuk menangkap pola berulang dalam data lalu lintas.
- Fokus Univariat: Tidak dapat menggabungkan faktor eksternal seperti cuaca, peristiwa, atau kondisi jalan.
- Persyaratan Stasioneritas: Data non-stasioner harus ditransformasikan, yang mungkin akan mempersulit proses.
- Asumsi Linier: Kesulitan dengan pola lalu lintas yang sangat non-linier atau kacau.
- Anda memiliki data lalu lintas univariat (misalnya, jumlah kendaraan dari waktu ke waktu).
- Data menunjukkan tren dan musim yang jelas.
- Anda memerlukan model yang sederhana dan dapat ditafsirkan.
- Anda ingin menggabungkan input multivariat (gunakan model LSTM atau pembelajaran mesin). Data tersebut sangat non-linier atau kompleks (gunakan model pembelajaran mendalam seperti LSTM atau GRU).
- Diperlukan prediksi waktu nyata (gunakan model hibrida atau pembelajaran penguatan).
0 komentar:
Posting Komentar