Peramalan produksi listrik menggunakan model ARIMA dengan Python – Towards AI – The Best of Tech, Science, and Engineering

Penulis: Jayashree domala

Visualisasi data

Peramalan Produksi Listrik Menggunakan Model Arima dengan Python

Panduan implementasi langkah demi langkah model ARIMA menggunakan Python.

Foto oleh Matthew Henry (Unsplash)

ARIMA yang merupakan kependekan dari ‘Auto-Regressive Integrated Moving Average’ digunakan pada data deret waktu dan memberikan wawasan tentang nilai masa lalu seperti kelambatan dan kesalahan ramalan yang dapat digunakan untuk meramalkan nilai masa depan.

Untuk mengetahui lebih lanjut tentang model ARIMA, lihat artikel di bawah ini:

Pengenalan singkat model ARIMA untuk peramalan deret waktu

Bagaimana menerapkan model ARIMA untuk membantu peramalan / prediksi?

Langkah-langkahnya adalah sebagai berikut:

Menganalisis data deret waktu dengan memplot atau memvisualisasikannya. Mengonversi data deret waktu ke dalam bentuk stasioner. Membuat plot plot ACF dan PACF. Membangun model ARIMA. Membuat prediksi menggunakan model yang dibuat.

Implementasinya menggunakan Python

→ Impor paket

Paket dasar seperti NumPy dan pandas untuk menangani data diimpor. Untuk visualisasi, matplotlib digunakan. Dan untuk mengimplementasikan model ARIMA, statsmodel diimpor.

>>> impor numpy sebagai np
>>> impor panda sebagai pd
>>> impor statsmodels.api sebagai sm
>>> impor matplotlib.pyplot sebagai plt
>>>% matplotlib sebaris

→ Menganalisis data

Data yang digunakan adalah data musiman produksi listrik.

>>> df = pd.read_csv (‘Electric_Production.csv’)
>>> df.head ()

Nama kolom diubah untuk kemudahan penggunaan.

>>> df.columns = [‘Date’,’Production’]
>>> df.head ()

Sekarang untuk bekerja dengan data deret waktu, kolom ‘tanggal’ diubah menjadi indeks DateTime.

>>> df[‘Date’] = pd.to_datetime (df[‘Date’])
>>> df.head ()
>>> df.set_index (‘Date’, inplace = True)
>>> df.head ()

→ Visualisasi data

>>> df.plot ()

Seperti yang terlihat dari plot, ini adalah data musiman karena ada beberapa musim dan juga tren yang meningkat.

Sekarang bandingkan simple moving average 12-bulan dengan rangkaiannya untuk memastikan trennya. Simpangan baku juga diplot untuk melihat apakah ada varians atau tidak.

>>> df[‘Production’].rolling (12) .mean (). plot (label = ’12 SMA ‘, figsize = (16,8))
>>> df[‘Production’].rolling (12) .std (). plot (label = ’12 STD ‘)
>>> df[‘Production’].merencanakan()
>>> plt.legend ()

Dilihat dari plot di atas, standar deviasi tidak terlalu bervariasi sehingga tidak banyak variannya.

→ Penguraian data deret waktu menjadi komponen tren, musiman, dan residu.

statsmodels digunakan untuk dekomposisi.

>>> dari statsmodels.tsa.seasonal import season_decompose >>> decomp = season_decompose (df[‘Production’])
>>> fig = decomp.plot ()
>>> fig.set_size_inches (14,7)

Tren, kesalahan musiman dan sisa dapat dilihat secara individual di sini.

→ Mengubah data menjadi bentuk stasioner

Data tersebut terlebih dahulu diuji menggunakan uji Dickey-Fuller untuk mengecek apakah data tersebut dalam bentuk stasioner atau tidak dan kemudian diubah bentuknya.

Dickey-Fuller memiliki hipotesis nol bahwa akar unit hadir dan merupakan deret waktu non-stasioner. Hipotesis alternatifnya adalah tidak ada akar unit dan deretnya stasioner.

Kami akan menguji dengan bantuan parameter ‘p’. Jika p kecil (p <= 0,05), kami menolak hipotesis nol, jika tidak menolak hipotesis nol.

Dari paket statsmodels, fungsi tes augmented dickey-fuller diimpor. Ini mengembalikan tupel yang terdiri dari nilai: adf, pvalue, usedlag, nobs, critical values, icbest dan resstore.

