Pada kesempatan kali dilakukan pengolahan data menggunakan model time series khususnya model ARIMA (Autoregressive Integrated Moving Average). ARIMA cocok jika observasi dari deret waktu (time series) secara statistik berhubungan satu sama lain (dependent).
# Library yang digunakan pada pengolahan data
## Untuk membaca data dengan format Excel
library(readxl)
## Untuk mendapatkan informasi dari data
library(psych)
## Untuk mengubah data menjadi Time Series, Acf, Pacf, Model Arima dan ADF Test
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
# Untuk melihat signifikansi dari Koefesien
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Untuk memprediksi data nantinya
library(forecast)
Data penderita DBD di Kota Jakarta Pusat secara bulanan dari Januari 2008 - November 2017 yang diperoleh dari Dinas Kesehatan. Jumlah data adalah 515 data. Data yang digunakan sebagai percobaan dalam pemodelan sebanyak 490, sedangkan sisanya digunakan untuk perbandingan data asli dengan hasil prediksi.
# Input Data
data_asli <- read_excel("D:/SEMESTER 7/Kapseltat/Tugas Kelompok Time Series/Data Mingguan Penderita DBD JakPus.xlsx")
# Mengubah data training yaitu data yang dimodelkan kedalam bentuk time series
data_asli <- ts(data_asli)
data <- ts(data_asli[1:490,])
# Plot Data
plot(data, main = "Plot Data Penderita DBD JakBar 2008-2017", ylab = "Penderita DBD", xlab = "Waktu" , type = 'o')
Berdasarkan plot deret waktu tersebut data penderita DBD di Kota Jakarta Pusat secara bulanan dari Januari 2008 - November 2017 sangatlah beragam. Terlihat bahwa sekilas data tidak stasioner, yaitu terdapat variansi yang cukup besar.
#Statistika Deskriptif Data
describe(data)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 490 43.09 34.29 33 38.19 26.69 1 219 218 1.45 2.52 1.55
Rata-rata penderita DBD di Kota Jakarta Pusat secara bulanan dari Januari 2008 - November 2017 sebesar 43 orang dengan banyak penderita terkecil hanya seorang dan terbesar sebanyak 219 orang pada Maret 2016. Penderita DBD di Kota Jakarta Pusat dalam rentang waktu tersebut juga sangat beragam ditandai dengan besarnya standar deviasi. Kemencengan (skewness) positif yang artinya data menumpuk di nilai yang lebih kecil dari rataan. Kemudian keruncingan (kurtosis) < 3 yaitu distribusi lebih landai dari distribusi normal.
Untuk mengecek kestasioneran data lebih lanjut, data akan diuji dengan 3 cara.
# CEK STASIONERITAS
##Plot Data
plot(data, main = "Plot Data Penderita DBD JakBar 2008-2017")
abline(h = mean(ts(data)))
## Plot ACF
acf(data)
## Uji ADF (Augmented Dickey-Fuller)
adf.test(data)
## Warning in adf.test(data): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data
## Dickey-Fuller = -5.0258, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
#jika p-value < alpha maka stasioner
#jadi asumsi stasioner dulu
Perhatikan dari plot data terlihat bahwa sekilas data tidak stasioner, yaitu terdapat variansi yang cukup besar. Data tidak stasioner juga dibuktikan pada plot ACF (Autocorrelation Function) data yang membentuk pola dan menurun secara perlahan. Namun, pada berdasarkan uji ADF (Augmented Dickey-Fuller), dengan 𝛂 = 0.05 diperoleh p-value = 0,01 < 𝛂 sehingga disimpulkan bahwa data stasioner.
Maka selanjutnya dimodelkan data asli (Model 1) dan data yang sudah didiferensi (Model 2).
Selanjutnya dilakukan estimasi model dengan melihat plot ACF (Autocorrelation Function) dan PACF (Partial Autocorrelation Function).
#ACF Manual
T= length(data)
maxLag=12
df <- data.frame(1:T,data)
acfResults <- data.frame(k = c(rep(1:maxLag)), acf=NA, stringsAsFactors = F)
for (k in 1: maxLag) {
N <- nrow(df)-k
acf <- sum((data[1:N]-mean(ts(data)))%*%(data[(1+k):(N+k)]-mean(data)))/sum((data-mean(data))^2)
acfResults[k,1] <- k
acfResults[k,2] <- acf
}
#ACF dengan R
acf(data, plot = FALSE)
##
## Autocorrelations of series 'data', by lag
##
## 0 1 2 3 4 5 6 7 8 9 10
## 1.000 0.865 0.836 0.781 0.766 0.688 0.615 0.566 0.500 0.464 0.373
## 11 12 13 14 15 16 17 18 19 20 21
## 0.320 0.257 0.225 0.160 0.115 0.073 0.029 0.004 -0.039 -0.062 -0.094
## 22 23 24 25 26
## -0.104 -0.150 -0.166 -0.167 -0.160
#Plot ACF Manual dan dengan R
par(mfrow=c(1,2))
plot(acfResults[,2], type = "h", ylim = c(-.2,1), xlab = "lag", ylab = "ACF", main = 'Plot ACF manual')
abline(h = 0)
abline(h = c(1,-1)*1.96/sqrt(length(data)), lty = 2, col = "blue")
acf(data,main="Plot ACF dengan R")
#PACF Manual
PacfResults <- data.frame(k = c(1:maxLag), pacf = NA, stringsAsFactors = FALSE)
rho = acfResults[,2]
phi = matrix(0, nrow = maxLag, ncol = maxLag)
phi[1,1] = rho[1]
for (i in 2:maxLag){
phi[i,i] = (rho[i]-(sum(phi[i-1,1:i-1]*rho[(i-1):1])))/(1-sum(phi[i-1,1:i-1]*rho[1:i-1]))
for (j in 1:maxLag){
if (j<i){
phi[i,j] = phi[i-1,j]-(phi[i,i]*phi[i-1,i-j])
}
else {0}
}
PacfResults[k,1] <- k
PacfResults[,2] <- diag(phi)
}
#PACF dengan R
pacf(data, plot = FALSE)
##
## Partial autocorrelations of series 'data', by lag
##
## 1 2 3 4 5 6 7 8 9 10 11
## 0.865 0.347 0.037 0.136 -0.168 -0.192 0.016 -0.092 0.084 -0.138 -0.064
## 12 13 14 15 16 17 18 19 20 21 22
## -0.010 0.041 -0.036 0.012 -0.016 -0.064 0.039 -0.022 -0.012 0.003 -0.008
## 23 24 25 26
## -0.120 0.000 0.095 0.085
#Plot PACF Manual dan dengan R
par(mfrow=c(1,2))
plot(PacfResults[,2], type = "h", ylim = c(-.2,1), xlab = "lag", ylab = "PACF", main = 'Plot PACF manual')
abline(h=0)
abline(h=c(1,-1)*1.96/sqrt(length(data)),lty=2,col="blue")
pacf(data,main='Plot PACF dengan R')
Berdasarkan gambar plot ACF dan PACF di atas, terlihat bahwa plot ACF menurun secara eksponensial, sedangkan pada plot PACF terdapat cut-off setelah lag-2, maka didapatkan model ARIMA(2,0,0) yang artinya model hanya mengandung Autoregressive (AR).
Selanjutnya, akan dicari estimasi parameter untuk model pertama ini, yaitu ARIMA(2,0,0).
#Estimasi Parameter
model_1 <- arima(ts(data),order=c(2,0,0))
summary(model_1)
##
## Call:
## arima(x = ts(data), order = c(2, 0, 0))
##
## Coefficients:
## ar1 ar2 intercept
## 0.5614 0.3501 42.2670
## s.e. 0.0424 0.0425 7.9625
##
## sigma^2 estimated as 257.5: log likelihood = -2056.09, aic = 4120.18
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.002586618 16.04667 10.48246 -22.94941 40.18491 0.9355582
## ACF1
## Training set -0.009452142
Berdasarkan hasil identifikasi model, diperoleh nilai AIC sebesar 4120.18.
Data asli didiferensi sekali dan kemudia di cek stasioneritasnya kembali.
# Cara differensi data jika data tidak stasioner
data2 <- diff(ts(data))
plot(data2, main = "Plot Data Differensi 1x")
abline(h = mean(data2))
# CEK STASIONERITAS
##Plot Data
plot(data2, main = "Plot Data Penderita DBD JakBar 2008-2017")
abline(h=mean(ts(data2)))
## Plot ACF
acf(data2)
## Uji ADF (Augmented Dickey-Fuller)
adf.test(data2)
## Warning in adf.test(data2): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data2
## Dickey-Fuller = -7.8722, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
Dari plot data yang telah didiferensi sekali terlihat data cukup stasioner dibanding data asli sebelumnya. Kemudian, pada plot ACF (Autocorrelation Function) tidak membentuk pola yang signifikan. Begitu pula, pada hasil uji ADF (Augmented Dickey-Fuller), dengan 𝛂 = 0.05 diperoleh p-value = 0,01 < 𝛂 sehingga disimpulkan bahwa data yang telah didiferensi sekali telah stasioner.
Selanjutnya dilakukan estimasi model dengan melihat plot ACF (Autocorrelation Function) dan PACF (Partial Autocorrelation Function).
acf(data2,main="Plot ACF dengan R")
pacf(data2,main='Plot PACF dengan R')
Dari hasil plot ACF dan PACF di atas, model yang mungkin cocok adalah ARIMA(1,1,1). Selanjutnya, dapat digunakan auto arima di R sebagai pertimbangan dalam menentukan model. Hasilnya adalah ARIMA(5,1,2).
model_auto = auto.arima(data)
summary(model_auto)
## Series: data
## ARIMA(5,1,2)
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ma1 ma2
## 0.3836 -0.6718 -0.4012 0.0956 -0.1400 -0.8392 0.9452
## s.e. 0.0521 0.0561 0.0575 0.0521 0.0485 0.0258 0.0339
##
## sigma^2 estimated as 245.8: log likelihood=-2036.94
## AIC=4089.88 AICc=4090.18 BIC=4123.42
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.09906185 15.55067 10.41434 -13.57487 36.26411 0.9294784
## ACF1
## Training set 0.0221461
Berdasarkan ketiga model ARIMA di atas yaitu ARIMA(2,0,0), ARIMA(1,1,1), dan ARIMA(5,1,2) kemudian ditentukan model mana yang cukup baik. Dapat dilihat melalui nilai AIC,MAPE beserta RMSE dari masing-masing model. Diperoleh AIC dan RMSE paling kecil terletak pada ARIMA(5,1,2), sedangkan MAPE paling kecil ada pada ARIMA(1,1,1). Maka, dipilih model ARIMA(5,1,2) sebagai model yang cocok untuk data yang dipunya.
coeftest(model_auto)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.383631 0.052145 7.3570 1.880e-13 ***
## ar2 -0.671767 0.056091 -11.9763 < 2.2e-16 ***
## ar3 -0.401218 0.057499 -6.9778 2.999e-12 ***
## ar4 0.095590 0.052087 1.8352 0.066478 .
## ar5 -0.139983 0.048480 -2.8875 0.003883 **
## ma1 -0.839207 0.025794 -32.5347 < 2.2e-16 ***
## ma2 0.945169 0.033936 27.8517 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dapat dilihat bahwa pvalue dari koefisien ar4 > α maka dapat kita simpulkan bahwa hanya koefisien ar4 yang tidak siginifikan pada model yang dimiliki. Sehingga model memiliki semua parameter kecuali ar4. Kemudian, langkah selanjutnya dilakukan uji diagnostik residual data.
#Uji Diagnostik
qqnorm(residuals(model_auto))
qqline(residuals(model_auto))
hist(residuals(model_auto))
shapiro.test(residuals(model_auto))
##
## Shapiro-Wilk normality test
##
## data: residuals(model_auto)
## W = 0.90254, p-value < 2.2e-16
Box.test(residuals(model_auto),type="Ljung")
##
## Box-Ljung test
##
## data: residuals(model_auto)
## X-squared = 0.24179, df = 1, p-value = 0.6229
checkresiduals(residuals(model_auto))
## Warning in modeldf.default(object): Could not find appropriate degrees of
## freedom for this model.
Berdasarkan QQ Plot, terlihat pada awal dan akhir data nilainya cukup jauh dari garis. Sedangkan pada histogram sekilas data residual berdistribusi normal dan terdapat nilai ekstrim tinggi data. Untuk menguji kenormalan digunakan Uji Shapiro-Wilk diperoleh p-value < 0.5. Artinya untuk uji kenormalan Shapiro-Wilk 𝐻0 ditolak, sehingga tidak berdistribusi normal. Selanjutnya, pada grafik residual ACF masih terdapat lag sehingga dapat diasumsikan adanya korelasi antar residual. Untuk pembuktian lebih lanjut, gunakan Uji Ljung-Box diperoleh p-value < 0.05, sehingga 𝐻0 ditolak. Artinya, ada korelasi antar residual. Adanya korelasi dan data tidak berdistribusi normal mengakibatkan tidak terpenuhinya asumsi residual dalam pemodelan.
#grafik observasi
plot(data_asli,col="black", ylab="Penderita DBD JakPus", xlab="waktu",type='l')
#grafik model
lines(fitted.values(model_auto), type="l",lty=2,col="red")
Selanjutnya diperiksa prediksi berdasarkan model terpilih.
#Prediksi
prediksi = forecast(model_auto, h = 5)
autoplot(prediksi)
summary(prediksi)
##
## Forecast method: ARIMA(5,1,2)
##
## Model Information:
## Series: data
## ARIMA(5,1,2)
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ma1 ma2
## 0.3836 -0.6718 -0.4012 0.0956 -0.1400 -0.8392 0.9452
## s.e. 0.0521 0.0561 0.0575 0.0521 0.0485 0.0258 0.0339
##
## sigma^2 estimated as 245.8: log likelihood=-2036.94
## AIC=4089.88 AICc=4090.18 BIC=4123.42
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.09906185 15.55067 10.41434 -13.57487 36.26411 0.9294784
## ACF1
## Training set 0.0221461
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 491 10.84053 -9.253166 30.93422 -19.89012 41.57118
## 492 10.51339 -12.365174 33.39196 -24.47636 45.50315
## 493 14.93132 -11.343940 41.20658 -25.25322 55.11586
## 494 14.15296 -14.637697 42.94362 -29.87855 58.18448
## 495 12.49798 -20.242388 45.23834 -37.57409 62.57004
Model dari pengolahan data penderita DBD di Kota Jakarta Pusat secara bulanan dari Januari 2008 - November 2017 diperoleh bahwa model yang terpilih adalah ARIMA(5,1,2) dan memiliki RMSE sebesar ≈15% sehingga model ini dapat digunakan untuk memprediksi data ke depannya.
Namun, perhatikan pada uji diagnostik model ARIMA(5,1,2) sebelumnya menunjukkan adanya korelasi antar residual dan residual model tidak berdistribusi normal sehingga asumsi residual dalam pemodelan tidak dipenuhi. Maka, akan lebih baik data dimodelkan dengan data yang memperhatikan korelasi antar residual datanya.