Peramalan deret waktu adalah penggunaan model untuk memprediksi nilai masa depan berdasarkan nilai yang diamati sebelumnya. Saya mendapat ide untuk analisis deret waktu di bawah ini dari Susan Li
DataSumber data. https. //menghibur. awan. google. com/marketplace/product/iowa-department-of-commerce/iowa-liquor-sales?project=fiery-province-334423
Saya menggunakan data Iowa Liquor Sales dari Jan 2016 hingga Des 2019 hanya untuk analisis deret waktu
SasaranMenggunakan Time Series Analysis untuk meramalkan penjualan
Ada beberapa kategori dalam Penjualan Ritel Minuman Keras Iowa, saya mulai dari analisis deret waktu dan peramalan penjualan wiski (kategori_grup = 101)
Ada data wiski Iowa selama 3 tahun
2016–01–04 00. 00. 00 -> 2019–12–31 00. 00. 00
Pra-pemrosesan DataLangkah ini termasuk menghapus kolom yang tidak saya perlukan, memeriksa nilai yang hilang, menjumlahkan penjualan berdasarkan tanggal, dan seterusnya
Baris Hilang. 276382 (10. 79%)
Memvisualisasikan Data Deret Waktu Penjualan WiskiBeberapa pola yang dapat dibedakan muncul saat kami memplot data. Time-series memiliki pola musiman, seperti penjualan selalu rendah di awal tahun dan tinggi di akhir tahun. Selalu ada tren naik dalam satu tahun dengan beberapa bulan rendah di pertengahan tahun
Kami juga dapat memvisualisasikan data kami menggunakan metode yang disebut dekomposisi deret waktu yang memungkinkan kami menguraikan deret waktu menjadi tiga komponen berbeda. tren, musiman, dan kebisingan
Plot di atas dengan jelas menunjukkan bahwa penjualan wiski stabil, bersama dengan musimnya yang jelas
Peramalan deret waktu dengan ARIMAKami akan menerapkan salah satu metode yang paling umum digunakan untuk peramalan deret waktu, yang dikenal sebagai ARIMA, yang merupakan singkatan dari Autoregressive Integrated Moving Average.
Model ARIMA dilambangkan dengan notasi ARIMA(p, d, q). Ketiga parameter ini menjelaskan musiman, tren, dan kebisingan dalam data
Langkah ini merupakan pemilihan parameter untuk penjualan ARIMA Time Series Model Whisky. Tujuan kami di sini adalah menggunakan "pencarian kisi" untuk menemukan kumpulan parameter optimal yang menghasilkan kinerja terbaik untuk model kami
Output di atas menunjukkan bahwa SARIMAX(1, 1, 1)x(1, 1, 0, 12) menghasilkan nilai AIC terendah dari 490. 80. Oleh karena itu kita harus menganggap ini sebagai pilihan yang optimal
Memasang model ARIMAJalankan diagnostik model untuk menyelidiki perilaku yang tidak biasa
Itu tidak sempurna, namun, diagnostik model kami menunjukkan bahwa residu model hampir terdistribusi normal
Memvalidasi perkiraanUntuk membantu kami memahami keakuratan prakiraan kami, kami membandingkan prediksi penjualan dengan penjualan nyata dari deret waktu, dan kami menetapkan prakiraan untuk dimulai pada 2019–01–01 hingga akhir data
Plot garis menunjukkan nilai yang diamati dibandingkan dengan prediksi perkiraan bergulir. Secara keseluruhan, prakiraan kami selaras dengan nilai sebenarnya dengan sangat baik, menunjukkan tren naik mulai dari awal tahun dan menangkap musiman menjelang akhir tahun
Mean Squared Error dari perkiraan kami adalah 1691902713. 18
Root Mean Squared Error dari perkiraan kami adalah 41132. 75
Dalam statistik, mean squared error (MSE) dari sebuah estimator mengukur rata-rata kuadrat dari error — yaitu, perbedaan kuadrat rata-rata antara nilai estimasi dan apa yang diestimasi. MSE adalah ukuran kualitas estimator — selalu non-negatif, dan semakin kecil MSE, semakin dekat kita untuk menemukan garis yang paling cocok
Root Mean Square Error (RMSE) memberi tahu kami bahwa model kami dapat meramalkan rata-rata penjualan wiski Iowa dalam set pengujian dalam 41132 dari penjualan sebenarnya. Penjualan harian wiski berkisar dari sekitar 260.000 hingga lebih dari 550.000. Menurut pendapat saya, ini adalah model yang cukup bagus sejauh ini
Memproduksi dan memvisualisasikan prakiraanModel tersebut dengan jelas menangkap musim penjualan wiski. Saat kita meramalkan lebih jauh ke masa depan, wajar bagi kita untuk menjadi kurang percaya diri dengan nilai-nilai kita. Hal ini tercermin dari interval kepercayaan yang dihasilkan oleh model kami, yang tumbuh lebih besar saat kami melangkah lebih jauh ke masa depan
Data deret waktu merupakan sumber penting untuk informasi dan strategi yang digunakan dalam berbagai bisnis. Dari industri keuangan konvensional hingga industri pendidikan, mereka memainkan peran utama dalam memahami banyak detail tentang faktor-faktor tertentu sehubungan dengan waktu. Baru-baru ini saya mempelajari pentingnya data deret waktu dalam industri telekomunikasi dan ingin memoles analisis deret waktu dan informasi prakiraan saya. Jadi saya memutuskan untuk mengerjakan contoh sederhana menggunakan python dan saya telah menjelaskan semua detailnya di blog ini
Peramalan deret waktu pada dasarnya adalah pemodelan pembelajaran mesin untuk data Deret Waktu (tahun, hari, jam...dll. ) untuk memprediksi nilai masa depan menggunakan pemodelan Time Series. Ini membantu jika data Anda berkorelasi secara serial
Memuat dan Menangani Time Series di Pandas
Saya akan menggunakan python di notebook jupyter. Panda di python memiliki perpustakaan yang khusus untuk menangani objek deret waktu. Anda dapat melihat dokumentasi ini untuk detail lebih lanjut
Mari kita mulai dengan Pendahuluan
import pandas as pdimport numpy as np
import matplotlib.pylab as plt
%matplotlib inline
Untuk memuat data- Saya telah memberikan tautan ke GitHub saya tempat kumpulan data dan kode tersedia. Saya akan menggunakan dataset AirPassenger dari. Apakah kamu siap?
data = pd.read_csv('AirPassengers.csv')print data.head()
print '\n Data Types:'
print data.dtypes_
Melihat output
Data tersebut berisi bulan tertentu dan jumlah penumpang yang bepergian pada bulan tersebut. Tipe data di sini adalah objek (bulan) Mari kita ubah menjadi objek Time series dan gunakan kolom Bulan sebagai indeks kita
from datetime import datetimecon=data['Month']
data['Month']=pd.to_datetime(data['Month'])
data.set_index('Month', inplace=True)
#check datatype of index
data.index
Anda dapat melihat bahwa sekarang tipe datanya adalah 'datetime64[ns]'. Sekarang mari kita buat menjadi rangkaian daripada bingkai data (ini akan memudahkan penjelasan blog)
#convert to time series:ts = data['#Passengers']
ts.head(10)
Mari jelajahi berbagai properti berdasarkan indeks tanggal-waktu
STATIONARITAS
Ini adalah konsep yang sangat penting dalam Analisis Deret Waktu. Untuk menerapkan model deret waktu, deret Waktu harus stasioner; . Ini dilakukan pada dasarnya karena jika Anda mengambil perilaku tertentu dari waktu ke waktu, penting bahwa perilaku ini sama di masa mendatang agar kami dapat meramalkan rangkaiannya. Ada banyak teori statistik untuk mengeksplorasi deret stasioner daripada deret non-stasioner. (Dengan demikian kita bisa membawa pertarungan ke tanah rumah kita. )
Dalam praktiknya kita dapat mengasumsikan deret menjadi stasioner jika memiliki sifat statistik konstan dari waktu ke waktu dan sifat ini bisa
• rata-rata konstan
• varian konstan
• co-variance otomatis yang tidak bergantung pada waktu
Detail ini dapat dengan mudah diambil menggunakan perintah stat di python
Cara terbaik untuk memahami stasioneritas Anda dalam Time Series adalah dengan mengamati plotnya
Jelas dari plot bahwa ada peningkatan tren secara keseluruhan, dengan beberapa musim di dalamnya
Saya telah menulis sebuah fungsi untuk itu karena saya akan sering menggunakannya dalam penjelasan Time series ini. Namun sebelum kita membahasnya, izinkan saya menjelaskan semua konsep dalam fungsi tersebut
Merencanakan Statistik Bergulir. Fungsi akan memplot rata-rata bergerak atau Standar Deviasi bergerak. Ini masih metode visual
CATATAN. rata-rata bergerak dan deviasi standar bergerak — Kapan saja 't', kita mengambil rata-rata/std tahun lalu yang dalam hal ini adalah 12 bulan)
Tes Dickey-fuller. Ini adalah salah satu uji statistik untuk memeriksa stasioneritas. Pertama kita mempertimbangkan hipotesis nol. deret waktu tidak stasioner. Hasil dari sisanya akan berisi uji statistik dan nilai kritis untuk tingkat kepercayaan yang berbeda. Idenya adalah memiliki Uji statistik kurang dari nilai kritis, dalam hal ini kita dapat menolak hipotesis nol dan mengatakan bahwa Time series ini memang stasioner (gaya kuat dengan yang satu ini. )
Lebih detail untuk Dickey fuller Test
Detail fungsi
- berarti
- Standar deviasi (bukan varians)
- Plot seri asli
- Maksud plot
- Plot std
- Tes plot Dickey-Fuller
def test_stationarity(timeseries):
#Determing rolling statistics
rolmean = pd.rolling_mean(timeseries, window=12)
rolstd = pd.rolling_std(timeseries, window=12)#Plot rolling statistics:
plt.plot(timeseries, color='blue',label='Original')
plt.plot(rolmean, color='red', label='Rolling Mean')
plt.plot(rolstd, color='black', label = 'Rolling Std')
plt.legend(loc='best')
plt.title('Rolling Mean & Standard Deviation')
plt.show()
#Perform Dickey-Fuller test:
print 'Results of Dickey-Fuller Test:'
dftest = adfuller(timeseries, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
print dfoutput_
Sekarang mari parsing data deret waktu kita ke dalam fungsi ini
Ini tidak stasioner karena
• rata-rata meningkat meskipun std kecil
• Status uji adalah > nilai kritis
• Catatan. nilai yang ditandatangani dibandingkan dan nilai absolut
MEMBUAT RANGKAIAN WAKTU STASIUNAda dua faktor utama yang membuat deret waktu tidak stasioner. Mereka
• Tren. rata-rata tidak konstan
• Musiman. Variasi pada kerangka waktu tertentu
Ide dasarnya adalah memodelkan tren dan musiman dalam rangkaian ini, sehingga kami dapat menghapusnya dan membuat rangkaian tersebut stasioner. Kemudian kita dapat melanjutkan dan menerapkan peramalan statistik ke deret stasioner. Dan akhirnya kita dapat mengonversi nilai yang diramalkan menjadi asli dengan menerapkan batasan tren dan musiman kembali ke yang sebelumnya kita pisahkan
Mari kita mulai dengan mengerjakan potongan tren
Kecenderungan
Langkah pertama adalah mengurangi tren menggunakan transformasi, seperti yang kita lihat di sini bahwa ada tren positif yang kuat. Transformasi ini dapat berupa log, sq-rt, cube root dll. Pada dasarnya itu menghukum nilai yang lebih besar lebih dari yang lebih kecil. Dalam hal ini kita akan menggunakan transformasi logaritmik
Ada beberapa kebisingan dalam mewujudkan tren ke depan di sini. Ada beberapa metode untuk memodelkan tren ini dan kemudian menghapusnya dari rangkaian. Beberapa yang umum adalah
• Menghaluskan. menggunakan rolling/moving average
• Agresi. dengan mengambil rata-rata untuk jangka waktu tertentu (tahun/bulan)
Saya akan menggunakan Smoothing di sini
Menghaluskan
Dalam smoothing, kami biasanya mengambil beberapa contoh terakhir (perkiraan bergulir) Kami akan membahas dua metode dalam smoothing- Moving average dan Exponentially weighted moving average
Rata-rata bergerak -
Pertama ambil nilai x berturut-turut dan ini tergantung frekuensinya jika 1 tahun kita ambil 12 nilai. Beruntung bagi kami bahwa Pandas memiliki fungsi untuk perkiraan bergulir ("baiklah, baiklah" -Matthew McConaughey. )
Sekarang kurangi rolling mean dari seri aslinya
Alasan ada nilai nol adalah karena kita mengambil rata-rata dari 12 pertama jadi 11 nilai adalah nol. Kita juga bisa melihatnya dalam representasi visual. Oleh karena itu dijatuhkan untuk analisis lebih lanjut. Sekarang mari kita uraikan ke fungsi untuk memeriksa stasioneritas
Kami memperhatikan dua hal
• Nilai bergulir sedikit berbeda tetapi tidak ada tren khusus
• Statistik uji lebih kecil dari nilai kritis 5%. Itu memberi tahu kami bahwa kami 95% yakin bahwa seri ini stasioner
Dalam contoh ini kita dapat dengan mudah mengambil periode waktu (12 bulan untuk satu tahun), tetapi ada situasi di mana rentang periode waktu lebih kompleks seperti harga saham dll. Jadi kami menggunakan rata-rata pergerakan tertimbang secara eksponensial (ada rata-rata pergerakan tertimbang lainnya tetapi sebagai permulaan, mari gunakan ini). Nilai sebelumnya diberikan dengan faktor peluruhan. Panda kembali datang untuk menyelamatkan dengan beberapa fungsi luar biasa, seperti
parameter (halflife) diasumsikan 12, tetapi itu sangat tergantung pada domainnya. Mari kita periksa stasioneritas sekarang
Itu stasioner karena
• Nilai bergulir memiliki variasi yang lebih sedikit dalam besaran rata-rata dan standar deviasi
• statistik uji lebih kecil dari 1% dari nilai kritis. Jadi bisa dibilang kami hampir 99% yakin bahwa ini stasioner
Musiman (bersama dengan Tren)
Sebelumnya kita hanya melihat tren bagian dari deret waktu, sekarang kita akan melihat tren dan musiman. Sebagian besar Time series memiliki tren seiring dengan musim. Ada dua metode umum untuk menghilangkan tren dan musiman, yaitu
• Membedakan. dengan mengambil perbedaan menggunakan jeda waktu
• Penguraian. modelkan tren dan musiman, lalu hapus
Membedakan
Di sini pertama-tama kita mengambil selisih nilai pada waktu tertentu dengan waktu sebelumnya. Sekarang mari kita lakukan di Pandas
Terlihat oke bagi saya, tetapi mari kita uraikan menggunakan fungsi pengujian stasioner kami
Itu stasioner karena
• variasi mean dan std memiliki variasi kecil dengan waktu
• uji statistik kurang dari 10% dari nilai kritis, sehingga kita dapat yakin 90% bahwa ini stasioner
Membusuk
Di sini kami memodelkan tren dan musiman, lalu bagian deret waktu yang tersisa dikembalikan. Tebak apa? . Mari kita periksa
Hapus tren dan musiman dari Time series dan sekarang kita dapat menggunakan nilai sisa. Mari kita periksa stasioneritas
Ini stasioner karena
• uji statistik lebih rendah dari 1% nilai kritis
• variasi mean dan std memiliki variasi kecil dengan waktu
Peramalan Time Series
Sekarang kita telah membuat deret Waktu stasioner, mari buat model pada deret waktu menggunakan pembedaan karena mudah untuk menambahkan kesalahan, tren, dan musiman kembali ke nilai yang diprediksi
Kami akan menggunakan metode pemodelan statistik yang disebut ARIMA untuk meramalkan data di mana ada ketergantungan pada nilainya
Auto Regressive Integrated Moving Average(ARIMA) — Ini seperti persamaan regresi liner di mana prediktor bergantung pada parameter (p,d,q) dari model ARIMA
Izinkan saya menjelaskan parameter dependen ini
• p. Ini adalah jumlah istilah AR (Auto-Regressive). Contoh — jika p adalah 3 maka prediktor untuk y(t) adalah y(t-1),y(t-2),y(t-3)
• q. Ini adalah jumlah istilah MA (Moving-Average). Contoh — jika p adalah 3 maka prediktor untuk y(t) adalah y(t-1),y(t-2),y(t-3)
• d. Ini adalah jumlah perbedaan atau jumlah perbedaan non-musiman
Sekarang mari kita periksa bagaimana kita bisa mengetahui nilai p dan q apa yang akan digunakan. Kami menggunakan dua teknik pembuatan plot yang populer;
• Fungsi Autokorelasi (ACF). Itu hanya mengukur korelasi antara dua berturut-turut (versi tertinggal). contoh pada lag 4, ACF akan membandingkan rangkaian pada contoh waktu t1…t2 dengan rangkaian pada contoh t1–4…t2–4
• Fungsi Autokorelasi Parsial (PACF). digunakan untuk mengukur tingkat hubungan antara y(t) dan y(t-p)
Dua garis putus-putus di kedua sisi 0 adalah interval kepercayaan. Ini dapat digunakan untuk menentukan nilai 'p' dan 'q' sebagai
• p. Pertama kali PACF melintasi interval kepercayaan atas, di sini mendekati 2. maka p = 2
• q. Pertama kali ACF melintasi interval kepercayaan atas, di sini mendekati 2. maka p = 2
Sekarang, dengan menggunakan ini, buat 3 model ARIMA berbeda dengan mempertimbangkan efek individual maupun gabungan. Saya juga akan mencetak RSS untuk masing-masing. Harap dicatat bahwa di sini RSS adalah untuk nilai residu dan bukan deret aktual
Model ARModel MA
MODEL ARIMA
nilai RSS
• AR=1. 5023
• MA=1. 472
• ARIMA =1. 0292
ARIMA memiliki nilai RSS terbaik
LANGKAH TERAKHIR. MEMBAWA INI KEMBALI KE SKALA ASLI
Langkah-langkah yang terlibat
• Pertama dapatkan nilai prediksi dan simpan sebagai rangkaian. Anda akan melihat bulan pertama hilang karena kami mengambil jeda 1 (shift)
• Sekarang ubah perbedaan menjadi skala log. temukan jumlah kumulatif dan tambahkan ke seri baru dengan nilai dasar (di sini nilai bulan pertama dari seri log)
• Selanjutnya -ambil eksponen deret dari atas (anti-log) yang akan menjadi nilai prediksi — model perkiraan deret waktu
- Sekarang plot nilai prediksi dengan yang asli
• Temukan RMSE
Hasilnya dapat lebih disempurnakan untuk mendapatkan model yang lebih baik. Cakupan blog adalah untuk memperkenalkan Time Series Forecasting dengan cepat. Semoga kalian menikmati blognya, ada lebih banyak detail sehubungan dengan analisis dan peramalan Time series. Ini adalah tempat yang baik untuk memahami teori di balik teknik praktis