>>> dari statsmodels.tsa.stattools import adfuller

Kemudian fungsi ini dipanggil pada kolom produksi dari dataset.

>>> fuller_test = adfuller (df[‘Production’])
>>> fuller_test (-2.256990350047239,
0.18621469116586975,
15,
381,
{‘1%’: -3.4476305904172904,
‘5%’: -2.869155980820355,
‘10% ‘: -2.570827146203181},
1840.8474501627156)

Sekarang nilai-p dicetak dan menggunakan nilai-p, dipastikan apakah datanya stasioner atau tidak.

>>> def test_p_value (data):
fuller_test = adfuller (data)
print (‘P-value:’, fuller_test[1])
jika fuller_test[1] <= 0,05:
print (‘Tolak hipotesis nol, data tidak bergerak’)
lain:
print (‘Jangan tolak hipotesis nol, data tidak stasioner’) >>> test_p_value (df[‘Production’]) Nilai-P: 0.18621469116586975
Jangan menolak hipotesis nol, data tidak stasioner

Karena data tidak stasioner, dilakukan pembedaan. Perbedaannya adalah perubahan deret waktu dari satu periode ke periode berikutnya. Perbedaan pertama, perbedaan kedua dan perbedaan musim dihitung dan untuk masing-masing, nilai-p diperiksa.

df[‘First_diff’] = df[‘Production’] – df[‘Production’].shift (1)
df[‘First_diff’].merencanakan()
>>> test_p_value (df[‘First_diff’].dropna ()) Nilai-P: 4.0777865655398996e-10
Tolak hipotesis nol, data tidak bergerak

Pada perbedaan pertama didapatkan data dalam bentuk stasioner. Dalam kasus, perbedaan kedua diperlukan maka hal berikut akan dilakukan.

>>> df[‘Second_diff’] = df[‘First_diff’] – df[‘First_diff’].shift (1)
>>> df[‘Second_diff’].merencanakan()
>>> test_p_value (df[‘Second_diff’].dropna ()) Nilai-P: 4.1836937480000375e-17
Tolak hipotesis nol, data tidak bergerak

Perbedaan musim juga bisa diambil sebagai berikut. Pergeseran akan terjadi sepanjang musim yaitu ’12’.

>>> df[‘Seasonal_diff’] = df[‘Production’] – df[‘Production’].shift (12)
>>> df[‘Seasonal_diff’].merencanakan()
>>> test_p_value (df[‘Seasonal_diff’].dropna ()) Nilai-P: 8.812644938089026e-07
Tolak hipotesis nol, data tidak bergerak

→ Merencanakan plot ACF dan PACF

Dari paket statsmodels, fungsi plot ACF dan PACF diimpor.

>>> dari statsmodels.graphics.tsaplots impor plot_acf, plot_pacf >>> first_diff = plot_acf (df[‘First_diff’].dropna ())
>>> sec_diff = plot_pacf (df[‘Second_diff’].dropna ())

Sekarang plot ACF dan PACF terakhir akan diplot yang akan digunakan lebih lanjut.

>>> p1 = plot_acf (df[‘Seasonal_diff’].dropna ())
>>> p2 = plot_pacf (df[‘Seasonal_diff’].dropna ())

→ Membangun model ARIMA

Untuk data non musiman, model ARIMA dapat diimpor dari modul statsmodels.

>>> dari statsmodels.tsa.arima_model import ARIMA

Untuk data musiman, model ARIMA musiman dapat diimpor dari modul statsmodels. Data yang digunakan disini adalah data musiman sehingga model ARIMA musiman diimpor. Argumen yang lolos adalah kolom produksi, urutan dan urutan musiman.

order: Urutan (p, d, q) model untuk jumlah parameter AR, perbedaan, dan parameter MA.

urutan musiman: Urutan (P, D, Q, s) dari komponen musiman model untuk parameter AR, perbedaan, parameter MA, dan periodisitas.

>>> model = sm.tsa.statespace.SARIMAX (df[‘Production’], pesanan = (0,1,0), musiman_order = (1,1,1,12))

Setelah model dibuat, selanjutnya yang harus dilakukan adalah menyesuaikan model.

>>> hasil = model.fit ()
>>> results.summary ()

Untuk mengetahui nilai residual atau error, metode ‘resid’ dapat dipanggil pada hasil.

>>> hasil. Tanggalresid
1985-01-01 72.505200
1985-02-01 -1.833200
1985-03-01 -8.221800
1985-04-01 -4.978800
1985-05-01 -2.156300

