library("forecast")
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library("TTR")
library("TSA")
## Registered S3 methods overwritten by 'TSA':
## method from
## fitted.Arima forecast
## plot.Arima forecast
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
library("graphics")
library("tseries")
library("readxl")
dataawal<-read_xlsx("C:/Users/LENOVO/OneDrive/Dokumen/SMT 3/Statistika Ekonomi & Industri/datalatihan.xlsx")
data1<-dataawal[-111:-120,]
data2<-dataawal[-1:-110,]
data1 merupakan data yang akan digunakan untuk mengidentifikasi model dan meramal 10 minggu kedepan, sedangkan data2 akan digunakan untuk mengetes tingkat akurasi model.
data.ts<-ts(data1)
head(data.ts)
## Time Series:
## Start = 1
## End = 6
## Frequency = 1
## Sales (in thousands)
## [1,] 10618.1
## [2,] 10537.9
## [3,] 10209.3
## [4,] 10553.0
## [5,] 9934.9
## [6,] 10534.5
ts.plot(data.ts, xlab="Time Period", ylab="Sales", main= "Time Series Plot Data Sales")
points(data.ts)
Setelah proses persiapan sudah selesai, langkah selanjutnya adalah
mengidentifikasi model yang sesuai.
adf.test(data.ts)
## Warning in adf.test(data.ts): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data.ts
## Dickey-Fuller = -5.9291, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
acf(data.ts)
pacf(data.ts, lag.max = 50)
eacf(data.ts)
## AR/MA
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o x o o o o o o o o o o o
## 1 o o o o o o o o o o o o o o
## 2 o x o o o o o o o o o o o o
## 3 x o o o o o o o o o o o o o
## 4 x o o o o o o o o o o o o o
## 5 o o x o o o o o o o o o o o
## 6 x o o o o o o o o o o o o o
## 7 x x o o x o o o o o o o o o
Berdasarkan Augmented Dickey-Fuller Test data yang digunakan sudah stasioner dikarenakan nilai p-value = 0.01 < 0.05 sehingga dapat langsung melihat plot ACF, PACF dan EACF untuk mendapatkan kandidat model yang sesuai ACF = Kandidat model 1: ARIMA(0,0,3) PACF = Kandidat model 2: ARIMA(3,0,0) EACF = Kandidat model 3: ARIMA(1,0,1) EACF = Kandidat model 4: ARIMA(1,0,2) EACF = Kandidat model 5: ARIMA(3,0,1)
#Penentuan Model Terbaik berdasar AIC
arima(data.ts, order=c(0,0,3), method="ML")
##
## Call:
## arima(x = data.ts, order = c(0, 0, 3), method = "ML")
##
## Coefficients:
## ma1 ma2 ma3 intercept
## 0.0141 -0.0518 -0.2326 10374.4514
## s.e. 0.1002 0.1171 0.0967 14.9337
##
## sigma^2 estimated as 45079: log likelihood = -745.56, aic = 1499.12
arima(data.ts, order=c(3,0,0), method="ML")
##
## Call:
## arima(x = data.ts, order = c(3, 0, 0), method = "ML")
##
## Coefficients:
## ar1 ar2 ar3 intercept
## 0.0904 0.0086 -0.2312 10374.9540
## s.e. 0.0927 0.0929 0.0926 17.9023
##
## sigma^2 estimated as 44745: log likelihood = -745.15, aic = 1498.3
arima(data.ts, order=c(1,0,1), method="ML")
##
## Call:
## arima(x = data.ts, order = c(1, 0, 1), method = "ML")
##
## Coefficients:
## ar1 ma1 intercept
## 0.0672 0.0246 10375.1957
## s.e. 0.4398 0.4314 22.7734
##
## sigma^2 estimated as 47350: log likelihood = -748.18, aic = 1502.36
arima(data.ts, order=c(3,0,1), method="ML")
##
## Call:
## arima(x = data.ts, order = c(3, 0, 1), method = "ML")
##
## Coefficients:
## ar1 ar2 ar3 ma1 intercept
## 0.6498 -0.0437 -0.2197 -0.6094 10374.0433
## s.e. 0.2868 0.1149 0.1105 0.2950 12.8663
##
## sigma^2 estimated as 43484: log likelihood = -743.64, aic = 1497.28
Berdasarkan nilai AIC, model yang mempunyai AIC terkecil adalah model ARIMA(3,0,1) sehingga model yang akan digunakan untuk peramamlan adalah model ARIMA(3,0,1)
ARIMA_data <- Arima(data.ts, order=c(3,00,3), method="ML")
hasil_forecastt <- forecast(ARIMA_data)
hasil_forecast <- as.data.frame(hasil_forecastt)
hasil_forecast
plot(hasil_forecastt)
Garis biru mewakili prediksi titik, area berbayang biru tua menunjukkan
interval prediksi 80% dan area berbayang biru muda menunjukkan interval
prediksi 95% untuk prediksi titik.
data_forecast1 <- hasil_forecast$'Point Forecast'
data_forecast1 <- as.data.frame(data_forecast1)
head(data_forecast1)
dataaktual <- as.data.frame(data2)
dataaktual
akurasi.arima <- accuracy(data_forecast1$data_forecast1,dataaktual$'Sales (in thousands)')
akurasi.arima
## ME RMSE MAE MPE MAPE
## Test set 71.09004 204.297 161.3968 0.6495022 1.534839
Jika nilai MAPE kecil maka kesalahan hasil pendugaannya juga kecil. Peramalan penjualan menggunakan metode ARIMA dinilai memiliki kemampuan ramalan yang sangat akurat karena hasil dari MAPE adalah sebesar 1.538676%
plot(data.ts,main="Plot semua data")
points(data.ts)
data1.ses<-HoltWinters(data.ts,alpha=0.1, beta=FALSE, gamma=FALSE)
data1.ses
## Holt-Winters exponential smoothing without trend and without seasonal component.
##
## Call:
## HoltWinters(x = data.ts, alpha = 0.1, beta = FALSE, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.1
## beta : FALSE
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 10393.24
SSE <- data1.ses$SSE
SSE
## [1] 5954375
MSE <- data1.ses$SSE
MSE
## [1] 5954375
hasil_forecast.sess <- forecast(data1.ses)
hasil_forecast.sess <- as.data.frame(hasil_forecast.sess)
hasil_forecast.sess
plot(hasil_forecast.sess)
data_forecast2 <- hasil_forecast.sess$'Point Forecast'
data_forecast2 <- as.data.frame(data_forecast2)
head(data_forecast2)
dataaktual <- as.data.frame(data2)
dataaktual
akurasi.ses <- accuracy(data_forecast2$data_forecast2,dataaktual$'Sales (in thousands)')
akurasi.ses
## ME RMSE MAE MPE MAPE
## Test set 31.73833 189.8569 161.3 0.2723997 1.540696
Jika nilai MAPE kecil maka kesalahan hasil pendugaannya juga kecil. Peramalan penjualan menggunakan metode ARIMA dinilai memiliki kemampuan ramalan yang sangat akurat karena hasil dari MAPE adalah sebesar 1.540696%
akurasi.arima
## ME RMSE MAE MPE MAPE
## Test set 71.09004 204.297 161.3968 0.6495022 1.534839
akurasi.ses
## ME RMSE MAE MPE MAPE
## Test set 31.73833 189.8569 161.3 0.2723997 1.540696
Hasil dari kedua metode tersebut menghasilkan nilai MAPE 1.538676% untuk metode ARIMA dan 1.540696% untuk metode Simple Exponential Smoothing. Dengan demikian, metode yang mempunyai MAPE lebih kecil adalah metode ARIMA(3,0,1) dengan nilai p=3, d=0, q=1.
fit <- Arima(data.ts, order=c(3,0,1), method="ML")
fit
## Series: data.ts
## ARIMA(3,0,1) with non-zero mean
##
## Coefficients:
## ar1 ar2 ar3 ma1 mean
## 0.6498 -0.0437 -0.2197 -0.6094 10374.0433
## s.e. 0.2868 0.1149 0.1105 0.2950 12.8663
##
## sigma^2 = 45555: log likelihood = -743.64
## AIC=1499.28 AICc=1500.1 BIC=1515.49
hasil_forecast
interval.prediction <- hasil_forecast[,-1]
interval.prediction
plot(hasil_forecast$`Point Forecast`, type="n", ylim=range(hasil_forecast$`Lo 80`,hasil_forecast$`Hi 80`))
polygon(c(time(hasil_forecast$`Point Forecast`),rev(time(hasil_forecast$`Point Forecast`))), c(hasil_forecast$`Hi 80`,rev(hasil_forecast$`Lo 80`)),
col=rgb(0,0,0.6,0.2), border=FALSE)
lines(hasil_forecast$`Point Forecast`)
lines(fitted(fit),col='red')
out <- (hasil_forecast$`Point Forecast`< hasil_forecast$`Lo 80` | hasil_forecast$`Point Forecast` > hasil_forecast$`Hi 80`)
plot(hasil_forecast$`Point Forecast`, type="n", ylim=range(hasil_forecast$`Lo 95`,hasil_forecast$`Hi 95`))
polygon(c(time(hasil_forecast$`Point Forecast`),rev(time(hasil_forecast$`Point Forecast`))), c(hasil_forecast$`Hi 95`,rev(hasil_forecast$`Lo 95`)),
col=rgb(0,0,0.6,0.2), border=FALSE)
lines(hasil_forecast$`Point Forecast`)
lines(fitted(fit),col='red')
out <- (hasil_forecast$`Point Forecast`< hasil_forecast$`Lo 95` | hasil_forecast$`Point Forecast` > hasil_forecast$`Hi 95`)