1 Pendahuluan

Beras merupakan salah satu komoditas pangan utama yang memiliki peran penting dalam memenuhi kebutuhan konsumsi masyarakat di Indonesia. Sebagai makanan pokok bagi sebagian besar penduduk, kestabilan harga beras menjadi salah satu faktor yang sangat diperhatikan dalam menjaga ketahanan pangan nasional. Perubahan harga beras tidak hanya memengaruhi daya beli masyarakat, tetapi juga dapat berdampak pada tingkat inflasi dan kondisi perekonomian secara keseluruhan.

Dalam rantai distribusi beras, harga beras di tingkat penggilingan merupakan salah satu indikator penting yang mencerminkan kondisi awal terbentuknya harga beras sebelum sampai ke pasar atau konsumen. Harga pada tingkat ini dipengaruhi oleh berbagai faktor, seperti produksi padi, ketersediaan bahan baku gabah, biaya distribusi, kebijakan pemerintah, serta kondisi permintaan dan penawaran di pasar. Oleh karena itu, pemantauan dan analisis terhadap perkembangan harga beras di tingkat penggilingan menjadi penting untuk memahami dinamika pergerakan harga beras dari waktu ke waktu.

Data harga beras yang dicatat secara berkala membentuk suatu deret waktu (time series), yaitu data yang tersusun berdasarkan urutan waktu tertentu. Analisis deret waktu memungkinkan peneliti untuk mengidentifikasi pola yang terdapat dalam data, seperti pola tren, pola musiman, maupun fluktuasi acak yang terjadi pada periode tertentu. Dengan memahami pola tersebut, analisis deret waktu juga dapat digunakan untuk melakukan peramalan terhadap nilai data pada periode yang akan datang.

Salah satu metode yang umum digunakan dalam analisis deret waktu adalah metode Autoregressive Integrated Moving Average (ARIMA). Model ARIMA merupakan pendekatan statistik yang memanfaatkan hubungan antara nilai suatu variabel pada periode sekarang dengan nilai variabel tersebut pada periode sebelumnya. Metode ini banyak digunakan dalam berbagai bidang, termasuk ekonomi dan sektor pangan, karena mampu menggambarkan pola data historis serta menghasilkan model yang dapat digunakan untuk melakukan peramalan.

Berdasarkan hal tersebut, penelitian ini dilakukan untuk menganalisis pola pergerakan Rata-Rata Harga Beras Bulanan di Tingkat Penggilingan pada periode tahun 2017 hingga 2025. Selain itu, penelitian ini juga bertujuan untuk membangun model deret waktu menggunakan metode ARIMA yang dapat menggambarkan karakteristik data harga beras serta digunakan untuk melakukan peramalan harga beras pada periode mendatang. Hasil analisis diharapkan dapat memberikan gambaran mengenai dinamika harga beras serta menjadi salah satu referensi dalam memahami perkembangan harga komoditas pangan di Indonesia.

2 Tujuan Analisis

Tujuan dari analisis ini adalah:

  1. Mengidentifikasi pola pergerakan data rata-rata harga beras bulanan di tingkat penggilingan pada periode tahun 2017 hingga 2025.
  2. Menguji stasioneritas data deret waktu sebagai langkah awal dalam proses pemodelan.
  3. Menentukan model ARIMA yang sesuai untuk menggambarkan pola data harga beras.
  4. Melakukan peramalan harga beras pada beberapa periode mendatang berdasarkan model yang diperoleh.

3 Data dan Preprocessing

3.1 Sumber Data dan Variabel yang Digunakan

Data yang digunakan dalam analisis ini merupakan data sekunder yang diperoleh dari Badan Pusat Statistik (BPS). Data tersebut berupa rata-rata harga beras bulanan di tingkat penggilingan pada periode tahun 2017 hingga 2025.

Variabel yang digunakan dalam penelitian ini terdiri dari variabel periode yang menunjukkan waktu pengamatan dalam bentuk bulan dan tahun, serta variabel harga yang menunjukkan rata-rata harga beras pada setiap periode. Data tersebut disusun dalam bentuk deret waktu dengan frekuensi bulanan untuk keperluan analisis time series menggunakan metode ARIMA.

