Sumber data untuk proyek ini diambil dari Badan Pusat Statistik (BPS) melalui tautan berikut: BPS - BI Rate.
Data yang digunakan mencakup pergerakan suku bunga Bank Indonesia (BI Rate) dari 2014 hingga 2024, yang dianalisis untuk meramalkan tren suku bunga ke depan.
BI Rate adalah suku bunga acuan yang ditetapkan oleh Bank Indonesia (BI) sebagai kebijakan moneter untuk mengatur stabilitas ekonomi. BI Rate memengaruhi:
Menganalisis dan meramalkan BI Rate penting karena:
Tujuan dari analisis ini adalah:
library(readxl)
BIRate_2024_2014 <- read_excel("BIRate_2024-2014.xlsx")
BIRate_2024_2014
## # A tibble: 130 x 3
## Year Month `BI Rate`
## <dbl> <dbl> <dbl>
## 1 2024 10 6
## 2 NA 9 6
## 3 NA 8 6.25
## 4 NA 7 6.25
## 5 NA 6 6.25
## 6 NA 5 6.25
## 7 NA 4 6.25
## 8 NA 3 6
## 9 NA 2 6
## 10 NA 1 6
## # i 120 more rows
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Registered S3 methods overwritten by 'TSA':
## method from
## fitted.Arima forecast
## plot.Arima forecast
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
Setelah mengimpor data, kita akan membagi data menjadi dua bagian: 80% untuk data pelatihan (training) dan 20% data pengujian (testing).
data <- BIRate_2024_2014$`BI Rate`
plot.ts(data,
main = "BI Rate 2014 - 2024",
ylab="BI Rate",
xlab="Bulan")
# Membagi data menjadi data pelatihan (train) dan data pengujian (test)
data.train = (data[1:104])
data.test = (data[105:130])
# Membuat plot
plot.ts(data,
main = "Partisi Data Training dan Data Testing",
ylab = "BI Rate",
xlab = "Waktu", # Menambahkan label untuk sumbu X
type = 'l',
col = 'blue',
las = 1,
lwd = 2) # Menambah ketebalan garis
# Menambahkan data testing dengan warna orange
lines(105:130, data.test, col = 'orange', lwd = 2)
# Menambahkan garis vertikal untuk memisahkan data training dan testing
abline(v = 105, lty = 3, col = 'red')
# Menambahkan legenda di sudut kiri bawah
legend("bottomright",
legend = c("Data Training", "Data Testing"),
col = c("blue", "orange"),
lty = 1,
lwd = 2,
bty = "o",
cex = 0.8)
Sebelum melanjutkan ke pemodelan, penting untuk menguji apakah data bersifat stasioner. Model ARIMA membutuhkan data stasioner, yang berarti data tidak menunjukkan tren atau musiman yang signifikan.
# Uji Dickey-Fuller
adf.test(data.train)
##
## Augmented Dickey-Fuller Test
##
## data: data.train
## Dickey-Fuller = -1.9019, Lag order = 4, p-value = 0.6174
## alternative hypothesis: stationary
# ternyata data BELUM STATIONER
karena nilai p-value = 0.6174 > 0.05 maka DATA BELUM STASIONER sehingga perlu dilakukan differencing, setelah itu di uji stasioneritasnya.
# Differencing
data.traindiff <- diff(data.train)
# Uji Dickey-Fuller
adf.test(data.traindiff)
##
## Augmented Dickey-Fuller Test
##
## data: data.traindiff
## Dickey-Fuller = -3.4981, Lag order = 4, p-value = 0.04568
## alternative hypothesis: stationary
plot.ts(data.traindiff, main="Plot Data Training Setelah Differencing")
terlihat bahwa p-value = 0.04568 < 0.05 artinya DATA SUDAH
STASIONER ## Langkah 4 : Identifikasi Model ARIMA Selanjutnya,
kita melakukan AutoCorrelation Function (ACF) dan Partial
AutoCorrelation Function (PACF) untuk menentukan parameter model ARIMA
yang sesuai.
# Plot ACF
acf(data.traindiff)
# Plot PACF
pacf(data.traindiff)
Berdasarkan analisis ACF dan PACF, terdapat beberapa kandidat model
ARIMA. ACF menunjukkan kemungkinan MA(1) atau MA(2), sementara PACF
menunjukkan cut-off pada lag-2, mengindikasikan AR(2). Kandidat model
adalah
Dari hasil ACF dan ADF didapatkan 4 kandidat model ARIMA, selanjutnya membuat model tersebut
Pada langkah ini, keandalan model diuji dengan membandingkan hasil prediksi terhadap data uji, dan MAPE (Mean Absolute Percentage Error) digunakan untuk mengukur akurasi model. Model dengan nilai MAPE terkecil dipilih, karena semakin rendah nilai MAPE, semakin baik kemampuan model dalam melakukan prediksi dengan error yang lebih kecil. Validasi ini memastikan bahwa model yang dipilih dapat memberikan prediksi yang akurat dan dapat diandalkan untuk penggunaan masa depan.
findError = function(x, x_fit){
e = x - x_fit
n = length(x)
MAD = sum(abs(e))/n
MSD = sum(e^2)/n
MAPE = (sum(abs(e)/x)/n)*100
result = matrix(c(MAD, MSD, MAPE), nrow=1)
colnames(result) = c("MAD", "MSD", "MAPE")
rownames(result) = "nilai"
return(result)
}
# Membuat prediksi untuk setiap model dan menghitung errornya
# Model_111
forecast_111 = forecast(data.train, model = model_111, h = 26)
error_111 = findError(data.test, forecast_111$mean)
# Model_210
forecast_210 = forecast(data.train, model = model_210, h = 26)
error_210 = findError(data.test, forecast_210$mean)
# Model_211
forecast_211 = forecast(data.train, model = model_211, h = 26)
error_211 = findError(data.test, forecast_211$mean)
# Model_310
forecast_310 = forecast(data.train, model = model_310, h = 26)
error_310 = findError(data.test, forecast_310$mean)
# Membuat tabel perbandingan error (MAD, MSD, MAPE) untuk setiap model
model_names <- c("Model_111", "Model_210", "Model_211", "Model_310")
mad_values <- c( error_111[1, "MAD"], error_210[1, "MAD"], error_211[1, "MAD"], error_310[1, "MAD"])
msd_values <- c( error_111[1, "MSD"], error_210[1, "MSD"], error_211[1, "MSD"], error_310[1, "MSD"])
mape_values <- c( error_111[1, "MAPE"], error_210[1, "MAPE"], error_211[1, "MAPE"], error_310[1, "MAPE"])
# Membuat data frame untuk tabel perbandingan
model_comparison <- data.frame(
Model = model_names,
MAD = mad_values,
MSD = msd_values,
MAPE = mape_values
)
# Menampilkan tabel perbandingan error untuk setiap model
print(model_comparison)
## Model MAD MSD MAPE
## 1 Model_111 1.6708407 2.8261024 22.239083
## 2 Model_210 0.7500000 0.5817308 9.968371
## 3 Model_211 2.3859870 5.8270383 31.739817
## 4 Model_310 0.7669964 0.6070098 10.195557
# Plot validasi model
par(mfrow=c(2,2)) # Menyiapkan layout 2x2 untuk beberapa plot
# Plot untuk Model_111 (ARIMA(1, 1, 1))
plot(forecast_111,
ylim = c(3.5, 7.8),
main = "Forecast ARIMA(1, 1, 1)")
lines(data)
abline(v=105, lty=4, col="red")
# Plot untuk Model_210 (ARIMA(2, 1, 0))
plot(forecast_210,
ylim = c(3.5, 7.8),
main = "Forecast ARIMA(2, 1, 0)")
lines(data)
abline(v=105, lty=4, col="red")
# Plot untuk Model_211 (ARIMA(2, 1, 1))
plot(forecast_211,
ylim = c(3.5, 7.8),
main = "Forecast ARIMA(2, 1, 1)")
lines(data)
abline(v=105, lty=4, col="red")
# Plot untuk Model_310 (ARIMA(3, 1, 0))
plot(forecast_310,
ylim = c(3.5, 7.8),
main = "Forecast ARIMA(3, 1, 0)")
lines(data)
abline(v=105, lty=4, col="red")
dari hasil validasi model, terlihat model ARIMA(2,1,0) memiliki nilai MAPE terkecil
Setelah ditemukan model dengan MAPE terkecil selanjutnya model dapat digunakan untuk melakukan forecasting. Pada penelitian ini dilakukan forecasting sebanyak 12 bulan kedepan.
# Menggunakan model ARMA (2,1,0), Suku bunga diramal sebanyak 12 bulan kedepan
forecast.final = forecast(data, model = model_210, h = 12)
forecast.final
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 131 7.5 7.251255 7.748745 7.119577 7.880423
## 132 7.5 7.222336 7.777664 7.075349 7.924651
## 133 7.5 7.185256 7.814744 7.018641 7.981359
## 134 7.5 7.149148 7.850852 6.963419 8.036581
## 135 7.5 7.119302 7.880698 6.917773 8.082227
## 136 7.5 7.090680 7.909320 6.873999 8.126001
## 137 7.5 7.064000 7.936000 6.833196 8.166804
## 138 7.5 7.038960 7.961040 6.794900 8.205100
## 139 7.5 7.015155 7.984845 6.758493 8.241507
## 140 7.5 6.992478 8.007522 6.723812 8.276188
## 141 7.5 6.970774 8.029226 6.690619 8.309381
## 142 7.5 6.949923 8.050077 6.658730 8.341270
# Plot Forecast BI Rate 12 bulan kedepan
autoplot(forecast.final,
ylab="BI Rate", xlab="Bulan",
main = "Peramalan BI Rate 12 Bulan ke Depan")
Hasil forecast
Model ARIMA(2,1,0) memprediksi suku bunga akan tetap stabil di sekitar nilai 7.5 untuk 12 bulan ke depan. Meskipun interval prediksi dengan tingkat kepercayaan 80% menunjukkan rentang sempit, interval 95% yang lebih lebar mencerminkan ketidakpastian yang lebih besar di masa depan.
Keputusan
Meskipun forecast menunjukkan kestabilan suku bunga di sekitar 7.5, lebar interval 95% yang signifikan (6.92 hingga 8.34) mengindikasikan adanya ketidakpastian yang cukup besar dalam 12 bulan ke depan. Hal ini menunjukkan bahwa meskipun tidak ada perubahan drastis yang diprediksi, kondisi ekonomi dan kebijakan moneter yang berubah dapat memengaruhi fluktuasi suku bunga. Oleh karena itu, perlu waspada terhadap potensi perubahan kebijakan atau faktor eksternal yang dapat mempengaruhi pasar, dan mengadaptasi strategi keuangan dengan lebih fleksibel untuk menghadapi ketidakpastian ini.