Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Jumat, 21 Maret 2025

Mengulik Statistik Transportasi - Prediksi Deret Waktu Dengan ARIMA

 


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}")

Contoh yang saya gunakan adalah data lalu lintas harian di kota bandung yang saya dapatkan di : https://satudata.bandungkab.go.id/dataset/data-lalu-lintas-masuk , dan kemudian saya jalankan dengan google colab. Unduh datanya dalam bentuk CSV dan kemudian satu persatu kita olah.


1. Pengolahan data awal

#Load and Preprocess the Data
import 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 verify
print(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 date
data = filtered_data.sort_values(by='Date').reset_index(drop=True)

# Display the cleaned data
print(data.head())


Hasilnya seperti ini :
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

2. Visualisasi Data

# Visualize the Data
import matplotlib.pyplot as plt

# Plot the time series
plt.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()

Hasil visualisasinya seperti ini :





2. Cek apakah data statisioner : 

#Check for Stationarity
from statsmodels.tsa.stattools import adfuller

# Perform ADF test
result = adfuller(data['Jumlah'])
print(f"ADF Statistic: {result[0]}")
print(f"p-value: {result[1]}")

# Interpretation
if result[1] <= 0.05:
    print("The data is stationary.")
else:
    print("The data is non-stationary. Differencing may be required.")

Hasilnya ini :

ADF Statistic: -4.2035830664815785 p-value: 0.0006497583886865874 The data is stationary.


4. Jika tidak statisioner lakukan ini :

#if non stationary
data['Value_Diff'] = data['Jumlah'].diff().dropna()

# Plot the differenced data
plt.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()


5. Buat pemodelan ARIMA dengan library python pmdarima


Jangan lupa jika menggunakan google colab install dulu librarynya: 

#Build the ARIMA Model
!pip install pmdarima

Lanjut ini : 

from pmdarima import auto_arima

# Fit the auto_arima model to find optimal parameters
model = auto_arima(data['Jumlah'], seasonal=True, m=12, trace=True, error_action='ignore', suppress_warnings=True)
print(model.summary())

Lalu Training model arima nya:
#train the arima model
from statsmodels.tsa.arima.model import ARIMA

# Extract optimal parameters from auto_arima
order = model.order

# Train the ARIMA model
arima_model = ARIMA(data['Jumlah'], order=order)
arima_fit = arima_model.fit()

# Print model summary
print(arima_fit.summary())

Hasilnya training seperti ini :


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).


6. Lanjut ke prediksi 1 tahun / 365 hari kedepan menggunakan arima :
# Forecast for the next 365 days (or desired horizon)
forecast_steps = 365
forecast = arima_fit.forecast(steps=forecast_steps)

# Create a date range for the forecast period
forecast_dates = pd.date_range(start='2025-01-01', periods=forecast_steps, freq='D')

# Combine forecast dates and values into a DataFrame
forecast_data = pd.DataFrame({'Date': forecast_dates, 'Forecasted_Value': forecast})

# Display the forecasted data
print(forecast_data.head())

# Plot the forecast
plt.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()


Hasilnya seperti ini dan grafiknya seperti gambar paling atas tulisan ini : 
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


Keunggulan ARIMA

  • 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.


Keterbatasan ARIMA

  • 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.


Kapan Menggunakan ARIMA vs. Model Lain

Gunakan ARIMA Saat:
  • 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.

Pertimbangkan Alternatif Saat:

  • 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).

Kesimpulan 

ARIMA adalah alat yang ampuh dan dapat ditafsirkan untuk prediksi lalu lintas, terutama saat menangani data deret waktu univariat. Dengan memahami komponennya dan mengikuti pendekatan terstruktur, Anda dapat menggunakan ARIMA secara efektif untuk memperkirakan pola lalu lintas. Namun, untuk skenario yang lebih kompleks yang melibatkan beberapa variabel atau prediksi waktu nyata, pertimbangkan untuk menggabungkan ARIMA dengan model lain atau beralih ke teknik lanjutan seperti LSTM ( dibahas pada tulisan selanjutnya ).


- Powered by Qwen AI -
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (28) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gis (3) gsm (1) iklan (1) infrared (2) Input Output (3) iot (78) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (9) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) statistik (5) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) unesa (8) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (9)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika