D. HASIL DAN PEMBAHASAN
Loading Libraries
Berikut adalah paket-paket yang
diperlukan dalam analisis ARIMA. Keterangan masing-masing
package dapat dipelajari secara mendalam dengan cara membuka
menu ‘Bantuan’ pada software RStudio dan memasukkan nama paket
yang diinginkan.
# Library
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
library(readxl)
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tseries)
library(lmtest)
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.4.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.2.0
## ✔ forcats 1.0.1 ✔ readr 2.1.6
## ✔ ggplot2 4.0.1 ✔ stringr 1.6.0
## ✔ lubridate 1.9.4 ✔ tibble 3.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(patchwork)
library(FitAR)
## Loading required package: lattice
## Loading required package: leaps
## Loading required package: ltsa
## Loading required package: bestglm
##
## Attaching package: 'FitAR'
##
## The following object is masked from 'package:forecast':
##
## BoxCox
# Pemasangan remotes package jika belum dipasang
# install.packages("remotes")
# Pemasangan FitAR package
# remotes::install_github("cran/FitAR")
1. Statistik Deskriptif
Statistik deskriptif seperti pada umumnya
memberikan informasi statistik dasar seperti nilai minimum serta
maksimum, rata-rata, median, dan sebagainya. Di sisi lain, pengimporan
data bisa melalui lokasi file atau menggunakan opsi ‘Import
Dataset’ di menu ‘File’ RStudio.
Catatan: kamu bisa mengganti inflasi
dengan hal lain atau kata kunci yang kompatibel dengan data kamu. Bagian
kode data$Inflation (%) juga dapat diubah dengan nama kolom
numerik data yang dipilih untuk dianalisis jikalau menggunakan data seri
waktu yang berbeda. Misalnya, data inflasi 2020-2025 kebetulan memiliki
nilai numerik atau inflasi di kolom bernama ‘Inflation (%)’.
# -- 1. Statistika Deskriptif
data <- read_excel("Bogor_Inflation_ARIMA_Syntax.xlsx")
Inflation = data$`Inflation (%)`
# View(data)
summary(data)
## Date Inflation (%)
## Min. :2020-01-01 00:00:00 Min. :-0.7300
## 1st Qu.:2021-06-23 12:00:00 1st Qu.: 0.0550
## Median :2022-12-16 12:00:00 Median : 0.2000
## Mean :2022-12-16 06:40:00 Mean : 0.2460
## 3rd Qu.:2024-06-08 12:00:00 3rd Qu.: 0.4425
## Max. :2025-12-01 00:00:00 Max. : 1.5400
# Plot Time Series
plot.ts(Inflation,
main= "Plot Time Series, Inflasi di Kota Bogor",
xlab= "Bulan")

2. Pembagian Data
Langkah kedua adalah pembagian data
inflasi menjadi bagian latih (training) dan uji
(testing). Tahapan ini tidak boleh dilewatkan apabila ingin
dilakukan tahapan forecasting dengan data inflasi. Hal ini
dikarenakan akan dilakukan prediksi untuk nilai-nilai inflasi mendatang
yang membutuhkan evaluasi dari dua hal yaitu data latih dan uji. Data
latih berguna sebagai identifikasi model ARIMA. Sedangkan, data uji
sebagai memvalidasi kemampuan model ARIMA tersebut dalam melakukan
prediksi. Perlu digaris bawahi, pembangkitan data tidak memerlukan
proses perhitungan nilai prediksi. Maka dari itu, pembagian data menjadi
opsional apabila hanya ingin membangkitkan data saja.
Pada umumnya pembagian data latih dan uji
menggunakan rasio 2:1. Oleh karena itu, data inflasi yang nantinya akan
diproses terbagi menjadi data latih yang dimulai dari tahun 2020 sampai
2023, sedangkan data uji menggunakan data inflasi tahun 2024-2025.
Catatan: Kamu bisa menyesuaikan periode
untuk data latih dan uji Jangan lupa juga untuk mengganti
Inflation (%) dengan nama kolom numerikmu.
# -- 2. Pembagian Data
train_data <- data[1:48, ] # 2020-2023
test_data <- data[49:72, ] # 2024-2025
test_data
## # A tibble: 24 × 2
## Date `Inflation (%)`
## <dttm> <dbl>
## 1 2024-01-01 00:00:00 0.06
## 2 2024-02-01 00:00:00 0.6
## 3 2024-03-01 00:00:00 0.45
## 4 2024-04-01 00:00:00 0.1
## 5 2024-05-01 00:00:00 -0.02
## 6 2024-06-01 00:00:00 -0.11
## 7 2024-07-01 00:00:00 -0.07
## 8 2024-08-01 00:00:00 0.04
## 9 2024-09-01 00:00:00 -0.14
## 10 2024-10-01 00:00:00 0.08
## # ℹ 14 more rows
# Pengambilan nilai numerik dari data
tr_ts <- ts(train_data$`Inflation (%)`,
start = c(2020, 1),
frequency = 12)
te_ts <- ts(test_data$`Inflation (%)`,
start = c(2024, 1),
frequency = 12)
tr_data <- train_data$`Inflation (%)`
tr_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2020 0.78 0.25 0.04 -0.02 0.01 0.27 -0.01 -0.16 0.11 0.13 0.32 0.44
## 2021 0.19 0.24 0.06 0.24 0.40 -0.17 0.07 0.08 -0.01 0.08 0.26 0.56
## 2022 0.53 0.13 0.97 0.68 0.55 0.75 0.55 -0.45 1.18 0.10 0.20 0.49
## 2023 0.61 0.36 0.15 0.32 0.22 0.18 0.24 -0.08 0.16 0.12 0.81 0.22
te_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2024 0.06 0.60 0.45 0.10 -0.02 -0.11 -0.07 0.04 -0.14 0.08 0.26 0.49
## 2025 -0.54 -0.73 1.54 1.07 -0.25 0.41 0.33 -0.15 0.20 0.42 0.06 0.46
tr_data
## [1] 0.78 0.25 0.04 -0.02 0.01 0.27 -0.01 -0.16 0.11 0.13 0.32 0.44
## [13] 0.19 0.24 0.06 0.24 0.40 -0.17 0.07 0.08 -0.01 0.08 0.26 0.56
## [25] 0.53 0.13 0.97 0.68 0.55 0.75 0.55 -0.45 1.18 0.10 0.20 0.49
## [37] 0.61 0.36 0.15 0.32 0.22 0.18 0.24 -0.08 0.16 0.12 0.81 0.22
3. Uji Stasioneritas
Dalam analisis ARIMA, diasumsikan adanya
tren dalam data deret waktu yang disebut non-stasioner. Data
non-stasioner perlu diubah menjadi stasioner, jika tidak, data akan
sulit diprediksi. Beruntungnya, bagian Integrated dalam model
ARIMA memungkinkan perubahan dari non-stasioner menjadi stasioner
melalui proses pembedaan atau differencing.
Namun, sebelum melakukan
differencing, perlu dilakukan pemeriksaan stasioneritas dalam
data deret waktu menggunakan Uji Augmented Dickey Fuller (ADF)
untuk menentukan apakah differencing diperlukan. Kriteria tolak
hipotesis nol atau data non-stasioner adalah p-value kurang
dari 0,05.
Catatan: Jika data kamu tidak stasioner
(nilai p >= 0,05), pergi ke langkah 4. Jika sudah stasioner sedari
awal, periksa grafik Partial Autocorrelation Function (PACF)
dan Autocorrelation Function (ACF). PACF dapat digunakan untuk
memeriksa berapa banyak komponen yang tersedia untuk model p dengan
melihat lag (garis) di luar interval kepercayaan (garis titik
biru). Grafik ACF serupa, tetapi untuk model q.
# -- 3. Uji Stasioneritas
adf.test(tr_data)
##
## Augmented Dickey-Fuller Test
##
## data: tr_data
## Dickey-Fuller = -2.2397, Lag order = 3, p-value = 0.4784
## alternative hypothesis: stationary
acf(tr_data, main = "ACF Plot")

