Time series adalah dataset unik dalam bidang data science. Datanya dicatat pada frekuensi waktu (misalnya, harian, mingguan, bulanan, dll.), dan setiap observasi saling terkait. Data time series sangat berharga ketika Anda ingin menganalisis apa yang terjadi pada data dari waktu ke waktu dan membuat prediksi di masa depan.
Time Series Forecasting adalah metode untuk membuat prediksi masa depan berdasarkan data time series historis. Ada banyak metode statistik untuk forecasting time series, seperti ARIMA atau Exponential Smoothing.
Time Series Forecasting sering ditemui dalam bisnis, sehingga berguna bagi data scientist untuk mengetahui cara mengembangkan model time series. Dalam artikel ini, kita akan belajar cara forecast time series menggunakan dua paket forecast Python yang populer; statsmodels dan Prophet. Mari kita mulai.
Time Series Forecasting dengan statsmodels
Paket Python statsmodels adalah paket open-source yang menawarkan berbagai model statistik, termasuk model time series forecasting. Mari kita coba paket ini dengan contoh dataset. Artikel ini akan menggunakan data Digital Currency Time Series dari Kaggle (CC0: Public Domain).
Mari kita bersihkan data dan melihat dataset yang kita miliki.
import pandas as pd
df = pd.read_csv('dc.csv')
df = df.rename(columns = {'Unnamed: 0' : 'Time'})
df['Time'] = pd.to_datetime(df['Time'])
df = df.iloc[::-1].set_index('Time')
df.head()
Untuk contoh kita, anggaplah kita ingin forecast variabel close_USD. Mari kita lihat pola data dari waktu ke waktu.
import matplotlib.pyplot as plt
plt.plot(df['close_USD'])
plt.show()
Mari kita buat model forecast berdasarkan data di atas. Sebelum pemodelan, mari kita bagi data menjadi data training dan testing.
# Pisahkan datanya
train = df.iloc[:-200]
test = df.iloc[-200:]
Kita tidak membagi data secara acak karena ini adalah data time series, dan kita perlu mempertahankan urutan. Sebaliknya, kita mencoba memiliki data training dari data awal dan data testing dari data terbaru.
Mari kita gunakan statsmodels untuk membuat model forecast. Statsmodel menyediakan banyak API model time series, tetapi kita akan menggunakan model ARIMA sebagai contoh.
from statsmodels.tsa.arima.model import ARIMA
#parameter sampel
model = ARIMA(train, order=(2, 1, 0))
results = model.fit()
# Buat prediksi untuk test set
forecast = results.forecast(steps=200)
forecast
Dalam contoh di atas, kita menggunakan model ARIMA dari statsmodels sebagai model forecast dan mencoba memprediksi 200 hari ke depan.
Apakah hasil modelnya bagus? Mari kita coba mengevaluasinya. Evaluasi model time series biasanya menggunakan grafik visualisasi untuk membandingkan yang sebenarnya dan prediksi dengan metrik regresi seperti Mean Absolute Error (MAE), Root Mean Square Error (RMSE), dan Mean Absolute Percentage Error (MAPE).
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np
#mean absolute error
mae = mean_absolute_error(test, forecast)
#root mean square error
mse = mean_squared_error(test, forecast)
rmse = np.sqrt(mse)
#mean absolute percentage error
mape = (forecast - test).abs().div(test).mean()
print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")
Output>>
MAE: 7956.23
RMSE: 11705.11
MAPE: 0.35%
Skor di atas terlihat baik, tetapi mari kita lihat bagaimana hasilnya saat kita memvisualisasikannya.
plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(forecast.index, forecast, label='Forecast')
plt.legend()
plt.show()
Seperti yang kita lihat, forecast-nya buruk karena model kita tidak bisa memprediksi peningkatan tren. Model ARIMA yang kita gunakan tampaknya terlalu sederhana untuk forecasting.
Mungkin lebih baik jika kita mencoba menggunakan model lain di luar statsmodels. Mari kita coba paket Prophet yang terkenal dari Facebook.
Time Series Forecasting dengan Prophet
Prophet adalah paket model time series forecasting yang bekerja dengan baik pada data dengan efek musiman. Prophet juga dianggap sebagai model forecast yang kuat karena dapat menangani missing data dan outlier.
Mari kita coba paket Prophet. Pertama, kita perlu menginstal paketnya.
pip install prophet
Setelah itu, kita harus menyiapkan dataset kita untuk pelatihan model forecast. Prophet memiliki persyaratan khusus: kolom waktu harus diberi nama ds dan nilainya sebagai y.
Ketika data kita telah siap, mari kita coba membuat prediksi forecast berdasarkan data.
import pandas as pd
from prophet import Prophet
model = Prophet()
# Fit model
model.fit(df_p)
# Buat tanggal untuk diprediksi
future_dates = model.make_future_dataframe(periods=365)
# Buat prediksi
predictions = model.predict(future_dates)
predictions.head()
Yang hebat dari Prophet adalah bahwa setiap titik data forecast dirinci untuk kita pahami. Namun, sulit untuk memahami hasil hanya dari data. Jadi, kita bisa mencoba memvisualisasikannya menggunakan Prophet.
Fungsi plot prediksi dari model akan memberitahu kita seberapa yakin prediksi tersebut. Dari plot di atas, kita dapat melihat bahwa prediksi memiliki tren naik tetapi dengan ketidakpastian yang meningkat semakin lama prediksinya.
Juga dimungkinkan untuk memeriksa komponen forecast dengan fungsi berikut.
model.plot_components(predictions)
Secara default, kita akan mendapatkan tren data tahunan dan mingguan. Ini adalah cara yang baik untuk menjelaskan apa yang terjadi dengan data kita.
Apakah mungkin untuk mengevaluasi model Prophet juga? Tentu saja. Prophet mencakup pengukuran diagnostik yang dapat kita gunakan: time series cross-validation. Metode ini menggunakan sebagian data historis dan memasang model setiap kali menggunakan data hingga titik cutoff. Kemudian Prophet akan membandingkan prediksi dengan yang sebenarnya. Mari kita coba menggunakan kodenya.
from prophet.diagnostics import cross_validation, performance_metrics
# Lakukan cross-validation dengan 365 hari awal untuk data pelatihan pertama dan cut-off setiap 180 hari.
df_cv = cross_validation(model, initial='365 days', period='180 days', horizon = '365 days')
# Hitung evaluation metrics
res = performance_metrics(df_cv)
res
Dalam hasil di atas, kita memperoleh hasil evaluasi dari hasil aktual dibandingkan dengan forecast pada setiap hari prediksi. Juga dimungkinkan untuk memvisualisasikan hasilnya dengan kode berikut.
from prophet.plot import plot_cross_validation_metric
# Pilih antara 'mse', 'rmse', 'mae', 'mape', 'coverage'
plot_cross_validation_metric(df_cv, metric= 'mape')
Jika kita melihat plot di atas, kita dapat melihat bahwa kesalahan prediksi bervariasi mengikuti hari, dan dapat mencapai 50% kesalahan pada beberapa titik. Dengan cara ini, kita mungkin ingin menyesuaikan model lebih lanjut untuk memperbaiki kesalahan. Anda bisa memeriksa dokumentasinya untuk eksplorasi lebih lanjut.
Kesimpulan
Forecasting adalah salah satu kasus umum yang terjadi dalam bisnis. Salah satu cara mudah untuk mengembangkan model forecasting adalah dengan menggunakan paket Python statsforecast dan Prophet. Dalam artikel ini, kita belajar cara membuat model forecasting dan mengevaluasinya dengan statsforecast dan Prophet.
留言