Sektor industri pengolahan merupakan salah satu sektor yang memiliki peran dalam mendukung pertumbuhan ekonomi nasional. Sektor ini memberikan kontribusi dalam meningkatkan nilai tambah produk, memperluas peluang kerja, serta mendorong perkembangan kegiatan ekonomi di berbagai daerah. Salah satu subsektor yang cukup signifikan dalam industri pengolahan adalah industri makanan. Untuk memantau perkembangan aktivitas produksi pada sektor ini, Badan Pusat Statistik (BPS) menyediakan indikator statistik berupa Indeks Produksi Bulanan untuk Industri Besar dan Sedang (IBS). Indeks ini menunjukkan perubahan tingkat produksi industri dari waktu ke waktu berdasarkan klasifikasi lapangan usaha yang mengacu pada Klasifikasi Baku Lapangan Usaha Indonesia (KBLI).
Indeks Produksi Bulanan untuk Industri Besar dan Sedang pada sektor
makanan mencerminkan kondisi dan dinamika aktivitas produksi makanan
dalam suatu periode tertentu. Perubahan nilai indeks produksi tersebut
dapat dipengaruhi oleh beragam faktor, seperti tingkat permintaan pasar,
keadaan ekonomi, kebijakan pemerintah, serta adanya pola musiman dalam
kegiatan produksi. Oleh karena itu, analisis terhadap data indeks
produksi sangat penting untuk memahami pola pergerakan produksi serta
meramalkan kemungkinan perkembangan produksi di masa mendatang.
Salah satu teknik yang dapat digunakan dalam menganalisis data runtun
waktu adalah metode Autoregressive Integrated Moving Average (ARIMA).
Metode ARIMA adalah pendekatan statistik yang dapat memodelkan hubungan
antara nilai suatu variabel dengan nilai variabel tersebut pada periode
sebelumnya. Teknik ini banyak diterapkan dalam analisis runtun waktu
karena dapat menggambarkan pola data dan menghasilkan model yang dapat
digunakan untuk melakukan peramalan. Proses pemodelan dengan metode
ARIMA umumnya memiliki beberapa tahap, yaitu identifikasi model,
pengujian stasioneritas data, estimasi parameter model, serta evaluasi
model melalui pengujian diagnostik.
Berdasarkan hal tersebut, penelitian ini dilakukan untuk menganalisis
pola pergerakan Indeks Produksi Bulanan untuk Industri Besar dan Sedang
sektor makanan menurut KBLI pada periode tahun 2020 hingga 2024. Selain
itu, penelitian ini juga bertujuan untuk membangun model runtun waktu
menggunakan metode ARIMA yang dapat digunakan untuk menggambarkan
karakteristik data serta melakukan peramalan terhadap nilai produksi
pada periode mendatang. Hasil analisis diharapkan dapat memberikan
gambaran mengenai perkembangan produksi industri makanan serta menjadi
salah satu referensi dalam memahami dinamika sektor industri pengolahan
di Indonesia.
Tujuan dari analisis ini adalah:
Data yang digunakan dalam penelitian ini merupakan data sekunder yang diperoleh dari publikasi resmi Badan Pusat Statistik (BPS), yaitu Indeks Produksi Bulanan Industri Besar dan Sedang (IBS) sektor makanan menurut KBLI dengan periode Januari 2020 sampai Desember 2024.
file_path <- "/Users/kai/Documents/produksi makanan .xlsx"
raw <- read_excel(file_path, sheet = "Data Produksi Makanan")
head(raw, 10)
## # A tibble: 10 × 3
## No Periode `Data Produksi Makanan`
## <dbl> <chr> <dbl>
## 1 1 Januari 2020 202.
## 2 2 Februari 2020 194.
## 3 3 Maret 2020 203.
## 4 4 April 2020 198.
## 5 5 Mei 2020 180.
## 6 6 Juni 2020 197.
## 7 7 Juli 2020 202.
## 8 8 Agustus 2020 198.
## 9 9 September 2020 204.
## 10 10 Oktober 2020 210.
str(raw)
## tibble [60 × 3] (S3: tbl_df/tbl/data.frame)
## $ No : num [1:60] 1 2 3 4 5 6 7 8 9 10 ...
## $ Periode : chr [1:60] "Januari 2020" "Februari 2020" "Maret 2020" "April 2020" ...
## $ Data Produksi Makanan: num [1:60] 202 194 203 198 180 ...
# mapping bulan Indonesia -> angka bulan
bulan_id <- c(
"Januari"=1, "Februari"=2, "Maret"=3, "April"=4, "Mei"=5, "Juni"=6,
"Juli"=7, "Agustus"=8, "September"=9, "Oktober"=10, "November"=11, "Desember"=12
)
df <- raw %>%
mutate(
# bersihkan produksi: hapus spasi; ubah koma jadi titik; jadi numeric
produksi = `Data Produksi Makanan` %>%
as.character() %>%
str_replace_all("\\s+", "") %>%
str_replace_all(",", ".") %>%
as.numeric(),
# ekstrak bulan & tahun dari kolom Periode (contoh: "Januari 2020")
bulan = str_extract(Periode, "^[A-Za-z]+"),
tahun = str_extract(Periode, "\\d{4}") %>% as.integer(),
bulan_num = unname(bulan_id[bulan]),
# buat tanggal awal bulan
date = as.Date(sprintf("%04d-%02d-01", tahun, bulan_num))
) %>%
select(date, Periode, produksi) %>%
arrange(date)
head(df)
## # A tibble: 6 × 3
## date Periode produksi
## <date> <chr> <dbl>
## 1 2020-01-01 Januari 2020 202.
## 2 2020-02-01 Februari 2020 194.
## 3 2020-03-01 Maret 2020 203.
## 4 2020-04-01 April 2020 198.
## 5 2020-05-01 Mei 2020 180.
## 6 2020-06-01 Juni 2020 197.
summary(df$produksi)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 180.2 205.2 222.2 221.4 237.2 260.6
Tahap data cleaning dilakukan untuk menyiapkan data agar dapat digunakan dalam analisis. Pada tahap ini dilakukan pembersihan nilai produksi dengan menghapus spasi dan menyesuaikan format angka agar dapat dikonversi menjadi tipe numerik. Selain itu, informasi bulan dan tahun pada kolom periode diekstraksi dan diubah menjadi format tanggal sehingga data dapat disusun secara kronologis dan digunakan sebagai objek deret waktu (time series).
sum(is.na(df$produksi))
## [1] 0
df %>% filter(is.na(produksi))
## # A tibble: 0 × 3
## # ℹ 3 variables: date <date>, Periode <chr>, produksi <dbl>
Proses pengecekan data hilang (missing value) dilakukan
untuk menjamin integritas data sebelum masuk ke tahap pemodelan, di mana
hasil pengujian menggunakan fungsi sum(is.na(df$produksi))
menunjukkan angka nol yang berarti seluruh observasi dari Januari 2020
sampai Desember 2024 telah terisi lengkap.
start_year <- year(min(df$date))
start_month <- month(min(df$date))
produksi_ts <- ts(df$produksi, start = c(start_year, start_month), frequency = 12)
produksi_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct
## 2020 201.60 193.76 203.15 197.88 180.20 197.45 201.69 198.05 204.17 210.08
## 2021 206.12 190.52 221.96 222.03 203.20 222.32 224.12 233.01 222.61 213.81
## 2022 195.18 183.88 217.24 226.28 196.76 227.12 234.31 248.36 246.41 239.66
## 2023 212.93 205.58 220.24 182.90 236.18 236.78 252.03 250.13 250.13 246.25
## 2024 231.79 217.71 233.04 205.66 245.84 236.89 244.84 239.98 243.35 260.63
## Nov Dec
## 2020 207.12 214.85
## 2021 210.85 207.65
## 2022 234.74 225.45
## 2023 237.98 231.62
## 2024 247.73 251.27
Setelah memastikan tidak ada data yang terlewat melalui pengecekan
missing value, langkah selanjutnya adalah mengubah data mentah
tersebut menjadi objek time series agar bisa dianalisis lebih
lanjut. Dengan mengekstraksi titik awal waktu secara otomatis dari kolom
tanggal dan menetapkan frekuensi bulanan (frequency = 12), data tersusun
dalam struktur produksi_ts. Tahapan ini memudahkan untuk
menganalisis pola musiman secara mendalam, menggambarkan korelasi
melalui plot ACF/PACF, dan membangun model prediksi ARIMA/SARIMA.
autoplot(produksi_ts) +
labs(title = "Plot Produksi Makanan Bulanan", x = "Tahun", y = "Produksi")
Berdasarkan plot deret waktu Indeks Produksi Makanan Bulanan periode 2020–2024, terlihat bahwa data mengalami fluktuasi dari waktu ke waktu dengan kecenderungan tren meningkat pada beberapa periode terakhir. Selain itu, terdapat pola naik dan turun yang berulang dalam setiap tahun, yang mengindikasikan adanya kemungkinan pola musiman pada data produksi makanan. Pola tersebut menunjukkan bahwa aktivitas produksi cenderung berubah mengikuti periode tertentu dalam satu tahun.
produksi_stl <- stl(produksi_ts, s.window = "periodic")
autoplot(produksi_stl)
Hasil analisis STL mengungkapkan bahwa Indeks Produksi Industri Makanan menunjukkan kecenderungan untuk meningkat dari tahun 2020 hingga 2024, menandakan adanya pertumbuhan aktivitas produksi secara berkepanjangan. Selain itu, tampak pola musiman yang berulang setiap tahun, di mana produksi pada bulan-bulan tertentu cenderung lebih tinggi atau lebih rendah dibandingkan bulan lainnya. Di sisi lain, komponen sisa (remainder) memperlihatkan fluktuasi acak yang relatif kecil di sekitar nol, sehingga sebagian besar variasi data telah dijelaskan oleh komponen tren dan musiman. Hal ini menunjukkan bahwa data memiliki pola yang cukup jelas dan dapat dimodelkan lebih lanjut dengan metode runtun waktu seperti ARIMA untuk kebutuhan peramalan.
Uji stasioneritas dalam varian pada data permasalahan dilakukan dengan melihat nilai rounded value pada Box-Cox Plot dari output
# Pastikan semua nilai positif
min_val <- min(produksi_ts, na.rm = TRUE)
shift <- ifelse(min_val <= 0, abs(min_val) + 0.01, 0)
produksi_pos <- produksi_ts + shift
# Hitung lambda optimal
lambda <- BoxCox.lambda(produksi_pos)
lambda
## [1] -0.9999242
Uji stasioneritas dalam varians dilakukan menggunakan metode Box-Cox transformation dengan melihat nilai parameter λ (lambda). Berdasarkan hasil perhitungan diperoleh nilai λ sebesar −0.9999. Nilai tersebut menunjukkan bentuk transformasi yang paling sesuai untuk menstabilkan varians data. Oleh karena itu dilakukan transformasi Box-Cox pada data produksi makanan sebelum dilakukan proses pemodelan lebih lanjut.
Transformasi pertama
# Transformasi Box-Cox
produksi_bc <- BoxCox(produksi_pos, lambda = lambda)
autoplot(produksi_bc) +
labs(title = "Produksi Setelah Transformasi Box-Cox",
x = "Tahun", y = "Produksi (Transformasi)")
# (opsional) cek lambda setelah transformasi
BoxCox.lambda(produksi_bc)
## [1] -0.9999242
Setelah dilakukan transformasi Box-Cox dengan nilai λ sebesar −0.9999, varians data menjadi lebih stabil sehingga data dapat digunakan untuk tahap analisis selanjutnya. Meskipun nilai λ belum mencapai 1, nilai tersebut sudah mendekati bentuk transformasi yang optimal sehingga transformasi dianggap cukup untuk menstabilkan varians. Dengan demikian, proses pemodelan dapat dilanjutkan pada tahap pengujian stasioneritas dalam mean dan identifikasi model ARIMA.
Secara Formal
adf.test(produksi_bc)
##
## Augmented Dickey-Fuller Test
##
## data: produksi_bc
## Dickey-Fuller = -3.7527, Lag order = 3, p-value = 0.02793
## alternative hypothesis: stationary
Hipotesis:
𝐻0: 𝛿 = 0 (Terdapat unit roots sehingga data tidak stasioner)
𝐻1: 𝛿 ≠ 0 (Tidak terdapat unit roots sehingga data stasioner)
Taraf signifikansi: 𝛼 = 0.05
Statistik Uji:
Berdasarkan output Augmented Dicky-Fuller test statistic test for unit root in level (d=0) yang didapat dari output di atas pada kolom p - value. diperoleh : p-value = 0.02793
Daerah Kritis:
H0 ditolak jika p - value < 𝛼 (0.05)
Keputusan:
H0 gagal ditolak karena p - value (0.02793) < 𝛼 (0.05)
Kesimpulan:
Pada taraf signifikansi 𝛼 = 0.05, H0 gagal ditolak, karena nilai p - value (0.3879) > 𝛼 (0.05). Maka, dapat disimpulkan bahwa data transformasi pertama untuk Indeks Produksi sektor Makanan tahun 2020-2024 tidak terdapat unit roots sehingga data sudah stasioner dalam mean.
Acf(produksi_bc)
Pacf(produksi_bc)
Berdasarkan plot ACF dan PACF dari data yang telah stasioner, terlihat bahwa nilai autokorelasi pada beberapa lag awal masih signifikan dan kemudian menurun secara bertahap, sedangkan pada plot PACF terdapat cut off hingga sekitar lag ke-2. Pola tersebut mengindikasikan adanya kemungkinan komponen autoregressive hingga orde ke-2. Selain itu, tidak terlihat adanya pola musiman yang signifikan pada lag ke-12, sehingga model yang digunakan adalah model non-musiman ARIMA.
Model seasonal: (p,d,q)(P,D,Q)m
p : Model AR (pola non musiman) = 1,2
d : Differencing = 0
q : Model MA (pola non musiman) = 0,1
P : Model SAR (pola musiman) = 0
D : Differencing pola musiman = 0
Q : Model SMA (pola musiman) = 0
m : 12 (data bulanan)
Kombinasi model yang diambil adalah:
ARIMA(1,0,0) ARIMA(2,0,0) ARIMA(1,0,1), ARIMA(2,0,1)
# 1. Definisikan Model terlebih dahulu (Pastikan variabel 'inflasi_bc' sudah ada)
model1 <- Arima(produksi_bc, order = c(1,0,0))
model2 <- Arima(produksi_bc, order = c(2,0,0))
model3 <- Arima(produksi_bc, order = c(1,0,1))
model4 <- Arima(produksi_bc, order = c(2,0,1))
# 2. Fungsi Uji Signifikansi
uji_signifikansi <- function(model){
coef_est <- model$coef
se_est <- sqrt(diag(model$var.coef))
z_value <- coef_est / se_est
p_value <- 2 * (1 - pnorm(abs(z_value)))
hasil <- data.frame(
Parameter = names(coef_est),
Estimate = coef_est,
Std_Error = se_est,
z_value = z_value,
p_value = p_value,
Keputusan = ifelse(p_value < 0.05,"Signifikan","Tidak Signifikan")
)
return(hasil)
}
# 3. Panggil fungsi untuk masing-masing model
hasil_model1 <- uji_signifikansi(model1)
print(hasil_model1)
## Parameter Estimate Std_Error z_value p_value Keputusan
## ar1 ar1 0.6328396 0.1006533441 6.287318 3.229967e-10 Signifikan
## intercept intercept 0.9955233 0.0001715458 5803.251468 0.000000e+00 Signifikan
hasil_model2 <- uji_signifikansi(model2)
print(hasil_model2)
## Parameter Estimate Std_Error z_value p_value Keputusan
## ar1 ar1 0.4584883 0.1220398252 3.756875 0.0001720486 Signifikan
## ar2 ar2 0.2883490 0.1253531806 2.300292 0.0214316566 Signifikan
## intercept intercept 0.9955245 0.0001988976 5005.211627 0.0000000000 Signifikan
hasil_model3 <- uji_signifikansi(model3)
print(hasil_model3)
## Parameter Estimate Std_Error z_value p_value Keputusan
## ar1 ar1 0.8583859 0.0931427473 9.21581 0.00000000 Signifikan
## ma1 ma1 -0.3754309 0.1480604261 -2.53566 0.01122356 Signifikan
## intercept intercept 0.9955271 0.0002103501 4732.71556 0.00000000 Signifikan
hasil_model4 <- uji_signifikansi(model4)
print(hasil_model4)
## Parameter Estimate Std_Error z_value p_value
## ar1 ar1 0.6202819 0.2985232996 2.0778340 0.03772465
## ar2 ar2 0.1899018 0.2204552638 0.8614075 0.38901366
## ma1 ma1 -0.1802138 0.2871535762 -0.6275868 0.53027469
## intercept intercept 0.9955256 0.0002076844 4793.4541130 0.00000000
## Keputusan
## ar1 Signifikan
## ar2 Tidak Signifikan
## ma1 Tidak Signifikan
## intercept Signifikan
Hipotesis:
𝐻0: 𝜑i = 0 dan atau 𝜃i = 0 (Parameter tidak signifikan terhadap model
𝐻1: 𝜑i ≠ 0 dan atau 𝜃i ≠ 0 (Parameter signifikan terhadap model)
Taraf signifikansi: 𝛼 = 0.05
Statistik Uji:
Dilihat dari p-value output di atas :
Daerah Kritis:
H0 ditolak jika p - value < 𝛼 (0.05)
Keputusan dan kesimpulan:
Berdasarkan model ARIMA(1,0,0), diperoleh bahwa AR(1) signifikan karena p-value ( 3.229967e-10) > 𝛼 (0.05). Hal ini menunjukkan bahwa lag pertama dari komponen autoregressive (AR) berpengaruh secara signifikan terhadap model.
Pada model ARIMA(2,0,0), AR(1) signifikan karena p-value (0.0001720486) > 𝛼 (0.05) dan AR(2) signifikan secara statistik karena p-value (0.0214316566) > 𝛼 (0.0). Dengan demikian, lag 1 dan lag 2 dari komponen AR berpengaruh secara signifikan terhadap model.
Pada model ARIMA(1,0,1), AR(1) signifikan karena p-value (0.0000) > 𝛼 (0.05) dan MA(1) signifikan secara statistik karena p-value (0.01122356) > 𝛼 (0.05) seluruh parameter tidak signifikan secara statistik (p-value > 0.05). Dengan demikian, lag 1 dari AR dan lag 1 dari komponen MA berpengaruh secara signifikan terhadap model.
Pada model ARIMA(2,0,1), AR(1) signifikan karena p-value (0.03772465) > 𝛼 (0.05), AR(2) tidak signifikan secara statistik karena p-value (0.38901366) > 𝛼 (0.05), dan MA(1) tidak signifikan secara statistik karena p-value (0.53027469) > 𝛼 (0.05). Dengan demikian, hanya lag 1 dari komponen AR yang berpengaruh secara signifikan terhadap model.
Perbandingan Model
# Fungsi menghitung jumlah parameter signifikan
hitung_signifikan <- function(model){
coef <- model$coef
se <- sqrt(diag(model$var.coef))
z_stat <- coef / se
p_values <- 2 * (1 - pnorm(abs(z_stat)))
jumlah_sig <- sum(p_values < 0.05)
if(jumlah_sig == length(p_values)){
return(paste(jumlah_sig,"signifikan"))
} else if(jumlah_sig > 0){
return(paste(jumlah_sig,"signifikan"))
} else {
return("Tidak signifikan")
}
}
# Membuat tabel perbandingan
tabel_model <- data.frame(
Model = c("ARIMA(1,0,0)",
"ARIMA(2,0,0)",
"ARIMA(1,0,1)",
"ARIMA(2,0,1)"),
AIC = c(AIC(model1),
AIC(model2),
AIC(model3),
AIC(model4)),
Signifikansi = c(
hitung_signifikan(model1),
hitung_signifikan(model2),
hitung_signifikan(model3),
hitung_signifikan(model4)
)
)
print(tabel_model)
## Model AIC Signifikansi
## 1 ARIMA(1,0,0) -785.0950 2 signifikan
## 2 ARIMA(2,0,0) -788.1214 3 signifikan
## 3 ARIMA(1,0,1) -787.8552 3 signifikan
## 4 ARIMA(2,0,1) -786.4684 2 signifikanBerdasarkan nilai AIC dan uji signifikansi parameter, model 2 yaitu ARIMA(2,0,0) memiliki nilai AIC terkecil dan memiliki 3 parameter signifikan, sehingga dipilih sebagai kandidat terbaik untuk tahap diagnostik residual.
res <- residuals(model2)
shapiro.test(res)
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.98645, p-value = 0.7451
Hipotesis:
𝐻0: Residual berdistribusi normal
𝐻1: Residual tidak berdistribusi normal
Taraf signifikansi: 𝛼 = 0.05
Statistik Uji:
Diperoleh dari output di atas pada kolom p - value sebesar 0.7451
Daerah Kritis:
H0 ditolak jika p - value < 𝛼 (0.05)
Keputusan:
H0 ditolak karena p - value (0.7451) < 𝛼 (0.05)
Kesimpulan:
Pada taraf signifikansi 𝛼 = 0.05, H0 ditolak, karena nilai p - value (0.7451) > 𝛼 (0.05). Sehingga dapat disimpulkan model ARIMA(2,0,0) berdistribusi normal.
hist(res, breaks=10)
qqnorm(res)
qqline(res)
Histogram residual menunjukkan bahwa sebaran residual cenderung membentuk pola yang mendekati distribusi normal dengan pusat distribusi berada di sekitar nilai nol. Hal ini menunjukkan bahwa kesalahan prediksi model relatif simetris dan tidak menunjukkan penyimpangan yang ekstrem. Selain itu, pada grafik Normal Q-Q Plot, sebagian besar titik residual berada di sekitar garis diagonal, yang menunjukkan bahwa distribusi residual mengikuti pola distribusi normal. Meskipun terdapat sedikit penyimpangan pada bagian ekor, secara keseluruhan pola titik masih mengikuti garis normalitas.
Box.test(residuals(model2), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(model2)
## X-squared = 0.057682, df = 1, p-value = 0.8102
Hipotesis:
𝐻0: Tidak ada autokorelasi antar lag data
𝐻1: Ada autokorelasi antar lag data
Taraf signifikansi: 𝛼 = 0.05
Statistik Uji:
Diperoleh dari output di atas pada kolom p - value sebesar 0.8102
Daerah Kritis:
H0 ditolak jika p - value < 𝛼 (0.05)
Keputusan:
H0 gagal ditolak karena p - value (0.8102) > 𝛼 (0.05)
Kesimpulan:
Pada taraf signifikansi 𝛼 = 0.05, H0 gagal ditolak, karena nilai p - value (0.8212) > 𝛼 (0.05). Sehingga dapat disimpulkan model ARIMA (2,0,0) tidak terdapat autokorelasi antar lag data.
ArchTest(residuals(model2), lags = 12)
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: residuals(model2)
## Chi-squared = 21.583, df = 12, p-value = 0.04247
Hipotesis:
𝐻0: Tidak ada terdapat gejala heteroskedastisitas
𝐻1: Ada gejala heteroskedastisitas
Taraf signifikansi: 𝛼 = 0.05
Statistik Uji:
Diperoleh dari output di atas pada kolom p - value sebesar 0.04247
Daerah Kritis:
H0 ditolak jika p - value < 𝛼 (0.05)
Keputusan:
H0 ditolak karena p - value (0.04247) < 𝛼 (0.05)
Kesimpulan:
Pada taraf signifikansi 𝛼 = 0.05, H0 ditolak, karena nilai p - value (0.04247) < 𝛼 (0.05). Sehingga dapat disimpulkan model ARIMA (2,0,0) mengandung efek ARCH atau terjadi heteroskedastisitas. Dengan demikian, asumsi homoskedastisitas tidak terpenuhi.
mape <- function(actual, pred){
actual <- as.numeric(actual)
pred <- as.numeric(pred)
mean(abs((actual - pred)/actual))*100
}
smape <- function(actual, pred){
actual <- as.numeric(actual)
pred <- as.numeric(pred)
mean(abs(actual - pred) / ((abs(actual) + abs(pred))/2))*100
}
n <- length(produksi_ts)
n_train <- floor(0.8 * n)
train <- window(produksi_ts, end = time(produksi_ts)[n_train])
test <- window(produksi_ts, start = time(produksi_ts)[n_train+1])
length(train)
## [1] 48
length(test)
## [1] 12
Data deret waktu produksi dibagi menjadi dua bagian, yaitu data training (in-sample) dan data testing (out-sample) dengan proporsi 80% : 20%. Dari total 60 observasi data bulanan, diperoleh 48 observasi sebagai data training yang digunakan untuk membangun dan mengestimasi model ARIMA, serta 12 observasi sebagai data testing yang digunakan untuk mengevaluasi kinerja model melalui perhitungan MAPE dan SMAPE.
model_train <- Arima(train, order = c(2,0,0))
fc_test <- forecast(model_train, h = length(test))
MAPE_test <- mape(test, fc_test$mean)
SMAPE_test <- smape(test, fc_test$mean)
fit_train <- fitted(model_train)
MAPE_train <- mape(train, fit_train)
SMAPE_train <- smape(train, fit_train)
tabel_error <- data.frame(
Data = c("Training","Testing"),
MAPE = c(MAPE_train, MAPE_test),
SMAPE = c(SMAPE_train, SMAPE_test)
)
tabel_error
## Data MAPE SMAPE
## 1 Training 5.350868 5.327258
## 2 Testing 8.736790 9.162994
Berdasarkan hasil perhitungan, diperoleh nilai MAPE sebesar 5.35% dan SMAPE sebesar 5.33% pada data training, sedangkan pada data testing diperoleh MAPE sebesar 8.74% dan SMAPE sebesar 9.16%. Nilai kesalahan yang relatif kecil ini menunjukkan bahwa model ARIMA(2,0,0) memiliki kemampuan yang cukup baik dalam memodelkan dan memprediksi data produksi makanan.
forecast_model <- forecast(model2, h = 12)
forecast_model
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jan 2025 0.9959334 0.9955177 0.9963491 0.9952976 0.9965692
## Feb 2025 0.9958762 0.9954189 0.9963335 0.9951768 0.9965756
## Mar 2025 0.9958037 0.9953015 0.9963058 0.9950357 0.9965716
## Apr 2025 0.9957539 0.9952299 0.9962779 0.9949525 0.9965553
## May 2025 0.9957102 0.9951706 0.9962497 0.9948850 0.9965354
## Jun 2025 0.9956758 0.9951266 0.9962249 0.9948359 0.9965156
## Jul 2025 0.9956474 0.9950919 0.9962029 0.9947978 0.9964970
## Aug 2025 0.9956245 0.9950648 0.9961841 0.9947685 0.9964804
## Sep 2025 0.9956058 0.9950434 0.9961682 0.9947456 0.9964659
## Oct 2025 0.9955906 0.9950264 0.9961548 0.9947277 0.9964534
## Nov 2025 0.9955782 0.9950128 0.9961436 0.9947135 0.9964429
## Dec 2025 0.9955682 0.9950020 0.9961343 0.9947023 0.9964341
Berdasarkan hasil prediksi menggunakan model ARIMA(2,0,0) untuk 12 bulan mendatang, terlihat bahwa estimasi produksi makanan diprediksi akan mengalami penurunan sedikit demi sedikit dibandingkan dengan nilai di periode terakhir. Garis biru menunjukkan nilai utama yang diperkirakan, sedangkan area berwarna biru yang semakin meluas menggambarkan interval kepercayaan dari prediksi tersebut. Dengan semakin jauh periode yang diprediksi, ketidakpastian prediksi juga semakin meningkat, yang terlihat dari rentang interval yang semakin lebar. Ini menunjukkan bahwa model masih mampu mencerminkan pola data sejarah, namun tingkat ketidakpastian akan meningkat seiring dengan periode prediksi yang lebih panjang.
autoplot(forecast_model) +
labs(title = "Forecast Produksi Makanan",
x = "Tahun",
y = "Produksi")
Berdasarkan tabel hasil peramalan, nilai point forecast menunjukkan
estimasi produksi makanan untuk setiap bulan pada tahun 2025. Terlihat
bahwa nilai prediksi mengalami penurunan secara bertahap dari bulan
Januari hingga Desember 2025, dengan nilai sekitar 0.9959 pada awal
tahun dan menurun hingga sekitar 0.9956 pada akhir tahun. Selain nilai
prediksi utama, tabel juga menampilkan interval kepercayaan 80% dan 95%
yang terdiri dari batas bawah (Lo) dan batas atas (Hi).