pacf(tr_data, main = "PACF Plot")

4. Pembedaan (Differencing)
Perhatikan dengan seksama seberapa banyak
data perlu didiferensiasikan, karena total differencing akan
digunakan untuk menentukan nilai d pada model ARIMA (p,d,q). Lakukan
diferensiasi hingga data menjadi stasioner atau tolak hipotesis nol
(nilai p < 0,05) berdasarkan uji ADF.
Apabila telah didapatkan data deret waktu
stasioner, maka pemeriksaan grafik PACF dan ACF dapat dilakukan untuk
menentukan jumlah komponen untuk masing-masing parameter p dan q pada
model ARIMA.
Sebagai contoh, karena data inflasi di
Kota Bogor menjadi stasioner pada diferensiasi pertama, maka d = 1.
Sementara itu, berdasarkan grafik PACF dan ACF, kombinasi komponen yang
tersedia untuk model ARIMA data inflasi adalah p bernilai 0, 1, atau 2,
sedangkan q bernilai 0 atau 1. Kombinasi-kombinasi tersebut yang
selanjutnya akan dibandingkan untuk menemukan model ARIMA terbaik.
# -- 4. Pembedaan (Differencing)
diff1 = diff(tr_data)
adf.test(diff1)
## Warning in adf.test(diff1): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: diff1
## Dickey-Fuller = -4.3662, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
acf(diff1, main = "ACF Differencing 1")

pacf(diff1, main = "PACF Differencing 1")

# Differencing kedua
diff2 = diff(diff1) # <--- Hanya digunakan jika data belum stasioner
adf.test(diff2)
## Warning in adf.test(diff2): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: diff2
## Dickey-Fuller = -6.7663, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
acf(diff2, main = "ACF Differencing 2")

pacf(diff2, main = "PACF Differencing 2")