file_path <- "C:/Semester 6/Komlan/Data Beras Medium 2017-2025.xlsx"

raw <- read_excel(file_path)

head(raw, 10)
## # A tibble: 10 × 2
##    tanggal             rataan_harga
##    <dttm>              <chr>       
##  1 2017-01-01 00:00:00 9099.52     
##  2 2017-02-01 00:00:00 9047.57     
##  3 2017-03-01 00:00:00 8705.43     
##  4 2017-04-01 00:00:00 8653.8      
##  5 2017-05-01 00:00:00 8790.17     
##  6 2017-06-01 00:00:00 8794.48     
##  7 2017-07-01 00:00:00 8743.86     
##  8 2017-08-01 00:00:00 8823.05     
##  9 2017-09-01 00:00:00 8935.02     
## 10 2017-10-01 00:00:00 9116.5
str(raw)
## tibble [108 × 2] (S3: tbl_df/tbl/data.frame)
##  $ tanggal     : POSIXct[1:108], format: "2017-01-01" "2017-02-01" ...
##  $ rataan_harga: chr [1:108] "9099.52" "9047.57" "8705.43" "8653.8" ...
summary(raw)
##     tanggal                    rataan_harga      
##  Min.   :2017-01-01 00:00:00   Length:108        
##  1st Qu.:2019-03-24 06:00:00   Class :character  
##  Median :2021-06-16 00:00:00   Mode  :character  
##  Mean   :2021-06-16 08:26:40                     
##  3rd Qu.:2023-09-08 12:00:00                     
##  Max.   :2025-12-01 00:00:00

3.2 Pembersihan Data

df <- raw %>%
  mutate(rataan_harga = as.numeric(rataan_harga)) %>%
  arrange(tanggal)

head(df)
## # A tibble: 6 × 2
##   tanggal             rataan_harga
##   <dttm>                     <dbl>
## 1 2017-01-01 00:00:00        9100.
## 2 2017-02-01 00:00:00        9048.
## 3 2017-03-01 00:00:00        8705.
## 4 2017-04-01 00:00:00        8654.
## 5 2017-05-01 00:00:00        8790.
## 6 2017-06-01 00:00:00        8794.
str(df)
## tibble [108 × 2] (S3: tbl_df/tbl/data.frame)
##  $ tanggal     : POSIXct[1:108], format: "2017-01-01" "2017-02-01" ...
##  $ rataan_harga: num [1:108] 9100 9048 8705 8654 8790 ...

Pada tahap pembersihan data dilakukan penyesuaian format data agar dapat digunakan dalam analisis. Variabel rataan_harga yang sebelumnya bertipe character dikonversi menjadi tipe numeric sehingga nilai harga dapat diolah dalam perhitungan statistik. Selain itu, data juga disusun berdasarkan variabel tanggal untuk memastikan bahwa seluruh observasi tersusun secara kronologis sesuai urutan waktu pengamatan. Setelah proses ini dilakukan, data siap digunakan untuk tahap analisis selanjutnya.

3.3 Cek Missing Value

sum(is.na(df$rataan_harga))
## [1] 0
df %>% filter(is.na(rataan_harga))
## # A tibble: 0 × 2
## # ℹ 2 variables: tanggal <dttm>, rataan_harga <dbl>

Pengecekan missing value dilakukan untuk memastikan bahwa tidak terdapat nilai yang hilang pada data yang digunakan dalam analisis. Berdasarkan hasil pemeriksaan menggunakan fungsi sum(is.na(df$rataan_harga)) diperoleh nilai 0, yang menunjukkan bahwa tidak terdapat nilai yang hilang pada variabel rataan_harga. Selain itu, pengecekan menggunakan df %>% filter(is.na(rataan_harga)) juga tidak menampilkan baris data apa pun. Dengan demikian, dapat disimpulkan bahwa dataset tidak memiliki missing value sehingga data dapat langsung digunakan pada tahap analisis selanjutnya.

3.4 Pembentukan Data Deret Waktu

start_year  <- year(min(df$tanggal))
start_month <- month(min(df$tanggal))

beras_ts <- ts(df$rataan_harga,
               start = c(start_year, start_month),
               frequency = 12)

