Pemulusan Data Bulanan Emas Tahun 2017-2022

Moving Average

Moving Average atau rataan bergerak merupakan salah satu jenis pemulusan yang ada pada analisis deret waktu dengan cara menghaluskan variasi lokal dengan menggunakan rata-rata dari data historis aktual pada beberapa periode terakhir untuk melakukan peramalan terhadap pada periode yang akan datang.(Putrasyah 2019).

Rumus :

Ft+1=(Xt+Xt-1+⋯Xt-n+1)/n …(1)

Dimana :

Ft+1 = ramalan untuk periode t+1

X1 = data pada periode t

n = jangka dari moving average.

Pada Single Moving Average Smoothing pada periode ke-t merupakan rata-rata dari m buah data dari data periode ke-t hingga ke-(t-m+1). Sedangkan forecasting pada periode ke t+1 dilakukan dengan menggunakan data periode sebelumnya. Metode ini cocok untuk data bertipe konstan/stasioner.

Sedangkan Double Moving Average prinsipnya sama dengan Single Moving Average yang melakukan penghalusan menggunakan rataan sebanyak 2 kali. Metode ini cocok untuk data yang memiliki pola tren.

Eksponesial Smoothing

Pemulusan eksponensial merupakan teknik deret waktu yang mana data dari waktu ke waktu dihaluskan secara eksponensial baik dengan meningkat secara eksponensial atau menurunkan bobot dengan data poin (Singh et. al. 2019). Pemulusan eksponensial tunggal merupakan pendekatan dengan memberikan bobot yang menurun secara geometris pada pengamatan yang lebih lama (Montgomery et. al. 2015).

St = Xt + (1- )St-1

Ft = St

Ft+1 = Ft+ (Xt - Ft)

Ft+1 = Ft+ (et)

Keterangan: St : data yang telah dismoothing pada waktu t, dengan t = 1,2,…T.

Xt : data aktual pada waktu t, dengan t = 1,2,…T.

Ft : data ramalan pada waktu t, dengan t = 1,2,…,T.

e_t : selisih nilai data aktual dengan nilai ramalan pada waktu t, dengan t = 1,2,..,T.

: parameter pembobot (faktor pengali) dengan 0 < < 1.

Inisiasi S0 = X1, jika perubahan dalam proses diharapkan terjadi lebih awal dan cepat, pilihan ini untuk memulai nilai St dapat diterima. Gunakan nilai rata-rata dari data atau subset data yang tersedia, inisiasi S0 = S. Jika proses setidaknya di awal secara konstan, nilai awal ini lebih disukai (Montgomery et. al. 2015).

Pemulusan eksponensial berganda digunakan untuk data deret waktu yang mengalami unsur trend, karena menghasilkan hasil yang lebih baik dibandingkan dengan pemulusan eksponensial tunggal (Montgomery et. al. 2015).

St = Xt+ (1 - )(St-1+Tt-1)

Tt = (St-St-1) + (1 - )Tt-1

Ft+m = St + Tt.m

Keterangan:

St : Nilai pemulusan tunggal

Xt : Data sebenarnya pada waktu ke t

Tt : Pemulusan trend

Ft+m : Nilai ramalan

m : Peramalan masa datang

: Koefisien pemulusan (smoothing), dengan 0 <  < 1

: Koefisien pemulusan (smoothing) untuk trend dengan 0 < < 1

Keakuratan Model

Dalam melakukan pengujian hasil dari peramalan, terdapat beberapa metode yang digunakan dalam penelitian ini, diantaranya yaitu ukuran statistik standar menggunakan nilai SSE dan MSE serta ukuran relatif yang menggunakan nilai MAPE dengan penjelasan menurut Andriyanto (2017) sebagai berikut :

Jumlah Kuadrat Kesalahan (Sum of Squared Error) dapat dihitung dengan menggunakan rumus sebagai berikut :

SSE=_{i=1}{n}{e_i}2

Nilai Tengah Kesalahan Kuadrat (Mean Squared Error) dapat dihitung dengan menggunakan rumus sebagai berikut : MSE=_{i=1}^{n}

dengan e_i=X_i-F_i

Keterengan : e_i : kesalahan (error) n : banyaknya periode data X_i : data aktual pada periode ke i F : ramalan untuk periode yang sama

Nilai Tengah Kesalahan Pemrosesan Absolut (Mean Absolute Percentage Error) dapat dihitung dengan menggunakan rumus sebagai berikut :

MAPE=_{t=1}^{n}

dengan PE_t=

Keterangan : PE_t : persentase nilai kesalahan (percentage error)

Inputasi data

#Load library
library(data.table)
## Warning: package 'data.table' was built under R version 4.1.3
library(imputeTS)
## Warning: package 'imputeTS' was built under R version 4.1.2
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ggplot2)
library(TTR)
## Warning: package 'TTR' was built under R version 4.1.1
library(forecast)
## Warning: package 'forecast' was built under R version 4.1.2
#Input data yang sudah di praproses sebelumnya
data <- read.csv("D:/Semester 6/Metode Peramalan Deret Waktu/fixed.csv")
data$gold.X<-as.Date(data$gold.X,format="%Y-%m-%d")
summary(data)
##      gold.X               gold.y    
##  Min.   :2017-01-01   Min.   :1192  
##  1st Qu.:2018-04-16   1st Qu.:1276  
##  Median :2019-08-01   Median :1411  
##  Mean   :2019-08-01   Mean   :1504  
##  3rd Qu.:2020-11-16   3rd Qu.:1775  
##  Max.   :2022-03-01   Max.   :1962
#Membuat data menjadi objek time series
data.ts<-ts(data$gold.y)
#Melihat Plot time series 
plot.ts(data.ts)

Membagi data training dan testing

Pembagian 80 persen untuk data training dan 20 persen untuk data testing berdasarkan rujukan pada jurnal Predicting Gold and Silver Price Direction Using Tree-Based Classifiers oleh Sadorsky (2021).

str(data.ts)
##  Time-Series [1:63] from 1 to 63: 1212 1212 1248 1258 1269 ...
0.8*63
## [1] 50.4
train <-data.ts[1:50]
test<- data.ts[51:63]
plot.ts(train)

plot.ts(test)

Single Moving Average

SMA M=2

