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.
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
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)
#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)
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)
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
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.
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
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
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.
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.
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
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.
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
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
#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.