5. Menentukan Model ARIMA Terbaik
Model ARIMA terbaik untuk data inflasi
dapat diidentifikasi melalui nilai Akaike’s Information
Criteria (AIC), yang merupakan estimasi kesalahan prediksi. Lebih
lanjut, AIC merupakan cerminan kualitas relatif model statistik untuk
sekumpulan data tertentu yang dibandingkan oleh model-model ARIMA
lainnya. Model dengan nilai AIC terendah lebih diutamakan karena
memiliki kekuatan penjelas hubungan di dalam data deret waktu yang lebih
baik dibandingkan model ARIMA lainnya.
Catatan: Tambahkan label m
jika kamu masih memiliki kombinasi model lain dan ganti
best_model dengan model yang memiliki nilai AIC
terendah.
# -- 5.Penentuan Model ARIMA
m1 <- arima(tr_ts, order = c(0,1,0))
m2 <- arima(tr_ts, order = c(0,1,1))
m3 <- arima(tr_ts, order = c(1,1,0))
m4 <- arima(tr_ts, order = c(1,1,1))
m5 <- arima(tr_ts, order = c(2,1,0))
m6 <- arima(tr_ts, order = c(2,1,1))
aic <- data.frame(Name = c("m1", "m2", "m3", "m4", "m5", "m6"),
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)"),
AIC = c(m1$aic,
m2$aic,
m3$aic,
m4$aic,
m5$aic,
m6$aic))
aic
## Name Model AIC
## 1 m1 ARIMA (0,1,0) 54.52956
## 2 m2 ARIMA (0,1,1) 29.91778
## 3 m3 ARIMA (1,1,0) 39.20062
## 4 m4 ARIMA (1,1,1) 31.55783
## 5 m5 ARIMA (2,1,0) 32.08784
## 6 m6 ARIMA (2,1,1) 32.98561
best_model <- m2
best_model <- arima(tr_ts, order = c(0,1,1), include.mean = FALSE)
6. Properti Statistik untuk Validasi Model
Setelah mengidentifikasi model ARIMA
terbaik untuk data inflasi, perlu dilakukan pemeriksaan menggunakan
beberapa uji statistik untuk memastikan kemampuannya dalam memprediksi
nilai periode mendatang. Berikut adalah uji yang digunakan untuk
memvalidasi model ARIMA.
1. Uji Z: Pengujian Z terkait tes
signifikansi perbedaan antara menggunakan model ARIMA dan tidak
menggunakan model ARIMA sama sekali untuk menjelaskan variabel deret
waktu. Selain itu, melalui uji Z, koefisien parameter untuk model ARIMA
dapat diestimasi. (Hasil yang diinginkan, nilai p < 0,05)
# -- 6.Signifikansi Model ARIMA (z-test)
coeftest(best_model)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.87308 0.11830 -7.3804 1.578e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Didapatkan nilai estimasi parameter q
atau Moving Average adalah -0.87308 dan berbeda secara nyata.
Dalam kata lain, terdapat perbedaan besar apabila digunakannya model
ARIMA dibandingkan dengan tidak menggunakan model ARIMA untuk
menjelaskan nilai-nilai pada data deret waktu. Karena data inflasi
menggunakan (0,1,1) untuk model ARIMA, estimasi koefisien MA(1)
didapatkan sebesar -0.87308 dengan AR(0), maka model ARIMA dapat dibuat
sebagai persamaan dibawah.
Gambar 3. Persamaan Model ARIMA (0,1,1)
Menggunakan Data Inflasi Kota Bogor 2020-2023
Catatan: Jika kamu memiliki model ARIMA
(2,1,1), kamu akan melihat 2 nilai AR dan 1 nilai MA.
2. Uji Ljung-Box: Dalam deret
waktu, sebagian besar galat (error) dalam model harus telah
ditangkap, meninggalkan hanya keacakan murni untuk galatnya. Dalam
statistik, galat tersebut bersifat white noise. (Hasil yang
diinginkan, nilai p > 0,05)
# -- 7. Uji Galat White Noise
res1 = best_model$residuals
acf(res1)

pacf(res1)

checkresiduals(best_model)