01-09-2017 0,529985
2017-10-01 4.057874
2017-11-01 0.690663
2017-12-01 2.477697
01-01-2018 6.953533
Panjang: 397, dtype: float64

Plot titik-titik sisa dapat dibuat.

>>> results.resid.plot ()

Distribusi kesalahan dapat dilihat dengan memplot KDE. Dan seperti terlihat dari plot di bawah ini, kesalahan didistribusikan sekitar 0 yang bagus.

>>> results.resid.plot (jenis = ‘kde’)

→ Memprediksi atau meramalkan

Dengan memprediksi nilai-nilai tersebut, kinerja model dapat dipastikan. Pertama, kita dapat melihat bagaimana itu memprediksi data saat ini dan kemudian beralih ke memprediksi data masa depan.

>>> df[‘prediction’] = result.predict ()
>>> df[[‘Production’,’prediction’]]. plot (figsize = (12,8))

Dilihat dari plot di atas, model melakukan tugasnya dengan baik dalam memprediksi data yang ada. Sekarang untuk memprediksi masa depan, kita dapat menambahkan lebih banyak bulan ke dataset dengan nilai null dan memprediksinya. Ini bisa dilakukan dengan menggunakan panda. Indeks terakhir diperoleh yang merupakan tanggal terakhir dan offset bulan ditambahkan ke dalamnya yang dimulai dari 1 hingga 24.

>>> dari pandas.tseries.offsets impor DateOffset
>>> extra_dates = [df.index[-1] + DateOffset (bulan = m) untuk m dalam kisaran (1,24)]>>> extra_dates
[Timestamp(‘2018-02-01 00:00:00’),
Timestamp(‘2018-03-01 00:00:00’),
Timestamp(‘2018-04-01 00:00:00’),
Timestamp(‘2018-05-01 00:00:00’),
Timestamp(‘2018-06-01 00:00:00’),
Timestamp(‘2018-07-01 00:00:00’),
Timestamp(‘2018-08-01 00:00:00’),
Timestamp(‘2018-09-01 00:00:00’),
Timestamp(‘2018-10-01 00:00:00’),
Timestamp(‘2018-11-01 00:00:00’),
Timestamp(‘2018-12-01 00:00:00’),
Timestamp(‘2019-01-01 00:00:00’),
Timestamp(‘2019-02-01 00:00:00’),
Timestamp(‘2019-03-01 00:00:00’),
Timestamp(‘2019-04-01 00:00:00’),
Timestamp(‘2019-05-01 00:00:00’),
Timestamp(‘2019-06-01 00:00:00’),
Timestamp(‘2019-07-01 00:00:00’),
Timestamp(‘2019-08-01 00:00:00’),
Timestamp(‘2019-09-01 00:00:00’),
Timestamp(‘2019-10-01 00:00:00’),
Timestamp(‘2019-11-01 00:00:00’),
Timestamp(‘2019-12-01 00:00:00’)]

Sekarang kerangka data lain dibuat dengan nilai tanggal masa depan ekstra ini sebagai indeks dan nilai kolom lainnya sebagai null.

>>> forecast_df = pd.DataFrame (indeks = extra_dates, kolom = df.columns)
>>> forecast_df.head ()

Sekarang kerangka data asli dan kerangka data perkiraan ini digabungkan menjadi satu untuk perkiraan.

>>> final_df = pd.concat ([df,forecast_df])

Sekarang kita dapat memprediksi nilai untuk titik data akhir dengan menyebutkan argumen awal dan akhir sambil memanggil fungsi ‘prediksi’.

>>> final_df[‘prediction’] = results.predict (mulai = 396, akhir = 430)
>>> final_df[[‘Production’,’prediction’]]. plot (figsize = (12,8))

Garis prediksi dapat dilihat dengan jelas untuk nilai-nilai yang akan datang.

Kesimpulan

Model ARIMA berhasil digunakan untuk memprediksi nilai masa depan produksi listrik yang merupakan dataset musiman dengan perilaku non-stasioner. Dengan langkah-langkah yang tepat, data diubah ke dalam bentuk stasioner dan model prediksi dibangun.

Lihat notebook dan dataset di sini.

Hubungi saya: LinkedIn

Lihat pekerjaan saya yang lain: GitHub

Perkiraan produksi listrik menggunakan model ARIMA dengan Python awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Towards AI