AI dengan Python - Menganalisis Data Rangkaian Waktu

Memprediksi yang berikutnya dalam urutan masukan tertentu adalah konsep penting lainnya dalam pembelajaran mesin. Bab ini memberi Anda penjelasan rinci tentang menganalisis data deret waktu.

pengantar

Data deret waktu berarti data yang berada dalam rangkaian interval waktu tertentu. Jika kita ingin membuat prediksi urutan dalam pembelajaran mesin, maka kita harus berurusan dengan data dan waktu berurutan. Data seri merupakan abstrak dari data sekuensial. Pengurutan data adalah fitur penting dari data sekuensial.

Konsep Dasar Analisis Urutan atau Analisis Rangkaian Waktu

Analisis urutan atau analisis deret waktu adalah untuk memprediksi berikutnya dalam urutan masukan yang diberikan berdasarkan pengamatan sebelumnya. Prediksi dapat berupa apa saja yang mungkin datang berikutnya: simbol, angka, cuaca hari berikutnya, istilah berikutnya dalam pidato, dll. Analisis urutan bisa sangat berguna dalam aplikasi seperti analisis pasar saham, prakiraan cuaca, dan rekomendasi produk.

Example

Pertimbangkan contoh berikut untuk memahami prediksi urutan. SiniA,B,C,D adalah nilai yang diberikan dan Anda harus memprediksi nilainya E menggunakan Model Prediksi Urutan.

Menginstal Paket Berguna

Untuk analisis data deret waktu menggunakan Python, kita perlu menginstal paket berikut -

Panda

Pandas adalah pustaka berlisensi BSD open source yang menyediakan kinerja tinggi, kemudahan penggunaan struktur data dan alat analisis data untuk Python. Anda dapat menginstal Pandas dengan bantuan perintah berikut -

pip install pandas

Jika Anda menggunakan Anaconda dan ingin menginstal dengan menggunakan file conda manajer paket, maka Anda dapat menggunakan perintah berikut -

conda install -c anaconda pandas

hmmpelajari

Ini adalah pustaka berlisensi BSD open source yang terdiri dari algoritme dan model sederhana untuk mempelajari Hidden Markov Model (HMM) dengan Python. Anda dapat menginstalnya dengan bantuan perintah berikut -

pip install hmmlearn

Jika Anda menggunakan Anaconda dan ingin menginstal dengan menggunakan file conda manajer paket, maka Anda dapat menggunakan perintah berikut -

conda install -c omnia hmmlearn

PyStruct

Ini adalah pembelajaran terstruktur dan perpustakaan prediksi. Algoritme pembelajaran yang diterapkan di PyStruct memiliki nama seperti bidang acak bersyarat (CRF), Jaringan Acak Markov Margin Maksimum (M3N), atau mesin vektor dukungan struktural. Anda dapat menginstalnya dengan bantuan perintah berikut -

pip install pystruct

CVXOPT

Ini digunakan untuk pengoptimalan konveks berdasarkan bahasa pemrograman Python. Ini juga merupakan paket perangkat lunak gratis. Anda dapat menginstalnya dengan bantuan perintah berikut -

pip install cvxopt

Jika Anda menggunakan Anaconda dan ingin menginstal dengan menggunakan file conda manajer paket, maka Anda dapat menggunakan perintah berikut -

conda install -c anaconda cvdoxt

Panda: Menangani, Mengiris, dan Mengekstrak Statistik dari Data Rangkaian Waktu

Panda adalah alat yang sangat berguna jika Anda harus bekerja dengan data deret waktu. Dengan bantuan Pandas, Anda dapat melakukan hal berikut -

  • Buat rentang tanggal dengan menggunakan pd.date_range paket

  • Buat indeks panda dengan kurma menggunakan pd.Series paket

  • Lakukan pengambilan sampel ulang dengan menggunakan ts.resample paket

  • Ubah frekuensinya

Contoh

Contoh berikut ini memperlihatkan Anda menangani dan memotong data deret waktu dengan menggunakan Pandas. Perhatikan bahwa di sini kita menggunakan data Monthly Arctic Oscillation, yang dapat diunduh dari bulanan.ao.index.b50.current.ascii dan dapat dikonversi ke format teks untuk kita gunakan.

Menangani data deret waktu

Untuk menangani data deret waktu, Anda harus melakukan langkah-langkah berikut -