beras_ts
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2017  9099.52  9047.57  8705.43  8653.80  8790.17  8794.48  8743.86  8823.05
## 2018 10177.05 10215.16  9698.23  9220.84  9190.37  9135.41  9197.78  9172.27
## 2019  9902.68  9799.57  9555.35  9144.20  9142.52  9166.40  9211.03  9224.00
## 2020  9805.40  9844.13  9826.68  9671.03  9526.55  9445.31  9316.30  9334.90
## 2021  9404.74  9386.31  9153.68  8978.86  8909.50  8906.67  8886.90  8915.75
## 2022  9381.24  9358.61  9323.35  9104.35  9065.18  9007.86  9091.92  9358.34
## 2023 10801.71 11300.76 11121.88 11049.87 11005.56 11079.92 11120.58 11474.96
## 2024 13187.17 14161.81 13964.60 12759.11 12071.41 12313.56 12518.68 12627.46
## 2025 12608.54 12596.26 12702.97 12555.17 12576.12 12868.83 13264.30 13458.23
##           Sep      Oct      Nov      Dec
## 2017  8935.02  9116.50  9279.52  9526.01
## 2018  9309.98  9395.39  9603.63  9798.38
## 2019  9301.08  9433.88  9522.01  9565.59
## 2020  9404.58  9462.81  9384.98  9382.69
## 2021  8962.39  9010.82  9071.94  9128.44
## 2022  9785.04 10043.47 10122.15 10371.11
## 2023 12685.36 13011.56 12959.50 13070.70
## 2024 12608.47 12554.97 12394.92 12447.45
## 2025 13385.89 13324.28 13195.20 13283.83

Pada tahap ini, variabel rataan_harga disusun berdasarkan urutan waktu dengan frekuensi bulanan sehingga membentuk objek time series yang dimulai dari Januari 2017 hingga Desember 2025. Hasil pembentukan data deret waktu menunjukkan bahwa data harga beras tersusun secara kronologis untuk setiap bulan dalam satu tahun, mulai dari Januari hingga Desember. Dengan demikian, data telah memiliki struktur deret waktu yang sesuai dan siap digunakan pada tahap analisis selanjutnya

4 Identifikasi Model

4.1 Visualisasi Deret Waktu

autoplot(beras_ts) +
  labs(
    title = "Pergerakan Rata-Rata Harga Beras Medium Bulanan di Tingkat Penggilingan",
    x = "Tahun",
    y = "Harga (Rp/kg)"
  )

Visualisasi deret waktu dilakukan untuk melihat pola pergerakan rata-rata harga beras medium bulanan di tingkat penggilingan selama periode 2017 hingga 2025. Berdasarkan grafik, harga beras mengalami fluktuasi dari waktu ke waktu dengan kondisi yang relatif stabil pada periode 2017 hingga 2021. Namun, mulai tahun 2022 terlihat adanya peningkatan harga yang cukup signifikan hingga mencapai puncaknya pada tahun 2024. Setelah mengalami sedikit penurunan, harga kembali berada pada tingkat yang relatif tinggi hingga tahun 2025. Pola ini menunjukkan adanya kecenderungan tren peningkatan harga beras dalam beberapa tahun terakhir.

4.2 Dekomposisi

beras_stl <- stl(beras_ts, s.window = "periodic")
autoplot(beras_stl)

Dekomposisi deret waktu dilakukan untuk memisahkan komponen utama yang membentuk data deret waktu, yaitu tren, musiman, dan komponen sisa. Proses ini bertujuan untuk memahami pola dasar yang terdapat pada data sebelum dilakukan pemodelan lebih lanjut. Berdasarkan hasil dekomposisi, terlihat bahwa komponen tren menunjukkan kecenderungan peningkatan harga beras dalam jangka panjang, terutama mulai sekitar tahun 2022 hingga 2024 yang mengalami kenaikan cukup signifikan. Komponen musiman memperlihatkan adanya pola yang berulang setiap tahun, yang menunjukkan bahwa harga beras mengalami fluktuasi pada periode tertentu secara konsisten. Sementara itu, komponen sisa menunjukkan fluktuasi acak di sekitar nilai nol yang tidak dapat dijelaskan oleh tren maupun pola musiman. Hal ini menunjukkan bahwa sebagian besar variasi pada data harga beras dapat dijelaskan oleh komponen tren dan musiman.