sma2<- SMA(train,n=2)
ramal2<- c(NA,sma2)
data.gab<-cbind(aktual=c(train,rep(NA,13)),pemulusan=c(sma2,rep(NA,13)),ramalan=c(ramal2,rep(ramal2[length(ramal2)],12)))
data.gab #forecast 13 periode ke depan
##         aktual pemulusan  ramalan
##  [1,] 1211.900        NA       NA
##  [2,] 1211.900  1211.900       NA
##  [3,] 1247.800  1229.850 1211.900
##  [4,] 1258.250  1253.025 1229.850
##  [5,] 1268.700  1263.475 1253.025
##  [6,] 1268.000  1268.350 1263.475
##  [7,] 1268.200  1268.100 1268.350
##  [8,] 1268.400  1268.300 1268.100
##  [9,] 1320.200  1294.300 1268.300
## [10,] 1296.200  1308.200 1294.300
## [11,] 1272.200  1284.200 1308.200
## [12,] 1274.100  1273.150 1284.200
## [13,] 1308.950  1291.525 1273.150
## [14,] 1343.800  1326.375 1291.525
## [15,] 1310.400  1327.100 1326.375
## [16,] 1311.800  1311.100 1327.100
## [17,] 1313.200  1312.500 1311.100
## [18,] 1298.600  1305.900 1312.500
## [19,] 1260.750  1279.675 1305.900
## [20,] 1222.900  1241.825 1279.675
## [21,] 1207.250  1215.075 1241.825
## [22,] 1191.600  1199.425 1215.075
## [23,] 1215.400  1203.500 1199.425
## [24,] 1250.367  1232.883 1203.500
## [25,] 1285.333  1267.850 1232.883
## [26,] 1320.300  1302.817 1267.850
## [27,] 1312.200  1316.250 1302.817
## [28,] 1291.800  1302.000 1316.250
## [29,] 1278.700  1285.250 1302.000
## [30,] 1332.650  1305.675 1285.250
## [31,] 1386.600  1359.625 1305.675
## [32,] 1411.300  1398.950 1359.625
## [33,] 1440.000  1425.650 1398.950
## [34,] 1468.700  1454.350 1425.650
## [35,] 1511.000  1489.850 1454.350
## [36,] 1522.800  1516.900 1489.850
## [37,] 1534.600  1528.700 1516.900
## [38,] 1546.400  1540.500 1528.700
## [39,] 1558.200  1552.300 1540.500
## [40,] 1570.000  1564.100 1552.300
## [41,] 1686.600  1628.300 1564.100
## [42,] 1740.400  1713.500 1628.300
## [43,] 1793.600  1767.000 1713.500
## [44,] 1877.650  1835.625 1767.000
## [45,] 1961.700  1919.675 1835.625
## [46,] 1884.100  1922.900 1919.675
## [47,] 1829.550  1856.825 1922.900
## [48,] 1775.000  1802.275 1856.825
## [49,] 1820.800  1797.900 1802.275
## [50,] 1866.600  1843.700 1797.900
## [51,]       NA        NA 1843.700
## [52,]       NA        NA 1843.700
## [53,]       NA        NA 1843.700
## [54,]       NA        NA 1843.700
## [55,]       NA        NA 1843.700
## [56,]       NA        NA 1843.700
## [57,]       NA        NA 1843.700
## [58,]       NA        NA 1843.700
## [59,]       NA        NA 1843.700
## [60,]       NA        NA 1843.700
## [61,]       NA        NA 1843.700
## [62,]       NA        NA 1843.700
## [63,]       NA        NA 1843.700
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab[,1])
lines(data.gab[,2],col="green",lwd=2)
lines(data.gab[,3],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.sma = train-ramal2[1:length(train)]
SSE.sma = sum(error.sma[3:length(train)]^2)
MSE.sma = mean(error.sma[3:length(train)]^2)
MAPE.sma = mean(abs((error.sma[3:length(train)]/train[3:length(train)])*100))

akurasitrain.sma2 <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasitrain.sma2)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.sma2) <- c("Akurasi Training m = 2")

#test error
error.sma = test-ramal2[51:length(ramal2)]
SSE.sma = sum(error.sma^2)
MSE.sma = mean(error.sma^2)
MAPE.sma = mean(abs((error.sma/test)*100))

akurasitest.sma2 <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasitest.sma2 )<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.sma2 ) <- c("Akurasi Testing m = 2")
akurasitrain.sma2
##      Akurasi Training m = 2
## SSE            1.317664e+05
## MSE            2.745133e+03
## MAPE           2.737616e+00
akurasitest.sma2
##      Akurasi Testing m = 2
## SSE           68809.722389
## MSE            5293.055568
## MAPE              3.771307

Pada Single Moving Average dengan menggunakan M=2 didapatkan nilai akurasi data training yang lebih kecil dibandingkan data testingnya. Untuk memperbaiki akurasi yang didapatkan maka dicoba M lain yaitu sebesar M=3

SMA M=3

sma3<- SMA(train,n=3)
ramal3<- c(NA,sma3)
data.gab<-cbind(aktual=c(train,rep(NA,13)),pemulusan=c(sma3,rep(NA,13)),ramalan=c(ramal3,rep(ramal3[length(ramal3)],12)))
data.gab #forecast 13 periode ke depan
##         aktual pemulusan  ramalan
##  [1,] 1211.900        NA       NA
##  [2,] 1211.900        NA       NA
##  [3,] 1247.800  1223.867       NA
##  [4,] 1258.250  1239.317 1223.867
##  [5,] 1268.700  1258.250 1239.317
##  [6,] 1268.000  1264.983 1258.250
##  [7,] 1268.200  1268.300 1264.983
##  [8,] 1268.400  1268.200 1268.300
##  [9,] 1320.200  1285.600 1268.200
## [10,] 1296.200  1294.933 1285.600
## [11,] 1272.200  1296.200 1294.933
## [12,] 1274.100  1280.833 1296.200
## [13,] 1308.950  1285.083 1280.833
## [14,] 1343.800  1308.950 1285.083
## [15,] 1310.400  1321.050 1308.950
## [16,] 1311.800  1322.000 1321.050
## [17,] 1313.200  1311.800 1322.000
## [18,] 1298.600  1307.867 1311.800
## [19,] 1260.750  1290.850 1307.867
## [20,] 1222.900  1260.750 1290.850
## [21,] 1207.250  1230.300 1260.750
## [22,] 1191.600  1207.250 1230.300
## [23,] 1215.400  1204.750 1207.250
## [24,] 1250.367  1219.122 1204.750
## [25,] 1285.333  1250.367 1219.122
## [26,] 1320.300  1285.333 1250.367
## [27,] 1312.200  1305.944 1285.333
## [28,] 1291.800  1308.100 1305.944
## [29,] 1278.700  1294.233 1308.100
## [30,] 1332.650  1301.050 1294.233
## [31,] 1386.600  1332.650 1301.050
## [32,] 1411.300  1376.850 1332.650
## [33,] 1440.000  1412.633 1376.850
## [34,] 1468.700  1440.000 1412.633
## [35,] 1511.000  1473.233 1440.000
## [36,] 1522.800  1500.833 1473.233
## [37,] 1534.600  1522.800 1500.833
## [38,] 1546.400  1534.600 1522.800
## [39,] 1558.200  1546.400 1534.600
## [40,] 1570.000  1558.200 1546.400
## [41,] 1686.600  1604.933 1558.200
## [42,] 1740.400  1665.667 1604.933
## [43,] 1793.600  1740.200 1665.667
## [44,] 1877.650  1803.883 1740.200
## [45,] 1961.700  1877.650 1803.883
## [46,] 1884.100  1907.817 1877.650
## [47,] 1829.550  1891.783 1907.817
## [48,] 1775.000  1829.550 1891.783
## [49,] 1820.800  1808.450 1829.550
## [50,] 1866.600  1820.800 1808.450
## [51,]       NA        NA 1820.800
## [52,]       NA        NA 1820.800
## [53,]       NA        NA 1820.800
## [54,]       NA        NA 1820.800
## [55,]       NA        NA 1820.800
## [56,]       NA        NA 1820.800
## [57,]       NA        NA 1820.800
## [58,]       NA        NA 1820.800
## [59,]       NA        NA 1820.800
## [60,]       NA        NA 1820.800
## [61,]       NA        NA 1820.800
## [62,]       NA        NA 1820.800
## [63,]       NA        NA 1820.800
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab[,1])
lines(data.gab[,2],col="green",lwd=2)
lines(data.gab[,3],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.sma = train-ramal3[1:length(train)]
SSE.sma = sum(error.sma[4:length(train)]^2)
MSE.sma = mean(error.sma[4:length(train)]^2)
MAPE.sma = mean(abs((error.sma[4:length(train)]/train[4:length(train)])*100))

akurasitrain.sma3 <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasitrain.sma3)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.sma3) <- c("Akurasi Training m = 3")

#test error
error.sma = test-ramal3[51:length(ramal3)]
SSE.sma = sum(error.sma^2)
MSE.sma = mean(error.sma^2)
MAPE.sma = mean(abs((error.sma/test)*100))

akurasitest.sma3 <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasitest.sma3 )<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.sma3 ) <- c("Akurasi testing m = 3")
akurasitrain.sma3
##      Akurasi Training m = 3
## SSE            1.856431e+05
## MSE            3.949852e+03
## MAPE           3.207975e+00
akurasitest.sma3
##      Akurasi testing m = 3
## SSE           47173.818729
## MSE            3628.755287
## MAPE              2.864572
data.frame(akurasitrain.sma2,akurasitrain.sma3)
##      Akurasi.Training.m...2 Akurasi.Training.m...3
## SSE            1.317664e+05           1.856431e+05
## MSE            2.745133e+03           3.949852e+03
## MAPE           2.737616e+00           3.207975e+00
data.frame(akurasitest.sma2,akurasitest.sma3)
##      Akurasi.Testing.m...2 Akurasi.testing.m...3
## SSE           68809.722389          47173.818729
## MSE            5293.055568           3628.755287
## MAPE              3.771307              2.864572