Langkah pertama melibatkan mengimpor paket-paket berikut -

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Selanjutnya, tentukan fungsi yang akan membaca data dari file input, seperti yang ditunjukkan pada kode yang diberikan di bawah ini -

def read_data(input_file):
   input_data = np.loadtxt(input_file, delimiter = None)

Sekarang, ubah data ini menjadi deret waktu. Untuk ini, buat rentang tanggal deret waktu kami. Dalam contoh ini, kami menyimpan satu bulan sebagai frekuensi data. File kami memiliki data yang dimulai dari Januari 1950.

dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')

Pada langkah ini, kami membuat data deret waktu dengan bantuan Seri Pandas, seperti yang ditunjukkan di bawah ini -

output = pd.Series(input_data[:, index], index = dates)	
return output
	
if __name__=='__main__':

Masukkan jalur file input seperti yang ditunjukkan di sini -

input_file = "/Users/admin/AO.txt"

Sekarang, ubah kolom menjadi format deret waktu, seperti yang diperlihatkan di sini -

timeseries = read_data(input_file)

Terakhir, plot dan visualisasikan data menggunakan perintah yang ditunjukkan -

plt.figure()
timeseries.plot()
plt.show()

Anda akan mengamati plot seperti yang ditunjukkan pada gambar berikut -

Mengiris data deret waktu

Pemotongan melibatkan pengambilan hanya sebagian dari data deret waktu. Sebagai bagian dari contoh, kami memotong data hanya dari 1980 hingga 1990. Amati kode berikut yang melakukan tugas ini -

timeseries['1980':'1990'].plot()
   <matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>

plt.show()

Saat Anda menjalankan kode untuk memotong data deret waktu, Anda dapat mengamati grafik berikut seperti yang ditunjukkan pada gambar di sini -

Mengekstrak Statistik dari Data Rangkaian Waktu

Anda harus mengekstrak beberapa statistik dari data tertentu, jika Anda perlu menarik beberapa kesimpulan penting. Mean, varians, korelasi, nilai maksimum, dan nilai minimum adalah beberapa dari statistik tersebut. Anda dapat menggunakan kode berikut jika Anda ingin mengekstrak statistik tersebut dari data deret waktu tertentu -

Berarti

Anda dapat menggunakan mean() fungsi, untuk menemukan mean, seperti yang ditunjukkan di sini -

timeseries.mean()

Maka output yang akan Anda amati untuk contoh yang dibahas adalah -

-0.11143128165238671

Maksimum

Anda dapat menggunakan max() fungsi, untuk menemukan maksimum, seperti yang ditunjukkan di sini -

timeseries.max()

Maka output yang akan Anda amati untuk contoh yang dibahas adalah -

3.4952999999999999

Minimum

Anda dapat menggunakan fungsi min (), untuk menemukan minimum, seperti yang ditunjukkan di sini -

timeseries.min()

Maka output yang akan Anda amati untuk contoh yang dibahas adalah -

-4.2656999999999998

Mendapatkan semuanya sekaligus

Jika Anda ingin menghitung semua statistik dalam satu waktu, Anda dapat menggunakan describe() berfungsi seperti yang ditunjukkan di sini -

timeseries.describe()

Maka output yang akan Anda amati untuk contoh yang dibahas adalah -

count   817.000000
mean     -0.111431
std       1.003151
min      -4.265700
25%      -0.649430
50%      -0.042744
75%       0.475720
max       3.495300
dtype: float64

Pengambilan sampel ulang

Anda dapat mengambil sampel ulang data ke frekuensi waktu yang berbeda. Dua parameter untuk melakukan pengambilan sampel ulang adalah -

  • Jangka waktu
  • Method

Pengambilan sampel ulang dengan mean ()

Anda dapat menggunakan kode berikut untuk mengambil sampel kembali data dengan metode mean (), yang merupakan metode default -

timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()

Kemudian, Anda dapat mengamati grafik berikut sebagai output dari resampling menggunakan mean () -

Pengambilan sampel ulang dengan median ()

Anda dapat menggunakan kode berikut untuk mengambil sampel kembali data menggunakan median()metode -

timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()

Kemudian, Anda dapat mengamati grafik berikut sebagai keluaran dari re-sampling dengan median () -

Rolling Mean

Anda dapat menggunakan kode berikut untuk menghitung rata-rata rolling (bergerak) -

timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()

Kemudian, Anda dapat mengamati grafik berikut sebagai output dari rata-rata rolling (bergerak) -

