Udara adalah campuran gas yang menyelimuti bumi dan menjadi bagian penting dari kehidupan semua makhluk hidup. Udara menyediakan oksigen yang dibutuhkan manusia dan hewan untuk bernapas, serta memainkan peran penting dalam menjaga suhu dan keseimbangan lingkungan. Kualitas udara yang baik sangat menentukan kesehatan manusia dan kenyamanan hidup sehari-hari.
Salah satu masalah utama pada kualitas udara adalah PM2.5, yaitu partikel halus dengan diameter kurang dari 2,5 mikrometer. Partikel ini sangat kecil sehingga dapat masuk ke dalam paru-paru dan aliran darah. Paparan PM2.5 yang tinggi dapat meningkatkan risiko gangguan pernapasan, penyakit jantung, dan bahkan kematian dini. Oleh karena itu, memantau dan memprediksi konsentrasi PM2.5 sangat penting untuk melindungi kesehatan masyarakat.
Salah satu metode yang banyak digunakan untuk meramalkan PM2.5 adalah ARIMA (Auto-Regressive Integrated Moving Average). Model ini memanfaatkan data historis untuk memperkirakan nilai di masa depan dengan mempertimbangkan tren, musiman, dan variasi acak. ARIMA dipilih karena fleksibilitasnya dan kemampuan menangani data yang tidak stasioner melalui proses differencing.
Penelitian sebelumnya oleh Lita Widiastuti dan Wiga Maulana Baihaqi (Universitas Amikom Purwokerto, 2025) menggunakan pendekatan machine learning untuk memprediksi paparan PM2.5 dan dampaknya terhadap kesehatan masyarakat di Indonesia. Hasil penelitian menunjukkan bahwa paparan PM2.5 diperkirakan akan terus meningkat dalam 8 tahun ke depan, yang dapat meningkatkan biaya kesehatan akibat gangguan pernapasan dan kematian dini. Model terbaik untuk memprediksi PM2.5 adalah ARIMA.
Penelitian ini bertujuan menerapkan metode ARIMA untuk meramlakan konsentrasi PM2.5 di Kota Bandung, sehingga dapat memberikan gambaran pola dan kecenderungan kualitas udara berdasarkan data historis.
Data yang digunakan dalam penelitian ini diperoleh dari situs web AQI.in, pengambilan data dilakukan dengan memilih negara Indonesia dan Kota Bandung, kemudian data PM2.5 dicatat dan dimasukkan secara manual ke dalam file Excel. Data ini mencakup konsentrasi PM2.5 dalam satuan mikrogram per meter kubik (µg/m³), yang merupakan salah satu indikator utama kualitas udara.
Periode data yang digunakan dalam penelitian ini adalah dari 1 Januari 2025 sampai 31 Desember 2025, dengan frekuensi harian. Variabel yang dianalisis adalah tanggal pengambilan data, konsentrasi partikel halus ≤2,5 mikrometer. Data yang diinput secara manual di Excel kemudian format tanggal agar lebih konsisten, dan diekspor ke Rstudio.
library(readxl)
library(forecast)
library(tibble)
library(tseries)
library(zoo)
library(lmtest)
library(ggplot2)# Set working directory
setwd("C:/Users/HP/OneDrive/Documents/Semester 5/tugas komputasi statistik")
# Baca data Excel
data <- read_excel("PM2.5 Kota Bandung.xlsx")
# Pastikan kolom numeric dan tanggal
data$`Pm 2.5` <- as.numeric(data$`Pm 2.5`)
data$Tanggal <- as.Date(data$Tanggal, format="%d/%m/%Y") # sesuaikan format
# Filter periode yang dibutuhkan
data <- data[data$Tanggal >= as.Date("2025-01-01") &
data$Tanggal <= as.Date("2025-12-31"), ]
head (data)## # A tibble: 6 × 2
## Tanggal `Pm 2.5`
## <date> <dbl>
## 1 2025-01-01 20
## 2 2025-01-02 16
## 3 2025-01-03 25
## 4 2025-01-04 25
## 5 2025-01-05 16
## 6 2025-01-06 20
Menyiapkan data dalam format time series untuk analisis tren dan ARIMA.
#Membuat data menjadi time series
Data_ts <- zoo(data$ `Pm 2.5`,
order.by = data$Tanggal)
head(Data_ts)## 2025-01-01 2025-01-02 2025-01-03 2025-01-04 2025-01-05 2025-01-06
## 20 16 25 25 16 20
Langkah selanjutnya adalah melakukan analisis deskriptif dan visualisasi awal untuk memperoleh pemahaman lebih lanjut mengenai karakteristik, pola, anomali, dan hubungan dalam data sebelum melakukan analisis lanjutan atau pemodelan. EDA memanfaatkan statistik deskriptif dan visualisasi untuk mendeteksi masalah kualitas data, seperti outlier dan missing values, menguji hipotesis awal, serta memastikan bahwa data siap digunakan untuk pengambilan keputusan atau pembangunan model yang lebih akurat.
Pada Tahap ini, eksplorasi data dilakukan untuk memahami pola konsentrasi PM2.5 di Kota Bandung sebelum dilakukan peramalan menggunakan model ARIMA. Transformasi data menjadi time series Data PM2.5 harian diubah menjadi format time series agar bisa dianalisis secara kronologis. Beberapa baris pertama data ditampilkan untuk memastikan format tanggal dan nilai PM2.5 sudah benar.
Sebagian data digunakan untuk membangun model (training) dan sebagian lainnya untuk menguji akurasi prediksi (testing). Proporsi yang digunakan adalah 85% untuk training dan 15% untuk testing.
#Split data training dan testing (EDA juga termasuk untuk memastikan data siap di-model)
# Split Data Training dan Testing
n <- length(Data_ts)
Data_train <- head(Data_ts, floor(0.85 * n))
Data_test <- tail(Data_ts, n - length(Data_train))
Data_test## 2025-11-07 2025-11-08 2025-11-09 2025-11-10 2025-11-11 2025-11-12 2025-11-13
## 6 5 5 5 5 5 6
## 2025-11-14 2025-11-15 2025-11-16 2025-11-17 2025-11-18 2025-11-19 2025-11-20
## 5 6 7 5 4 6 5
## 2025-11-21 2025-11-22 2025-11-23 2025-11-24 2025-11-25 2025-11-26 2025-11-27
## 4 7 7 5 7 9 9
## 2025-11-28 2025-11-29 2025-11-30 2025-12-01 2025-12-02 2025-12-03 2025-12-04
## 6 8 9 11 9 11 10
## 2025-12-05 2025-12-06 2025-12-07 2025-12-08 2025-12-09 2025-12-10 2025-12-11
## 10 10 8 7 7 8 9
## 2025-12-12 2025-12-13 2025-12-14 2025-12-15 2025-12-16 2025-12-17 2025-12-18
## 7 6 4 5 5 5 6
## 2025-12-19 2025-12-20 2025-12-21 2025-12-22 2025-12-23 2025-12-24 2025-12-25
## 5 5 6 9 10 8 10
## 2025-12-26 2025-12-27 2025-12-28 2025-12-29 2025-12-30 2025-12-31
## 7 4 6 6 7 5
Berisi ringkasan statistik yang ditampilkan untuk memeriksa nilai minimum, maksimum, rata-rata, median, dan kuartil PM2.5. Analisis ini membantu memahami distribusi dan variasi data secara umum.
## Tanggal Pm 2.5
## Min. :2025-01-01 Min. : 4.00
## 1st Qu.:2025-04-02 1st Qu.:10.00
## Median :2025-07-02 Median :13.00
## Mean :2025-07-02 Mean :15.35
## 3rd Qu.:2025-10-01 3rd Qu.:18.00
## Max. :2025-12-31 Max. :73.00
Berdasarkan data PM2.5 harian Kota Bandung tahun 2025, konsentrasi partikel halus bervariasi antara 4 µg/m³ hingga 73 µg/m³, menunjukkan adanya fluktuasi yang cukup besar sepanjang tahun. Nilai median sebesar 13 µg/m³ dan rata-rata 15,35 µg/m³ mengindikasikan distribusi data sedikit miring ke kanan, karena rata-rata lebih tinggi dari median.
Kuartil pertama dan kuartil ketiga masing-masing sebesar 10 µg/m³ dan 18 µg/m³, sehingga setengah dari data berada dalam rentang 10–18 µg/m³. Secara keseluruhan, sebagian besar hari menunjukkan konsentrasi PM2.5 yang relatif rendah, namun terdapat beberapa hari dengan nilai tinggi yang dapat dianggap sebagai outlier, memberikan gambaran awal tentang dinamika kualitas udara di Kota Bandung sepanjang periode pengamatan.
Plot garis PM2.5 harian dibuat untuk melihat pola tren, fluktuasi, dan kemungkinan adanya outlier. Visualisasi ini membantu mendeteksi perilaku musiman atau tren naik-turun dalam data.
# Plot Time Series
plot(
Data_ts,
xlab = "Tanggal",
ylab = "PM2.5 (µg/m³)",
main = "Time Series PM2.5 Kota Bandung Tahun 2025"
)Berdasarkan plot time series PM2.5 harian Kota Bandung tahun 2025, sebagian besar periode menunjukkan konsentrasi PM2.5 yang relatif rendah, berkisar antara 10–30 µg/m³. Namun, terdapat lonjakan signifikan pada bulan Oktober 2025, di mana konsentrasi mencapai puncak sekitar 70 µg/m³. Setelah puncak tersebut, konsentrasi PM2.5 kembali menurun dan stabil pada level rendah hingga akhir tahun, menunjukkan fluktuasi harian yang cukup bervariasi sepanjang periode pengamatan.
Penelitian ini menggunakan metode Autoregressive Integrated Moving Average (ARIMA) untuk menganalisis data PM2.5 harian Kota Bandung dan melakukan peramalan. ARIMA merupakan salah satu metode time series yang dapat menangani data non-stasioner dengan memperhitungkan komponen Autoregressive (AR), Differencing (I), dan Moving Average (MA).
Uji stasioneritas dilakukan untuk menguji apakah data memiliki rata-rata dan varians yang konstan dari waktu ke waktu.
##
## Augmented Dickey-Fuller Test
##
## data: Data_train
## Dickey-Fuller = -2.9257, Lag order = 6, p-value = 0.1861
## alternative hypothesis: stationary
Data training diuji stasioneritasnya menggunakan Augmented Dickey-Fuller (ADF) test. Karena data awal tidak stasioner p-value > 0.05, maka perlu dilakukan differencing sekali untuk membuat data menjadi stasioner sebelum pemodelan ARIMA.
##
## Augmented Dickey-Fuller Test
##
## data: diff1
## Dickey-Fuller = -8.5659, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
Setelah dilakukan diffrencing pertama, data telah menjadi stasioner, artinya proses analisis dapat dilanjutkan ke tahap berikutnya.
Mengevaluasi autokorelasi dalam data menggunakan Auto-Correlation Function (ACF) dan Partial Auto-Correlation Function (PACF). Tujuannya untuk membantu menentukan parameter model ARIMA (p, d, q) dan memahami struktur hubungan antar waktu dalam data.
Berdasarkan plot ACF dan PACF pada data PM2.5 yang telah stasioner, terlihat bahwa plot PACF menunjukkan cut-off yang jelas hingga lag ke-5, sedangkan plot ACF menunjukkan indikasi pola tailing off. Pola ini mengindikasikan adanya proses Autoregressive berorde 5.
Langkah selanjutnya adalah membangun beberapa kandidat model ARIMA dengan berbagai kombinasi parameter (p,d,q). Tujuan dari variasi ini adalah untuk menemukan model yang paling sesuai dengan pola data, berdasarkan kriteria informasi seperti AIC. Semakin rendah nilai AIC, semakin baik kesesuaian model terhadap data.
#Estimasi Model
m1 <- arima(Data_train, order = c(0,1,0))
m2 <- arima(Data_train, order = c(0,1,1))
m3 <- arima(Data_train, order = c(1,1,0))
m4 <- arima(Data_train, order = c(1,1,1))
m5 <- arima(Data_train, order = c(2,1,0))
m6 <- arima(Data_train, order = c(2,1,1))
m7 <- arima(Data_train, order = c(2,1,2))
m8 <- arima(Data_train, order = c(3,1,0))
m9 <- arima(Data_train, order = c(3,1,1))
m10 <- arima(Data_train, order = c(3,1,2))
m11 <- arima(Data_train, order = c(4,1,0))
m12 <- arima(Data_train, order = c(4,1,1))
m13 <- arima(Data_train, order = c(4,1,2))
m14 <- arima(Data_train, order = c(5,1,0))
m15 <- arima(Data_train, order = c(5,1,1))
m16 <- arima(Data_train, order = c(5,1,2))
m17 <- arima(Data_train, order = c(0,1,2))
#Tabel AIC
aic <- data.frame(
Nama = paste0("m", 1:17),
Model = c("ARIMA(0,1,0)","ARIMA(0,1,1)","ARIMA(1,1,0)","ARIMA(1,1,1)",
"ARIMA(2,1,0)","ARIMA(2,1,1)","ARIMA(2,1,2)","ARIMA(3,1,0)",
"ARIMA(3,1,1)","ARIMA(3,1,2)","ARIMA(4,1,0)","ARIMA(4,1,1)",
"ARIMA(4,1,2)","ARIMA(5,1,0)","ARIMA(5,1,1)","ARIMA(5,1,2)",
"ARIMA(0,1,2)"),
AIC = c(m1$aic,m2$aic,m3$aic,m4$aic,m5$aic,m6$aic,m7$aic,m8$aic,
m9$aic,m10$aic,m11$aic,m12$aic,m13$aic,m14$aic,m15$aic,
m16$aic,m17$aic)
)
aic## Nama Model AIC
## 1 m1 ARIMA(0,1,0) 1885.078
## 2 m2 ARIMA(0,1,1) 1885.517
## 3 m3 ARIMA(1,1,0) 1886.052
## 4 m4 ARIMA(1,1,1) 1867.912
## 5 m5 ARIMA(2,1,0) 1881.251
## 6 m6 ARIMA(2,1,1) 1860.986
## 7 m7 ARIMA(2,1,2) 1859.112
## 8 m8 ARIMA(3,1,0) 1852.173
## 9 m9 ARIMA(3,1,1) 1850.462
## 10 m10 ARIMA(3,1,2) 1844.633
## 11 m11 ARIMA(4,1,0) 1847.681
## 12 m12 ARIMA(4,1,1) 1846.555
## 13 m13 ARIMA(4,1,2) 1841.398
## 14 m14 ARIMA(5,1,0) 1844.510
## 15 m15 ARIMA(5,1,1) 1846.395
## 16 m16 ARIMA(5,1,2) 1837.220
## 17 m17 ARIMA(0,1,2) 1870.324
Model ARIMA(5,1,2) dipilih sebagai model terbaik karena mampu menampilkan pola data lebih akurat dan sederhana dengan nilai AIC terkecil, yaitu 1837.220.
Uji signifikansi pada model ARIMA bertujuan untuk mengecek apakah setiap parameter (AR atau MA) benar-benar berpengaruh terhadap data. Parameter dianggap signifikan jika p-value < 0,05.
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -1.022270 0.055720 -18.3464 < 2.2e-16 ***
## ar2 -1.201794 0.073636 -16.3207 < 2.2e-16 ***
## ar3 -0.572731 0.094880 -6.0364 1.576e-09 ***
## ar4 -0.526193 0.074371 -7.0753 1.492e-12 ***
## ar5 -0.316066 0.056176 -5.6263 1.841e-08 ***
## ma1 0.920679 0.015360 59.9392 < 2.2e-16 ***
## ma2 0.999993 0.015895 62.9134 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil uji signifikansi koefisien pada model ARIMA(5,1,2) menunjukkan bahwa seluruh parameter autoregressive (AR1 hingga AR5) dan moving average (MA1 dan MA2) signifikan secara statistik pada tingkat signifikansi 5%. Koefisien AR1 dan AR2 memiliki p-value yang sangat kecil. Koefisien AR3, AR4, dan AR5 juga signifikan dengan p-value <0,001, menunjukkan bahwa autokorelasi hingga lima lag masih berperan penting dalam model. Pada komponen moving average, koefisien MA1 dan MA2 menunjukkan nilai yang signifikan. Berdasarkan kriteria signifikansi tersebut, seluruh parameter dalam model ARIMA(5,1,2) dinyatakan relevan, sehingga model ini dianggap stabil dan layak digunakan untuk peramalan jangka pendek.
Residual adalah selisih antara nilai aktual dan nilai yang diprediksi model, dan harus bersifat acak (white noise). Beberapa metode yang umum digunakan dalam uji residual antara lain plot ACF dan PACF residual untuk melihat autokorelasi, uji Ljung-Box untuk menguji keberadaan autokorelasi pada berbagai lag, dan uji normalitas untuk memastikan distribusi residual mendekati normal. Dengan melakukan uji residual, kita dapat menilai validitas model sebelum digunakan untuk forecasting.
##
## Box-Ljung test
##
## data: res1
## X-squared = 16.72, df = 12, p-value = 0.1604
##
## Box-Ljung test
##
## data: res1
## X-squared = 30.503, df = 24, p-value = 0.1686
##
## Box-Ljung test
##
## data: res1
## X-squared = 44.005, df = 36, p-value = 0.1689
##
## Box-Ljung test
##
## data: res1
## X-squared = 46.973, df = 48, p-value = 0.5149
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: res1
## D = 0.14333, p-value = 5.878e-06
## alternative hypothesis: two-sided
Setelah model ARIMA(5,1,2) ditetapkan sebagai model terbaik, dilakukan pemeriksaan residual untuk memastikan model sudah menangkap pola data dengan baik. Berdasarkan hasil analisis residual model ARIMA yang terpilih, dilakukan uji normalitas residual untuk memastikan kelayakan model. Hasil plot ACF dan PACF residual menunjukkan tidak adanya pola autokorelasi yang signifikan.
Selanjutnya, uji Ljung–Box dilakukan pada beberapa lag, yaitu lag 12, 24, 36, dan 48. Pada seluruh lag tersebut diperoleh nilai p-value masing-masing sebesar 0,1604; 0,1686; 0,1689; dan 0,5149, yang seluruhnya lebih besar dari tingkat signifikansi 5% (α = 0,05). Dengan demikian, hipotesis nol yang menyatakan bahwa residual bersifat independen (tidak mengandung autokorelasi). Hal ini menunjukkan bahwa residual dapat dianggap sebagai white noise, sehingga model telah memadai dalam menangkap pola data.
Namun demikian, hasil uji normalitas residual menggunakan uji Kolmogorov–Smirnov menunjukkan nilai p-value sebesar 5,878×10⁻⁶, yang lebih kecil dari 0,05. Hal ini mengindikasikan bahwa residual tidak berdistribusi normal. ARIMA pada dasarnya menggunakan informasi autokorelasi untuk prediksi, bukan distribusi normal residual. Selama residual acak dan tidak memiliki pola, model masih bisa menghasilkan prediksi yang akurat, meskipun distribusinya tidak sempurna normal. Untuk forecast jangka pendek, normalitas residual tidak terlalu krusial karena kesalahan prediksi masih tersebar acak dan tidak bias.
Evaluasi ini dilakukan dengan menghitung MAPE (Mean Absolute Percentage Error), MAE (Mean Absolute Error), dan RMSE (Root Mean Square Error). MAPE mengukur kesalahan prediksi dalam bentuk persentase relatif terhadap nilai aktual, sehingga memudahkan untuk memahami seberapa besar deviasi prediksi dibanding data asli.
#MAPE Training
train_pred <- fitted(best_model)
actual_train <- as.numeric(Data_train)
pred_train <- as.numeric(train_pred)
mape_train <- mean(abs((actual_train - pred_train)/actual_train)) * 100
#MAPE Testing
h <- length(Data_test) # panjang test set
test_pred <- forecast(best_model, h = h)$mean
actual_test <- as.numeric(Data_test)
pred_test <- as.numeric(test_pred)
pred_test <- pred_test[1:length(actual_test)]
mape_test <- mean(abs((actual_test - pred_test)/actual_test)) * 100
cat("MAPE Training:", round(mape_train,2), "%\n")## MAPE Training: 16.84 %
## MAPE Testing : 26.62 %
#MAE & RMSE data test
mae_test <- mean(abs(actual_test - pred_test))
rmse_test <- sqrt(mean((actual_test - pred_test)^2))
mae_test; rmse_test## [1] 1.754707
## [1] 2.064123
#Prediksi di training
train_pred <- fitted(best_model)
actual_train <- as.numeric(Data_train)
pred_train <- as.numeric(train_pred)
# MAE & RMSE data train
mae_train <- mean(abs(actual_train - pred_train))
rmse_train <- sqrt(mean((actual_train - pred_train)^2))
mae_train## [1] 2.887783
## [1] 4.552916
Hasil evaluasi akurasi model ARIMA menunjukkan bahwa nilai MAPE pada data training sebesar 16,84%, yang termasuk dalam kategori akurasi sedang (reasonable forecasting). Hal ini mengindikasikan bahwa model cukup mampu menyesuaikan diri dengan pola data historis, meskipun belum mencapai tingkat akurasi yang sangat tinggi. Sementara itu, MAPE pada data testing sebesar 26,62%, yang tergolong akurasi rendah, menunjukkan bahwa kemampuan model dalam memprediksi data di luar sampel masih kurang akurat.
Berdasarkan ukuran kesalahan absolut, nilai MAE dan RMSE pada data testing masing-masing sebesar 1,75 dan 2,06, yang relatif lebih kecil dibandingkan nilai MAE dan RMSE pada data training sebesar 2,89 dan 4,55. Kondisi ini menunjukkan bahwa meskipun persentase kesalahan relatif (MAPE) pada data testing lebih besar, kesalahannya masih berada pada tingkat yang dapat diterima.
Secara keseluruhan, model ARIMA yang digunakan sudah mampu menangkap pola utama dalam data. Namun, tingkat akurasi yang dihasilkan masih tergolong sedang, sehingga model ini lebih tepat digunakan untuk peramalan jangka pendek untuk melihat kecenderungan umum data.
Peramalan ini bertujuan untuk memprediksi nilai PM2.5 pada beberapa periode ke depan berdasarkan pola historis yang telah ditangkap oleh model. Hasil peramalan diharapkan dapat memberikan gambaran mengenai kecenderungan kualitas udara pada periode mendatang.
# Forecast 14 hari
forecast_14d <- forecast(best_model, h = 14)
# Ambil tanggal terakhir dari data training
last_date <- as.Date(index(Data_train)[length(Data_train)])
# Buat tanggal forecast bulan berikutnya
future_date <- seq.Date(from = as.Date("2026-01-01"), by = "day", length.out = 14)
# Buat tabel
forecast_table <- tibble(
Bulan = future_date,
Forecast = as.numeric(forecast_14d$mean)
)
print(forecast_table)## # A tibble: 14 × 2
## Bulan Forecast
## <date> <dbl>
## 1 2026-01-01 9.00
## 2 2026-01-02 5.85
## 3 2026-01-03 5.89
## 4 2026-01-04 8.51
## 5 2026-01-05 5.80
## 6 2026-01-06 5.79
## 7 2026-01-07 8.53
## 8 2026-01-08 5.90
## 9 2026-01-09 5.90
## 10 2026-01-10 8.35
## 11 2026-01-11 5.91
## 12 2026-01-12 5.98
## 13 2026-01-13 8.27
## 14 2026-01-14 5.95
#Membandingkan data aktual dengan hasil forecast
Data_test1 = as.matrix(Data_test)
tab <- tibble(
Tanggal = future_date, # 14 tanggal forecast
Data_Testing = as.numeric(Data_test[1:14]), # 14 data aktual
Forecast = as.numeric(forecast_14d$mean) # 14 forecast
)
print(tab)## # A tibble: 14 × 3
## Tanggal Data_Testing Forecast
## <date> <dbl> <dbl>
## 1 2026-01-01 6 9.00
## 2 2026-01-02 5 5.85
## 3 2026-01-03 5 5.89
## 4 2026-01-04 5 8.51
## 5 2026-01-05 5 5.80
## 6 2026-01-06 5 5.79
## 7 2026-01-07 6 8.53
## 8 2026-01-08 5 5.90
## 9 2026-01-09 6 5.90
## 10 2026-01-10 7 8.35
## 11 2026-01-11 5 5.91
## 12 2026-01-12 4 5.98
## 13 2026-01-13 6 8.27
## 14 2026-01-14 5 5.95
# Data untuk plot
df_plot <- data.frame(
Index = future_date, # tanggal 14 hari
Actual = as.numeric(Data_test[1:14]), # data aktual
Predicted = as.numeric(forecast_14d$mean) # data forecast
)Hasil peramalan 14 hari menunjukkan nilai prediksi berada pada kisaran 5,80–9,00, dengan nilai tertinggi 9,00 dan terendah 5,79. Dibandingkan data aktual yang berada pada rentang 4–7, model cenderung sedikit overestimate pada beberapa periode, tetapi tetap mampu mengikuti pola fluktuasi data secara umum.
Berdasarkan hasil visualisasi line chart, terlihat bahwa pola prediksi cenderung mengikuti fluktuasi data aktual pada data testing. Nilai hasil peramalan menunjukkan adanya pola naik–turun yang relatif konsisten, dengan nilai prediksi yang secara umum berada di sekitar rentang data aktual. Namun demikian, pada beberapa periode tertentu model menghasilkan nilai prediksi yang lebih tinggi dibandingkan data aktual, terutama ketika terjadi lonjakan nilai pada hasil forecast.
Grafik perbandingan antara data aktual dan prediksi menunjukkan bahwa model mampu menangkap arah pergerakan dan pola umum data, meskipun masih terdapat selisih yang cukup terlihat pada beberapa titik. Hal ini sejalan dengan nilai MAPE data testing (26.62 %) yang berada pada kategori sedang, sehingga dapat disimpulkan bahwa model ARIMA cukup baik dalam menggambarkan kecenderungan jangka pendek, namun akurasinya belum optimal untuk ketepatan prediksi pada setiap periode.
Berdasarkan hasil analisis deret waktu, konsentrasi PM2.5 harian di Kota Bandung tahun 2025 menggunakan metode ARIMA, diperoleh bahwa data awal bersifat tidak stasioner sehingga diperlukan proses differencing satu kali untuk memenuhi asumsi stasioneritas. Penentuan orde model dilakukan berdasarkan pola Autocorrelation Function (ACF), Partial Autocorrelation Function (PACF), serta kriteria pemilihan model terbaik menggunakan nilai Akaike Information Criterion (AIC).
Dari beberapa kandidat model yang diestimasi, model ARIMA(5,1,2) dipilih sebagai model terbaik karena memiliki nilai AIC terendah dan parameter yang signifikan secara statistik. Hasil uji diagnostik residual menunjukkan bahwa residual bersifat acak dan tidak mengandung autokorelasi, yang dibuktikan melalui uji Ljung–Box pada beberapa lag dengan nilai p-value lebih besar dari 0,05. Meskipun uji normalitas residual menunjukkan bahwa residual tidak berdistribusi normal, kondisi tersebut masih dapat ditoleransi karena asumsi utama ARIMA adalah residual bersifat white noise.
Evaluasi kinerja model menunjukkan bahwa nilai Mean Absolute Percentage Error (MAPE) pada data training sebesar 16,84% dan pada data testing sebesar 26,62%. Selain itu, nilai Mean Absolute Error (MAE) dan Root Mean Square Error (RMSE) pada data testing masing-masing sebesar 1,75 dan 2,06. Hasil ini menunjukkan bahwa model mampu menangkap pola utama pergerakan data PM2.5, namun tingkat akurasinya masih tergolong sedang.
Hasil peramalan menunjukkan bahwa konsentrasi PM2.5 yang diprediksi berada pada kisaran 5,80 hingga 9,00 µg/m³. Secara umum, nilai prediksi mengikuti kecenderungan data aktual, sehingga model ARIMA yang dibangun dapat digunakan untuk peramalan jangka pendek dan sebagai alat pendukung dalam memahami pola umum kualitas udara di Kota Bandung.
AQI Indonesia. (2025). Data kualitas udara Kota Bandung. Diakses dari https://www.aqi.in/id/dashboard/indonesia/bandung
Khusna, N. F., Aulia, S., Amaria, S., Rahmah, A., Sanmas, S. A., & Fauzi, F. (2023, November). Peramalan Kualitas Udara di Semarang Menggunakan Metode Autoregressive Integrated Moving Average (ARIMA). In Prosiding Seminar Nasional UNIMUS (Vol. 6).
Vatresia, A., Nafila, R., Agwil, W., Utama, F., & Shehab, M. (2025). Forecasting air quality index data with autoregressive integrated moving average models. EQA-International Journal of Environmental Quality, 65, 86-96.
Widiastuti, L., & Baihaqi, W. M. (2025). Penggunaan Machine Learning untuk Memprediksi Paparan PM2. 5 dan Dampaknya terhadap Kesehatan. Jurnal Ilmiah Sains dan Teknologi, 9(1), 53-65.