Terlihat setelah menaikan M nilai akurasi training tidak membaik, nilai SSE MSE dan MAPE dari m=3 lebih besar dibandingkan dengan M=2. Namun akurasi membaik pada data testing dengan semua nilai SSE MSE dan MAPE yang lebih baik. Penambahan M dapat memperbaiki akurasi data testing sehingga kita mencoba menambah M lagi sebanyak 1.

SMA M=4

sma4<- SMA(train,n=4)
ramal4<- c(NA,sma4)
data.gab<-cbind(aktual=c(train,rep(NA,13)),pemulusan=c(sma4,rep(NA,13)),ramalan=c(ramal4,rep(ramal4[length(ramal4)],12)))
data.gab #forecast 13 periode ke depan
##         aktual pemulusan  ramalan
##  [1,] 1211.900        NA       NA
##  [2,] 1211.900        NA       NA
##  [3,] 1247.800        NA       NA
##  [4,] 1258.250  1232.463       NA
##  [5,] 1268.700  1246.663 1232.463
##  [6,] 1268.000  1260.688 1246.663
##  [7,] 1268.200  1265.787 1260.688
##  [8,] 1268.400  1268.325 1265.787
##  [9,] 1320.200  1281.200 1268.325
## [10,] 1296.200  1288.250 1281.200
## [11,] 1272.200  1289.250 1288.250
## [12,] 1274.100  1290.675 1289.250
## [13,] 1308.950  1287.862 1290.675
## [14,] 1343.800  1299.762 1287.862
## [15,] 1310.400  1309.313 1299.762
## [16,] 1311.800  1318.738 1309.313
## [17,] 1313.200  1319.800 1318.738
## [18,] 1298.600  1308.500 1319.800
## [19,] 1260.750  1296.087 1308.500
## [20,] 1222.900  1273.862 1296.087
## [21,] 1207.250  1247.375 1273.862
## [22,] 1191.600  1220.625 1247.375
## [23,] 1215.400  1209.288 1220.625
## [24,] 1250.367  1216.154 1209.288
## [25,] 1285.333  1235.675 1216.154
## [26,] 1320.300  1267.850 1235.675
## [27,] 1312.200  1292.050 1267.850
## [28,] 1291.800  1302.408 1292.050
## [29,] 1278.700  1300.750 1302.408
## [30,] 1332.650  1303.837 1300.750
## [31,] 1386.600  1322.437 1303.837
## [32,] 1411.300  1352.312 1322.437
## [33,] 1440.000  1392.637 1352.312
## [34,] 1468.700  1426.650 1392.637
## [35,] 1511.000  1457.750 1426.650
## [36,] 1522.800  1485.625 1457.750
## [37,] 1534.600  1509.275 1485.625
## [38,] 1546.400  1528.700 1509.275
## [39,] 1558.200  1540.500 1528.700
## [40,] 1570.000  1552.300 1540.500
## [41,] 1686.600  1590.300 1552.300
## [42,] 1740.400  1638.800 1590.300
## [43,] 1793.600  1697.650 1638.800
## [44,] 1877.650  1774.562 1697.650
## [45,] 1961.700  1843.337 1774.562
## [46,] 1884.100  1879.262 1843.337
## [47,] 1829.550  1888.250 1879.262
## [48,] 1775.000  1862.587 1888.250
## [49,] 1820.800  1827.362 1862.587
## [50,] 1866.600  1822.987 1827.362
## [51,]       NA        NA 1822.987
## [52,]       NA        NA 1822.987
## [53,]       NA        NA 1822.987
## [54,]       NA        NA 1822.987
## [55,]       NA        NA 1822.987
## [56,]       NA        NA 1822.987
## [57,]       NA        NA 1822.987
## [58,]       NA        NA 1822.987
## [59,]       NA        NA 1822.987
## [60,]       NA        NA 1822.987
## [61,]       NA        NA 1822.987
## [62,]       NA        NA 1822.987
## [63,]       NA        NA 1822.987
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab[,1])
lines(data.gab[,2],col="green",lwd=2)
lines(data.gab[,3],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.sma = train-ramal4[1:length(train)]
SSE.sma = sum(error.sma[5:length(train)]^2)
MSE.sma = mean(error.sma[5:length(train)]^2)
MAPE.sma = mean(abs((error.sma[5:length(train)]/train[5:length(train)])*100))

akurasitrain.sma4 <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasitrain.sma4)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.sma4) <- c("Akurasi Training m = 4")
#test error
error.sma = test-ramal4[51:length(ramal4)]
SSE.sma = sum(error.sma^2)
MSE.sma = mean(error.sma^2)
MAPE.sma = mean(abs((error.sma/test)*100))

akurasitest.sma4 <- matrix(c(SSE.sma, MSE.sma, MAPE.sma))
row.names(akurasitest.sma4 )<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.sma4 ) <- c("Akurasi testing m = 4")
akurasitrain.sma4
##      Akurasi Training m = 4
## SSE            2.389692e+05
## MSE            5.194982e+03
## MAPE           3.638425e+00
akurasitest.sma4
##      Akurasi testing m = 4
## SSE           48651.556162
## MSE            3742.427397
## MAPE              2.951187
data.frame(akurasitrain.sma3,akurasitrain.sma4)
##      Akurasi.Training.m...3 Akurasi.Training.m...4
## SSE            1.856431e+05           2.389692e+05
## MSE            3.949852e+03           5.194982e+03
## MAPE           3.207975e+00           3.638425e+00
data.frame(akurasitest.sma3,akurasitest.sma4)
##      Akurasi.testing.m...3 Akurasi.testing.m...4
## SSE           47173.818729          48651.556162
## MSE            3628.755287           3742.427397
## MAPE              2.864572              2.951187

Terlihat setelah menaikan M nilai akurasi data training maupun data testing tidak membaik, nilai SSE MSE dan MAPE dari m=4 lebih besar dibandingkan dengan M=3.Kelompok kami mencoba menggunakan M dari 5-10 dan hasil errornya tetap tidak membaik. Untuk metode pemulusan Single Moving Average Metode terbaik yang dipilih berdasarkan error terkecil pada data training adalah SMA dengan M=2 sedangkan berdasarkan data testing metode terbaik adalah SMA dengan M=3

Double Moving Average

DMA M=2

dma2 <- SMA(sma2, n = 2)
At <- 2*sma2 - dma2
Bt <- 2/(2-1)*(sma2 - dma2)
data.dma<- At+Bt
data.ramal2<- c(NA, data.dma)

t = 1:13
f = c()

for (i in t) {
  f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}

