Python: Zeitreihenanalyse: Erstellen eines SARIMA-Modells

Konstruktion des SARIMA-Modells (1)

Überprüfung des ARIMA-Modells

Das ARIMA-Modell ist ein Modell, das von vorherigen Werten beeinflusst wird Mit dem AR-Modell AR (p), das mit den letzten p-Werten korreliert Ein MA-Modell MA (q), das von den vorherigen q-Werten in einem vom vorherigen Fehler betroffenen Modell beeinflusst wird, wurde synthetisiert. ARMA (p, q) wurde an die Differenzreihe vor dem d-Punkt angepasst.

Und Was ist das SARIMA-Modell? Das ARIMA-Modell wird auch für Zeitreihendaten mit einem saisonalen Zyklus verwendet Es ist ein Modell, das erweitert werden kann.

Das SARIMA-Modell verfügt zusätzlich zu (p, d, q) -Parametern Es hat auch die Parameter (sp, sd, sq, s).

Was sind sp, sd, sq?

sp :Saisonale Autokorrelation
sd :Ableitung der Saisonalität
sq :Saisonaler gleitender Durchschnitt
Es heißt.
Übrigens ARIMA(p,d,q)Vom Modell

・ P.:Es wird der Grad der Autokorrelation genannt und ob das Modell unter Verwendung der letzten p-Werte vorhergesagt wird.

・ D.:Es wird Induktion genannt und die Tatsache, dass die Differenz d-ter Ordnung notwendig war, um die Zeitreihendaten stabil zu machen.

・ Q.:Dies wird als gleitender Durchschnitt bezeichnet und die Tatsache, dass das Modell von den letzten q-Werten beeinflusst wird

Es stellte dar.

Die Grundbedeutungen von sp, sd und sq ändern sich nicht. jedoch Für sp, sd, sq werden die aktuellen Daten von historischen Daten beeinflusst, die eine oder mehrere saisonale Perioden durchlaufen haben.

Beispielsweise repräsentiert bei Daten mit saisonalen Schwankungen des 12-Monats-Zyklus der Parameter von s den Zyklus. Es wird s = 12.

Wenn sq = 1, Daten für genau 12 Monate (vor 1 Zyklus) Wenn sq = 2 ist, bedeutet dies, dass das Modell von den Daten vor 12 Monaten und den Daten vor 24 Monaten betroffen ist.

Wenn es schwer zu verstehen ist, ersetzen Sie einfach q durch sq.

Parameter bestimmen

SARIMA-Modellparameter (p, d, q) (sp, sd, sq, s) für Python Es gibt keine Funktion, die es automatisch am besten geeignet macht.

Daher ist die Informationsmenge Standard(BIC in diesem Fall(Bayesianischer Informationsmengenstandard) )Durch
Sie müssen ein Programm schreiben, um herauszufinden, welcher Wert am besten geeignet ist.

Ich werde diesmal nicht auf den Standard der Informationsmenge eingehen. Beachten Sie bei BIC, dass der Parameterwert umso geeigneter ist, je niedriger dieser Wert ist.

#Daten in chronologischer Reihenfolge:DATA,Parameter s(Zeitraum):Geben Sie s ein, um die besten Parameter und deren BIC auszugeben.

def selectparameter(DATA,s):
    p = d = q = range(0, 1)
    pdq = list(itertools.product(p, d, q))
    seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
    parameters = []
    BICs = np.array([])
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(DATA,
                                            order=param,
                seasonal_order=param_seasonal)
                results = mod.fit()
                parameters.append([param, param_seasonal, results.bic])
                BICs = np.append(y,results.bic)
            except:
                continue
    return print(parameters[np.argmin(BICs)])

Um auf den Inhalt der Funktion einzugehen, ist jeder Parameter Für 0,1 (diesmal wird die Obergrenze des Parameters der Einfachheit halber auf 1 gesetzt) Der BIC des SARIMA-Modells wird berechnet und der Fall angezeigt, in dem der BIC am kleinsten ist.

In Bezug auf die Parameter s, Zeitreihendaten und Lassen Sie es uns untersuchen, indem wir die unten beschriebene partielle Autokorrelation visualisieren.

import warnings
import itertools
import pandas as pd
import numpy as np
import statsmodels.api as sm

#Laden und Organisieren von Daten
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
index = pd.date_range("1980-01-31","1995-07-31",freq="M")
sales_sparkling.index=index
del sales_sparkling["Month"]

#Es sind die Daten für ein Jahr
sales_sparkling = sales_sparkling[:12]

#Funktionsdefinition
def selectparameter(DATA,s):
    p = d = q = range(0, 2)
    pdq = list(itertools.product(p, d, q))
    seasonal_pdq = [(x[0], x[1], x[2], s) for x in list(itertools.product(p, d, q))]
    parameters = []
    BICs = np.array([])
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(DATA,
                                            order=param,
                                            seasonal_order=param_seasonal)
                results = mod.fit()
                parameters.append([param, param_seasonal, results.bic])
                BICs = np.append(BICs,results.bic)
            except:
                continue
    return parameters[np.argmin(BICs)]