Menganalisis Data Sekuensial dengan Hidden Markov Model (HMM)

HMM merupakan model statistik yang banyak digunakan untuk data yang memiliki kelanjutan dan ekstensibilitas seperti analisis pasar saham time series, health checkup, dan speech recognition. Bagian ini membahas secara rinci dengan menganalisis data sekuensial menggunakan Hidden Markov Model (HMM).

Model Markov Tersembunyi (HMM)

HMM adalah model stokastik yang dibangun di atas konsep rantai Markov berdasarkan asumsi bahwa probabilitas statistik masa depan hanya bergantung pada status proses saat ini, bukan status sebelumnya. Misalnya, saat melempar koin, kita tidak bisa mengatakan bahwa hasil lemparan kelima adalah kepala. Ini karena koin tidak memiliki memori apa pun dan hasil selanjutnya tidak bergantung pada hasil sebelumnya.

Secara matematis, HMM terdiri dari variabel-variabel berikut -

Serikat (S)

Ini adalah sekumpulan status tersembunyi atau laten yang ada di HMM. Ini dilambangkan dengan S.

Simbol keluaran (O)

Ini adalah satu set simbol keluaran yang mungkin ada di HMM. Ini dilambangkan dengan O.

Matriks Probabilitas Transisi Status (A)

Ini adalah probabilitas untuk melakukan transisi dari satu kondisi ke kondisi lainnya. Ini dilambangkan dengan A.

Matriks Probabilitas Emisi Pengamatan (B)

Ini adalah kemungkinan memancarkan / mengamati simbol pada keadaan tertentu. Ini dilambangkan dengan B.

Matriks Probabilitas Sebelumnya (Π)

Ini adalah probabilitas untuk memulai pada keadaan tertentu dari berbagai keadaan sistem. Ini dilambangkan dengan Π.

Karenanya, HMM dapat didefinisikan sebagai = (S,O,A,B,),

dimana,

  • S = {s1,s2,…,sN} adalah satu set N kemungkinan status,
  • O = {o1,o2,…,oM} adalah satu set M simbol observasi yang mungkin,
  • A adalah NN keadaan Transition Probability Matrix (TPM),
  • B adalah NM observasi atau Emission Probability Matrix (EPM),
  • π adalah vektor distribusi probabilitas keadaan awal dimensi N.

Contoh: Analisis data Pasar Saham

Dalam contoh ini, kita akan menganalisis data pasar saham, selangkah demi selangkah, untuk mendapatkan gambaran tentang bagaimana HMM bekerja dengan data sekuensial atau deret waktu. Harap dicatat bahwa kami menerapkan contoh ini dengan Python.

Impor paket yang diperlukan seperti yang ditunjukkan di bawah ini -

import datetime
import warnings

Sekarang, gunakan data pasar saham dari matpotlib.finance paket, seperti yang ditunjukkan di sini -

import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
   from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
   from matplotlib.finance import (
      quotes_historical_yahoo as quotes_historical_yahoo_och1)

from hmmlearn.hmm import GaussianHMM

Muat data dari tanggal mulai dan tanggal akhir, yaitu antara dua tanggal tertentu seperti yang ditunjukkan di sini -

start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)

Pada langkah ini, kita akan mengekstrak kutipan penutup setiap hari. Untuk ini, gunakan perintah berikut -

closing_quotes = np.array([quote[2] for quote in quotes])

Sekarang, kami akan mengekstrak volume saham yang diperdagangkan setiap hari. Untuk ini, gunakan perintah berikut -

volumes = np.array([quote[5] for quote in quotes])[1:]

Di sini, ambil selisih persentase dari harga penutupan saham, menggunakan kode yang ditunjukkan di bawah ini -

diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])

Pada langkah ini, buat dan latih Gaussian HMM. Untuk ini, gunakan kode berikut -

hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
   warnings.simplefilter('ignore')
   hmm.fit(training_data)

Sekarang, buat data menggunakan model HMM, menggunakan perintah yang ditunjukkan -

num_samples = 300
samples, _ = hmm.sample(num_samples)

Terakhir, pada langkah ini, kami memplot dan memvisualisasikan perbedaan persentase dan volume saham yang diperdagangkan sebagai output dalam bentuk grafik.

Gunakan kode berikut untuk memplot dan memvisualisasikan persentase perbedaan -

plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')

Gunakan kode berikut untuk merencanakan dan memvisualisasikan volume saham yang diperdagangkan -

plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()