data.gab2 <- cbind(aktual = c(train,rep(NA,13)), pemulusan1 = c(sma2,rep(NA,13)),pemulusan2 = c(dma2, rep(NA,13)),At = c(At, rep(NA,13)), Bt = c(Bt,rep(NA,13)),ramalan = c(data.ramal2, f[-1]))
data.gab2
##         aktual pemulusan1 pemulusan2       At          Bt  ramalan
##  [1,] 1211.900         NA         NA       NA          NA       NA
##  [2,] 1211.900   1211.900         NA       NA          NA       NA
##  [3,] 1247.800   1229.850   1220.875 1238.825  17.9500125       NA
##  [4,] 1258.250   1253.025   1241.438 1264.613  23.1749880 1256.775
##  [5,] 1268.700   1263.475   1258.250 1268.700  10.4499510 1287.788
##  [6,] 1268.000   1268.350   1265.912 1270.787   4.8750000 1279.150
##  [7,] 1268.200   1268.100   1268.225 1267.975  -0.2499695 1275.662
##  [8,] 1268.400   1268.300   1268.200 1268.400   0.2000120 1267.725
##  [9,] 1320.200   1294.300   1281.300 1307.300  25.9999695 1268.600
## [10,] 1296.200   1308.200   1301.250 1315.150  13.8999635 1333.300
## [11,] 1272.200   1284.200   1296.200 1272.200 -24.0000000 1329.050
## [12,] 1274.100   1273.150   1278.675 1267.625 -11.0499875 1248.200
## [13,] 1308.950   1291.525   1282.337 1300.713  18.3750308 1256.575
## [14,] 1343.800   1326.375   1308.950 1343.800  34.8500365 1319.088
## [15,] 1310.400   1327.100   1326.738 1327.463   0.7250058 1378.650
## [16,] 1311.800   1311.100   1319.100 1303.100 -16.0000307 1328.188
## [17,] 1313.200   1312.500   1311.800 1313.200   1.3999635 1287.100
## [18,] 1298.600   1305.900   1309.200 1302.600  -6.6000057 1314.600
## [19,] 1260.750   1279.675   1292.787 1266.563 -26.2249755 1296.000
## [20,] 1222.900   1241.825   1260.750 1222.900 -37.8499760 1240.338
## [21,] 1207.250   1215.075   1228.450 1201.700 -26.7500000 1185.050
## [22,] 1191.600   1199.425   1207.250 1191.600 -15.6500240 1174.950
## [23,] 1215.400   1203.500   1201.462 1205.538   4.0750120 1175.950
## [24,] 1250.367   1232.883   1218.192 1247.575  29.3833615 1209.613
## [25,] 1285.333   1267.850   1250.367 1285.333  34.9666750 1276.958
## [26,] 1320.300   1302.817   1285.333 1320.300  34.9666750 1320.300
## [27,] 1312.200   1316.250   1309.533 1322.967  13.4332885 1355.267
## [28,] 1291.800   1302.000   1309.125 1294.875 -14.2500000 1336.400
## [29,] 1278.700   1285.250   1293.625 1276.875 -16.7500000 1280.625
## [30,] 1332.650   1305.675   1295.462 1315.887  20.4249573 1260.125
## [31,] 1386.600   1359.625   1332.650 1386.600  53.9500125 1336.312
## [32,] 1411.300   1398.950   1379.287 1418.613  39.3250428 1440.550
## [33,] 1440.000   1425.650   1412.300 1439.000  26.7000120 1457.938
## [34,] 1468.700   1454.350   1440.000 1468.700  28.6999510 1465.700
## [35,] 1511.000   1489.850   1472.100 1507.600  35.5000000 1497.400
## [36,] 1522.800   1516.900   1503.375 1530.425  27.0500245 1543.100
## [37,] 1534.600   1528.700   1522.800 1534.600  11.8000000 1557.475
## [38,] 1546.400   1540.500   1534.600 1546.400  11.8000000 1546.400
## [39,] 1558.200   1552.300   1546.400 1558.200  11.8000000 1558.200
## [40,] 1570.000   1564.100   1558.200 1570.000  11.8000000 1570.000
## [41,] 1686.600   1628.300   1596.200 1660.400  64.1999880 1581.800
## [42,] 1740.400   1713.500   1670.900 1756.100  85.2000120 1724.600
## [43,] 1793.600   1767.000   1740.250 1793.750  53.5000000 1841.300
## [44,] 1877.650   1835.625   1801.312 1869.937  68.6249698 1847.250
## [45,] 1961.700   1919.675   1877.650 1961.700  84.0499875 1938.562
## [46,] 1884.100   1922.900   1921.287 1924.512   3.2250063 2045.750
## [47,] 1829.550   1856.825   1889.862 1823.787 -66.0749815 1927.737
## [48,] 1775.000   1802.275   1829.550 1775.000 -54.5499880 1757.713
## [49,] 1820.800   1797.900   1800.087 1795.712  -4.3750000 1720.450
## [50,] 1866.600   1843.700   1820.800 1866.600  45.7999880 1791.337
## [51,]       NA         NA         NA       NA          NA 1912.400
## [52,]       NA         NA         NA       NA          NA 1958.200
## [53,]       NA         NA         NA       NA          NA 2004.000
## [54,]       NA         NA         NA       NA          NA 2049.800
## [55,]       NA         NA         NA       NA          NA 2095.600
## [56,]       NA         NA         NA       NA          NA 2141.400
## [57,]       NA         NA         NA       NA          NA 2187.200
## [58,]       NA         NA         NA       NA          NA 2233.000
## [59,]       NA         NA         NA       NA          NA 2278.800
## [60,]       NA         NA         NA       NA          NA 2324.600
## [61,]       NA         NA         NA       NA          NA 2370.400
## [62,]       NA         NA         NA       NA          NA 2416.200
## [63,]       NA         NA         NA       NA          NA 2462.000
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab2[,1])
lines(data.gab2[,3],col="green",lwd=2)
lines(data.gab2[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.dma = train-data.ramal2[1:length(train)]
SSE.dma = sum(error.dma[4:length(train)]^2)
MSE.dma = mean(error.dma[4:length(train)]^2)
MAPE.dma = mean(abs((error.dma[4:length(train)]/data.ts[4:length(train)])*100))

akurasitrain.dma2 <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasitrain.dma2)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.dma2) <- c("Akurasi training m = 2")

#test error
error.dma = test-data.ramal2[51:length(data.ramal2)]
SSE.dma = sum(error.dma^2)
MSE.dma = mean(error.dma^2)
MAPE.dma = mean(abs((error.dma/test)*100))

akurasitest.dma2 <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasitest.dma2 )<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.dma2 ) <- c("Akurasi Testing m = 2")
akurasitrain.dma2
##      Akurasi training m = 2
## SSE            1.040257e+05
## MSE            2.213313e+03
## MAPE           2.272141e+00
akurasitest.dma2
##      Akurasi Testing m = 2
## SSE           2.155254e+05
## MSE           1.657887e+04
## MAPE          6.583516e+00

Pada Double Moving Average dengan menggunakan M=2 didapatkan nilai akurasi data training yang lebih kecil dibandingkan data testingnya. Untuk memperbaiki akurasi yang didapatkan maka dicoba M lain yaitu sebesar M=3

DMA M=3

dma3 <- SMA(sma3, n = 3)
At <- 2*sma3 - dma3
Bt <- 2/(3-1)*(sma3 - dma3)
data.dma3 <- At+Bt
data.ramal3<- c(NA, data.dma3)

t = 1:13
f = c()

for (i in t) {
  f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}

