Berikut ini adalah data harga buah alpukat yang ada dipasaran dari waktu ke waktu
Tujuan saya menggunakan data ini adalah untuk memprediksi harga dari buah alpukat di waktu kedepan (masa depan). Buah alpukat sendiri merupakan salah satu buah yang banyak dikonsumsi oleh masyarakat, jadi banyak orang yang ingin mendapat keuntungan dari menjual ataupun membeli buah alpukat tersebut. Dengan analisis prediksi harga alpukat di masa depan yang akan saya buat ini, diharapkan dapat membantu melihat waktu yang tepat untuk menjual ataupun membeli buah alpukat.
Deskripsi Data:
Date : Tanggal
Price : Harga Alpukat
Data yang saya gunakan berasal dari kaggle dengan link sebagai berikut:
Aktifkan Library
Mengaktifkan library yang akan dipakai untuk analisis dan prediksi
library(tidyverse) #preprocessing data
library(padr) #padding time series
library(TSstudio) #ts plot
library(forecast) #forecasting
library(tseries) #adf test
library(ggplot2) #visualization
library(gridExtra) #grid plot
Import Data
Import data yang akan digunakan
rawavocado <- read.csv("avocado.csv")
rawavocado
Memilih Variabel
Prediksi harga dilakukan di kota “New York” dengan tipe buah “Organic”
Ambil hanya kolom “Date” dan “AveragePrice”, karena kolom tersebut akan dipakai untuk Time Series
avocado_select <-
rawavocado %>%
filter(region == "NewYork" & type == "organic") %>%
select("Date", "AveragePrice")
avocado_select
Mengubah Tipe Data
glimpse(avocado_select)
## Rows: 169
## Columns: 2
## $ Date <chr> "2015-12-27", "2015-12-20", "2015-12-13", "2015-12-06", "~
## $ AveragePrice <dbl> 1.90, 1.93, 1.90, 1.65, 1.89, 1.84, 1.76, 1.82, 2.09, 1.9~
Dapat dilihat untuk varibel Date masih bertipe data “chr” , untuk itu perlu diubah menjadi tipe data “date”
avocado_select$Date <- as.Date(avocado_select$Date)
glimpse(avocado_select)
## Rows: 169
## Columns: 2
## $ Date <date> 2015-12-27, 2015-12-20, 2015-12-13, 2015-12-06, 2015-11-~
## $ AveragePrice <dbl> 1.90, 1.93, 1.90, 1.65, 1.89, 1.84, 1.76, 1.82, 2.09, 1.9~
Tipe data variabel Date sudah dirubah menjadi “date”
Mengelompokan Data
Karena urutan tanggal dari variabel Date masih tidak urut, kita perlu mengurutkannya dan mengelompokannya sesuai dengan tanggal masing-masing
avocado <-
avocado_select %>%
arrange(Date) %>%
group_by(Date) %>%
summarise(Price = mean(AveragePrice))
avocado
Dapat dilihat data Price sudah dikelompokan berdasarkan Date, dengan interval 1 minggu (7 hari)
Cek Range tanggal atau periode
range(avocado$Date)
## [1] "2015-01-04" "2018-03-25"
Data yang yang digunakan dimulai dari 4-Januari-2015 hingga 25-Maret-2018
Cek Missing Value
avocado %>%
pad() %>%
anyNA()
## pad applied on the interval: week
## [1] FALSE
Hasil “FALSE” yang berati data yang akan digunakan aman, tidak ada data yang missing
Membuat Data Time Series
Membuat data Time Series menggunakan fungsi ts() dengan paramater:
data = nilai y yang ingin diamati (Price)
start = data yang digunakan dari tahun berapa
end = data yang digunakan sampai tahun berapa
frequency = banyaknya data dalam 1 pola musiman, pola yang digunakan adalah pola mingguan
avocado_ts <-
ts(data = avocado$Price,
start = 2015, #data yang digunakan dari tahun 2015
end = 2018, #data yang digunakan hingga tahun 2017
frequency = 48) #frekuensi tahunan 48 minggu (1 tahun)
Melihat Pola Data
avocado_ts %>%
ts_plot()
Decomposition
Decomposition adalah suatu tahapan dalam analisis time series untuk menguraikan data menjadi beberapa komponen dalam time series data, yaitu:
Selain melihat bisa pola data, dari decomposition dapat juga terlihat jenis data yang digunakan yaitu Additive atau Multiplicative
avocado_dc <-
decompose(avocado_ts)
autoplot(avocado_dc)
Dari hasil decompose dapat disimpulkan bahwa data yang digunakan memiliki pola trend yang naik dan memiliki pola seasonal (musiman).
Membuat data test dan data train dengan ketentuan spliting tidak memakai random dan data waktu/tanggal harus sudah terurut.
Didata ini saya akan membuat prediksi harga alpukat 12 minggu (6 bulan) kedepan.
# 12 minggu terakhir untuk data test
avocado_test <- avocado_ts %>%
tail(12)
# minggu sisanya untuk data train
avocado_train <- avocado_ts %>%
head(-12)
Exponential Smoothing
Pembuatan model dalam time series dibedakan berdasarkan karakteristik data, yaitu:
Dilihat dari hasil decompse yang sudah dilakukan, data memiliki pola trend yang naik dan memiliki pola seasonal (musiman). Untuk itu model yang cocok adalah menggunakan Holt-Winters Exponential Smoothing.
Model
avocado_hw <-
HoltWinters(avocado_train)
ARIMA
Syarat modeling ARIMA adalah data harus stationer (rata-rata dan variansinya konstan), artinya tidak ada trend dan tidak ada seasonal.
Model ARIMA :
AR(p) = nilai p menunjukkan berapa banyak data variable y sebelumnya yang digunakan oleh AutoRegressive
I(d) = nilai d menunjukkan berapa kali data dilakukan differencing hingga stationer
MA(q) = nilai q menunjukkan berapa banyak error yang dilakukan smoothing
Cek Stationer
adf.test(avocado_train)
##
## Augmented Dickey-Fuller Test
##
## data: avocado_train
## Dickey-Fuller = -2.5154, Lag order = 5, p-value = 0.3622
## alternative hypothesis: stationary
Nilai p-value > 0.05, artinya data tidak stationer
Differencing (d)
Karena data tidak stationer, maka perlu di stationer kan dengan cara differencing
#Diffrence
avocado_train_diff <- avocado_train %>% diff()
#Cek ADF
adf.test(avocado_train_diff)
## Warning in adf.test(avocado_train_diff): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: avocado_train_diff
## Dickey-Fuller = -6.9635, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
Nilai p-value < 0.05 , artinya data sudah stationer
ACF (Auto Correlation Function) (q) dan PACF (Partial Auto Correlation Function) (p)
tsdisplay(avocado_train_diff)
Model
Buat model dengan nilai p (PACF) = 2, d (Diff) = 1, dan q (ACF) = 17. Untuk data train yang digunakan adalah data yang sebelum differencing
avocado_arima_manual <- arima(avocado_train, order = c(2,1,17))
Auto ARIMA
Auto ARIMA digunakan tanpa perlu menentukan nilai p, d, dan q secara manual.
avocado_arima_auto <- auto.arima(avocado_train, seasonal = T)
Membuat forecasting
avocado_hw_f <- forecast(avocado_hw,h=12)
avocado_arima_manual_f <- forecast(avocado_arima_manual,h=12)
avocado_arima_auto_f <- forecast(avocado_arima_auto,h=12)
Hasil visualisasi
a <- autoplot(avocado_hw_f, fcol = "red") +
autolayer(avocado_ts, series = "Actual", color = "black") +
theme_minimal()
b <- autoplot(avocado_arima_manual_f, fcol = "red") +
autolayer(avocado_ts, series = "Actual", color = "black") +
theme_minimal()
c <- autoplot(avocado_arima_auto_f, fcol = "red") +
autolayer(avocado_ts, series = "Actual", color = "black") +
theme_minimal()
grid.arrange(a,b,c)
Model Performa
HoltWinters
accuracy(avocado_hw_f,avocado_test)
## ME RMSE MAE MPE MAPE MASE
## Training set -0.002060946 0.2058392 0.1430845 -0.7774369 6.859123 0.6545844
## Test set -0.045951269 0.1953085 0.1527974 -2.6713851 7.855282 0.6990195
## ACF1 Theil's U
## Training set -0.03338435 NA
## Test set 0.38153922 1.583459
ARIMA Manual
accuracy(avocado_arima_manual_f,avocado_test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.01155424 0.1441275 0.1147223 0.09684014 5.545008 0.5248327
## Test set -0.08540168 0.1923311 0.1547082 -4.62717180 7.954223 0.7077611
## ACF1 Theil's U
## Training set -0.01549225 NA
## Test set 0.32541346 1.365681
ARIMA Auto
accuracy(avocado_arima_auto_f,avocado_test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.003754638 0.1641553 0.1251306 -0.3559012 6.142993 0.5724491
## Test set -0.158701157 0.2138296 0.1661688 -8.2374859 8.591920 0.7601911
## ACF1 Theil's U
## Training set -0.01103194 NA
## Test set -0.19487723 1.646667
Dari hasil performa masing-masing model, dapat lihat nilai MAPE untuk data test terkecil adalah HoltWinters. Jadi HoltWinters adalah model yang akan digunakan.
Normalitas
Cek normalitas menggunakan Shapiro-wijk test
shapiro.test(avocado_hw_f$residuals)
##
## Shapiro-Wilk normality test
##
## data: avocado_hw_f$residuals
## W = 0.94859, p-value = 0.001976
Nilai p-value < 0.05 , artinya berdistribusi normal
Autokorelasi
Cek normalitas menggunakan Ljung-Box test
Box.test(avocado_hw_f$residuals, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: avocado_hw_f$residuals
## X-squared = 0.098117, df = 1, p-value = 0.7541
Nilai p-value > 0.05 , artinya tidak mempunyai korelasi pada residual
Prediksi harga alpukat untuk 12 minggu (6 bulan) kedepan
model <- HoltWinters(avocado_ts)
forecast <- forecast(model,h=12)
forecast$mean
## Time Series:
## Start = c(2018, 2)
## End = c(2018, 13)
## Frequency = 48
## [1] 2.186263 1.741252 2.053455 1.722182 1.822576 1.753480 2.019880 1.918632
## [9] 2.028391 2.054885 2.010201 2.050842
Prediksi <- c("Minggu ke-1", "Minggu ke-2", "Minggu ke-3","Minggu ke-4", "Minggu ke-5", "Minggu ke-6","Minggu ke-7", "Minggu ke-8", "Minggu ke-9","Minggu ke-10", "Minggu ke-11", "Minggu ke-12")
Harga_USD <- c(2.186263,1.741252,2.053455,1.722182,1.822576,1.753480,2.019880,1.918632,2.028391,2.054885,2.010201,2.050842)
pred_harga <- data.frame(Prediksi,Harga_USD)
pred_harga
Visualisasi prediksi harga alpukat untuk 12 minggu (6 bulan) kedepan
avocado_ts %>%
autoplot(series = "Harga Sekarang") +
autolayer(forecast$mean, series = "Harga Prediksi") +
labs(title="Prediksi harga alpukat",
y="USD") + theme_bw()
Dari hasil evaluasi model yang telah dilakukan, dapat disimpulkan bahwa model HoltWinter merupakan model yang terbaik dilihat dari hasil uji normalitas yang berdistribusi normal dan hasil uji korelasi yang tidak mempunyai korelasi antar residual.
Untuk prediksi harga alpukat pada 12 minggu (6 bulan) kedepan dapat dilihat pada minggu ke-1 hingga minggu ke-3 cenderung naik, lalu setelah pada minggu ke-4 harga turun, tetapi pada minggu ke-7 hingga minggu ke-12 harga alpukat kembali naik.