#Setzen Sie den Zyklus in das zweite Argument
selectparameter(sales_sparkling,12)

Autokorrelationskoeffizient / partieller Autokorrelationskoeffizient und dessen Visualisierung

Autokorrelation war die Korrelation mit früheren Daten. Eine andere Möglichkeit, Zeitreihendaten zu analysieren

Der Wert der partiellen Autokorrelation ist wichtig.

Apropos Autokorrelation k-ter Ordnung, sie repräsentiert die Korrelation zwischen yt und yt-k. Die partielle Autokorrelation k-ter Ordnung sind die Daten zwischen yt und yt - k, d. H. Die Korrelation wird erhalten, indem der Einfluss von yt - k + 1 von yt - 1 entfernt wird.

Ich werde im Detail erklären. Angenommen, Sie finden den Autokorrelationskoeffizienten für eine Differenz von 7 Tagen. Wenn jedoch die Daten eines Tages mit den Daten des vorherigen Tages korrelieren, vor 7 Tagen → vor 6 Tagen → vor 5 Tagen ... Es kann durch die Daten von vor 1 Tag bis heute korreliert werden.

Die Korrelation, die durch Entfernen des Einflusses während dieses Zeitraums erhalten wird, wird als partielle Autokorrelation bezeichnet.

Lassen Sie uns den Autokorrelationskoeffizienten und den partiellen Autokorrelationskoeffizienten mit Python visualisieren. Wenn die monatlichen Daten saisonabhängig sind, beträgt der Zyklus im Allgemeinen 12.

#Der Graph des Autokorrelationskoeffizienten ist
sm.graphics.tsa.plot_acf(DATA)

#Der Graph der partiellen Autokorrelation ist
sm.graphics.tsa.plot_pacf(DATA)

#Sie können mit ausgeben.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime


#Laden und Organisieren von Daten
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
index = pd.date_range("1980-01-31", "1995-07-31", freq="M")
sales_sparkling.index=index
del sales_sparkling["Month"]
#Visualisierung der Autokorrelation / partiellen Autokorrelation
fig=plt.figure(figsize=(12, 8))
#Gibt ein Diagramm des Autokorrelationskoeffizienten aus
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(sales_sparkling, lags=30, ax=ax1)
#Gibt ein Diagramm des partiellen Autokorrelationskoeffizienten aus
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(sales_sparkling, lags=30, ax=ax2)
plt.show()

image.png

Konstruktion des SARIMA-Modells (2)

Ein Modell bauen

Hier fasse ich das Verfahren zur Analyse von Zeitreihendaten mit dem SARIMA-Modell zusammen.

  1. Daten lesen

  2. Daten organisieren

  3. Datenvisualisierung

  4. Den Datenzyklus verstehen (Parameter bestimmen)

  5. Andere Parameter als s bestimmen

  6. Erstellen Sie ein Modell

  7. Vorhersage mit Daten und deren Visualisierung

Es wird im Fluss gemacht.

Schließlich lernen wir in diesem Abschnitt von der Modellkonstruktion bis zur Vorhersage. Sobald Sie das Optimum (p, d, q) (sp, sd, sq, s) kennen, ist es Zeit, das Modell zu erstellen. Dieses Mal verwenden wir Daten für 15 Jahre (180 Monate).

#Ein Modell bauen
sm.tsa.statespace.SARIMAX(DATA,order=(p, d, q),seasonal_order=(sp, sd, sq, s)).fit()
#Wird genutzt.

Lassen Sie uns ein SARIMA-Modell der Verkaufsdaten von Sekt erstellen.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime


#Laden und Organisieren von Daten
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
index = pd.date_range("1980-01-31", "1995-07-31", freq="M")
sales_sparkling.index=index
del sales_sparkling["Month"]

#Modell fit
SARIMA_sparkring_sales = sm.tsa.statespace.SARIMAX(sales_sparkling,order=(0, 0, 0),seasonal_order=(0, 1, 1, 12)).fit()


#Geben Sie den BIC des konstruierten SARIMA-Modells aus
print(SARIMA_sparkring_sales.bic)

Ausführung von Prognosen und Visualisierung von Prognosedaten

Das Abrufen von Vorhersagedaten für das Modell ist einfach

Modellname.predict("Zu Beginn der Vorhersage","Am Ende der Prognose")Wird genutzt.

"Zu Beginn der Vorhersage" muss jedoch die Zeit in den ursprünglichen Zeitreihendaten sein. Beispielsweise müssen die Verkaufsdaten für den diesmal verwendeten Sekt vor dem 31.07.1995 liegen.

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime


#Laden und Organisieren von Daten
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
print(sales_sparkling.head())
print(sales_sparkling.tail())
index = pd.date_range("1980-01-31", "1995-07-31", freq="M")
sales_sparkling.index=index
del sales_sparkling["Month"]