data.gab2 <- (cbind(aktual = c(train,rep(NA,13)), pemulusan1 = c(sma3,rep(NA,13)),pemulusan2 = c(data.dma3, rep(NA,13)),At = c(At, rep(NA,13)), Bt = c(Bt,rep(NA,13)),ramalan = c(data.ramal3, f[-1])))
data.gab2
##         aktual pemulusan1 pemulusan2       At           Bt  ramalan
##  [1,] 1211.900         NA         NA       NA           NA       NA
##  [2,] 1211.900         NA         NA       NA           NA       NA
##  [3,] 1247.800   1223.867         NA       NA           NA       NA
##  [4,] 1258.250   1239.317         NA       NA           NA       NA
##  [5,] 1268.700   1258.250   1293.794 1276.022  17.77220333       NA
##  [6,] 1268.000   1264.983   1286.583 1275.783  10.79998100 1293.794
##  [7,] 1268.200   1268.300   1277.211 1272.756   4.45555278 1286.583
##  [8,] 1268.400   1268.200   1270.278 1269.239   1.03890644 1277.211
##  [9,] 1320.200   1285.600   1308.733 1297.167  11.56666389 1270.278
## [10,] 1296.200   1294.933   1318.978 1306.956  12.02220322 1308.733
## [11,] 1272.200   1296.200   1304.111 1300.155   3.95553256 1318.978
## [12,] 1274.100   1280.833   1261.189 1271.011  -9.82222478 1304.111
## [13,] 1308.950   1285.083   1280.506 1282.794  -2.28887244 1261.189
## [14,] 1343.800   1308.950   1343.606 1326.278  17.32780639 1280.506
## [15,] 1310.400   1321.050   1353.095 1337.072  16.02224378 1343.606
## [16,] 1311.800   1322.000   1331.333 1326.667   4.66666644 1353.095
## [17,] 1313.200   1311.800   1298.833 1305.317  -6.48335789 1331.333
## [18,] 1298.600   1307.867   1295.822 1301.844  -6.02224378 1298.833
## [19,] 1260.750   1290.850   1265.539 1278.194 -12.65555811 1295.822
## [20,] 1222.900   1260.750   1209.272 1235.011 -25.73887128 1265.539
## [21,] 1207.250   1230.300   1169.633 1199.967 -30.33331989 1209.272
## [22,] 1191.600   1207.250   1156.217 1181.733 -25.51666933 1169.633
## [23,] 1215.400   1204.750   1186.050 1195.400  -9.35000267 1156.217
## [24,] 1250.367   1219.122   1236.619 1227.870   8.74815533 1186.050
## [25,] 1285.333   1250.367   1301.607 1275.987  25.62038833 1236.619
## [26,] 1320.300   1285.333   1352.785 1319.059  33.72593867 1301.607
## [27,] 1312.200   1305.944   1356.737 1331.341  25.39628100 1352.785
## [28,] 1291.800   1308.100   1324.715 1316.407   8.30740022 1356.737
## [29,] 1278.700   1294.233   1277.181 1285.707  -8.52594678 1324.715
## [30,] 1332.650   1301.050   1300.894 1300.972  -0.07778589 1277.181
## [31,] 1386.600   1332.650   1379.328 1355.989  23.33887406 1300.894
## [32,] 1411.300   1376.850   1456.850 1416.850  40.00001367 1379.328
## [33,] 1440.000   1412.633   1489.811 1451.222  38.58890789 1456.850
## [34,] 1468.700   1440.000   1500.344 1470.172  30.17222072 1489.811
## [35,] 1511.000   1473.233   1535.789 1504.511  31.27776411 1500.344
## [36,] 1522.800   1500.833   1559.789 1530.311  29.47777233 1535.789
## [37,] 1534.600   1522.800   1570.489 1546.644  23.84445533 1559.789
## [38,] 1546.400   1534.600   1564.978 1549.789  15.18889433 1570.489
## [39,] 1558.200   1546.400   1570.000 1558.200  11.80000000 1564.978
## [40,] 1570.000   1558.200   1581.800 1570.000  11.80000000 1570.000
## [41,] 1686.600   1604.933   1675.111 1640.022  35.08888356 1581.800
## [42,] 1740.400   1665.667   1777.800 1721.733  56.06666933 1675.111
## [43,] 1793.600   1740.200   1880.067 1810.133  69.93333067 1777.800
## [44,] 1877.650   1803.883   1938.483 1871.183  67.29999456 1880.067
## [45,] 1961.700   1877.650   2018.461 1948.056  70.40553794 1938.483
## [46,] 1884.100   1907.817   1997.217 1952.517  44.69999189 2018.461
## [47,] 1829.550   1891.783   1890.517 1891.150  -0.63332789 1997.217
## [48,] 1775.000   1829.550   1735.883 1782.717 -46.83331972 1890.517
## [49,] 1820.800   1808.450   1738.828 1773.639 -34.81110300 1735.883
## [50,] 1866.600   1820.800   1823.200 1822.000   1.19999867 1738.828
## [51,]       NA         NA         NA       NA           NA 1823.200
## [52,]       NA         NA         NA       NA           NA 1824.400
## [53,]       NA         NA         NA       NA           NA 1825.600
## [54,]       NA         NA         NA       NA           NA 1826.800
## [55,]       NA         NA         NA       NA           NA 1828.000
## [56,]       NA         NA         NA       NA           NA 1829.200
## [57,]       NA         NA         NA       NA           NA 1830.400
## [58,]       NA         NA         NA       NA           NA 1831.600
## [59,]       NA         NA         NA       NA           NA 1832.800
## [60,]       NA         NA         NA       NA           NA 1834.000
## [61,]       NA         NA         NA       NA           NA 1835.200
## [62,]       NA         NA         NA       NA           NA 1836.400
## [63,]       NA         NA         NA       NA           NA 1837.600
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab2[,1])
lines(data.gab2[,3],col="green",lwd=2)
lines(data.gab2[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.dma3 = train-data.ramal3[1:length(train)]
SSE.dma3 = sum(error.dma3[6:length(train)]^2)
MSE.dma3 = mean(error.dma3[6:length(train)]^2)
MAPE.dma3 = mean(abs((error.dma3[6:length(train)]/data.ts[6:length(train)])*100))

akurasitrain.dma3 <- matrix(c(SSE.dma3, MSE.dma3, MAPE.dma3))
row.names(akurasitrain.dma3)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.dma3) <- c("Akurasi training m = 3")


#test error
error.dma3.test = test-data.ramal3[51:length(data.ramal3)]
SSE.dma3.test = sum(error.dma3.test^2)
MSE.dma3.test = mean(error.dma3.test^2)
MAPE.dma3.test = mean(abs((error.dma3.test/test)*100))

akurasitest.dma3 <- matrix(c(SSE.dma3.test, MSE.dma3.test, MAPE.dma3.test))
row.names(akurasitest.dma3)<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.dma3) <- c("Akurasi testing m = 3")
data.frame(akurasitrain.dma2,akurasitrain.dma3)
##      Akurasi.training.m...2 Akurasi.training.m...3
## SSE            1.040257e+05           1.509239e+05
## MSE            2.213313e+03           3.353864e+03
## MAPE           2.272141e+00           2.944336e+00
data.frame(akurasitest.dma2,akurasitest.dma3)
##      Akurasi.Testing.m...2 Akurasi.testing.m...3
## SSE           2.155254e+05          48801.735906
## MSE           1.657887e+04           3753.979685
## MAPE          6.583516e+00              2.959601

Terlihat setelah menaikan M nilai akurasi training tidak membaik, nilai SSE MSE dan MAPE dari m=3 lebih besar dibandingkan dengan M=2. Namun akurasi membaik pada data testing dengan semua nilai SSE MSE dan MAPE yang lebih baik. Penambahan M dapat memperbaiki akurasi data testing sehingga kita mencoba menambah M lagi sebanyak 1.

DMA M=4

dma4 <- SMA(sma4, n = 4)
At <- 2*sma4 - dma4
Bt <- 2/(4-1)*(sma4 - dma4)
data.dma4 <- At+Bt
data.ramal4 <- c(NA, data.dma4)

t = 1:13
f = c()

for (i in t) {
  f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}

data.gab5 <- (cbind(aktual = c(train,rep(NA,13)), pemulusan1 = c(sma4,rep(NA,13)),pemulusan2 = c(data.dma4, rep(NA,13)),At = c(At, rep(NA,13)), Bt = c(Bt,rep(NA,13)),ramalan = c(data.ramal4, f[-1])))
data.gab5
##         aktual pemulusan1 pemulusan2       At          Bt  ramalan
##  [1,] 1211.900         NA         NA       NA          NA       NA
##  [2,] 1211.900         NA         NA       NA          NA       NA
##  [3,] 1247.800         NA         NA       NA          NA       NA
##  [4,] 1258.250   1232.463         NA       NA          NA       NA
##  [5,] 1268.700   1246.663         NA       NA          NA       NA
##  [6,] 1268.000   1260.688         NA       NA          NA       NA
##  [7,] 1268.200   1265.787   1289.767 1280.175   9.5916570       NA
##  [8,] 1268.400   1268.325   1281.591 1276.284   5.3062489 1289.767
##  [9,] 1320.200   1281.200   1301.533 1293.400   8.1333338 1281.591
## [10,] 1296.200   1288.250   1308.849 1300.609   8.2395782 1301.533
## [11,] 1272.200   1289.250   1301.740 1296.744   4.9958216 1308.849
## [12,] 1274.100   1290.675   1296.227 1294.006   2.2208202 1301.740
## [13,] 1308.950   1287.862   1285.951 1286.716  -0.7645822 1296.227
## [14,] 1343.800   1299.762   1312.888 1307.638   5.2500154 1285.951
## [15,] 1310.400   1309.313   1329.995 1321.722   8.2729365 1312.888
## [16,] 1311.800   1318.738   1343.435 1333.556   9.8791783 1329.995
## [17,] 1313.200   1319.800   1332.961 1327.697   5.2645796 1343.435
## [18,] 1298.600   1308.500   1299.187 1302.912  -3.7250138 1332.961
## [19,] 1260.750   1296.087   1271.598 1281.394  -9.7958450 1299.187
## [20,] 1222.900   1273.862   1231.029 1248.162 -17.1333338 1271.598
## [21,] 1207.250   1247.375   1190.573 1213.294 -22.7208252 1231.029
## [22,] 1191.600   1220.625   1155.854 1181.763 -25.9083277 1190.573
## [23,] 1215.400   1209.288   1161.788 1180.788 -18.9999950 1155.854
## [24,] 1250.367   1216.154   1204.144 1208.948  -4.8041636 1161.788
## [25,] 1285.333   1235.675   1261.074 1250.915  10.1597290 1204.144
## [26,] 1320.300   1267.850   1327.197 1303.458  23.7389018 1261.074
## [27,] 1312.200   1292.050   1357.246 1331.168  26.0784709 1327.197
## [28,] 1291.800   1302.408   1348.929 1330.321  18.6083324 1357.246
## [29,] 1278.700   1300.750   1317.392 1310.735   6.6569316 1348.929
## [30,] 1332.650   1303.837   1310.631 1307.913   2.7173436 1317.392
## [31,] 1386.600   1322.437   1347.569 1337.517  10.0527700 1310.631
## [32,] 1411.300   1352.312   1406.443 1384.791  21.6520819 1347.569
## [33,] 1440.000   1392.637   1475.690 1442.469  33.2208405 1406.443
## [34,] 1468.700   1426.650   1515.218 1479.791  35.4270859 1475.690
## [35,] 1511.000   1457.750   1541.771 1508.163  33.6083373 1515.218
## [36,] 1522.800   1485.625   1560.557 1530.584  29.9729120 1541.771
## [37,] 1534.600   1509.275   1575.025 1548.725  26.2999969 1560.557
## [38,] 1546.400   1528.700   1584.304 1562.063  22.2416708 1575.025
## [39,] 1558.200   1540.500   1581.292 1564.975  16.3166708 1584.304
## [40,] 1570.000   1552.300   1584.977 1571.906  13.0708354 1581.292
## [41,] 1686.600   1590.300   1652.550 1627.650  24.8999970 1584.977
## [42,] 1740.400   1638.800   1736.008 1697.125  38.8833343 1652.550
## [43,] 1793.600   1697.650   1827.462 1775.537  51.9249980 1736.008
## [44,] 1877.650   1774.562   1939.953 1873.797  66.1562444 1827.462
## [45,] 1961.700   1843.337   2017.921 1948.087  69.8333262 1939.953
## [46,] 1884.100   1879.262   2013.528 1959.822  53.7062404 2017.921
## [47,] 1829.550   1888.250   1958.078 1930.147  27.9312465 2013.528
## [48,] 1775.000   1862.587   1852.968 1856.816  -3.8479131 1958.078
## [49,] 1820.800   1827.362   1765.691 1790.359 -24.6687418 1852.968
## [50,] 1866.600   1822.987   1777.472 1795.678 -18.2062454 1765.691
## [51,]       NA         NA         NA       NA          NA 1777.472
## [52,]       NA         NA         NA       NA          NA 1759.266
## [53,]       NA         NA         NA       NA          NA 1741.059
## [54,]       NA         NA         NA       NA          NA 1722.853
## [55,]       NA         NA         NA       NA          NA 1704.647
## [56,]       NA         NA         NA       NA          NA 1686.441
## [57,]       NA         NA         NA       NA          NA 1668.234
## [58,]       NA         NA         NA       NA          NA 1650.028
## [59,]       NA         NA         NA       NA          NA 1631.822
## [60,]       NA         NA         NA       NA          NA 1613.616
## [61,]       NA         NA         NA       NA          NA 1595.409
## [62,]       NA         NA         NA       NA          NA 1577.203
## [63,]       NA         NA         NA       NA          NA 1558.997
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab5[,1])
lines(data.gab5[,3],col="green",lwd=2)
lines(data.gab5[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.dma4 = train-data.ramal4[1:length(train)]
SSE.dma4 = sum(error.dma4[8:length(train)]^2)
MSE.dma4 = mean(error.dma4[8:length(train)]^2)
MAPE.dma4 = mean(abs((error.dma4[8:length(train)]/data.ts[8:length(train)])*100))

akurasitrain.dma4 <- matrix(c(SSE.dma4, MSE.dma4, MAPE.dma4))
row.names(akurasitrain.dma4)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.dma4) <- c("Akurasi training  m = 4")
akurasitrain.dma4
##      Akurasi training  m = 4
## SSE             1.801351e+05
## MSE             4.189189e+03
## MAPE            3.245712e+00
#test error
error.dma4.test = test-data.ramal4[51:length(data.ramal4)]
SSE.dma4.test = sum(error.dma4.test^2)
MSE.dma4.test = mean(error.dma4.test^2)
MAPE.dma4.test = mean(abs((error.dma4.test/test)*100))

akurasitest.dma4 <- matrix(c(SSE.dma4.test, MSE.dma4.test, MAPE.dma4.test))
row.names(akurasitest.dma4)<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.dma4) <- c("Akurasi testing m = 4")
akurasitest.dma4
##      Akurasi testing m = 4
## SSE           43541.443743
## MSE            3349.341826
## MAPE              2.172703
data.frame(akurasitrain.dma3,akurasitrain.dma4)
##      Akurasi.training.m...3 Akurasi.training..m...4
## SSE            1.509239e+05            1.801351e+05
## MSE            3.353864e+03            4.189189e+03
## MAPE           2.944336e+00            3.245712e+00
data.frame(akurasitest.dma3,akurasitest.dma4)
##      Akurasi.testing.m...3 Akurasi.testing.m...4
## SSE           48801.735906          43541.443743
## MSE            3753.979685           3349.341826
## MAPE              2.959601              2.172703

Terlihat setelah menaikan M nilai akurasi data training maupun data testing tidak membaik, nilai SSE MSE dan MAPE dari m=4 lebih besar dibandingkan dengan M=3.Kelompok kami mencoba menggunakan M dari 5-10 dan hasil error data testing membaik pada M=5.

DMA M=5

sma5 <-SMA(train,n=5)
dma5 <- SMA(sma5, n = 5)
At <- 2*sma5 - dma5
Bt <- 2/(5-1)*(sma5 - dma5)
data.dma5<- At+Bt
data.ramal5<- c(NA, data.dma5)

t = 1:13
f = c()

for (i in t) {
  f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}

