Python deteksi tren deret waktu

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

Data

Sumber 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

Sasaran

Menggunakan 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 Data

Langkah 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 Wiski

Beberapa 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 ARIMA

Kami 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 ARIMA

Jalankan diagnostik model untuk menyelidiki perilaku yang tidak biasa

Itu tidak sempurna, namun, diagnostik model kami menunjukkan bahwa residu model hampir terdistribusi normal

Memvalidasi perkiraan

Untuk 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 prakiraan

Model 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 pd
import 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 datetime
con=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
from statsmodels.tsa.stattools import adfuller
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 STASIUN

Ada 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 AR

Model 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

Bagaimana Anda mengidentifikasi tren dalam data deret waktu?

Cara termudah untuk mengenali Tren adalah dengan melihat bulan-bulan yang memiliki posisi yang sama di setiap rangkaian pola tiga periode . Misalnya, bulan 1 adalah bulan pertama dalam pola, seperti bulan 4. Penjualan di bulan 4 lebih tinggi daripada di bulan 1.

Bagaimana cara mengidentifikasi tren dan musiman dalam data deret waktu Python?

seasonal_decompose() menguji apakah deret waktu memiliki musiman atau tidak dengan menghapus tren dan mengidentifikasi musiman dengan menghitung autokorelasi(acf) . Outputnya meliputi jumlah periode, jenis model (penjumlahan/perkalian) dan acf periode.

Bagaimana Anda menentukan apakah ada tren dalam data Python?

Polinomial derajat pertama memiliki dua parameter, yang dapat kita sebut kemiringan dan offset. Jika kemiringannya berbeda dari nol, maka ada kecenderungan pada data

Paket Python mana yang terbaik untuk peramalan deret waktu?

Perkiraan deret waktu dengan Sklearn . Ini menyediakan berbagai metode klasifikasi, regresi, dan pengelompokan termasuk hutan acak, mesin vektor pendukung, k-means, dan lainnya. Sklearn or Scikit-Learn is for sure one of the most commonly used machine learning packages in Python. It provides various classification, regression, and clustering methods including random forest, support vector machine, k-means, and others.