Eksplorasi dan Pemulusan Data Time Series
Kelompok 5
P2-MPDW 2022
Anggota:
Hanung Safrizal (G1401201050)
Maulana Ahsan Fadillah (G1401201062)
Muhammad Irsyad Robbani (G1401201064)
Muhammad Raziv Zulfikar (G1401201083)
Dhea Puspita Adinda (G1401201090)
Pendahuluan
Latar Belakang
Beras merupakan makanan pokok bagi sebagian besar masyarakat Indonesia. Konsumsi beras di Indonesia meningkat setiap tahunnya seiring dengan meningkatnya jumlah penduduk di Indonesia. Ketergantungan masyarakat Indonesia terhadap beras bisa menimbulkan masalah jika ketersediaan beras sudah tidak dapat tercukupi. Pemenuhan kebutuhan dan stabilitas harga beras merupakan isu yang tetap relevan dari waktu ke waktu. Jumlah penduduk yang besar menjadikan permasalahan beras bukan hanya pada jumlah ketersediaan dan harga saja, namun termasuk keberagaman kualitas dan jenis produk beras (BPS 2009). Pada awal tahun 2018 harga beras mengalami peningkatan. Kenaikan harga beras ini jika terus dibiarkan akan menyebabkan terjadinya inflasi yang berdampak pada melambatnya pertumbuhan ekonomi nasional serta dampak negatif lainnya. Dalam rangka perumusan kebijakan pengendalian inflasi maka data dan informasi terkait proyeksi keadaan pasar sangat dibutuhkan. Oleh karena itu, pemodelan harga beras di Indonesia sangat perlu dilakukan.
Tujuan
- Mengeksplorasi dan forecasting data time series harga beras premium di Indonesia per bulan pada tahun 2013-2022.
Tinjauan Pustaka
Metode Single Moving Average
Metode single moving average adalah metode peramalan yang menggunakan sejumlah data aktual permintaan yang baru untuk membangkitkan nilai ramalan untuk permintaan dimasa yang akan datang.(Naufal dan Andrean, 2017).
Metode Double Moving Average
Metode Double Moving Average adalah merupakan suatu metode peramalan yang dilakukan dengan menghitung nilai rata-rata bergerak sebanyak dua kali, lalu dilanjutkan dengan meramal menggunakan suatu persamaan. Metode DMA digunakan untuk mengatasi galat sistematis yang terjadi apabila rata-rata bergerak data dipakai pada data yang memiliki tren. Metode ini merupakan pengembangan dari metode SMA (Muzaki 2022).
Metode Single Exponential Smoothing
Metode Single Exponential Smoothing adalah metode yang menunjukan pembobotan menurun secara eksponensial terhadap nilai observasi yang lebih tua. Yaitu nilai yang lebih baru diberikan bobot yang relatif lebih besar dibanding nilai observasi yang lebih lama. Metode ini memberikan sebuah pembobotan eksponensial rata-rata bergerak dari semua nilai observasi sebelumnya (Hartono et.al, 2012).
Metode Double Exponential Smoothing
Metode Double Exponential Smoothing merupakan metode yang digunakan untuk meramalkan data yang mengalami trend kenaikan. Jika data yang digunakan semakin banyak dalam perhitungan peramalan, maka persentase error peramalannya akan semakin kecil dan sebaliknya (Hanief dan Purwanto 2017).
Winter Smoothing
Metode pemulusan eksponensial linear dari Winter’s digunakan untuk peramalan jika data memiliki komponen musiman. Metode winter didasarkan pada tiga persamaan pemulusan, yaitu stasioneritas, trend, dan musiman. Holt Winter sendiri memiliki dua metode yang berbeda, bergantung pada sifat musiman itu sendiri, yaitu aditif atau multiplikatif.
SSE
Sum Square Error (SSE) menjumlahkan kuadrat dari kesalahan.
MSE
Mean Squared Error (MSE) merata-ratakan kuadrat dari kesalahan menggunakan penyebut n tanpa memperhatikan derajat bebas model. MSE banyak dipakai dalam optimalisasi pembobotan karena memberikan ketelitian yang lebih baik.
RMSE
Root Mean Square Error (RMSE) diperoleh dengan mengakarkan hasil MSE.
MAD
Simpangan absolut rata-rata atau mean absolute deviation (MAD) merata-ratakan nilai absolut kesalahan peramalan dalam unit ukuran yang sama seperti data aktual.
MAPE
Mean absolute percentage error (MAPE) merata-ratakan persentase absolut kesalahan dan memberikan gambaran seberapa kesalahan peramalan dibanding dengan nilai sebenarnya. MAPE banyak dipakai dalam perbandingan data-data yang mempunyai skala interval waktu yang berbeda.
Package dan Data
1. Memanggil Library
Packages yang digunakan dalam analisis eksplorasi dan pemulusan data deret waktu, sebagai berikut:
library(forecast)## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(TTR)
library(TSA)## 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
library(readxl)2. Memanggil Data
Data yang digunakan pada pengerjaan tugas analisis eksplorasi dan pemulusan deret waktua adalah data beras premium di Indonesia per bulan dari tahun 2013 hingga 2022. Data diperoleh dari web BPS Indonesia ( https://www.bps.go.id/indicator/36/500/1/harga-beras-di-penggilingan-menurut-kualitas.html). Pada data harga beras terdapat 3 peubah yang digunakan yaitu beras premium, medium, dan luar kualitas tetapi peubah yang digunakan dalam eksplorasi kali ini adalah data beras premium dengan jumlah amatan sebanyak 115 amatan.
data <- read_xlsx("C:/0 SEM5/MPDW/p1/Data Kelompok 15.xlsx")3. Split Data
Spliting data dilakukan untuk memisahkan data menjadi dua bagian yaitu data training dan data testing. Data training digunakan untuk menentukan model yang sesuai dengan keseluruhan data dan membuat model, sedangkan data testing digunakan untuk menguji performa dari model yang telah didapatkan. Data dibagi dengan perbandingan 80% : 20%. Jumlah data training sebanyak 92 amatan (amatan 1 sampai 92) dan data testing sebanyak 23 amatan (amatan 93 sampai 115).
train <- data[1:92, 3]
test <- data[93:115, 3]
data.premium <- ts(data[,3])
train.ts <- ts(train,start = 2013, frequency = 12)
test.ts <- ts(test)
data.ts <- ts(data[,3], start = 2013, frequency = 12)Eksplorasi Data Analisis
Plot Data Time Series
Single Moving Average (SMA)
Pemulusan SMA dengan n=4
data.sma<-SMA(train.ts, n=4)
data.sma## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2013 NA NA NA 13.00 11.50 10.50 11.75 13.00 13.75 15.50 16.25 18.00
## 2014 21.00 23.25 24.25 23.75 23.00 22.00 22.50 25.00 26.50 28.25 29.50 31.00
## 2015 43.00 55.25 65.00 65.75 54.75 43.25 34.25 34.00 39.25 44.75 53.50 63.00
## 2016 68.75 74.75 75.00 65.75 56.75 48.00 42.00 43.75 42.75 41.50 40.25 39.75
## 2017 43.25 45.75 47.50 47.25 47.50 48.75 48.50 51.00 53.00 54.75 60.00 68.00
## 2018 55.00 41.75 46.00 41.50 56.00 69.00 63.75 61.25 62.75 66.00 69.50 75.75
## 2019 59.50 41.50 42.00 36.25 49.00 64.25 60.00 62.25 66.00 69.00 72.50 76.50
## 2020 59.25 41.75 23.75 3.50 23.25 43.75 64.25 85.75
data.ramal<-c(NA,data.sma)
data.ramal #forecast 1 periode ke depan## [1] NA NA NA NA 13.00 11.50 10.50 11.75 13.00 13.75 15.50 16.25
## [13] 18.00 21.00 23.25 24.25 23.75 23.00 22.00 22.50 25.00 26.50 28.25 29.50
## [25] 31.00 43.00 55.25 65.00 65.75 54.75 43.25 34.25 34.00 39.25 44.75 53.50
## [37] 63.00 68.75 74.75 75.00 65.75 56.75 48.00 42.00 43.75 42.75 41.50 40.25
## [49] 39.75 43.25 45.75 47.50 47.25 47.50 48.75 48.50 51.00 53.00 54.75 60.00
## [61] 68.00 55.00 41.75 46.00 41.50 56.00 69.00 63.75 61.25 62.75 66.00 69.50
## [73] 75.75 59.50 41.50 42.00 36.25 49.00 64.25 60.00 62.25 66.00 69.00 72.50
## [85] 76.50 59.25 41.75 23.75 3.50 23.25 43.75 64.25 85.75
data.gab<-cbind(aktual=c(train.ts,rep(NA,5)),pemulusan=c(data.sma,rep(NA,5)),ramalan=c(data.ramal,rep(data.ramal[length(data.ramal)],4)))
data.gab #forecast 5 periode ke depan## aktual pemulusan ramalan
## [1,] 16 NA NA
## [2,] 15 NA NA
## [3,] 12 NA NA
## [4,] 9 13.00 NA
## [5,] 10 11.50 13.00
## [6,] 11 10.50 11.50
## [7,] 17 11.75 10.50
## [8,] 14 13.00 11.75
## [9,] 13 13.75 13.00
## [10,] 18 15.50 13.75
## [11,] 20 16.25 15.50
## [12,] 21 18.00 16.25
## [13,] 25 21.00 18.00
## [14,] 27 23.25 21.00
## [15,] 24 24.25 23.25
## [16,] 19 23.75 24.25
## [17,] 22 23.00 23.75
## [18,] 23 22.00 23.00
## [19,] 26 22.50 22.00
## [20,] 29 25.00 22.50
## [21,] 28 26.50 25.00
## [22,] 30 28.25 26.50
## [23,] 31 29.50 28.25
## [24,] 35 31.00 29.50
## [25,] 76 43.00 31.00
## [26,] 79 55.25 43.00
## [27,] 70 65.00 55.25
## [28,] 38 65.75 65.00
## [29,] 32 54.75 65.75
## [30,] 33 43.25 54.75
## [31,] 34 34.25 43.25
## [32,] 37 34.00 34.25
## [33,] 53 39.25 34.00
## [34,] 55 44.75 39.25
## [35,] 69 53.50 44.75
## [36,] 75 63.00 53.50
## [37,] 76 68.75 63.00
## [38,] 79 74.75 68.75
## [39,] 70 75.00 74.75
## [40,] 38 65.75 75.00
## [41,] 40 56.75 65.75
## [42,] 44 48.00 56.75
## [43,] 46 42.00 48.00
## [44,] 45 43.75 42.00
## [45,] 36 42.75 43.75
## [46,] 39 41.50 42.75
## [47,] 41 40.25 41.50
## [48,] 43 39.75 40.25
## [49,] 50 43.25 39.75
## [50,] 49 45.75 43.25
## [51,] 48 47.50 45.75
## [52,] 42 47.25 47.50
## [53,] 51 47.50 47.25
## [54,] 54 48.75 47.50
## [55,] 47 48.50 48.75
## [56,] 52 51.00 48.50
## [57,] 59 53.00 51.00
## [58,] 61 54.75 53.00
## [59,] 68 60.00 54.75
## [60,] 84 68.00 60.00
## [61,] 7 55.00 68.00
## [62,] 8 41.75 55.00
## [63,] 85 46.00 41.75
## [64,] 66 41.50 46.00
## [65,] 65 56.00 41.50
## [66,] 60 69.00 56.00
## [67,] 64 63.75 69.00
## [68,] 56 61.25 63.75
## [69,] 71 62.75 61.25
## [70,] 73 66.00 62.75
## [71,] 78 69.50 66.00
## [72,] 81 75.75 69.50
## [73,] 6 59.50 75.75
## [74,] 1 41.50 59.50
## [75,] 80 42.00 41.50
## [76,] 58 36.25 42.00
## [77,] 57 49.00 36.25
## [78,] 62 64.25 49.00
## [79,] 63 60.00 64.25
## [80,] 67 62.25 60.00
## [81,] 72 66.00 62.25
## [82,] 74 69.00 66.00
## [83,] 77 72.50 69.00
## [84,] 83 76.50 72.50
## [85,] 3 59.25 76.50
## [86,] 4 41.75 59.25
## [87,] 5 23.75 41.75
## [88,] 2 3.50 23.75
## [89,] 82 23.25 3.50
## [90,] 86 43.75 23.25
## [91,] 87 64.25 43.75
## [92,] 88 85.75 64.25
## [93,] NA NA 85.75
## [94,] NA NA 85.75
## [95,] NA NA 85.75
## [96,] NA NA 85.75
## [97,] NA NA 85.75
data.gabb <- ts(data.gab, start = 2013, frequency = 12)Hasil peramalan dengan menggunakan N=5 pada metode SMA adalah sebesar 85.75
Plot time series
ts.plot(data.gabb[,1], xlab="Time Period ", ylab="Sales", main= "SMA N=4 Data Premium")
points(data.gabb[,1])
lines(data.gabb[,2],col="green",lwd=2)
lines(data.gabb[,3],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)Menghitung nilai keakuratan
data.premium=as.numeric(data.premium)error.sma = test.ts-data.ramal[1:length(test.ts)]
SSE.sma = sum(error.sma[5:length(test.ts)]^2)
MSE.sma = mean(error.sma[5:length(test.ts)]^2)
MAPE.sma = mean(abs((error.sma[5:length(test.ts)]/test.ts[5:length(test.ts)])*100))
akurasi.sma <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasi.sma)<- c("SSE", "MSE", "MAPE")
colnames(akurasi.sma) <- c("Akurasi m = 4")
akurasi.sma## Akurasi m = 4
## SSE 2631.6875
## MSE 138.5099
## MAPE 249.5628
Double Moving Average (DMA)
Pemulusan DMA dengan n=4
dma <- SMA(data.sma, n = 4)
At <- 2*data.sma - dma
Bt <- 2/(4-1)*(data.sma - dma)
data.dma<- At+Bt
data.ramal2<- c(NA, data.dma)
t = 1:5
f = c()
for (i in t) {
f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}
data.gab2 <- cbind(aktual = c(train.ts,rep(NA,5)), pemulusan1 = c(data.sma,rep(NA,5)),pemulusan2 = c(data.dma, rep(NA,5)),At = c(At, rep(NA,5)), Bt = c(Bt,rep(NA,5)),ramalan = c(data.ramal2, f[-1]))
data.gab2## aktual pemulusan1 pemulusan2 At Bt ramalan
## [1,] 16 NA NA NA NA NA
## [2,] 15 NA NA NA NA NA
## [3,] 12 NA NA NA NA NA
## [4,] 9 13.00 NA NA NA NA
## [5,] 10 11.50 NA NA NA NA
## [6,] 11 10.50 NA NA NA NA
## [7,] 17 11.75 11.854167 11.8125 0.04166667 NA
## [8,] 14 13.00 15.187500 14.3125 0.87500000 11.854167
## [9,] 13 13.75 16.250000 15.2500 1.00000000 15.187500
## [10,] 18 15.50 18.833333 17.5000 1.33333333 16.250000
## [11,] 20 16.25 18.958333 17.8750 1.08333333 18.833333
## [12,] 21 18.00 21.541667 20.1250 1.41666667 18.958333
## [13,] 25 21.00 26.520833 24.3125 2.20833333 21.541667
## [14,] 27 23.25 29.291667 26.8750 2.41666667 26.520833
## [15,] 24 24.25 28.625000 26.8750 1.75000000 29.291667
## [16,] 19 23.75 24.895833 24.4375 0.45833333 28.625000
## [17,] 22 23.00 22.062500 22.4375 -0.37500000 24.895833
## [18,] 23 22.00 19.916667 20.7500 -0.83333333 22.062500
## [19,] 26 22.50 21.979167 22.1875 -0.20833333 19.916667
## [20,] 29 25.00 28.125000 26.8750 1.25000000 21.979167
## [21,] 28 26.50 30.666667 29.0000 1.66666667 28.125000
## [22,] 30 28.25 32.729167 30.9375 1.79166667 30.666667
## [23,] 31 29.50 33.145833 31.6875 1.45833333 32.729167
## [24,] 35 31.00 34.645833 33.1875 1.45833333 33.145833
## [25,] 76 43.00 59.770833 53.0625 6.70833333 34.645833
## [26,] 79 55.25 81.187500 70.8125 10.37500000 59.770833
## [27,] 70 65.00 92.395833 81.4375 10.95833333 81.187500
## [28,] 38 65.75 79.916667 74.2500 5.66666667 92.395833
## [29,] 32 54.75 45.687500 49.3125 -3.62500000 79.916667
## [30,] 33 43.25 20.020833 29.3125 -9.29166667 45.687500
## [31,] 34 34.25 8.833333 19.0000 -10.16666667 20.020833
## [32,] 37 34.00 21.395833 26.4375 -5.04166667 8.833333
## [33,] 53 39.25 41.854167 40.8125 1.04166667 21.395833
## [34,] 55 44.75 55.895833 51.4375 4.45833333 41.854167
## [35,] 69 53.50 71.208333 64.1250 7.08333333 55.895833
## [36,] 75 63.00 84.458333 75.8750 8.58333333 71.208333
## [37,] 76 68.75 87.500000 80.0000 7.50000000 84.458333
## [38,] 79 74.75 91.000000 84.5000 6.50000000 87.500000
## [39,] 70 75.00 82.708333 79.6250 3.08333333 91.000000
## [40,] 38 65.75 56.895833 60.4375 -3.54166667 82.708333
## [41,] 40 56.75 37.895833 45.4375 -7.54166667 56.895833
## [42,] 44 48.00 25.708333 34.6250 -8.91666667 37.895833
## [43,] 46 42.00 23.458333 30.8750 -7.41666667 25.708333
## [44,] 45 43.75 37.291667 39.8750 -2.58333333 23.458333
## [45,] 36 42.75 40.458333 41.3750 -0.91666667 37.291667
## [46,] 39 41.50 39.833333 40.5000 -0.66666667 40.458333
## [47,] 41 40.25 37.229167 38.4375 -1.20833333 39.833333
## [48,] 43 39.75 37.562500 38.4375 -0.87500000 37.229167
## [49,] 50 43.25 46.687500 45.3125 1.37500000 37.562500
## [50,] 49 45.75 51.583333 49.2500 2.33333333 46.687500
## [51,] 48 47.50 53.229167 50.9375 2.29166667 51.583333
## [52,] 42 47.25 49.437500 48.5625 0.87500000 53.229167
## [53,] 51 47.50 48.333333 48.0000 0.33333333 49.437500
## [54,] 54 48.75 50.416667 49.7500 0.66666667 48.333333
## [55,] 47 48.50 49.333333 49.0000 0.33333333 50.416667
## [56,] 52 51.00 54.437500 53.0625 1.37500000 49.333333
## [57,] 59 53.00 57.479167 55.6875 1.79166667 54.437500
## [58,] 61 54.75 59.645833 57.6875 1.95833333 57.479167
## [59,] 68 60.00 68.854167 65.3125 3.54166667 59.645833
## [60,] 84 68.00 83.104167 77.0625 6.04166667 68.854167
## [61,] 7 55.00 47.604167 50.5625 -2.95833333 83.104167
## [62,] 8 41.75 17.687500 27.3125 -9.62500000 47.604167
## [63,] 85 46.00 34.854167 39.3125 -4.45833333 17.687500
## [64,] 66 41.50 33.895833 36.9375 -3.04166667 34.854167
## [65,] 65 56.00 72.145833 65.6875 6.45833333 33.895833
## [66,] 60 69.00 95.458333 84.8750 10.58333333 72.145833
## [67,] 64 63.75 74.062500 69.9375 4.12500000 95.458333
## [68,] 56 61.25 59.166667 60.0000 -0.83333333 74.062500
## [69,] 71 62.75 60.354167 61.3125 -0.95833333 59.166667
## [70,] 73 66.00 70.270833 68.5625 1.70833333 60.354167
## [71,] 78 69.50 77.208333 74.1250 3.08333333 70.270833
## [72,] 81 75.75 87.833333 83.0000 4.83333333 77.208333
## [73,] 6 59.50 45.854167 51.3125 -5.45833333 87.833333
## [74,] 1 41.50 8.062500 21.4375 -13.37500000 45.854167
## [75,] 80 42.00 20.854167 29.3125 -8.45833333 8.062500
## [76,] 58 36.25 21.979167 27.6875 -5.70833333 20.854167
## [77,] 57 49.00 60.354167 55.8125 4.54166667 21.979167
## [78,] 62 64.25 91.541667 80.6250 10.91666667 60.354167
## [79,] 63 60.00 72.708333 67.6250 5.08333333 91.541667
## [80,] 67 62.25 67.875000 65.6250 2.25000000 72.708333
## [81,] 72 66.00 70.791667 68.8750 1.91666667 67.875000
## [82,] 74 69.00 76.812500 73.6875 3.12500000 70.791667
## [83,] 77 72.50 80.937500 77.5625 3.37500000 76.812500
## [84,] 83 76.50 85.666667 82.0000 3.66666667 80.937500
## [85,] 3 59.25 42.479167 49.1875 -6.70833333 85.666667
## [86,] 4 41.75 7.166667 21.0000 -13.83333333 42.479167
## [87,] 5 23.75 -20.520833 -2.8125 -17.70833333 7.166667
## [88,] 2 3.50 -44.104167 -25.0625 -19.04166667 -20.520833
## [89,] 82 23.25 23.562500 23.4375 0.12500000 -44.104167
## [90,] 86 43.75 77.395833 63.9375 13.45833333 23.562500
## [91,] 87 64.25 115.187500 94.8125 20.37500000 77.395833
## [92,] 88 85.75 138.250000 117.2500 21.00000000 115.187500
## [93,] NA NA NA NA NA 138.250000
## [94,] NA NA NA NA NA 159.250000
## [95,] NA NA NA NA NA 180.250000
## [96,] NA NA NA NA NA 201.250000
## [97,] NA NA NA NA NA 222.250000
data.gabb2<- ts(data.gab2, start = 2013, frequency = 12)Hasil peramalan dengan menggunakan N=5 selama 5 periode kedepan pada metode DMA terus menurun dari 138.25 sampai 222.25
Plot time series
ts.plot(data.gabb2[,1], xlab="Time Period ", ylab="Sales", main= "DMA N=4 Data Premium")
points(data.gabb2[,1])
lines(data.gabb2[,3],col="green",lwd=2)
lines(data.gabb2[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.7)Menghitung nilai keakuratan
error.dma = test.ts-data.ramal2[1:length(test.ts)]
SSE.dma = sum(error.dma[8:length(test.ts)]^2)
MSE.dma = mean(error.dma[8:length(test.ts)]^2)
MAPE.dma = mean(abs((error.dma[8:length(test.ts)]/test.ts[8:length(test.ts)])*100))
akurasi.dma <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasi.dma)<- c("SSE", "MSE", "MAPE")
colnames(akurasi.dma) <- c("Akurasi m = 4")
akurasi.dma## Akurasi m = 4
## SSE 3981.2444
## MSE 248.8278
## MAPE 362.7550
akurasi.sma## Akurasi m = 4
## SSE 2631.6875
## MSE 138.5099
## MAPE 249.5628
Dengan metode SMA, diketahui SSE, MSE, dan MAPE bernilai lebih kecil Metode SMA lebih baik digunakan # Looping for Best M value ## SMA
m = 2:30
akurasi.full <- c()
data.premium <- as.numeric(train.ts)
for(i in m){
data.sma <- SMA(train.ts, n = i)
data.ramal <- c(NA, data.sma)
error.sma = train.ts - data.ramal[1:length(train.ts)]
SSE.sma = sum(error.sma[(i+1):length(train.ts)]^2)
MSE.sma = mean(error.sma[(i+1):length(train.ts)]^2)
MAPE.sma = mean(abs((error.sma[(i+1):length(train.ts)]/train.ts[(i+1):length(train.ts)])*100))
tabel <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
colnames(tabel) <- paste("M =", i)
rownames(tabel) <- c("SSE", "MSE", "MAPE")
akurasi.full <- cbind(akurasi.full, tabel)
}
View(akurasi.full)
akurasi.full## M = 2 M = 3 M = 4 M = 5 M = 6 M = 7
## SSE 50223.7500 51596.6667 54846.0625 55266.4800 54076.7222 52865.6531
## MSE 558.0417 579.7378 623.2507 635.2469 628.7991 621.9489
## MAPE 136.2434 160.1736 182.5107 194.4230 198.9245 203.1741
## M = 8 M = 9 M = 10 M = 11 M = 12 M = 13
## SSE 51381.3750 50182.5062 49873.9400 48060.7851 45059.3472 44181.6627
## MSE 611.6830 604.6085 608.2188 593.3430 563.2418 559.2616
## MAPE 205.8848 208.7878 212.5577 214.0558 206.0703 202.9866
## M = 14 M = 15 M = 16 M = 17 M = 18 M = 19
## SSE 44222.2857 44859.6578 46146.3086 47110.8270 47919.2500 48384.4432
## MSE 566.9524 582.5930 607.1883 628.1444 647.5574 662.8006
## MAPE 205.6333 208.1853 213.3207 217.2473 220.3528 222.7301
## M = 20 M = 21 M = 22 M = 23 M = 24 M = 25
## SSE 48529.4375 48620.6417 49008.7831 49250.6181 48977.2101 45993.0672
## MSE 674.0200 684.7978 700.1255 713.7771 720.2531 686.4637
## MAPE 225.0758 227.5231 230.2930 232.7044 234.3229 236.7789
## M = 26 M = 27 M = 28 M = 29 M = 30
## SSE 42808.1701 41010.5446 41406.6403 41782.3769 42084.0256
## MSE 648.6086 630.9315 646.9788 663.2123 678.7746
## MAPE 237.3118 238.2589 241.5601 244.2212 247.0938
Nilai error yang terkecil merupakan n optimal, terlihat error yang terkecil ada pada N=27
DMA
m = 2:30
akurasi.full2 <- c()
for(i in m){
data.sma <- SMA(train.ts, n = i)
dma <- SMA(data.sma, n = i)
At <- 2*data.sma - dma
Bt <- 2/(i - 1) * (data.sma - dma)
data.dma <- At + Bt
data.ramal2 <- c(NA, data.dma)
error.dma <- test.ts - data.ramal2[1:length(test.ts)]
SSE.dma <- sum(error.dma[(i*2):length(test.ts)]^2)
MSE.dma <- mean(error.dma[(i*2):length(test.ts)]^2)
MAPE.dma <- mean(abs(error.dma[(i*2):115]/test.ts[(i*2):115]) * 100)
tabel2 <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
colnames(tabel2) <- paste("M =", i)
rownames <- c("SSE", "MSE", "MAPE")
akurasi.full2 <- cbind(akurasi.full2, tabel2)
}
akurasi.full2 <- as.data.frame(akurasi.full2)
View(akurasi.full2)
akurasi.full2## M = 2 M = 3 M = 4 M = 5 M = 6 M = 7 M = 8 M = 9
## 1 4744.1875 4446.432 3981.2444 3529.1308 3012.3062 2514.1415 1898.7657 1883.22
## 2 237.2094 247.024 248.8278 252.0808 251.0255 251.4141 237.3457 313.87
## 3 NA NA NA NA NA NA NA NA
## M = 10 M = 11 M = 12 M = 13 M = 14 M = 15 M = 16 M = 17 M = 18 M = 19
## 1 1865.0093 1009.2550 NA NA NA NA NA NA NA NA
## 2 466.2523 504.6275 NA NA NA NA NA NA NA NA
## 3 NA NA NA NA NA NA NA NA NA NA
## M = 20 M = 21 M = 22 M = 23 M = 24 M = 25 M = 26 M = 27 M = 28 M = 29 M = 30
## 1 NA NA NA NA NA NA NA NA NA NA NA
## 2 NA NA NA NA NA NA NA NA NA NA NA
## 3 NA NA NA NA NA NA NA NA NA NA NA
Nilai error yang terkecil merupakan n optimal, terlihat error yang terkecil ada pada N=11
Perbandingan SMA dan DMA
comp <- cbind(akurasi.full[,26], akurasi.full2[,10])
colnames(comp) <- c("SMA","DMA")
rownames(comp) <- c("SSE","MSE","MAPE")
comp <- as.data.frame(comp)
comp## SMA DMA
## SSE 41010.5446 1009.2550
## MSE 630.9315 504.6275
## MAPE 238.2589 NA
Jika dibandingkan antara SMA dan DMA pada nilai n optimum, metode DMA menghasilkan error yang lebih kecil dibanding SMA pada ketiga ukuran kebaikan diatas.
Pemulusan Eksponensial
Import data
dataekspo <- read_xlsx("C:/0 SEM5/MPDW/p1/Data Kelompok 15.xlsx")
dataekspo$Premium <- as.numeric(dataekspo$Premium)
str(dataekspo)## tibble [115 x 7] (S3: tbl_df/tbl/data.frame)
## $ Tahun : num [1:115] 2013 2013 2013 2013 2013 ...
## $ Bulan : chr [1:115] "Januari" "Februari" "Maret" "April" ...
## $ Premium : num [1:115] 7798 7773 7576 7421 7545 ...
## $ Medium : chr [1:115] "7697.37" "7645.05" "7503.27" "7290.96" ...
## $ Luar Kualitas: chr [1:115] "7545.32" "7328.44" "7033.14" "6870.91" ...
## $ IHK : num [1:115] 1.03 1.79 2.43 2.32 2.3 3.35 6.75 7.94 7.57 7.66 ...
## $ Harga Gabah : chr [1:115] "4333.19" "4265.58" "3783.15" "3669.04" ...
Membentuk objek time series
training<-dataekspo[1:92,3]
testing<-dataekspo[93:115,3]
dataekspo.ts<-ts(dataekspo$Premium,start = 2013, frequency = 12)
training.ts<-ts(training,start = 2013, frequency = 12)
testing.ts<-ts(testing,start=93)Eksplorasi
dataekspo.ts <- as.numeric(dataekspo.ts)
plot(dataekspo.ts, col="red",main="Plot seluruh data")
points(dataekspo.ts)plot(training.ts, col="blue",main="Plot data training")
points(training.ts)plot(testing.ts, col="blue",main="Plot data testing")
points(testing.ts)Single Exponential
Fungsi Holtwinter
ses1<- HoltWinters(training.ts, gamma = FALSE, beta = FALSE, alpha = 0.2)
plot(ses1)
## Fungsi Holtwinter optimal
sesopt<- HoltWinters(training.ts, gamma = FALSE, beta = FALSE)
sesopt## Holt-Winters exponential smoothing without trend and without seasonal component.
##
## Call:
## HoltWinters(x = training.ts, beta = FALSE, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.9999339
## beta : FALSE
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 9962.648
plot(sesopt)
## Fungsi Holtwinter
ramalan1<- forecast(ses1, h=10)
ramalan1$mean## Time Series:
## Start = 93
## End = 102
## Frequency = 1
## [1] 9912.331 9912.331 9912.331 9912.331 9912.331 9912.331 9912.331 9912.331
## [9] 9912.331 9912.331
Fungsi Holtwinter optimal
ramalanopt<- forecast(sesopt, h=10)
ramalanopt## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 93 9962.648 9719.807 10205.49 9591.254 10334.04
## 94 9962.648 9619.230 10306.07 9437.435 10487.86
## 95 9962.648 9542.053 10383.24 9319.403 10605.89
## 96 9962.648 9476.989 10448.31 9219.897 10705.40
## 97 9962.648 9419.667 10505.63 9132.230 10793.07
## 98 9962.648 9367.843 10557.45 9052.973 10872.32
## 99 9962.648 9320.186 10605.11 8980.088 10945.21
## 100 9962.648 9275.828 10649.47 8912.248 11013.05
## 101 9962.648 9234.167 10691.13 8848.532 11076.76
## 102 9962.648 9194.762 10730.53 8788.267 11137.03
Akurasi Data Training
SSE
ses1<- HoltWinters(training.ts, gamma = FALSE, beta = FALSE, alpha = 0.2)
sse1.train <- ses1$SSE
sse1.train## [1] 9045657
sseopt.train <- sesopt$SSE
sseopt.train## [1] 3283102
MSE
mse1.train <- sse1.train/length(training.ts)
mse1.train## [1] 98322.36
mseopt.train <- sseopt.train/length(training.ts)
mseopt.train## [1] 35685.89
RMSE
rmse1.train <- sqrt(mse1.train)
rmse1.train## [1] 313.564
rmseopt.train <- sqrt(mseopt.train)
rmseopt.train## [1] 188.9071
akurasi.ses1 <- matrix(c(sse1.train, mse1.train, rmse1.train, sseopt.train, mseopt.train, rmseopt.train), nrow=3, ncol=2)
row.names(akurasi.ses1)<- c("SSE", "MSE", "RMSE")
colnames(akurasi.ses1) <- c("alpha=0.2", "alpha=0.762373")
akurasi.ses1## alpha=0.2 alpha=0.762373
## SSE 9045657.450 3283102.1245
## MSE 98322.364 35685.8927
## RMSE 313.564 188.9071
Metode SES memiliki parameter pemulusan yaitu alpha yang bernilai antara 0 dan 1. Pada awal pemulusan, digunakan alpha 0.2. Lalu dilakukan pemulusan dengan alpha yang optimal secara otomatis dengan program, didapatkan alpha sebesar 0.762373. Parameter pemulusan yang dipilih adalah alpha =0.762373 karena memiliki error yang lebih kecil.
Double Exponential
des1<- HoltWinters(training.ts, gamma = FALSE, beta = 0.2, alpha = 0.2)
plot(des1)desopt<- HoltWinters(training.ts, gamma = FALSE)
desopt## Holt-Winters exponential smoothing with trend and without seasonal component.
##
## Call:
## HoltWinters(x = training.ts, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 1
## beta : 0.01810342
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 9962.65000
## b 10.61376
plot(desopt)
## Forecasting
ramalandes1<- forecast(des1, h=10)
ramalandes1## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 93 10040.14 9628.400 10451.89 9410.436 10669.85
## 94 10069.77 9646.330 10493.20 9422.177 10717.35
## 95 10099.39 9660.538 10538.24 9428.225 10770.55
## 96 10129.01 9670.808 10587.21 9428.251 10829.77
## 97 10158.63 9677.051 10640.21 9422.118 10895.15
## 98 10188.26 9679.290 10697.22 9409.860 10966.65
## 99 10217.88 9677.630 10758.13 9391.640 11044.12
## 100 10247.50 9672.237 10822.76 9367.711 11127.29
## 101 10277.12 9663.307 10890.94 9338.373 11215.87
## 102 10306.74 9651.051 10962.44 9303.947 11309.54
ramalandesopt<- forecast(desopt, h=10)
ramalandesopt## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 93 9973.264 9725.983 10220.54 9595.081 10351.45
## 94 9983.878 9630.990 10336.76 9444.183 10523.57
## 95 9994.491 9558.389 10430.59 9327.530 10661.45
## 96 10005.105 9497.015 10513.19 9228.049 10782.16
## 97 10015.719 9442.588 10588.85 9139.190 10892.25
## 98 10026.333 9392.931 10659.73 9057.628 10995.04
## 99 10036.946 9346.765 10727.13 8981.404 11092.49
## 100 10047.560 9303.263 10791.86 8909.256 11185.86
## 101 10058.174 9261.857 10854.49 8840.312 11276.04
## 102 10068.788 9222.137 10915.44 8773.947 11363.63
Akurasi data training
SSE
sse.des.train <- des1$SSE
sse.des.train## [1] 9207195
sseopt.des.train <- desopt$SSE
sseopt.des.train## [1] 3355077
MSE
mse.des.train <- sse1.train/length(training.ts)
mse.des.train## [1] 98322.36
mseopt.des.train <- sseopt.train/length(training.ts)
mseopt.des.train## [1] 35685.89
RMSE
rmse.des.train <- sqrt(mse.des.train)
rmse.des.train## [1] 313.564
rmseopt.des.train <- sqrt(mseopt.des.train)
rmseopt.des.train## [1] 188.9071
akurasi.des1 <- matrix(c(sse.des.train,mse.des.train,rmse.des.train,sseopt.des.train,mseopt.des.train,rmseopt.des.train), nrow=3, ncol=2)
row.names(akurasi.des1)<- c("SSE", "MSE", "RMSE")
colnames(akurasi.des1) <- c("alpha=0.2, beta=0.2", "alpha=0.7916783, beta=0")
akurasi.des1## alpha=0.2, beta=0.2 alpha=0.7916783, beta=0
## SSE 9207194.764 3355076.8907
## MSE 98322.364 35685.8927
## RMSE 313.564 188.9071
Metode DES memiliki dua parameter pemulusan yaitu alpha dan beta yang bernilai antara 0 dan 1. Pada awal pemulusan, digunakan alpha dan beta sebesar 0.2. Lalu dilakukan pemulusan dengan alpha dan beta yang optimal secara otomatis dengan program, didapatkan alpha sebesar 0.7916783 dan beta sebesar 0. Parameter pemulusan yang dipilih adalah alpha = 0.7916783 dan beta = 0 karena memiliki error yang lebih kecil. ## Perbandingan Single Exponential dan Double Exponential
selisihses<-ramalanopt$mean-testing.ts
selisihses## Time Series:
## Start = 93
## End = 102
## Frequency = 1
## testing.ts
## [1,] 91.52795
## [2,] 149.74795
## [3,] 248.14795
## [4,] 174.78795
## [5,] 182.45795
## [6,] 190.54795
## [7,] 355.67795
## [8,] 412.88795
## [9,] 335.56795
## [10,] 425.48795
SSEtestingses<-sum(selisihses^2)
str(testing.ts)## Time-Series [1:23, 1] from 93 to 115: 9871 9813 9714 9788 9780 ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr "Premium"
selisihdes<-ramalandesopt$mean-testing.ts
selisihdes## Time Series:
## Start = 93
## End = 102
## Frequency = 1
## testing.ts
## [1,] 102.1438
## [2,] 170.9775
## [3,] 279.9913
## [4,] 217.2450
## [5,] 235.5288
## [6,] 254.2325
## [7,] 429.9763
## [8,] 497.8001
## [9,] 431.0938
## [10,] 531.6276
SSEtestingdes<-sum(selisihdes^2)
akurasi <- matrix(c(SSEtestingses, SSEtestingdes), nrow=1, ncol=2)
row.names(akurasi)<- "SSE"
colnames(akurasi) <- c("SES", "DES")
akurasi## SES DES
## SSE 783158.6 1186519
Dibandingkan degan metode moving average, metode exponential memiliki error yang jauh lebih kecil, hal ini menandakan bahwa adanya perbedaan pengaruh harga beras antar periode sehingga metode exponential lebih cocok digunakan.
Pemulusan Winter
Import data
winter <- dataMembagi data menjadi training dan testing
training<-winter[1:92,3]
testing<-winter[93:115,3]Membentuk objek time series
winter.ts<-ts(winter$Premium, start=2013, frequency = 12,)
training.ts<-ts(training, start=2013, frequency = 12)
testing.ts<-ts(testing, start=93, frequency = 12)Membuat plot time series
plot(winter.ts, col="red")
points(winter.ts)plot(training.ts, col="blue")
points(training.ts)
# Winter Aditif
Pemulusan
aditif <- HoltWinters(training.ts, seasonal = "additive")
aditif ## Holt-Winters exponential smoothing with trend and additive seasonal component.
##
## Call:
## HoltWinters(x = training.ts, seasonal = "additive")
##
## Smoothing parameters:
## alpha: 0.8548849
## beta : 0
## gamma: 1
##
## Coefficients:
## [,1]
## a 89.2468595
## b 1.0007284
## s1 1.0606530
## s2 0.3786525
## s3 3.0591237
## s4 5.4550945
## s5 -21.6750436
## s6 -1.1475027
## s7 19.0352662
## s8 -5.8143374
## s9 4.4927227
## s10 -2.5830969
## s11 -1.8064322
## s12 -1.2468595
Forecasting
ramalan1 <- forecast(aditif, h=23)
ramalan1## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Sep 8 91.30824 62.2785608 120.3379 46.91118 135.7053
## Oct 8 91.62697 53.4352486 129.8187 33.21777 150.0362
## Nov 8 95.30817 49.7615697 140.8548 25.65066 164.9657
## Dec 8 98.70487 46.8360156 150.5737 19.37830 178.0314
## Jan 9 72.57546 15.0753450 130.0756 -15.36338 160.5143
## Feb 9 94.10373 31.4766712 156.7308 -1.67609 189.8835
## Mar 9 115.28722 47.9222982 182.6522 12.26146 218.3130
## Apr 9 91.43835 19.6475528 163.2291 -18.35620 201.2329
## May 9 102.74614 26.7869144 178.7054 -13.42347 218.9157
## Jun 9 96.67105 16.7605418 176.5816 -25.54152 218.8836
## Jul 9 98.44844 14.7730315 182.1238 -29.52205 226.4189
## Aug 9 100.00874 12.7306846 187.2868 -33.47153 233.4890
## Sep 9 103.31698 11.3377373 195.2962 -37.35313 243.9871
## Oct 9 103.63571 8.3673173 198.9041 -42.06472 249.3361
## Nov 9 107.31691 8.8691986 205.7646 -43.24587 257.8797
## Dec 9 110.71361 9.1860906 212.2411 -44.55933 265.9865
## Jan 10 84.58420 -19.9324126 189.1008 -75.26016 244.4286
## Feb 10 106.11247 -1.3100957 213.5350 -58.17617 270.4011
## Mar 10 127.29597 17.0440159 237.5479 -41.31984 295.9118
## Apr 10 103.44709 -9.5634293 216.4576 -69.38759 276.2818
## May 10 114.75488 -0.9484604 230.4582 -62.19811 291.7079
## Jun 10 108.67979 -9.6551095 227.0147 -72.29782 289.6574
## Jul 10 110.45718 -10.4520125 231.3664 -74.45747 295.3718
Akurasi data training
SSE
sse1.train <- aditif$SSE
sse1.train## [1] 40536.24
Winter Multiplikatif
Pemulusan
multi <- HoltWinters(training.ts,seasonal = "multiplicative")
multi## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = training.ts, seasonal = "multiplicative")
##
## Smoothing parameters:
## alpha: 0.8058113
## beta : 0
## gamma: 0.9152878
##
## Coefficients:
## [,1]
## a 94.1463388
## b 1.0007284
## s1 0.9197850
## s2 0.9274307
## s3 1.0152787
## s4 1.0986079
## s5 0.1342742
## s6 0.2141852
## s7 0.8424770
## s8 0.6074020
## s9 0.9713126
## s10 0.8706238
## s11 0.9139195
## s12 0.9351503
Forecasting
ramalan2 <- forecast(multi, h=23)
ramalan2## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Sep 8 87.51485 61.52127 113.50843 47.76110 127.26859
## Oct 8 89.17042 55.45444 122.88640 37.60627 140.73457
## Nov 8 98.63282 56.54037 140.72528 34.25796 163.00769
## Dec 8 107.82754 57.92646 157.72862 31.51042 184.14466
## Jan 9 13.31329 -13.32401 39.95059 -27.42495 54.05153
## Feb 9 21.45080 -22.31968 65.22128 -45.49037 88.39197
## Mar 9 85.21776 -78.73445 249.16997 -165.52551 335.96103
## Apr 9 62.04743 -58.50379 182.59865 -122.31975 246.41461
## May 9 100.19371 -92.86186 293.24928 -195.05931 395.44673
## Jun 9 90.67862 -83.79501 265.15226 -176.15578 357.51302
## Jul 9 96.10261 -88.22008 280.42531 -185.79463 377.99985
## Aug 9 99.27095 -90.27886 288.82077 -190.62047 389.16238
## Sep 9 98.56031 -89.76996 286.89058 -189.46599 386.58660
## Oct 9 100.30769 -90.75909 291.37448 -191.90373 392.51912
## Nov 9 110.82504 -99.21155 320.86163 -210.39820 432.04829
## Dec 9 121.02044 -107.08416 349.12505 -227.83545 469.87633
## Jan 10 14.92575 -25.92065 55.77216 -47.54343 77.39493
## Feb 10 24.02289 -39.32223 87.36802 -72.85511 120.90090
## Mar 10 95.33485 -141.53193 332.20162 -266.92162 457.59132
## Apr 10 69.34157 -103.37411 242.05724 -194.80427 333.48740
## May 10 111.85795 -163.90453 387.62044 -309.88438 533.60028
## Jun 10 101.13372 -147.13417 349.40161 -278.55925 480.82669
## Jul 10 107.07764 -154.31856 368.47383 -292.69335 506.84862
Akurasi data training
SSE
sse2.train <- multi$SSE
sse2.train## [1] 33622.63
Akurasi data testing
selisih1<-as.numeric(ramalan1$mean)-as.numeric(testing.ts)
selisih1## [1] 68.30824 71.62697 80.30817 79.70487 55.57546 78.10373 104.28722
## [8] 82.43835 90.74614 89.67105 97.44844 95.00874 100.31698 101.63571
## [15] 99.31691 96.71361 63.58420 84.11247 109.29597 93.44709 108.75488
## [22] 104.67979 97.45718
SSEtesting1<-sum(selisih1^2)
selisih2<-as.numeric(ramalan2$mean)-as.numeric(testing.ts)
selisih2## [1] 64.514846 69.170419 83.632824 88.827542 -3.686713 5.450799
## [7] 74.217761 53.047432 88.193711 83.678622 95.102613 94.270954
## [13] 95.560306 98.307694 102.825043 107.020440 -6.074248 2.022893
## [19] 77.334849 59.341565 105.857953 97.133718 94.077635
SSEtesting2<-sum(selisih2^2)
akurasi <- matrix(c(SSEtesting1, SSEtesting2), nrow=1, ncol=2)
row.names(akurasi)<- "SSE"
colnames(akurasi) <- c("Aditif", "Multiplikatif")
akurasi## Aditif Multiplikatif
## SSE 187947.9 144766
Kesimpulan
- Metode Exponential lebih cocok digunakan dibandingkan dengan metode moving average. Adanya perbedaan pengaruh harga beras antar periode membuat metode exponential lebih cocok digunakan.
- Dalam Metode Eksponensial, metode Double Exponential Smoothing lebih cocok digunakan dibandingkan Single Exponential Smoothing.
- Pada metode Winter, multiplikative lebih cocok digunakan dibandingkan additive.
Daftar Pustaka
Fani E, Widjajati FA, Soehardjoepri. 2017. Perbandingan Metode Winter Eksponensial Smoothing dan Metode Event Based untuk Menentukan Penjualan Produk Terbaik di Perusahaan X. Jurnal Sains dan Seni ITS. 6(1):2337-3529.
H. R. Naufal and R Adrean, “R. naufal Hayâ and R. Adrean, ‘Sistem Informasi Inventory Berdasarkan Prediksi Data Penjualan Barang Menggunakan Metode Single Moving Average Pada CV. Agung Youanda,’ ProTekInfo (Pengembangan Ris. dan Obs.Tek. Inform., vol. 4, pp. 29–33, 2017,” ProTekInfo (Pengembangan Ris. dan Obs. Tek.Inf., vol. 4, pp. 29–33, 2017.
Hartono A, Dwijana D, Handiwidjojo. 2012. Perbandingan metode single exponential smoothing dan exponential smoothing adjusted for trend untuk meramalkan penjualan. Studi kasus: Toko onderdil mobil “Prodi, Purwodadi”. Jurnal EKSIS. 5(1):8-18.
Hapsari, V. 2013. Perbandingan Metode Dekomposisi Klasik dengan Metode Pemulusan Eksponensial Holt-Winter dalam meramalkan Tingkat Pencemaran Udara di Kota Bandung Periode 2003-2012. Universitas Pendidikan Indonesia.
Muzaki L. 2022. Contoh studi kasus metode double moving average, kelebihan kekurangan, dan cara menghitung [internet]. [diacu pada 2022 Oktober 25]. Tersedia dari: https://www.pengadaanbarang.co.id/2022/05/metode-double-moving-average.html.
M. Layakana, S. Iskandar. “Penerapan Metode Double Moving Average dan Double Eksponensial Smoothing Dalam Meramalkan Jumlah Produksi Crude Palm Oil(CPO) Pada PT.Perkebunan Nusantara IV Unit Dolok Sinumbah. 6(1): 47.
Purwanto A, Hanief S. 2017. Teknik peramalan dengan double exponential smoothing pada distributor gula. Jurnal Teknologi Informasi dan Komputer. 3(1):362-367