4.3 Pengujian Stasioneritas Varians (Box-Cox)

Pengujian stasioneritas varians dilakukan untuk mengetahui apakah varians data deret waktu sudah stabil sepanjang periode pengamatan. Pengujian ini dilakukan menggunakan metode Box-Cox dengan melihat nilai parameter λ (lambda). Jika nilai λ mendekati 1, maka varians data dapat dianggap stabil sehingga tidak diperlukan transformasi. Sebaliknya, jika nilai λ jauh dari 1, maka varians data dianggap tidak stabil sehingga perlu dilakukan transformasi Box-Cox sebelum melanjutkan analisis lebih lanjut.

lambda <- BoxCox.lambda(beras_ts)
lambda
## [1] -0.9999242

Berdasarkan hasil perhitungan menggunakan metode Box-Cox diperoleh nilai parameter λ sebesar −0.9999. Nilai tersebut menunjukkan bahwa varians data belum stabil karena nilainya jauh dari 1. Oleh karena itu, diperlukan transformasi Box-Cox pada data agar varians menjadi lebih stabil sebelum dilakukan analisis deret waktu pada tahap selanjutnya.

4.3.1 Transformasi Pertama

beras_bc <- BoxCox(beras_ts, lambda = lambda)

autoplot(beras_bc) +
  labs(title = "Harga Beras Setelah Transformasi Box-Cox",
       x = "Tahun",
       y = "Harga (Transformasi)")

lambda2 <- BoxCox.lambda(beras_bc)
lambda2
## [1] -0.9999242

Transformasi pertama dilakukan menggunakan metode Box-Cox untuk menstabilkan varians data. Berdasarkan hasil perhitungan diperoleh nilai parameter λ sebesar −0.9999 sehingga dilakukan transformasi pada data deret waktu. Hasil transformasi menunjukkan bahwa pola data tetap mengikuti pergerakan data sebelumnya, namun dengan skala yang telah disesuaikan sehingga data dapat digunakan pada tahap analisis selanjutnya.

4.4 Pengujian Stasioneritas dalam Mean (ADF Test)

4.4.1 Secara Formal

Pengujian stasioneritas dalam mean dilakukan untuk mengetahui apakah rata-rata data deret waktu bersifat konstan sepanjang periode pengamatan. Data yang tidak stasioner dalam mean dapat mempengaruhi proses pemodelan deret waktu sehingga perlu dilakukan pengujian sebelum menentukan model yang sesuai. Pada tahap ini digunakan uji Augmented Dickey-Fuller (ADF) untuk mengetahui apakah data telah memenuhi asumsi stasioneritas.

adf.test(beras_bc)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  beras_bc
## Dickey-Fuller = -1.8916, Lag order = 4, p-value = 0.6216
## alternative hypothesis: stationary
  • Hipotesis

    H₀ : Data memiliki unit root sehingga data tidak stasioner dalam mean.

    H₁ : Data tidak memiliki unit root sehingga data stasioner dalam mean.

  • Taraf Signifikansi

    α = 0.05

  • Statistik Uji

    Berdasarkan hasil uji Augmented Dickey-Fuller (ADF) diperoleh nilai statistik uji Dickey-Fuller sebesar −1.8916 dengan p-value sebesar 0.6216.

  • Daerah Kritis

    H₀ ditolak jika p-value < α (0.05).

  • Keputusan

    Karena nilai p-value (0.6216) > α (0.05), maka H₀ gagal ditolak.

  • Kesimpulan

    Pada taraf signifikansi 0.05 dapat disimpulkan bahwa data harga beras setelah transformasi Box-Cox masih belum stasioner dalam mean. Oleh karena itu diperlukan proses differencing untuk menstabilkan rata-rata data sebelum dilakukan analisis lebih lanjut.

4.4.2 Differencing Pertama

diff_beras <- diff(beras_bc)

autoplot(diff_beras) +
  labs(title = "Data Harga Beras Setelah Differencing Pertama",
       x = "Tahun",
       y = "Differencing Harga")

