Dalam report ini, kita akan memprediksi pergerakan harga minya mentah. Tujuan dari data set ini adalah untuk memprediksi Harga Minyak Mentah di masa mendatang berdasarkan data historis yang tersedia dalam kumpulan data. Data tersebut berisi harga minyak Brent harian dari 17 Mei 1987 hingga 25 Februari 2020.
pada report kali ini, kita akan menggunakan packages prophet. sebuah packages yang dikembangkan oleh facebook untuk memprediksi.
library(tidyverse)
library(forecast)
library(prophet)
library(lubridate)
library(zoo)
library(padr)Pada bagian ini kita akan mempersiapkan dataset yang kita terima menjadi format time series. kita akan mengassign data set dengan nama “house”
oil <- read.csv("BrentOilPrices.csv")
glimpse(oil)#> Rows: 8,554
#> Columns: 2
#> $ Date <chr> "20-May-87", "21-May-87", "22-May-87", "25-May-87", "26-May-87",~
#> $ Price <dbl> 18.63, 18.45, 18.55, 18.60, 18.63, 18.60, 18.60, 18.58, 18.65, 1~
kita melihat kalau tipe data date belum sesuai sehingga kita akan mengubahnya dengan library lubridate tapi ada format data tanggal yang berbeda pada tahun 2021, sehingga butuh sedikit effort untuk memperbaikinya
oil$Date <- parse_date_time(x = oil$Date,
orders = c("d m y", "d B Y", "m/d/y"),
locale = "eng")akhirnya kita mendapat solusi untuk mengubah format data yang berbeda dalam 1 kolom. big thanks to stack overflow.
selanjutnya kita akan melihat apakah ada missing value pada data
colSums(is.na(oil))#> Date Price
#> 0 0
Ada langkah lebih yang harus dipersiapkan sebelum membuat model time series.
Data yang diperoleh sudah berurutan.
Dataset yang kita miliki tidak memiliki hari sabtu, minggu data hari libur nasional karena market futures tutup. jadi kita akan mengisi kekosongan waktu dengan fungsi pad()
oil <- oil %>%
pad()
head(oil)setelah menambahkan hari yang tidak tercantum, kita ada mendapati hari yang sudah ditambahkan memiliki nilai NA. nilai NA akan kita isi dengan nilai rata-rata nilai terdekat dihari tersebut
oil <- oil %>%
mutate(Price = na.fill(Price, fill = "extend"))
head(oil)sekarang nilai NA sudah terisi dengan nilai rata-rata hari yang mendekati hari yang bernilai NA.
notes : Futures market tidak open saat hari sabtu, minggu dan hari libur nasional. pada hari closed dan hari libur, tidak ada pergerakan harga sehingga saya memberikan nilai NA nilai rata-rata harga pada hari yang mendekati hari closed dan hari libur. jadi sewaktu pembuatan model prophet, model bisa melihat kalau pada hari closed dan libur tidak ada terjadi pergerakan dan kalau ada maka pergerakan sangatlah sedikit.
oil %>%
ggplot(aes(x=Date, y=Price)) +
geom_line(color = "pink") +
labs(
title = "Crude Oil Futures",
y = "Price"
) +
theme_minimal() # Cross Validation.
sebelum memulai pembuatan model. kita akan membagi data set menjadi 2 bagian yaitu data train dan data test. pembagian dataset menjadi data train dan data test berbeda karena data harus berurutan. oleh karena itu untuk data train, kita akan memakai 10000 hari observasi dan untuk data test 2305 hari.
data_train <- head(oil, 10000)
data_test <- tail(oil,2305)selanjutnya kita akan membentuk model prophet dan melihat secara visual hasil prediksi
# Your code here
train_daily <- data_train %>%
rename(
ds = "Date",
y = "Price"
)
model_prophet <- prophet(daily.seasonality = TRUE) %>%
fit.prophet(train_daily)
future_prophet <- make_future_dataframe(model_prophet, periods = 2305, freq = "day")period yang digunakan dalam pembuatan futures data frame adalah jumlah total hari yang ada pada dataset test.
# Your code here
forecast_prophet <- predict(model_prophet, future_prophet)
prophet_plot_components(model_prophet, forecast_prophet) fungsi prophet_plot_components memiliki fungsi yang hampir sama dengan fungsi decompose() autoplot() pada objek time series yang fungsi adalah sama-sama menjelaskan beberapa komponen pada time series.
penjelasan :
kita ada mendapatkan informasi bahwa pada weekly seasonal, harga crude oil mengalamai titik terendah pada hari rabu.
sedangkan untuk yearly seasonal, kita mendapatkan informasi kalau point tertinggi terjadi hampir pada sepanjang tahun keciali bulan desember dan bulan januari. hal ini wajar karena biasanya pada bulan desember dan bulan januari, kebanyakan pihak market sudah bersiap untuk merayakan hari libur tahun baru.
pada Trend. kita mendapatkan informasi kalau pergerakan nilai harga crude oil meningkat tajam dari tahun 2000. ada sedikit penurunan yang mungkin terjadi di tahun 2018 dimana saat itu ekonomi dunia sedang tidak bagus.
selanjutnya kita akan melihat hasil prediksi model dengan data yang sudah kita pisahkan.
test <- data_test %>% rename(
"ds" = Date,
"y" = Price
)evalx <- test %>%
mutate(
ds = as.POSIXct(ds)
) %>%
left_join(forecast_prophet) %>%
select(ds, y, yhat, yhat_upper, yhat_lower) berikut adalah hasil prediksi yang sudah dimasukan kedalam data frame
head(evalx)tail(evalx)selanjutnya kita akan melihat nilai error yang diberikan oleh model.
# Your code here
mape <- function(y, yhat) {
return(mean(abs(y - yhat)/ y))
}
mape(evalx$y, evalx$yhat) #> [1] 2.019832
nilai error yang diberikan sebesar 2.01.
# Your code here
evalx %>%
mutate(
month = month(ds, label = T)
) %>%
group_by(month) %>%
summarise(
mape = mean(abs(y-yhat)/y)
) %>%
ggplot(aes(x = month, y = mape)) +
geom_line(group=1) +
geom_point() +
theme_minimal() dari visual diatas, kita ada mendapati nilai MAPE tertinggi ada pada bulan april.
plot(model_prophet, forecast_prophet) +
add_changepoints_to_plot(model_prophet) +
geom_point(test, mapping = aes(as.POSIXct(ds), y), col = "red") # Conclusion
Prophet adalah tool yang sangat baik untuk melakukan prediksi yang cepat dan akurat. tidak ada yang bisa memprediksi market dengan akurasi yang tinggi tapi kita bisa memakai model sebagai alat bantu untuk mempertimbangkan analisa kita. diliat dari visualisasi plot yang ada. kita menyimpulkan untuk memprediksi harga market naik atau turun diperlukan data yang uptodate. kita tidak bisa memakai data puluhan tahun yang lalu untuk memprediksi 5-10 tahun kedepannya. akan lebih baik jika kita memakai 1 minggu untuk memprediksi pergerakan yang akan terjadi kedepannya yang akan datang.
sekian dari report analisa time series yang saya buat. semoga report ini bermanfaat. thank you