Time Series Forecasting dengan statsmodels dan Prophet

Time Series Forecasting dengan statsmodels dan Prophet

Node Sumber: 1996963
Time Series Forecasting dengan statsmodels dan Prophet
Image by jcomp on Freepik
 

Deret waktu adalah kumpulan data unik dalam bidang ilmu data. Data dicatat berdasarkan frekuensi waktu (misalnya, harian, mingguan, bulanan, dll.), dan setiap pengamatan terkait satu sama lain. Data deret waktu sangat berharga saat Anda ingin menganalisis apa yang terjadi pada data Anda dari waktu ke waktu dan membuat prediksi di masa mendatang. 

Peramalan deret waktu adalah metode untuk membuat prediksi masa depan berdasarkan data deret waktu historis. Ada banyak metode statistik untuk peramalan deret waktu, seperti ARIMA or Penghalusan Eksponensial.

Peramalan deret waktu sering ditemui dalam bisnis, sehingga bermanfaat bagi ilmuwan data untuk mengetahui cara mengembangkan model deret waktu. Pada artikel ini, kita akan mempelajari cara meramal deret waktu menggunakan dua paket Python peramalan populer; statsmodels dan Nabi. Mari kita masuk ke dalamnya.

Grafik model statistik Paket Python adalah paket sumber terbuka yang menawarkan berbagai model statistik, termasuk model peramalan deret waktu. Mari kita coba paket dengan contoh dataset. Artikel ini akan menggunakan Seri Waktu Mata Uang Digital data dari Kaggle (CC0: Domain Publik). 

Mari bersihkan data dan lihat 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()

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Sebagai contoh, katakanlah kita ingin meramalkan variabel 'close_USD'. Mari kita lihat bagaimana pola data dari waktu ke waktu.

import matplotlib.pyplot as plt plt.plot(df['close_USD'])
plt.show()

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Mari buat model perkiraan berdasarkan data kami di atas. Sebelum membuat model, mari pisahkan data menjadi data latih dan uji.

# Split the data
train = df.iloc[:-200] test = df.iloc[-200:]

 

Kami tidak membagi data secara acak karena ini adalah data deret waktu, dan kami perlu mempertahankan urutannya. Sebagai gantinya, kami mencoba mendapatkan data kereta dari sebelumnya dan data uji dari data terbaru.

Mari gunakan statsmodels untuk membuat model perkiraan. Itu model statistik menyediakan banyak API model deret waktu, tetapi kami akan menggunakan model ARIMA sebagai contoh kami.

from statsmodels.tsa.arima.model import ARIMA #sample parameters
model = ARIMA(train, order=(2, 1, 0)) results = model.fit() # Make predictions for the test set
forecast = results.forecast(steps=200)
forecast

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Dalam contoh kami di atas, kami menggunakan model ARIMA dari statsmodels sebagai model peramalan 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 aktual dan prediksi dengan metrik regresi seperti Mean Absolute Error (MAE), Root Mean Square Error (RMSE), dan MAPE (Mean Absolute Percentage Error).

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}%")

 

MAE: 7956.23 RMSE: 11705.11 MAPE: 0.35%

 

Skor di atas terlihat baik-baik saja, tetapi mari kita lihat bagaimana ketika 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()

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Seperti yang bisa kita lihat, ramalannya lebih buruk karena model kita tidak bisa meramalkan tren yang meningkat. Model ARIMA yang kami gunakan tampaknya terlalu sederhana untuk peramalan.

Mungkin lebih baik kita mencoba menggunakan model lain di luar statsmodels. Mari kita coba paket nabi terkenal dari Facebook.

nabi adalah paket model peramalan deret waktu yang berfungsi paling baik pada data dengan efek musiman. Nabi juga dianggap sebagai model ramalan yang kuat karena dapat menangani data yang hilang dan outlier.

Yuk cobain paket Prophet. Pertama, kita perlu menginstal paketnya.