data.gab2 <- cbind(aktual = c(train,rep(NA,13)), pemulusan1 = c(sma5,rep(NA,13)),pemulusan2 = c(dma5, rep(NA,13)),At = c(At, rep(NA,13)), Bt = c(Bt,rep(NA,13)),ramalan = c(data.ramal5, f[-1]))
data.gab2
##         aktual pemulusan1 pemulusan2       At         Bt  ramalan
##  [1,] 1211.900         NA         NA       NA         NA       NA
##  [2,] 1211.900         NA         NA       NA         NA       NA
##  [3,] 1247.800         NA         NA       NA         NA       NA
##  [4,] 1258.250         NA         NA       NA         NA       NA
##  [5,] 1268.700   1239.710         NA       NA         NA       NA
##  [6,] 1268.000   1250.930         NA       NA         NA       NA
##  [7,] 1268.200   1262.190         NA       NA         NA       NA
##  [8,] 1268.400   1266.310         NA       NA         NA       NA
##  [9,] 1320.200   1278.700   1259.568 1297.832   9.565994       NA
## [10,] 1296.200   1284.200   1268.466 1299.934   7.866996 1307.398
## [11,] 1272.200   1285.040   1275.288 1294.792   4.875994 1307.801
## [12,] 1274.100   1286.220   1280.094 1292.346   3.062993 1299.668
## [13,] 1308.950   1294.330   1285.698 1302.962   4.315995 1295.409
## [14,] 1343.800   1299.050   1289.768 1308.332   4.641005 1307.278
## [15,] 1310.400   1301.890   1293.306 1310.474   4.292011 1312.973
## [16,] 1311.800   1309.810   1298.260 1321.360   5.775011 1314.766
## [17,] 1313.200   1317.630   1304.542 1330.718   6.544005 1327.135
## [18,] 1298.600   1315.560   1308.788 1322.332   3.385999 1337.262
## [19,] 1260.750   1298.950   1308.768 1289.132  -4.909006 1325.718
## [20,] 1222.900   1281.450   1304.680 1258.220 -11.615005 1284.223
## [21,] 1207.250   1260.540   1294.826 1226.254 -17.143002 1246.605
## [22,] 1191.600   1236.220   1278.544 1193.896 -21.161998 1209.111
## [23,] 1215.400   1219.580   1259.348 1179.812 -19.883994 1172.734
## [24,] 1250.367   1217.503   1243.059 1191.948 -12.777660 1159.928
## [25,] 1285.333   1229.990   1232.767 1227.213  -1.388328 1179.170
## [26,] 1320.300   1252.600   1231.179 1274.021  10.710674 1225.825
## [27,] 1312.200   1276.720   1239.279 1314.161  18.720669 1284.732
## [28,] 1291.800   1292.000   1253.763 1330.237  19.118669 1332.882
## [29,] 1278.700   1297.667   1269.795 1325.538  13.935662 1349.356
## [30,] 1332.650   1307.130   1285.223 1329.037  10.953323 1339.474
## [31,] 1386.600   1320.390   1298.781 1341.999  10.804320 1339.990
## [32,] 1411.300   1340.210   1311.479 1368.941  14.365332 1352.803
## [33,] 1440.000   1369.850   1327.049 1412.651  21.400331 1383.306
## [34,] 1468.700   1407.850   1349.086 1466.614  29.382000 1434.051
## [35,] 1511.000   1443.520   1376.364 1510.676  33.578003 1495.996
## [36,] 1522.800   1470.760   1406.438 1535.082  32.161003 1544.254
## [37,] 1534.600   1495.420   1437.480 1553.360  28.969999 1567.243
## [38,] 1546.400   1516.700   1466.850 1566.550  24.924999 1582.330
## [39,] 1558.200   1534.600   1492.200 1577.000  21.200002 1591.475
## [40,] 1570.000   1546.400   1512.776 1580.024  16.812002 1598.200
## [41,] 1686.600   1579.160   1534.456 1623.864  22.352000 1596.836
## [42,] 1740.400   1620.320   1559.436 1681.204  30.442001 1646.216
## [43,] 1793.600   1669.760   1590.048 1749.472  39.855999 1711.646
## [44,] 1877.650   1733.650   1629.858 1837.442  51.895996 1789.328
## [45,] 1961.700   1811.990   1682.976 1941.004  64.506993 1889.338
## [46,] 1884.100   1851.490   1737.442 1965.538  57.023995 2005.511
## [47,] 1829.550   1869.320   1787.242 1951.398  41.038994 2022.562
## [48,] 1775.000   1865.600   1826.410 1904.790  19.594999 1992.437
## [49,] 1820.800   1854.230   1850.526 1857.934   1.852002 1924.385
## [50,] 1866.600   1835.210   1855.170 1815.250  -9.979996 1859.786
## [51,]       NA         NA         NA       NA         NA 1805.270
## [52,]       NA         NA         NA       NA         NA 1795.290
## [53,]       NA         NA         NA       NA         NA 1785.310
## [54,]       NA         NA         NA       NA         NA 1775.330
## [55,]       NA         NA         NA       NA         NA 1765.350
## [56,]       NA         NA         NA       NA         NA 1755.370
## [57,]       NA         NA         NA       NA         NA 1745.390
## [58,]       NA         NA         NA       NA         NA 1735.410
## [59,]       NA         NA         NA       NA         NA 1725.430
## [60,]       NA         NA         NA       NA         NA 1715.450
## [61,]       NA         NA         NA       NA         NA 1705.470
## [62,]       NA         NA         NA       NA         NA 1695.490
## [63,]       NA         NA         NA       NA         NA 1685.510
#Plot time series
ts.plot(data.ts, xlab="Waktu ", ylab="GC.F.Open")
points(data.gab2[,1])
lines(data.gab2[,3],col="green",lwd=2)
lines(data.gab2[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.8)

#Error
#train error
error.dma = train-data.ramal5[1:length(train)]
SSE.dma = sum(error.dma[10:length(train)]^2)
MSE.dma = mean(error.dma[10:length(train)]^2)
MAPE.dma = mean(abs((error.dma[10:length(train)]/data.ts[10:length(train)])*100))

akurasitrain.dma5 <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasitrain.dma5)<- c("SSE", "MSE", "MAPE")
colnames(akurasitrain.dma5) <- c("Akurasi training m = 5")
akurasitrain.dma5
##      Akurasi training m = 5
## SSE            2.144662e+05
## MSE            5.230884e+03
## MAPE           3.654366e+00
#test error
error.dma = test-data.ramal5[51:length(data.ramal5)]
SSE.dma = sum(error.dma^2)
MSE.dma = mean(error.dma^2)
MAPE.dma = mean(abs((error.dma/test)*100))

akurasitest.dma5 <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasitest.dma5 )<- c("SSE", "MSE", "MAPE")
colnames(akurasitest.dma5 ) <- c("Akurasi testing m = 5")
akurasitest.dma5
##      Akurasi testing m = 5
## SSE           40259.715579
## MSE            3096.901198
## MAPE              2.325267
data.frame(akurasitrain.dma3,akurasitrain.dma5)
##      Akurasi.training.m...3 Akurasi.training.m...5
## SSE            1.509239e+05           2.144662e+05
## MSE            3.353864e+03           5.230884e+03
## MAPE           2.944336e+00           3.654366e+00
data.frame(akurasitest.dma3,akurasitest.dma5)
##      Akurasi.testing.m...3 Akurasi.testing.m...5
## SSE           48801.735906          40259.715579
## MSE            3753.979685           3096.901198
## MAPE              2.959601              2.325267

Untuk metode pemulusan Double Moving Average Metode terbaik yang dipilih berdasarkan error terkecil pada data training adalah DMA dengan M=3 sedangkan berdasarkan data testing metode terbaik adalah DMA dengan M=5

Perbandingan Single dan Double Moving Average

data.frame(akurasitrain.sma2,akurasitrain.dma3)
##      Akurasi.Training.m...2 Akurasi.training.m...3
## SSE            1.317664e+05           1.509239e+05
## MSE            2.745133e+03           3.353864e+03
## MAPE           2.737616e+00           2.944336e+00
data.frame(akurasitest.sma3,akurasitest.dma5)
##      Akurasi.testing.m...3 Akurasi.testing.m...5
## SSE           47173.818729          40259.715579
## MSE            3628.755287           3096.901198
## MAPE              2.864572              2.325267

Berdasarkan akurasi data training metode yang memiliki error paling kecil adalah Single Moving Average dengan M=2,sedangkan berdasarkan akurasi data testing metode yang memiliki error paling kecil adalah Double Moving Average dengan M=5.

Eksponensial Smoothing

Single Exponential Smoothing

ses.1 <- HoltWinters(train, gamma = F, beta = F, alpha = 0.1)
ses.2 <- HoltWinters(train, gamma = F, beta = F, alpha = 0.2)
ses.3 <- HoltWinters(train, gamma = F, beta = F, alpha= 0.3)
ses.opt <- HoltWinters(train, gamma = F, beta = F) 

#plot
ses.opt
## Holt-Winters exponential smoothing without trend and without seasonal component.
## 
## Call:
## HoltWinters(x = train, beta = F, gamma = F)
## 
## Smoothing parameters:
##  alpha: 0.9999319
##  beta : FALSE
##  gamma: FALSE
## 
## Coefficients:
##       [,1]
## a 1866.597
plot(ses.1)

plot(ses.2)

plot(ses.3)

plot(ses.opt)

#akurasi training
MSE.ses1 <- (ses.1$SSE/length(train))
MSE.ses2 <- (ses.2$SSE/length(train))
MSE.ses3 <- (ses.3$SSE/length(train))
MSE.sesopt <- (ses.opt$SSE/length(train))