adf.test(diff_beras)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff_beras
## Dickey-Fuller = -4.8111, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
  • Hipotesis

    H₀ : Data memiliki unit root sehingga data tidak stasioner dalam mean.

    H₁ : Data tidak memiliki unit root sehingga data stasioner dalam mean.

  • Taraf Signifikansi

    α = 0.05

  • Statistik Uji

    Berdasarkan hasil uji Augmented Dickey-Fuller (ADF) pada data hasil differencing diperoleh nilai statistik Dickey-Fuller sebesar −4.8111 dengan p-value sebesar 0.01.

  • Daerah Kritis

    H₀ ditolak jika p-value < α (0.05).

  • Keputusan

    Karena nilai p-value (0.01) < α (0.05), maka H₀ ditolak.

  • Kesimpulan

    Pada taraf signifikansi 0.05 dapat disimpulkan bahwa data hasil differencing telah stasioner dalam mean. Oleh karena itu, proses differencing pertama sudah cukup untuk menstabilkan rata-rata data dan data dapat digunakan untuk tahap analisis selanjutnya.

4.5 ACF dan PACF

Acf(diff_beras)

Pacf(diff_beras)

Berdasarkan plot ACF dan PACF dari data yang telah stasioner setelah proses differencing pertama, terlihat bahwa nilai autokorelasi pada beberapa lag awal masih signifikan dan kemudian menurun secara bertahap menuju nol. Pada plot PACF terlihat adanya spike yang signifikan pada lag pertama sebelum kemudian menurun pada lag-lag berikutnya. Pola tersebut mengindikasikan adanya kemungkinan komponen autoregressive pada lag awal. Selain itu, tidak terlihat adanya pola musiman yang signifikan pada lag ke-12 sehingga model yang digunakan merupakan model ARIMA non-musiman.

4.6 Identifikasi Model

Model yang digunakan dalam analisis ini adalah model ARIMA non-musiman dengan bentuk umum ARIMA(p,d,q).

p : orde autoregressive (AR)
d : orde differencing
q : orde moving average (MA)

Berdasarkan hasil pengujian sebelumnya, data telah dilakukan differencing satu kali sehingga nilai d = 1. Selanjutnya, penentuan nilai p dan q dilakukan berdasarkan pola pada plot ACF dan PACF.

Berdasarkan hasil analisis plot ACF dan PACF, diperoleh kemungkinan nilai:

p : 0, 1
d : 1
q : 0, 1

Sehingga beberapa kandidat model ARIMA yang dapat digunakan adalah:

ARIMA(1,1,0)
ARIMA(0,1,1)
ARIMA(1,1,1)

Model-model tersebut selanjutnya akan diestimasi dan dibandingkan untuk menentukan model yang paling sesuai dalam memodelkan data harga beras.

5 Estimasi dan Verifikasi Model

5.1 Uji Signifikansi Parameter

# Definisikan Model Kandidat
model1 <- Arima(beras_ts, order = c(1,1,0))
model2 <- Arima(beras_ts, order = c(0,1,1))
model3 <- Arima(beras_ts, order = c(1,1,1))

# FUngsi Uji Signifikansi Parameter
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)
}