##
## Ljung-Box test
##
## data: Residuals from ARIMA(0,1,1)
## Q* = 7.6004, df = 9, p-value = 0.5749
##
## Model df: 1. Total lags used: 10
Sebagian besar galat sudah terjelaskan
oleh model ARIMA (0,1,1) sesuai dengan hasil dari uji
Ljung-Box. Galat yang tersisa adalah murni keacakan.
3. Uji Box-Ljung: Uji
autokorelasi untuk melihat apakah ada autokorelasi yang tersisa pada
galat model ARIMA. (Hasil yang diinginkan, nilai p > 0,05, tidak ada
autokorelasi)
# -- 8. Uji Autokorelasi
Box.test(res1, lag = 23, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: res1
## X-squared = 18.084, df = 23, p-value = 0.7529
Pemeriksaan autokorelasi pada galat
melalui uji Box-Ljung menampilkan tidak adanya kejadian
autokorelasi antar galat pada data deret waktu inflasi.
4. Uji Kolmogorov-Smirnov: Galat
model ARIMA harus berdistribusi secara normal atau mengikuti distribusi
normal. (Hasil yang diinginkan, nilai p > 0,05)
# -- 9. Uji Normalitas (Kolmogorov-Smirnov)
ks.test(res1, "pnorm", mean(res1), sd(res1))
##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: res1
## D = 0.096765, p-value = 0.7233
## alternative hypothesis: two-sided
Galat pada data latih inflasi telah
berdistribusi normal melalui pengujian normalitas,
Kolmogorov-Smirnov.
7. Nilai Kecocokan dan Prediksi Data
Tujuan utama dilakukannya analisis deret
waktu adalah prediksi nilai-nilai lanjutan atau inflasi tahun 2026 untuk
topik analisis yang dicontohkan kali ini. Sebelum memulai prediksi nilai
inflasi untuk bulan-bulan pada tahun 2026, data latih terlebih dahulu
dicari nilai kecocokannya untuk melihat keakuratan model ARIMA
(0,1,1).
Catatan: Pada bagian
Tanggal = train_data$Date, sesuaikan dengan nama kolom yang
berisi tanggal pada data deret waktu.
# -- 10. Hasil Kecocokan Data Latih dan Uji
# a. Prediksi Data Latih
Kecocokan_DataLatih <- fitted(best_model)
Prediksi_DataLatih <- data.frame(
Tanggal = train_data$Date,
Actual = tr_data,
Fitted = as.numeric(Kecocokan_DataLatih),
Residuals = as.numeric(tr_data) - as.numeric(Kecocokan_DataLatih)
)
print(Prediksi_DataLatih)
## Tanggal Actual Fitted Residuals
## 1 2020-01-01 0.78 0.7792200 0.0007799993
## 2 2020-02-01 0.25 0.6492439 -0.3992439296
## 3 2020-03-01 0.04 0.4498192 -0.4098192299
## 4 2020-04-01 -0.02 0.3195846 -0.3395845620
## 5 2020-05-01 0.01 0.2384544 -0.2284543993
## 6 2020-06-01 0.27 0.2011529 0.0688471092
## 7 2020-07-01 -0.01 0.2060443 -0.2160442681
## 8 2020-08-01 -0.16 0.1666228 -0.3266228163
## 9 2020-09-01 0.11 0.1192491 -0.0092490734
## 10 2020-10-01 0.13 0.1180885 0.0119115225
## 11 2020-11-01 0.32 0.1213837 0.1986163402
## 12 2020-12-01 0.44 0.1498632 0.2901367503
## 13 2021-01-01 0.19 0.1882804 0.0017196401
## 14 2021-02-01 0.24 0.1886897 0.0513102774
## 15 2021-03-01 0.06 0.1949953 -0.1349952872
## 16 2021-04-01 0.24 0.1776715 0.0623285022
## 17 2021-05-01 0.40 0.1860284 0.2139716092
## 18 2021-06-01 -0.17 0.2130211 -0.3830210940
## 19 2021-07-01 0.07 0.1639280 -0.0939279676
## 20 2021-08-01 0.08 0.1518836 -0.0718835581
## 21 2021-09-01 -0.01 0.1426374 -0.1526373553
## 22 2021-10-01 0.08 0.1231784 -0.0431783703
## 23 2021-11-01 0.26 0.1177266 0.1422734319
## 24 2021-12-01 0.56 0.1359191 0.4240808925
## 25 2022-01-01 0.53 0.1898871 0.3401129124
## 26 2022-02-01 0.13 0.2330911 -0.1030911051
## 27 2022-03-01 0.97 0.2200720 0.7499280244
## 28 2022-04-01 0.68 0.3153448 0.3646552172
## 29 2022-05-01 0.55 0.3616611 0.1883388594
## 30 2022-06-01 0.75 0.3855905 0.3644094832
## 31 2022-07-01 0.55 0.4318581 0.1181418552
## 32 2022-08-01 -0.45 0.4468321 -0.8968320892
## 33 2022-09-01 1.18 0.3330068 0.8469931991
## 34 2022-10-01 0.10 0.4405128 -0.3405127913
## 35 2022-11-01 0.20 0.3972897 -0.1972896735
## 36 2022-12-01 0.49 0.3722496 0.1177503573
## 37 2023-01-01 0.61 0.3871964 0.2228036167
## 38 2023-02-01 0.36 0.4154746 -0.0554745921
## 39 2023-03-01 0.15 0.4084328 -0.2584327522
## 40 2023-04-01 0.32 0.3756326 -0.0556326389
## 41 2023-05-01 0.22 0.3685715 -0.1485715228
## 42 2023-06-01 0.18 0.3497149 -0.1697149377
## 43 2023-07-01 0.24 0.3281751 -0.0881751481
## 44 2023-08-01 -0.08 0.3169839 -0.3969838723
## 45 2023-09-01 0.16 0.2666001 -0.1066001308
## 46 2023-10-01 0.12 0.2530708 -0.1330707981
## 47 2023-11-01 0.81 0.2361823 0.5738177264
## 48 2023-12-01 0.22 0.3090087 -0.0890086888
Di samping itu, data uji akan dicari
nilai prediksinya menggunakan model ARIMA (0,1,1) yang dimana hanya
bergantung kepada galat periode sebelumnya karena nilai AR(0). Sebagai
tambahan, nilai prediksi data uji juga dapat dicari dengan taraf
kepercayaan 80% dan 95% untuk melihat jangkauan prediksi data uji.
Catatan: h_periode akan
menunjukkan banyaknya bulan yang akan diestimasi nilai prediksinya untuk
data uji. Maka dari itu, jumlahnya akan berbeda apabila data digunakan
juga berbeda. Sama seperti data latih,
Tanggal = test_data$Date dapat disesuaikan dengan nama
kolom yang berisi tanggal pada data deret waktu.
# b. Prediksi Data Uji
h_periode <- length(te_ts) # 24 bulan (2024-2025)
prediksi_datauji <- forecast(best_model, h = h_periode)
forecast_test_table <- data.frame(
Tanggal = test_data$`Date`,
Nilai_Asli = as.numeric(te_ts),
Prediksi = as.numeric(prediksi_datauji$mean),
Lower_80 = as.numeric(prediksi_datauji$lower[,1]),
Upper_80 = as.numeric(prediksi_datauji$upper[,1]),
Lower_95 = as.numeric(prediksi_datauji$lower[,2]),
Upper_95 = as.numeric(prediksi_datauji$upper[,2])
)
print(forecast_test_table)
## Tanggal Nilai_Asli Prediksi Lower_80 Upper_80 Lower_95 Upper_95
## 1 2024-01-01 0.06 0.2977121 -0.1046394 0.7000636 -0.3176314 0.9130556
## 2 2024-02-01 0.60 0.2977121 -0.1078669 0.7032911 -0.3225674 0.9179916
## 3 2024-03-01 0.45 0.2977121 -0.1110689 0.7064931 -0.3274645 0.9228887
## 4 2024-04-01 0.10 0.2977121 -0.1142460 0.7096702 -0.3323235 0.9277477
## 5 2024-05-01 -0.02 0.2977121 -0.1173988 0.7128230 -0.3371453 0.9325695
## 6 2024-06-01 -0.11 0.2977121 -0.1205278 0.7159521 -0.3419307 0.9373549
## 7 2024-07-01 -0.07 0.2977121 -0.1236337 0.7190579 -0.3466806 0.9421048
## 8 2024-08-01 0.04 0.2977121 -0.1267167 0.7221409 -0.3513958 0.9468200
## 9 2024-09-01 -0.14 0.2977121 -0.1297776 0.7252018 -0.3560769 0.9515011
## 10 2024-10-01 0.08 0.2977121 -0.1328166 0.7282408 -0.3607248 0.9561490
## 11 2024-11-01 0.26 0.2977121 -0.1358344 0.7312586 -0.3653401 0.9607643
## 12 2024-12-01 0.49 0.2977121 -0.1388313 0.7342555 -0.3699235 0.9653477
## 13 2025-01-01 -0.54 0.2977121 -0.1418078 0.7372320 -0.3744756 0.9698998
## 14 2025-02-01 -0.73 0.2977121 -0.1447643 0.7401885 -0.3789971 0.9744213
## 15 2025-03-01 1.54 0.2977121 -0.1477011 0.7431253 -0.3834886 0.9789128
## 16 2025-04-01 1.07 0.2977121 -0.1506187 0.7460429 -0.3879507 0.9833749
## 17 2025-05-01 -0.25 0.2977121 -0.1535174 0.7489416 -0.3923839 0.9878081
## 18 2025-06-01 0.41 0.2977121 -0.1563977 0.7518219 -0.3967889 0.9922131
## 19 2025-07-01 0.33 0.2977121 -0.1592598 0.7546840 -0.4011660 0.9965902
## 20 2025-08-01 -0.15 0.2977121 -0.1621040 0.7575282 -0.4055160 1.0009402
## 21 2025-09-01 0.20 0.2977121 -0.1649308 0.7603550 -0.4098391 1.0052634
## 22 2025-10-01 0.42 0.2977121 -0.1677404 0.7631646 -0.4141361 1.0095603
## 23 2025-11-01 0.06 0.2977121 -0.1705332 0.7659574 -0.4184072 1.0138314
## 24 2025-12-01 0.46 0.2977121 -0.1733093 0.7687336 -0.4226530 1.0180772
Nilai prediksi untuk data uji diketahui
konstan dikarenakan digunakannya nilai rataan untuk mengestimasi nilai
inflasi tahun 2024 sampai 2025.
Yang tertera selanjutnya adalah line
chart untuk perbandingan data deret waktu aktual (asli) dengan
nilai estimasi prediksi menggunakan model ARIMA (0,1,1) untuk data latih
dan uji.
Catatan: Penamaan judul, garis x dan y
dari grafik dapat diubah sesuai dengan topik data yang dipakai.
Pewarnaan sebagai pembeda nilai aktual dan prediksi atau kecocokan dapat
disesuaikan juga. Tambahan, deskripsi warna garis juga bisa diubah
sesuai dengan warna yang digunakan sebelumnya. Di samping itu,
plot data latih dan uji bisa disesuaikan waktu mulai data deret
waktu pada bagian start = c(2020, 1).
# Visualisasi Data Deret Waktu
# Plot Data Latih
plot(tr_ts, main = "Data Latih: Aktual vs Kecocokan",
ylab = "Inflasi", xlab = "Bulan", col = "blue")
lines(Kecocokan_DataLatih, col = "red", lwd = 2)
legend("topleft", legend = c("Aktual", "Kecocokan"),
col = c("blue", "red"), lty = 1)

# Plot Data Latih dan Uji
plot(ts(c(tr_ts, te_ts), start = c(2020, 1), frequency = 12),
main = "Data Inflasi: Aktual vs Prediksi",
ylab = "Inflasi", xlab = "Bulan", col = "blue")
lines(ts(c(Prediksi_DataLatih$Fitted, prediksi_datauji$mean),
start = c(2020, 1), frequency = 12),
col = "red", lwd = 2)
abline(v = 2024, col = "gray", lty = 2)
legend("topleft", legend = c("Aktual", "Prediksi"),
col = c("blue", "red"), lty = 1)

8. Uji Kemampuan Prediksi Model ARIMA
Model ARIMA dapat dievaluasi melalui
nilai galatnya atau seberapa melesetnya nilai perkiraan dari nilai
aktual. Kedua data baik latih dan uji dapat dilakukan pencarian nilai
Mean Absolute Percentage Error (MAPE) dan Root Mean Square
Error (RMSE) sebagai penentu kemampuan model dalam pengestimasian
nilai mendatang.
# -- 11. Uji Kemampuan Prediksi Model ARIMA
# a. Menghitung Nilai MAPE
# MAPE Data Latih
train_pred <- fitted(best_model)
actual_train <- as.numeric(tr_data)
pred_train <- as.numeric(train_pred)
mape_train <- mean(abs((actual_train - pred_train) / actual_train)) *100
cat("\nMAPE Data Latih:", round(mape_train, 2), "%\n")
##
## MAPE Data Latih: 260.99 %
# MAPE Data Uji
actual_test <- as.numeric(test_data$`Inflation (%)`)
pred_test <- as.numeric(prediksi_datauji$mean)
mape_test <- mean(abs((actual_test - pred_test) / actual_test)) *100
cat("MAPE Data Uji:", round(mape_test, 2), "%\n")
## MAPE Data Uji: 248.27 %
# b. Perhitungan Nilai RMSE
rmse_train <- sqrt(mean((actual_train - pred_train)^2))
rmse_test <- sqrt(mean((actual_test - pred_test)^2))
cat("\nNilai RMSE Data Latih:", round(rmse_train, 2))
##
## Nilai RMSE Data Latih: 0.31
cat("\nNilai RMSE Data Uji:", round(rmse_test, 2))
##
## Nilai RMSE Data Uji: 0.48
train_pred <- as.numeric(fitted(best_model))
actual_train <- as.numeric(tr_data)
valid_idx <- !is.na(train_pred) & actual_train != 0
mape_train <- mean(
abs((actual_train[valid_idx] - train_pred[valid_idx]) /
actual_train[valid_idx])
) * 100
Penentuan kriteria kebaikan model ARIMA
dalam prediksi menggunakan acuan MAPE dapat dilakukan melalui kategori
seperti di bawah yang diambil dari artikel berjudul
Using the R-MAPE
index as a resistant measure of forecast accuracy (Montaño Moreno et al.,
2013) yang juga mengambil dari artikel
Industrial and
business forecasting methods (Meade, 1983).
Gambar 4. Interpretasi Nilai MAPE
Berdasarkan nilai yang didapatkan dari
perhitungan MAPE dan dibandingkan dengan interpretasi nilai MAPE,
diketahui analisis ARIMA terbukti tidak dapat secara akurat memprediksi
nilai mendatang dikarenakan nilai galatnya yang besar. Nilai-nilai
prediksi inflasi yang dihasilkan oleh model ARIMA tidak dapat digunakan
untuk penentuan rumus dan kalkulasi finansial yang membutuhkan nilai
inflasi karena nilai estimasinya yang meleset jauh.
Walaupun setelah proses pemeriksaan
properti statistik seperti galat
white noise, autokorelasi,
normalitas model ARIMA (0,1,1) terbukti memenuhi semua asumsi, akan
tetapi hal tersebut tidak menjamin keakuratan kemampuan model ARIMA
dalam prediksi. Hal ini dapat dibuktikan melalui nilai MAPE yang sangat
besar pada kedua data, latih dan uji. Menurut
Simon Stevenson
(2007), “Akurasi prediksi pada model tidak dapat ditetapkan hanya dengan
menggunakan nilai kecocokan data latih, dan pengukuran diagnostik galat
tidak dapat memberikan gambaran kebaikan performa prediksi.”
(Stevenson, 2007).
Adapula, “
Out-of-sample testing merupakan hal penting karena
uji diagnosa galat tidak menjamin keakuratan prediksi model deret waktu
ekonomi.”
(Tashman,
2000). Maka dari itu, analisis deret waktu lainnya seperti
ARIMAX, SARIMA, GARCH, atau semacamnya sangat direkomendasikan.
9. Perhitungan Prediksi Tahun 2026
Walaupun model ARIMA (0,1,1) tidak dapat
diandalkan untuk memprediksi nilai inflasi Kota Bogor untuk tahun 2026,
estimasi nilai untuk bulan-bulan pada tahun 2026 masih dapat dilakukan
sebagai percontohan saja. Seperti pada prediksi data uji, nilai prediksi
inflasi pada bulan-bulan tahun 2026 juga konstan karena menggunakan
nilai rataan untuk pengestimasian dan sangat bergantung kepada nilai
historis.
# -- 12. Prediksi Nilai Mendatang Menggunakan Model ARIMA
full_ts <- ts(
data$`Inflation (%)`,
start = c(2020, 1),
frequency = 12
)
final_model <- arima(full_ts, order = c(0,1,1))
forecast_2026 <- forecast(final_model, h = 12)
inflation_2026 <- window(
forecast_2026$mean,
start = c(2026, 1),
end = c(2026, 12)
)
lower_95_2026 <- window(forecast_2026$lower[,2],
start = c(2026,1),
end = c(2026,12))
upper_95_2026 <- window(forecast_2026$upper[,2],
start = c(2026,1),
end = c(2026,12))
month_2026 <- seq.Date(
from = as.Date("2026-01-01"),
to = as.Date("2026-12-01"),
by = "month"
)
forecast_2026_table <- data.frame(
Month = format(month_2026, "%B %Y"),
Forecast = as.numeric(inflation_2026),
Lower_95 = as.numeric(lower_95_2026),
Upper_95 = as.numeric(upper_95_2026)
)
forecast_2026_table
## Month Forecast Lower_95 Upper_95
## 1 January 2026 0.2459722 -0.4878389 0.9797833
## 2 February 2026 0.2459722 -0.4878389 0.9797833
## 3 March 2026 0.2459722 -0.4878389 0.9797833
## 4 April 2026 0.2459722 -0.4878389 0.9797833
## 5 May 2026 0.2459722 -0.4878389 0.9797833
## 6 June 2026 0.2459722 -0.4878389 0.9797833
## 7 July 2026 0.2459722 -0.4878389 0.9797833
## 8 August 2026 0.2459722 -0.4878389 0.9797833
## 9 September 2026 0.2459722 -0.4878389 0.9797833
## 10 October 2026 0.2459722 -0.4878389 0.9797833
## 11 November 2026 0.2459722 -0.4878389 0.9797833
## 12 December 2026 0.2459722 -0.4878389 0.9797833
SIMULASI PEMBANGKITAN DATA ACAK
Setelah menemukan model ARIMA optimal
yaitu (0,1,1) dan koefisien estimasi untuk MA(1) sebesar -0.87308
menggunakan data inflasi Kota Bogor, simulasi ARIMA melalui variabel
acak dapat dilakukan.
Pertanyaan utama: “Apakah variabel acak
yang secara sengaja disesuaikan untuk menggunakan model ARIMA (0,1,1)
akan lolos validasi statistik, menghasilkan hasil serupa, dan memiliki
nilai koefisien parameter yang hampir sama?”.
1. Libraries dan Pembangkitan Data Acak
Libraries yang digunakan dalam
pembangkitan data acak melalui analisis deret waktu ARIMA yaitu
tseries dan forecast. Data dibangkitkan secara
acak dengan fungsi pada RStudio yaitu set.seed yang jumlah
sampelnya disamakan dengan data inflasi Kota Bogor. Walaupun data
inflasi sebelumnya dibagi menjadi data latih dan uji yang masing-masing
berjumlah 48 and 24, pembangkitan data acak melalui model ARIMA akan
menggunakan semua data. Data inflasi pada tahun 2020-2025 akan
diperlakukan seperti data latih untuk mencari model ARIMA terbaik dan
nilai estimasi parameternya.
Catatan: nilai n bisa diatur
sesuai total sampel pada data yang digunakan sebelumnya jika data yang
digunakan berbeda. Tambahan,
model = list(order = c(0,1,1), ma = -0.87308) dapat diubah
dengan model terbaik yang telah diidentifikasi sebelumnya beserta nilai
parameternya. Apabila ada tambahan model AR maka bisa ditambahkan
seperti (order = c(), ar = , ma = ). Apabila bertemu dengan
skenario dimana ada 2 atau lebih parameter pada salah satu model AR atau
MA maka pada bagian fungsi arima.sim diubah seperti
model = list(order = c(1, 0, 2), ar = 0.6, ma = c(0.4, -0.2).
# ----- Simulasi Model ARIMA ----- #
# -- 1. Library dan set.seed
set.seed(123)
# Load library
library(tseries)
library(forecast)
# -- 2. Membangkitkan data dengan deret waktu
set.seed(123)
n <- 72
arima_data <- arima.sim(
n = n,
model = list(order = c(0,1,1), ma = -0.87308)
)
ts.plot(arima_data, main = "Simulasi Data Acak melalui Model ARIMA(0,1,1)")

2. Uji Stasioneritas dan Pembedaan (Differencing)
Data acak yang dihasilkan dan mengikuti
model ARIMA (0,1,1) juga diuji kestabilannya menggunakan uji ADF. Karena
data inflasi memiliki pembedaan sekali dari analisis ARIMA sebelumnya,
data acak yang dihasilkan juga diharapkan memiliki d = 1.
Catatan: Apabila diperlukan pembedaan
lebih dari sekali, maka syntax dan prosesnya sama seperti pada
analisis ARIMA dengan data inflasi Kota Bogor.
# 3. Uji Stasioneritas
# ARIMA Model (0,1,1)
adf.test(arima_data)
##
## Augmented Dickey-Fuller Test
##
## data: arima_data
## Dickey-Fuller = -3.3232, Lag order = 4, p-value = 0.07488
## alternative hypothesis: stationary
# 4. Pembedaan (Differencing):
diff_arima <- diff(arima_data)
adf.test(diff_arima)
## Warning in adf.test(diff_arima): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: diff_arima
## Dickey-Fuller = -5.5524, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
3. Identifikasi Komponen yang Tersedia (Plot PACF dan ACF)
Prosedur yang sama seperti analisis ARIMA
dengan data kasus nyata, grafik PACF dan ACF tetap menjadi acuan untuk
menentukan berapa banyak kombinasi komponen yang mungkin ada untuk
variabel acak yang telah dibangkitkan.
Catatan: Silakan ganti
diff_arima dalam fungsi acf maupun
pacf jika data yang dihasilkan sudah stasioner tanpa
diferensiasi, atau sesuaikan jika data sintetis memerlukan diferensiasi
kedua.
# 4. Identifikasi Komponen pada Model (Plot PACF and ACF)
# ARIMA (0,1,1)
acf(diff_arima, main = "ACF Diff ARIMA")

pacf(diff_arima, main = "PACF Diff ARIMA")

Didapatkan hasil yang serupa pada grafik
PACF dan ACF seperti data inflasi. Variabel acak juga memiliki komponen
AR dari lag 0, 1, dan 2. Sementara itu, MA memiliki komponen 0 dan 1
berdasarkan lag pada grafik ACF.
4. Model ARIMA Terbaik dan Estimasi Parameter
Lanjut ke tahap estimasi parameter, model
ARIMA terbaik yang diharapkan memiliki nilai AIC terendah adalah (0,1,1)
karena data acak yang dihasilkan telah sengaja dibuat untuk mengikuti
model ARIMA (0,1,1).
Catatan: Tambahkan
model_arima(i) apabila masih ada kombinasi komponen ARIMA
yang tersedia.
# 5. Estimasi Parameter
model_arima1 <- arima(arima_data, order = c(0,1,0))
summary(model_arima1)
##
## Call:
## arima(x = arima_data, order = c(0, 1, 0))
##
##
## sigma^2 estimated as 1.587: log likelihood = -118.78, aic = 239.56
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.0255715 1.250916 0.9386733 115.7181 201.828 0.9863014 -0.4201902
model_arima2 <- arima(arima_data, order = c(0,1,1))
summary(model_arima2)
##
## Call:
## arima(x = arima_data, order = c(0, 1, 1))
##
## Coefficients:
## ma1
## -1.0000
## s.e. 0.0976
##
## sigma^2 estimated as 0.82: log likelihood = -97.16, aic = 198.33
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.05675787 0.8992967 0.7011173 133.8509 208.4922 0.7366918
## ACF1
## Training set 0.02633631
model_arima3 <- arima(arima_data, order = c(1,1,0))
summary(model_arima3)
##
## Call:
## arima(x = arima_data, order = c(1, 1, 0))
##
## Coefficients:
## ar1
## -0.4502
## s.e. 0.1093
##
## sigma^2 estimated as 1.282: log likelihood = -111.22, aic = 226.43
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.01806796 1.124399 0.8262641 118.8464 197.6234 0.8681886
## ACF1
## Training set -0.2081765
model_arima4 <- arima(arima_data, order = c(1,1,1))
summary(model_arima4)
##
## Call:
## arima(x = arima_data, order = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1
## 0.0323 -1.0000
## s.e. 0.1197 0.0832
##
## sigma^2 estimated as 0.8199: log likelihood = -97.13, aic = 200.25
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.0567908 0.8992398 0.7008011 133.258 206.5874 0.7363597
## ACF1
## Training set -0.002500588
model_arima5 <- arima(arima_data, order = c(2,1,0))
summary(model_arima5)
##
## Call:
## arima(x = arima_data, order = c(2, 1, 0))
##
## Coefficients:
## ar1 ar2
## -0.6562 -0.4971
## s.e. 0.1062 0.1076
##
## sigma^2 estimated as 0.986: log likelihood = -102.05, aic = 210.09
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.01517806 0.9861612 0.753255 114.7411 215.2864 0.7914751
## ACF1
## Training set -0.06176894
model_arima6 <- arima(arima_data, order = c(2,1,1))
summary(model_arima6)
##
## Call:
## arima(x = arima_data, order = c(2, 1, 1))
##
## Coefficients:
## ar1 ar2 ma1
## 0.0350 -0.0906 -0.9957
## s.e. 0.1222 0.1283 0.3494
##
## sigma^2 estimated as 0.815: log likelihood = -96.86, aic = 201.72
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.05587593 0.8965614 0.7019212 134.5126 209.5901 0.7375365
## ACF1
## Training set 0.01074868
Berdasarkan hasil analisis, model ARIMA
(0,1,1) ternyata memiliki nilai AIC terendah. Hal ini selaras dengan
kesimpulan analisis model terbaik ARIMA menggunakan data inflasi. Selain
itu, koefisien MA(1) dari variabel acak yang dibangkitkan menunjukkan
nilai yang hampir identik (mendekati nilai -1) dengan estimasi koefisien
dari data inflasi (-0.87308). Meskipun demikian, nilai estimasi
parameter q pada data bangkitan acak mengindikasikan kemampuan model
ARIMA yang lemah dalam memprediksi nilai mendatang.
Sayangnya, karena data yang digunakan
khusus mengenai inflasi di Kota Bogor, maka diasumsikan model ARIMA
(0,1,1) atau analisis ARIMA mungkin tidak cocok untuk sebagian besar
data time series lainnya yang berhubungan dengan inflasi.
Ditambah lagi, model ARIMA (0,1,1) tidak dapat diandalkan untuk
memprediksi nilai periode mendatang untuk data time series yang
berkaitan dengan inflasi. Jangankan untuk generalisasi terhadap data
deret waktu secara luas, model ARIMA (0,1,1) saja menghasilkan
memprediksi yang meleset jauh. Mungkin, model ARIMA (0,1,1) cocok
digunakan untuk beberapa kasus data deret waktu lainnya, akan tetapi
analisis pencarian model ARIMA atau analisis deret waktu terbaik
disarankan karena dikhawatirkan terdapat model atau analisis yang lebih
optimal.
5. Uji Diagnostik Galat
Langkah akhir untuk memvalidasi model
ARIMA (0,1,1) untuk variabel acak yang dibangkitkan adalah analisis
galat. Galat pada grafik ACF diharapkan tetap berada dalam interval
kepercayaan kecuali lag 0, tentu saja. Di samping itu, uji autokorelasi
juga dilakukan untuk memastikan galat tidak memiliki autokorelasi
melalui uji Box-Ljung. Hasil yang diinginkan adalah nilai p
lebih besar dari 0,05.
Catatan: Kamu dapat mengganti
model_arima2 dengan model ARIMA terbaik sebelumnya yang
memiliki nilai AIC terendah dari data sintetis.
# -- 6. Uji Diagnosa Galat
# Residual Plot
ts.plot(residuals(model_arima2), main = "Galat ARIMA")

# Galat ACF
acf(residuals(model_arima2), main = "ACF Galat ARIMA")

# Uji Autokorelasi
Box.test(
residuals(model_arima2),
lag = 2,
type = "Ljung-Box"
)
##
## Box-Ljung test
##
## data: residuals(model_arima2)
## X-squared = 0.53647, df = 2, p-value = 0.7647
Diketahui dari hasil analisis uji galat
bahwa data bangkitan acak juga memiliki karakteristik yang sama dengan
data asli. Keduanya memenuhi asumsi pengujian galat acak atau white
noise, akan tetapi, keduanya juga memiliki performa yang buruk
dalam memprediksi nilai-nilai selanjutnya dengan pemodelan ARIMA.