1. Latar Belakang

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:

https://www.kaggle.com/neuromusic/avocado-prices

2. Set Up

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

3. Preprocessing Data

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

4. Time Series

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:

  • Trend : pola data secara umum, kecenderungan untuk naik atau turun
  • Seasonal : pola musiman yang membentuk pola berulang pada periode waktu yang tetap
  • Error/Remainder/Random : pola yang tidak dapat ditangkap dalam trend dan seasonal

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

5. Build Model

5.1. Cross Validation

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)

5.2. Modelling

Exponential Smoothing

Pembuatan model dalam time series dibedakan berdasarkan karakteristik data, yaitu:

  • Single/Simple Exponential Smooting/SES: no trend, no seasonal
  • Double Exponential Smooting/Holt Exponential Smoothing: ada trend, no seasonal
  • Triple Exponential Smooting/Holt-Winters Exponential Smoothing: ada trend, ada seasonal

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)

5.3. Forecast dan Evaluasi

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.

5.4. Asumsi

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

6. Prediksi

6.1. Prediksi Harga

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

6.2. Visualisasi

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()

7. Kesimpulan

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.