# Uji Untuk setiap model
hasil_model1 <- uji_signifikansi(model1)
print(hasil_model1)
##     Parameter  Estimate  Std_Error z_value      p_value  Keputusan
## ar1       ar1 0.4165642 0.08717468  4.7785 1.766075e-06 Signifikan
hasil_model2 <- uji_signifikansi(model2)
print(hasil_model2)
##     Parameter  Estimate  Std_Error  z_value      p_value  Keputusan
## ma1       ma1 0.5878475 0.07535599 7.800938 6.217249e-15 Signifikan
hasil_model3 <- uji_signifikansi(model3)
print(hasil_model3)
##     Parameter   Estimate Std_Error   z_value      p_value        Keputusan
## ar1       ar1 0.03644065 0.1548470 0.2353332 8.139501e-01 Tidak Signifikan
## ma1       ma1 0.56513997 0.1250392 4.5197041 6.192613e-06       Signifikan
  • HIpotesis

    H₀ : 𝜑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 nilai p-value pada output hasil estimasi model.

  • Daerah Kritis

    H₀ ditolak jika p-value < α (0.05).

  • Keputusan dan Kesimpulan

    Berdasarkan model ARIMA(1,1,0), diperoleh bahwa parameter AR(1) memiliki nilai p-value sebesar 1.766075e-06 yang lebih kecil dari α (0.05). Hal ini menunjukkan bahwa parameter AR(1) signifikan secara statistik sehingga komponen autoregressive pada lag pertama berpengaruh terhadap model.

    Pada model ARIMA(0,1,1), diperoleh bahwa parameter MA(1) memiliki nilai p-value sebesar 6.217249e-15 yang lebih kecil dari α (0.05). Hal ini menunjukkan bahwa parameter MA(1) signifikan secara statistik sehingga komponen moving average pada lag pertama berpengaruh terhadap model.

    Pada model ARIMA(1,1,1), diperoleh bahwa parameter AR(1) memiliki nilai p-value sebesar 0.8139501 yang lebih besar dari α (0.05) sehingga tidak signifikan secara statistik. Sementara itu, parameter MA(1) memiliki nilai p-value sebesar 6.192613e-06 yang lebih kecil dari α (0.05) sehingga signifikan secara statistik. Dengan demikian, hanya parameter MA(1) yang berpengaruh signifikan terhadap model.

    Perbandingan Model

    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,1,0)",
                "ARIMA(0,1,1)",
                "ARIMA(1,1,1)"),
    
      AIC = c(AIC(model1),
              AIC(model2),
              AIC(model3)),
    
      Signifikansi = c(
        hitung_signifikan(model1),
        hitung_signifikan(model2),
        hitung_signifikan(model3)
      )
    )
    
    print(tabel_model)
    ##          Model      AIC Signifikansi
    ## 1 ARIMA(1,1,0) 1487.865 1 signifikan
    ## 2 ARIMA(0,1,1) 1475.496 1 signifikan
    ## 3 ARIMA(1,1,1) 1477.441 1 signifikan

Berdasarkan hasil perbandingan model menggunakan nilai Akaike Information Criterion (AIC), diperoleh bahwa model ARIMA(0,1,1) memiliki nilai AIC paling kecil yaitu sebesar 1475.496, dibandingkan dengan model ARIMA(1,1,0) dengan nilai AIC sebesar 1487.865 dan ARIMA(1,1,1) dengan nilai AIC sebesar 1477.441. Selain itu, ketiga model memiliki parameter yang signifikan secara statistik. Oleh karena itu, model ARIMA(0,1,1) dipilih sebagai model terbaik untuk tahap analisis selanjutnya karena memiliki nilai AIC paling kecil sehingga dianggap paling mampu menjelaskan pola data dengan baik.

5.2 Uji Normalitas Residual

res <- residuals(model2)
shapiro.test(res)
## 
##  Shapiro-Wilk normality test
## 
## data:  res
## W = 0.89836, p-value = 5.244e-07
  • Hipotesis

    H₀ : Residual berdistribusi normal

    H₁ : Residual tidak berdistribusi normal

  • Taraf Signifikansi

    α = 0.05

  • Statistik Uji

    Berdasarkan hasil uji Shapiro-Wilk diperoleh nilai statistik uji W sebesar 0.89836 dengan p-value sebesar 5.244e-07.

  • Daerah Kritis

    H₀ ditolak jika p-value < α (0.05).

  • Keputusan

    Karena nilai p-value (5.244e-07) < 0.05, maka H₀ ditolak.

  • Kesimpulan

    Pada taraf signifikansi 0.05 dapat disimpulkan bahwa residual dari model ARIMA(0,1,1) tidak berdistribusi normal.

Dalam model ARIMA, normalitas residual tidak selalu harus terpenuhi secara ketat, yang lebih penting biasanya adalah independensi residual (tidak ada autokorelasi).

5.3 Uji Independensi Residual (Ljung-Box)