#Peramalan
fc.ses1 <- predict(ses.1, n=13)
fc.ses2 <- predict(ses.2, n=13)
fc.ses3 <- predict(ses.3, n=13)
fc.sesopt <- predict(ses.opt, n=13)

#Akurasi testing
test.MSE.SES1 <- (mean((fc.ses1-test)^2))
test.MSE.SES2 <- (mean((fc.ses2-test)^2))
test.MSE.SES3 <- (mean((fc.ses3-test)^2))
test.MSE.SESopt <- (mean((fc.sesopt-test)^2))
MAPE.SES1= mean(abs((fc.ses1-test/test)*100))
MAPE.SES2= mean(abs((fc.ses2-test/test)*100))
MAPE.SES3= mean(abs((fc.ses3-test/test)*100))
MAPE.SESopt= mean(abs((fc.sesopt-test/test)*100))

data.frame(MSE.ses1,MSE.ses2,MSE.ses3,MSE.sesopt)
##   MSE.ses1 MSE.ses2 MSE.ses3 MSE.sesopt
## 1 21040.61 9389.148 5667.236   1550.754
data.frame(test.MSE.SES1,test.MSE.SES2,test.MSE.SES3,test.MSE.SESopt)
##   test.MSE.SES1 test.MSE.SES2 test.MSE.SES3 test.MSE.SESopt
## 1      13855.81      3033.086      4213.088        8005.734
data.frame(MAPE.SES1,MAPE.SES2,MAPE.SES3,MAPE.SESopt)
##   MAPE.SES1 MAPE.SES2 MAPE.SES3 MAPE.SESopt
## 1  169076.5  179978.7  182960.7    186559.7

Kelompok kami mencoba parameter alpha dari 0.1 sampai 0.9 kemudian ditampilkan beberapa parameter yang memiliki errror terkecil. Berdasarkan Data training Metode Single eksponensial smoothing yang memiliki MSE yang paling kecil adalah SES dengan alpha optimum dari r yaitu sekitar 0.999. Sedangkan berdasarkan data testing Metode Single eksponensial smoothing yang memiliki MSE yang paling kecil adalah SES dengan alpha 0.2

Double exponential smoothing

des.1 <- HoltWinters(train, gamma = F, beta = 0.1, alpha = 0.1)
des.4 <- HoltWinters(train, gamma = F, beta = 0.4, alpha = 0.4)
des.6 <- HoltWinters(train, gamma = F, beta = 0.6, alpha= 0.6)
des.opt <- HoltWinters(train, gamma = F) 

#plot
des.opt
## Holt-Winters exponential smoothing with trend and without seasonal component.
## 
## Call:
## HoltWinters(x = train, gamma = F)
## 
## Smoothing parameters:
##  alpha: 1
##  beta : 0.07734517
##  gamma: FALSE
## 
## Coefficients:
##         [,1]
## a 1866.59998
## b   19.05983
plot(des.1)

plot(des.4)

plot(des.6)

plot(des.opt)

#akurasi training
MSE.des1 <- (des.1$SSE/length(train))
MSE.des4 <- (des.4$SSE/length(train))
MSE.des6 <- (des.6$SSE/length(train))
MSE.desopt <- (des.opt$SSE/length(train))

#Peramalan
fc.des1 <- predict(des.1, n=13)
fc.des4 <- predict(des.4, n=13)
fc.des6 <- predict(des.6, n=13)
fc.desopt <- predict(des.opt, n=13)

#Akurasi testing
test.MSE.DES1 <- (mean((fc.des1-test)^2))
test.MSE.DES4 <- (mean((fc.des4-test)^2))
test.MSE.DES6 <- (mean((fc.des6-test)^2))
test.MSE.DESopt <- (mean((fc.desopt-test)^2))
MAPE.DES1= mean(abs((fc.des1-test/test)*100))
MAPE.DES4= mean(abs((fc.des4-test/test)*100))
MAPE.DES6= mean(abs((fc.des6-test/test)*100))
MAPE.DESopt= mean(abs((fc.desopt-test/test)*100))

data.frame(MSE.des1,MSE.des4,MSE.des6,MSE.desopt)
##   MSE.des1 MSE.des4 MSE.des6 MSE.desopt
## 1 10830.17 3208.279 2413.469   1411.359
data.frame(test.MSE.DES1,test.MSE.DES4,test.MSE.DES6,test.MSE.DESopt)
##   test.MSE.DES1 test.MSE.DES4 test.MSE.DES6 test.MSE.DESopt
## 1      70737.37       6092.43      7498.111        46846.72
data.frame(MAPE.DES1,MAPE.DES4,MAPE.DES6,MAPE.DESopt)
##   MAPE.DES1 MAPE.DES4 MAPE.DES6 MAPE.DESopt
## 1  204228.5  178225.9  186492.7    199901.9

Kelompok kami mencoba parameter alpha dan beta dari 0.1 sampai 0.9 kemudian ditampilkan beberapa parameter yang memiliki errror terkecil. Berdasarkan Data training Metode Double eksponensial smoothing yang memiliki MSE yang paling kecil adalah DES dengan alpha dan beta optimum dari r yaitu alpha=1 dan beta=0.077. Sedangkan berdasarkan data testing Metode Single eksponensial smoothing yang memiliki MSE dan yang paling kecil adalah DES dengan alpha 0.4 dan beta =0.4

#Perbandingan SES dengan DES

data.frame(MSE.sesopt,MSE.desopt)
##   MSE.sesopt MSE.desopt
## 1   1550.754   1411.359
data.frame(test.MSE.SES2,test.MSE.DES4)
##   test.MSE.SES2 test.MSE.DES4
## 1      3033.086       6092.43

Berdasarkan data training metode pemulusan eksponensial yang memiliki MSE yang paling kecil adalah DES dengan alpha dan beta optimum dari r yaitu alpha=1 dan beta=0.077. Sedangkan berdasarkan data testing metode pemulusan eksponensial yang memiliki MSE dan yang paling kecil adalah SES dengan alpha 0.2

Perbandingan Moving Average dengan Eksponensial Smoothing

#training
akurasitrain.sma2
##      Akurasi Training m = 2
## SSE            1.317664e+05
## MSE            2.745133e+03
## MAPE           2.737616e+00
akurasitrain.sma2[2]
## [1] 2745.133
MSE.desopt
## [1] 1411.359
#testing
akurasitest.dma5
##      Akurasi testing m = 5
## SSE           40259.715579
## MSE            3096.901198
## MAPE              2.325267
akurasitest.dma5[2]
## [1] 3096.901
test.MSE.SES2
## [1] 3033.086

Berdasarkan data training metode pemulusan terbaik yang memiliki MSE yang paling kecil adalah DES dengan alpha dan beta optimum dari r yaitu alpha=1 dan beta=0.077. Sedangkan berdasarkan data testing metode pemulusan terbaik yang memiliki MSE dan yang paling kecil adalah SES dengan alpha 0.2

#Plot Pemulusan optimum

#Training Optimum
plot.ts(data.ts)
lines(des.opt$fitted[,2],type="l",col="red")
lines(fc.desopt,type="l",col="blue")
legend("topleft",c("Actual Data","Fitted Data","Forecast"),
       col=c("black","red","blue"),lty=1, cex=0.8)

#Testing Optimum
plot.ts(data.ts)
lines(ses.2$fitted[,2],type="l",col="red")
lines(fc.ses2,type="l",col="blue")
legend("topleft",c("Actual Data","Fitted Data","Forecast"),
       col=c("black","red","blue"),lty=1, cex=0.8)

#Daftar Pustaka

Andriyanto. 2017. Sistem peramalan harga emas antam menggunakan double exponential smoothing. Jurnal Intensif. 1(1): 3-4. doi: 10.29407/intensif.v1i1.531.

Montgomery DC, Jennings CL, Kulahci M. 2015. Introduction to Time Series Analysis and Forecasting Second Edition. New Jersey (US): John Wiley & Sons, Inc., Hoboken.

Singh K et. al. 2019. Implementation of exponential smoothing for forecasting time series data. International Journal of Scientific Research in Computer Science Applications and Management Studies. Tersedia pada: https://www.researchgate.net/publication/330970319.