pip install prophet

 

Setelah itu, kita harus menyiapkan dataset kita untuk pelatihan model peramalan. Nabi memiliki persyaratan khusus: kolom waktu harus diberi nama 'ds' dan nilainya sebagai 'y'.

df_p = df.reset_index()[["Time", "close_USD"]].rename( columns={"Time": "ds", "close_USD": "y"}
)

 

Dengan data kita siap, mari kita coba membuat prediksi perkiraan berdasarkan data.

import pandas as pd
from prophet import Prophet model = Prophet() # Fit the model
model.fit(df_p) # create date to predict
future_dates = model.make_future_dataframe(periods=365) # Make predictions
predictions = model.predict(future_dates) predictions.head()

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Apa yang hebat tentang Nabi adalah bahwa setiap titik data perkiraan dirinci untuk dipahami oleh kami para pengguna. Namun, sulit untuk memahami hasil hanya dari data. Jadi, kita bisa mencoba memvisualisasikannya menggunakan Prophet.

model.plot(predictions)

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Fungsi plot prediksi dari model akan memberi kita seberapa yakin prediksi itu. Dari plot di atas, kita dapat melihat bahwa prediksi tersebut memiliki tren naik namun dengan ketidakpastian yang meningkat semakin lama prediksi tersebut.

Dimungkinkan juga untuk memeriksa komponen ramalan dengan fungsi berikut.

model.plot_components(predictions)

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Secara default, kami akan mendapatkan tren data dengan musiman tahunan dan mingguan. Ini cara yang bagus untuk menjelaskan apa yang terjadi dengan data kami.

Apakah mungkin untuk mengevaluasi model Nabi juga? Sangat. Nabi menyertakan pengukuran diagnostik yang dapat kita gunakan: validasi silang deret waktu. Metode ini menggunakan sebagian dari data historis dan menyesuaikan model setiap kali menggunakan data hingga titik pisah batas. Kemudian Nabi akan membandingkan prediksi dengan yang sebenarnya. Mari kita coba menggunakan kode.

from prophet.diagnostics import cross_validation, performance_metrics # Perform cross-validation with initial 365 days for the first training data and the cut-off for every 180 days. df_cv = cross_validation(model, initial='365 days', period='180 days', horizon = '365 days') # Calculate evaluation metrics
res = performance_metrics(df_cv) res

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Dalam hasil di atas, kami memperoleh hasil evaluasi dari hasil aktual dibandingkan dengan perkiraan di setiap hari perkiraan. Dimungkinkan juga untuk memvisualisasikan hasilnya dengan kode berikut.

from prophet.plot import plot_cross_validation_metric
#choose between 'mse', 'rmse', 'mae', 'mape', 'coverage' plot_cross_validation_metric(df_cv, metric= 'mape')

 

Time Series Forecasting dengan statsmodels dan Prophet
 

Jika kita melihat plot di atas, kita dapat melihat kesalahan prediksi bervariasi dari hari ke hari, dan bisa mencapai kesalahan 50% di beberapa titik. Dengan cara ini, kami mungkin ingin mengubah model lebih lanjut untuk memperbaiki kesalahan. Anda dapat memeriksa dokumentasi untuk eksplorasi lebih lanjut.

Peramalan adalah salah satu kasus umum yang terjadi dalam bisnis. Salah satu cara mudah untuk mengembangkan model peramalan adalah dengan menggunakan paket statsforecast dan Prophet Python. Pada artikel ini, kita belajar cara membuat model perkiraan dan mengevaluasinya dengan perkiraan statistik dan Nabi.
 
 
Cornellius Yudha Wijaya adalah asisten manajer ilmu data dan penulis data. Selama bekerja full-time di Allianz Indonesia, ia suka berbagi tips Python dan Data melalui media sosial dan media tulis.
 

Stempel Waktu:

Lebih dari KDnugget