Box.test(residuals(model2), type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(model2)
## X-squared = 0.0054233, df = 1, p-value = 0.9413
  • Hipotesis

    H₀ : Tidak terdapat autokorelasi antar lag residual

    H₁ : Terdapat autokorelasi antar lag residual

  • Taraf Signifikansi

    α = 0.05

  • Statistik Uji

    Berdasarkan hasil uji Box-Ljung diperoleh nilai statistik uji sebesar 0.0054233 dengan p-value sebesar 0.9413.

  • Daerah Kritis

    H₀ ditolak jika p-value < α (0.05).

  • Keputusan

    Karena nilai p-value (0.9413) > 0.05, maka H₀ gagal ditolak.

  • Kesimpulan

    Pada taraf signifikansi 0.05 dapat disimpulkan bahwa tidak terdapat autokorelasi pada residual model ARIMA(0,1,1). Hal ini menunjukkan bahwa residual bersifat independen sehingga model telah memenuhi asumsi independensi residual.

5.4 Uji Homoskedastisitas Residual (ARCH Test)

ArchTest(residuals(model2), lags = 12)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  residuals(model2)
## Chi-squared = 30.308, df = 12, p-value = 0.002509
  • Hipotesis

    H₀ : Tidak terdapat gejala heteroskedastisitas pada residual

    H₁ : Terdapat gejala heteroskedastisitas pada residual

  • Taraf Signifikansi

    α = 0.05

  • Statistik Uji

    Berdasarkan hasil uji ARCH LM diperoleh nilai statistik Chi-squared sebesar 30.308 dengan p-value sebesar 0.002509.

  • Daerah Kritis

    H₀ ditolak jika p-value < α (0.05).

  • Keputusan

    Karena nilai p-value (0.002509) < 0.05, maka H₀ ditolak.

  • Kesimpulan

    Pada taraf signifikansi 0.05 dapat disimpulkan bahwa terdapat gejala heteroskedastisitas pada residual model ARIMA(0,1,1) sehingga asumsi homoskedastisitas tidak terpenuhi.

Berdasarkan hasil pengujian diagnostik residual, diperoleh bahwa residual model ARIMA(0,1,1) tidak berdistribusi normal dan terdapat gejala heteroskedastisitas. Namun hasil uji independensi residual menunjukkan bahwa tidak terdapat autokorelasi pada residual sehingga residual dapat dianggap bersifat white noise. Oleh karena itu, model ARIMA(0,1,1) masih dapat digunakan untuk proses peramalan.

6 MAPE

6.1 Fungsi MAPE dan SMAPE

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
}

6.2 Data Training dan Testing

n <- length(beras_ts)

n_train <- floor(0.8 * n)

train <- window(beras_ts, end = time(beras_ts)[n_train])
test  <- window(beras_ts, start = time(beras_ts)[n_train+1])

length(train)
## [1] 86
length(test)
## [1] 22

6.3 Hasil MAPE

model_train <- Arima(train, order = c(0,1,1))

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  1.43703  1.445083
## 2  Testing 14.66698 13.601418

Berdasarkan hasil perhitungan, diperoleh nilai MAPE sebesar 1.43703% dan SMAPE sebesar 1.445083% pada data training, sedangkan pada data testing diperoleh MAPE sebesar 14.66698% dan SMAPE sebesar 13.601418%. Nilai kesalahan pada data training relatif sangat kecil yang menunjukkan bahwa model mampu memodelkan data dengan sangat baik. Sementara itu, nilai kesalahan pada data testing masih berada pada tingkat yang cukup baik sehingga model ARIMA(0,1,1) memiliki kemampuan yang cukup baik dalam memodelkan dan memprediksi data harga beras.

7 Forecasting

forecast_model <- forecast(model2, h = 12)

autoplot(forecast_model) +
  labs(title = "Forecast Harga Beras",
       x = "Tahun",
       y = "Harga")

Berdasarkan hasil peramalan menggunakan model ARIMA(0,1,1) untuk 12 periode mendatang, terlihat bahwa harga beras diprediksi akan bergerak relatif stabil di sekitar nilai pada periode terakhir. Garis biru menunjukkan nilai prediksi utama, sedangkan area berwarna biru menunjukkan interval kepercayaan dari hasil peramalan. Semakin jauh periode yang diprediksi, rentang interval kepercayaan semakin melebar yang menandakan meningkatnya ketidakpastian prediksi pada periode yang lebih panjang.