#Modell fit
SARIMA_sparkring_sales = sm.tsa.statespace.SARIMAX(sales_sparkling,order=(0, 0, 0),seasonal_order=(0, 1, 1, 12)).fit()

#Pred durch Vorhersagedaten ersetzen
pred = SARIMA_sparkring_sales.predict("1994-07-31","1997-12-31")

#Visualisierung von Pred-Daten
plt.plot(pred)
plt.show()

Vergleich von tatsächlichen und vorhergesagten Daten

Als nächstes werden nur Prognosedaten ausgegeben Vergleichen wir die ursprünglichen Zeitreihendaten und Prognosedaten, indem wir sie gleichzeitig ausgeben.

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
import numpy as np


#Laden und Organisieren von Daten
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
index = pd.date_range("1980-01-31", "1995-07-31", freq="M")
sales_sparkling.index=index
del sales_sparkling["Month"]

#Modell fit
SARIMA_sparkring_sales = sm.tsa.statespace.SARIMAX(sales_sparkling,order=(0, 0, 0),seasonal_order=(0, 1, 1, 12)).fit()

#Pred durch Vorhersagedaten ersetzen
pred = SARIMA_sparkring_sales.predict("1994-7-31", "1997-12-31")

#Visualisierung von Prädaten und ursprünglichen Zeitreihendaten
plt.plot(sales_sparkling)
plt.plot(pred, color="r")
plt.show()

image.png

Recommended Posts

Python: Zeitreihenanalyse: Erstellen eines SARIMA-Modells
Python: Zeitreihenanalyse
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Python: Zeitreihenanalyse: Konstanz, ARMA / ARIMA-Modell
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Zeitreihenanalyse 2 Stabilität, ARMA / ARIMA-Modell
Ich habe versucht, Zeitreihen zu analysieren! (AR-Modell)
Zeitreihenanalyse durch allgemeines Gaußsches Zustandsraummodell unter Verwendung von Python [Implementierungsbeispiel unter Berücksichtigung von Extrinsik und Saisonalität]
Python-Zeitreihenfrage
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
Einführung in die Zeitreihenanalyse ~ Saisonales Anpassungsmodell ~ In R und Python implementiert
Python 3.4 Windows7-64bit-Umgebung erstellen (für die Analyse finanzieller Zeitreihen)
Erstellen einer virtuellen Python-Umgebung
Zeitreihenanalyse Teil 4 VAR
Zeitreihenanalyse Teil 3 Prognose
[Python] Zeichnen Sie Zeitreihendaten
Zeitreihenanalyse Teil 1 Autokorrelation
Erstellen einer virtuellen Python-Umgebung
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Eine Lernmethode für Anfänger zum Erlernen der Zeitreihenanalyse
Erstellen einer Python-Umgebung auf einem Mac
Erstellen einer Python-Umgebung unter Ubuntu
Umsatzprognose für die Zeitreihenanalyse
Erstellen einer virtuellen Umgebung mit Python 3
Zeitreihenplot gestartet ~ Python Edition ~
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
[Statistik] [Zeitreihenanalyse] Zeichnen Sie das ARMA-Modell und erfassen Sie die Tendenz.
[Pyenv] Erstellen einer Python-Umgebung mit Ubuntu 16.04
Leistungsfähigkeit von Vorhersagemethoden in der Zeitreihendatenanalyse Halboptimierung (SARIMA) [Memo]
Erstellen einer Python 3.6-Umgebung mit Windows + PowerShell
Zeitreihenanalyse Teil 2 AR / MA / ARMA
[Mac] Erstellen einer virtuellen Umgebung für Python
[Python] Beschleunigt das Laden von Zeitreihen-CSV
Erstellen einer Python-Entwicklungsumgebung für die KI-Entwicklung
Zeitreihenanalyse Nr. 6 Gefälschte Rückkehr und republikanischer Teil
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Zeitvariationsanalyse von Schwarzen Löchern mit Python
Erstellen einer Python-Umgebung mit virtualenv und direnv
[Python3] Eine Geschichte, die bei der Zeitzonenkonvertierung steckt
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
Überlebensanalyse mit Python 2-Kaplan-Meier-Schätzung
Datenanalyse in Python: Ein Hinweis zu line_profiler
[Python] Webentwicklungsvorbereitung (Erstellen einer virtuellen Umgebung)
Denken Sie daran, eine Python 3-Umgebung in einer Mac-Umgebung zu erstellen
Erstellen Sie in Python ein einfaches Momentum-Investmentmodell
Erstellen einer Python-Umgebung auf dem Sakura VPS-Server
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Erster Python
Ich habe versucht, "Grundlagen der Zeitreihenanalyse und des Zustandsraummodells" (Hayamoto) mit Pystan zu implementieren
[Einführung in die Elementzerlegung] Lassen Sie uns Zeitreihenanalysemethoden in R und Python arrange anordnen
Datenanalyse Python
Zeitreihenzerlegung
Python-Zeitmessung
Erster Python
Vorhersage aus verschiedenen Daten in Python mit dem Zeitreihen-Vorhersage-Tool Facebook Prophet
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell