{%hackmd @themes/dracula %}
# DAY 2 - Time Series Forecasting
<p align="center">
<img src="https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54" style="vertical-align:middle">
<img src="https://img.shields.io/badge/TensorFlow-%23FF6F00.svg?style=for-the-badge&logo=TensorFlow&logoColor=white" style="vertical-align:middle">
</p>
Seluruh materi di bawah merupakan hak milik Laboratorium Image Processing and Vision.
Sumber Repo : [Pelatihan Intelligence Forecasting IMV 2024](https://github.com/Pelatihan-Forecasting-IMV-2024)
[TOC]
## Pengantar Time Series Forecasting
<p align="center">
<img src="https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWYwcmtuYjI3cG90cWRvNTJ0cnhrdmE2cDN6ZDR0bmk0bDI0c24wYiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/bmQBu3aSF0DxadphkG/giphy.gif" style="vertical-align:middle">
</p>
**Time series forecasting** adalah `proses analisis` pada `time series data` menggunakan `statistika dan modeling` untuk membuat sebuah `prediksi` dalam membantu pengambilan keputusan secara strategis. Prediksi yang diciptakan belum tentu akurat dan sesuai dengan kenyataan yang akan terjadi, ketepatan prediksi juga dapat bervariasi terutama saat menganalisis variabel yang rentan terhadap fluktuasi oleh faktor eksternal di luar kendali. Meskipun demikian, kemampuan dalam memprediksi suatu data dapat membantu menentukan hasil yang lebih mungkin terjadi ketimbang hasil-hasil lainnya.
## Aplikasi Time Series Forecasting
Forecasting memiliki aplikasi yang luas dalam berbagai industri. Selain dipergunakan untuk kepentingan pribadi atau perusahaan, banyak aplikasi yang menguntungkan untuk seluruh orang. Beberapa contoh aplikasi yang menggunakan forecasting termasuk:
* Prediksi Cuaca: memprediksi cuaca berdasarkan suhu dan kelembapan.
[Paper: A real-time weather forecasting and analysis](https://ieeexplore.ieee.org/abstract/document/8391974)
* Prediksi Saham: memprediksi trend dan harga saham.
[Paper: ARIMA Model for Accurate Time Series Stocks Forecasting](https://www.semanticscholar.org/paper/ARIMA-Model-for-Accurate-Time-Series-Stocks-Khan-Alghulaiakh/5f6ba88d6e61c0f523865d0b652b1a12f07134b8?p2df)
* Prediksi Crypto: memprediksi trend dan harga cryptocurrency.
[Paper: Forecasting cryptocurrency prices time series using machine learning approach](https://www.shs-conferences.org/articles/shsconf/abs/2019/06/shsconf_m3e22019_02001/shsconf_m3e22019_02001.html)
Pada dasarnya, apabila seseorang memiliki data yang bersifat konsisten secara historis, maka data tersebut dapat dilakukan prediksi.
## Exploratory Data Analysis
Exploratory data analysis (EDA) adalah pendekatan terhadap data dalam berbagai aspeknya seperti analisis dan visualisasi untuk mempermudah pemahaman terhadap data tersebut.

Tujuan utama EDA adalah untuk melihat pola, hubungan, dan trend di dalam data. Proses ini sangat penting dalam analisis sebuah data terutama pada data yang besar dan kompleks.
Terdapat empat tipe dari EDA, yaitu:
1. **Univariate non-graphical**: data yang dianalisis merupakan data dengan satu variabel, artinya tidak memiliki hubungan atau relasi. Tujuannya untuk mendeskripsikan data.
2. **Univariate graphical**: metode grafis dari data yang memiliki satu variabel. Tujuannya untuk lebih memahami pola dari data saat dijabarkan sebagai grafik.
3. **Multivariate non-graphical**: data yang memiliki lebih dari satu variabel. Teknik ini tidak menggunakan penjabaran secara grafik namun tetap mencari tahu hubungan dan kausalitas dalam data.
4. **Multivariate graphical**: menjabarkan data dengan variabel lebih dari satu dalam bidang grafik. Tujuannya untuk lebih memahami bentuk dari data dan hubungan antar satu sama lain.
## Data Preprocessing
Seperti yang telah ditulis pada bagian sebelumnya, time series forecasting memerlukan data yang bersifat tersusun konsisten terhadap waktu historis. Data yang telah diambil perlu dilakukan pengecekan ulang dari kecacatan untuk membuatnya layak sebagai basis dari prediksi. Proses pengecekan ulang ini disebut dengan **data preprocessing**.

Data preprocessing umumnya terbagi menjadi empat bagian besar: penataan struktur data, pengisian data kosong, denoising data, dan deteksi pencilan data. Empat proses tersebuh sama rata pentingnya, maka dari itu sebuah data perlu melewati setiap tahap dalam data preprocessing untuk menjamin kemutuannya.
### Penataan struktur data

Selalu berasumsi bahwa data yang dimiliki tidak sempurna. Kesalahan dalam pembuatan data terjadi saat tipe data yang diobservasi berbeda dengan tipe data saat dicatat. Contohnya seperti pengamatan variabel angka namun ditulis sebagai suatu teks.

Gambar di atas menunjukkan data `Suhu Ruangan` dan `Suhu Luar Ruangan` yang tampak normal. Namun dengan menjalankan metode `info()` pada data tersebut, dapat terlihat tipe data yang digunakan.
```python
df.info()
```

Metode `.info()` memberi tahu bahwa kedua data tersebut merupakan sebuah `object`, bukan `float`.
```python
df['Suhu Ruangan'] = df['Suhu Ruangan'].astype(float)
df['Suhu Luar Ruangan'] = df['Suhu Luar Ruangan'].astype(float)
df.info()
```

Menjalankan metode `.astype(float)` mengubah tipe data yang asalnya `object` menjadi `float`.
### Mengisi data kosong
Data kosong pada sebuah rumpang waktu dapat diisi dengan berbagai cara. Menghitung rata-rata tetangga dari data tersebut menjadi cara umum dalam mengatasi masalah ini.

`NaN` berarti **Not a Number**. Kesalahan ini dapat diperbaiki dengan mengisi nilai baru untuk setiap nilai kosong. Terdapat beberapa cara dalam mengisi nilai tersebut, seperti mengisinya dengan nilai 0 atau mengisi dengan rata-rata data.
```python
df.fillna(0, inplace=True) #Mengisi nilai dengan 0
df.fillna(df.mean(), inplace=True) #Mengisi nilai dengan rata-rata
```

Pengisian `NaN` dengan 0.

Pengisian `NaN` dengan rata-rata.
### Mengurangi noise
Umumnya, data bersifat noisy atau memiliki data yang tidak bermakna. Noisy data bersifat buruk dan dapat mengakibatkan permasalahan yang cukup besar, maka dari itu proses mengurani noise sangat disarankan untuk time series forecasting.

```python
from scipy.signal import lfilter
n = 15 # Koefisien, semakin tinggi semakin rata
df_smooth = lfilter(15, 1, df)
```

Hasil penggunaan `lfilter` pada data, perhatikan grafik yang lebih mudah dibaca. Meskipun pengecilan noise dapat dilakukan sesuka hati, perhatikan apabila ada data penting yang hilang karena dianggap noise oleh algoritma.
### Deteksi pencilan data
Pencilan dalam sebuah data menggambarkan penaikan atau penurunan yang terjadi seketika. Tidak semua data memiliki pencilan, namun terkadang sebuah data adalah kumpulan dari berbagai pencilan, hal ini biasa terjadi pada data yang rentan terhadap perubahan.
## Metode Forecasting
Pembuatan sebuah prediksi dapat dilakukan melalui berbagai cara, pendekatan secara statistik dan secara pembelajaran mesin. Berikut adalah tabel model yang dapat dipakai untuk time series forecasting:
|Model|Deskripsi|
|---|---|
|ARIMA|Model statistika yang menggabungkan sifat autoregresi, diferensiasi, dan rata-rata bergerak.|
|SARIMA|Penambahan model ARIMA yang memasukkan komponen musiman (seasonal) untuk membantu pemodelan.|
|**LSTM**|**Salah satu tipe jaringan saraf berulang (RNN) didesain untuk menangkap ketergantungan jangka panjang pada model sekuensial.**|
|KNN for Time Series|Memprediksi berdasarkan pola data historis yang menyerupai satu sama lain.|
|ARIMAX|Penambahan model ARIMA untuk menunjang faktor eksternal yang dapat memengaruhi hasil prediksi.|
Pada pelatihan ini akan difokuskan pada model LSTM untuk memprediksi harga sebuah cryptocurrency. Perhatikan bahwa setiap model memiliki kelebihan dan kekurangan, pada hal ini LSTM dipilih karena memiliki kapabilitas dalam memproses data tidak linier.
### Recurrent Neural Network (RNN)
**Recurrent neural network** adalah salah satu tipe jaringan saraf buatan (ANN) yang dipakai untuk memroses data sekuensial. Berbeda dengan model pembelajaran mesin lainnya, RNN dapat menyimpan nilai output pada proses sebelumnya sebagai input proses saat ini.
<p align="center">
<img src="https://media.geeksforgeeks.org/wp-content/uploads/20231204125839/What-is-Recurrent-Neural-Network-660.webp">
</p>
Fitur utama sekaligus yang terpenting dari RNN adalah **hidden state** yang dimiliki, digunakan sebagai penyimpanan informasi sekuensial layaknya sebuah ingatan. Hidden state juga disebut sebagai memory state karena sifatnya yang dapat mengingat informasi.
<p align="center">
<img src="https://media.geeksforgeeks.org/wp-content/uploads/20231204130132/RNN-vs-FNN-660.png">
</p>
Jaringan neural buatan yang tidak memiliki node perulangan disebut **feed-forward neural network**, informasi yang diproses pada node ini hanya diteruskan ke depan menuju node lainnya. Apabila beberapa lapisan node ini disusun, maka jaringan buatan ini disebut sebagai **multi-layer neural network** atau **multi-layer perceptron**.
Jaringan neural yang menggunakan nilai keluaran node sebagai input untuk node tersebut pada proses selanjutnya, disebut dengan **recurrent node**. RNN tersusun dari banyak **recurrent node**.
### Vanishing Gradient Problem
**Vanishing gradient problem** adalah permasalahan yang dapat terjadi saat dilakukannya pelatihan model pembelajaran mendalam, terutama pada jaringan RNN. Permasalahan ini mengacu pada isu yang muncul pada kurva gradien fungsi loss mengecil mendekati nilai nol terhadap seluruh parameter pembelajaran. Hal ini dapat menyebabkan kurangnya mesin dalam mempelajari pola data, dan hasil model akan kesulitan dalam memprediksi suatu data. Hal ini seperti seseorang yang memberikan sebuah kalimat perintah namun setiap huruf yang ditulis ukurannya semakin mengecil hingga tidak terlihat dan tidak terbaca, mengakibatkan penerima tidak dapat memahami makna dari perintah tersebut.
### Long Short-Term Memory (LSTM)
Jaringan long short-term memory adalah sebuah RNN yang dilatih menggunakan **Backpropagation Through Time** yang dapat menyelesaikan permasalahan pada RNN tradisional yaitu permasalahan **vanishing gradient**.
Berbeda dengan jaringan neural pada pembelajaran mesin lainnya, LSTM menggunakan memory block yang dihubungkan secara lapisan, bukan neuron.

1. **Forget Gate**: menentukan informasi sekarang atau sebelumnya yang akan disimpan pada memory selanjutnya, informasi yang tidak disimpan akan **dilupakan**. Input dan hidden value digabung dan diaktivasikan dengan fungsi **sigmoid**, menghasilkan probabilitas kemungkinan. Fungsi aktivasi **sigmoid** hanya akan mengembalikan nilai 0 atau 1, apabila probabilitas bernilai 0, maka nilai tersebut akan dilupakan, apabila probabilitas bernilai 1, maka nilai tersebut akan diingat.
2. **Input Gate**: menentukan seberapa pentingnya informasi yang **datang** untuk menyelesaikan tugas yang sedang dilaksanakan. Setiap input akan melalui fungsi aktivasi **sigmoid** untuk dilihat apakah informasi yang diterima merupakan informasi penting atau tidak penting. Fungsi aktivasi **tanh** akan menilai informasi yang masuk, karena **tanh** mengeluarkan nilai antara -1 sampai 1, apabila keluaran berupa negatif informasi yang sudah diterima akan dihapus dari rumpunan informasi, apabila positif akan ditambahkan ke dalam rumpunan informasi.
3. **Output Gate**: mengirimkan informasi terbaru ke state selanjutnya. Berdasarkan ukuran dari model yang digunakan informasi baru ini dapat menjadi informasi input pada waktu selanjutnya. Pada akhir sebuah model, output dapat melakukan prediksi berdasarkan informasi-informasi yang tersedia dari proses-proses sebelumnya.
### Fungsi Aktivasi Dalam LSTM

1. **Sigmoid**
Fungsi sigmoid digunakan dalam pembelajaran mesin untuk menambahkan sifat non-linier pada model, fungsi ini memiliki range **(0,1)** membuatnya cocok untuk menghitung probabilitas.

2. **Hyperbolic Tangent**
Fungsi tangent hiperbolik (tanh) memiliki kurva yang serupa dengan fungsi sigmoid, namun fungsi tanha memiliki range **(-1, 1)**. Fungsi tanh dapat mengurangi dampak dari **vanishing gradient problem**.

## Evaluasi Model
**Error metrics** memungkinkan pengguna untuk melihat akurasi dan efisiensi melalui beberapa metrik parameter di bawah ini:
* **Mean Squared Error**
* **Root Mean Squared Error**
* **Mean Absolute Error**
### Mean Squared Error (MSE)
Ditujukan untuk menghitung dan menentukan akurasi dan error rate dari berbagai algoritma pembelajaran mesin terutama permasalahan regresi. MSE dapat membantu untuk melihat **rata-rata perbandingan kuadrat antara hasil nilai prediksi terhadap nilai sesungguhnya**.

### Root Mean Squared Error (RMSE)
Hasil MSE yang kembali diberikan akar kuadrat, adalah arti dari RMSE. **Rata-rata perbandingan antara hasil nilai prediksi terhadap nilai sesungguhnya**, perhatikan bahwa RMSE tidak membandingkan nilai kuadrat karena telah diberi akar.

### Mean Absolute Error (MAE)
Perhitungan **rata-rata kesalahan dalam keseluruhan prediksi**. Menghitung perbedaan antara hasil prediksi dan hasil sesungguhnya secara absolut.

## Contoh Kode dan Aplikasi
[Google Colaboratory](https://colab.research.google.com/drive/1DODRet2QTaWgjq3bT2qgFArBrTD9YAHs#scrollTo=GCbdXeGrZPve)
## Referensi Eksternal
[Time Series Forecasting (TSF) Using Various Deep Learning Models](https://arxiv.org/ftp/arxiv/papers/2204/2204.11115.pdf)
[Bitcoin: And the Future of Money](https://books.google.co.id/books?id=_-wuBAAAQBAJ&redir_esc=y)
[A LSTM-Method for Bitcoin Price Prediction: A
Case Study Yahoo Finance Stock Market](https://rie.binadarma.ac.id/file/conference/a-lstm-method-for-bitcoin-price-prediction-a-case-study-yahoo-finance-stock-market-1639027986.pdf)
[What is EDA?](https://www.ibm.com/topics/exploratory-data-analysis)
[Activation Functions in Neural Networks [12 Types & Use Cases]](https://www.v7labs.com/blog/neural-networks-activation-functions)