[PYTHON] Herausforderung für die zukünftige Umsatzprognose: ② Zeitreihenanalyse mit PyFlux

Einführung

Letztes Mal Herausforderung für zukünftige Umsatzprognosen: ① Was ist Zeitreihenanalyse? führte die Zeitreihenanalyse ein, um zukünftige Umsatzprognosen zu realisieren. Anstelle einer Einführung hatte ich das Gefühl, dass ich versucht habe, sie mit meiner eigenen Interpretation zusammenzufassen (ich verstehe Mathematik überhaupt nicht), und für diejenigen, die ein solides Verständnis für mathematische Formeln haben, könnte es einen Punkt gegeben haben, an dem "Ich missverstehe". Hmm. Wenn Sie Fragen haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.

Übrigens möchte ich diesmal tatsächlich ein Modell für die Zeitreihenanalyse erstellen.

Das Modell ist eine Verifizierungsbibliothek des ARIMA-Modells und des ARIMAX-Modells unter Verwendung von PyFlux, die in Vorhersagebibliothek für Zeitreihendaten - PyFlux-- eingeführt wurde. Gehen. (Eigentlich wollte ich SARIMA unter Berücksichtigung der Saisonalität machen, aber ich wusste nicht, wie ich es mit PyFlux machen sollte, also gab ich diesmal auf)

Analyseumgebung

Google Colaboratory

Zieldaten

Die Daten sind sehr einfach und verwenden den täglichen Umsatz und die Temperatur (Durchschnitt / Höchste / Niedrigste) als erklärende Variablen.

Datum Verkaufszahlen Durchschnittstemperatur Höchste Temperatur Niedrigste Temperatur
2018-01-01 7,400,000 4.9 7.3 2.2
2018-01-02 6,800,000 4.0 8.0 0.0
2018-01-03 5,000,000 3.6 4.5 2.7
2018-01-04 7,800,000 5.6 10.0 2.6

1. Originaldatenerstellung

Laden Sie wie gewohnt die Zieldaten in BigQuery in die Python-Umgebung von Colaboratory herunter. Wie im Beispiel können Elementnamen nicht auf Japanisch angegeben werden, werden jedoch hier der Übersichtlichkeit halber verwendet.

import pandas as pd

query = """
SELECT * 
FROM `myproject.mydataset.mytable`
WHERE CAST(Datum als Zeitstempel) between CAST("2018-01-01" AS TIMESTAMP) AND CAST("2018-12-31" AS TIMESTAMP) ORDER BY p_date'
"""

df = pd.io.gbq.read_gbq(query, project_id="myproject", dialect="standard")

#Fehlende Werte auf Null
df.fillna(0, inplace=True)

#Stellen Sie das Datum auf Datetime ein und setzen Sie es auf df Index
df = df[1:].set_index('Datum')
df.index=pd.to_datetime(df.index, utc=True).tz_convert('Asia/Tokyo')
df.index = df.index.tz_localize(None)
df= df.sort_index()

Das Datum muss in den Datetime-Typ konvertiert und für die spätere Verarbeitung indiziert werden.

Aus irgendeinem Grund habe ich Pandas 'read_gbq verwendet, das am langsamsten war, als ich es mit Ich habe versucht, die BigQuery-Speicher-API zu verwenden überprüft habe. Ich werde. Wenn die Originaldaten nicht so schwer sind, ist es einfach, einfach zu schreiben. .. .. (Ausrede)

Werfen wir zunächst einen Blick auf die Verkaufsdaten.

%matplotlib inline
import matplotlib.pyplot as plt

plt.figure()
df["Verkaufszahlen"].plot(figsize=(12, 8))

ダウンロード.png

Da es täglich ist, geht es erheblich auf und ab. Anfang März und Ende des Jahres steigen stark an.

2. Erstellen Sie das ARIMA-Modell

Von hier aus führen wir eine Zeitreihenanalyse mit PyFlux durch. PyFlux ist jedoch nicht standardmäßig in Colaboratory installiert. Installieren wir es also zuerst.

pip install pyflux

Die Modellprogrammierung selbst ist super einfach. Die folgenden fünf Argumente werden an ARIMA übergeben.

--ar: Reihenfolge der Selbstrückgabe --ma: Reihenfolge des gleitenden Durchschnitts --integ: Differenzboden --target: Zielvariable --Familie: Wahrscheinlichkeitsverteilung

Dann sagt MLE (Most Probable Estimation) das Modell voraus.

import pyflux as pf

model = pf.ARIMA(data=df, ar=5, ma=5, integ=1, target='Verkaufszahlen', family=pf.Normal())
x = model.fit('MLE')

Ich habe jedoch keine Ahnung, wie die Werte von ar, ma und integ lauten sollen, daher muss ich sie zuerst verschieben.

x.summary()

Hier ist die Zusammenfassung, die herauskommt. Wenn für die Bewertung des Modells selbst AIC (Akaike Information Amount Standard) oder BIC (Bayes Information Amount Criteria) verwendet wird, scheint ein Modell mit einem niedrigen Wert gut zu sein. Die Auswertung der Variablen ist der P-Wert (P.>|z|) Soll ich es benutzen? Konstante (fester Wert) und AR(3)・ Ma(5)Scheint nicht signifikant zu sein, da der P-Wert hoch ist.

Wenn einer von AR / MA nicht signifikant ist, bedeutet dies, dass jede Bestellung um eins reduziert werden sollte? Wenn jedoch gesagt wird, dass der feste Wert nicht signifikant ist, ist es dann schwierig, diese Daten überhaupt für das ARIMA-Modell zu verwenden?

Normal ARIMA(5,1,5)                                                                                       
======================================================= ==================================================
Dependent Variable: Differenced kingaku                 Method: MLE                                       
Start Date: 2018-01-09 03:00:00                         Log Likelihood: -5401.3927                        
End Date: 2019-01-01 03:00:00                           AIC: 10826.7854                                   
Number of observations: 357                             BIC: 10873.3182                                   
==========================================================================================================
Latent Variable                          Estimate   Std Error  z        P>|z|    95% C.I.                 
======================================== ========== ========== ======== ======== =========================
Constant                                 18212.1745 51000.329  0.3571   0.721    (-81748.4703 | 118172.819
AR(1)                                    0.2046     0.0583     3.507    0.0005   (0.0902 | 0.3189)        
AR(2)                                    -0.9284    0.0476     -19.4981 0.0      (-1.0217 | -0.8351)      
AR(3)                                    -0.0762    0.0807     -0.9438  0.3453   (-0.2343 | 0.082)        
AR(4)                                    -0.4864    0.0465     -10.4663 0.0      (-0.5774 | -0.3953)      
AR(5)                                    -0.5857    0.0555     -10.5508 0.0      (-0.6945 | -0.4769)      
MA(1)                                    -0.8716    0.0787     -11.0703 0.0      (-1.0259 | -0.7173)      
MA(2)                                    0.9898     0.0905     10.9326  0.0      (0.8123 | 1.1672)        
MA(3)                                    -0.5321    0.1217     -4.3708  0.0      (-0.7707 | -0.2935)      
MA(4)                                    0.4706     0.0945     4.9784   0.0      (0.2853 | 0.6558)        
MA(5)                                    0.007      0.0725     0.0973   0.9225   (-0.135 | 0.1491)        
Normal Scale                             900768.835                                                       
==========================================================================================================

Statistisch gesehen sah es nicht sehr gut aus, aber was ist mit der Grafik?

model.plot_fit(figsize=(15, 10))

ダウンロード (1).png

Blau ist die reelle Zahl und Schwarz ist der Modellwert. Der Zeitpunkt des Anstiegs und Abfalls ist ähnlich, aber es gibt viele Zeitpunkte, zu denen die Größe der Schwankungsbreite der reellen Zahl nicht vorhergesagt werden kann.

3. Konstruktion des ARIMAX-Modells

Als Nächstes erstellen wir ein ARIMAX-Modell, das ARIMA + -Variablen verwenden kann. Das Programm ist auch hier super einfach. Es scheint "objektive Variable ~ 1 + erklärende Variable" in das Argument der Formel zu schreiben. (Es ist ein bisschen nicht intuitiv)

import pyflux as pf

model = pf.ARIMA(data=df, formula='Verkaufszahlen~1+Durchschnittstemperatur+Höchste Temperatur+Niedrigste Temperatur', ar=5, ma=5, integ=1, target='Verkaufszahlen', family=pf.Normal())
x = model.fit('MLE')

Bewerten Sie dann das Modell auf die gleiche Weise wie ARIMA.

x.summary()

Für AIC und BIC ist es fast dasselbe. Die als erklärende Variable hinzugefügte Temperaturvariable hat einen P-Wert von 1,0, was völlig unbrauchbar ist. .. ..

Normal ARIMAX(5,1,5)                                                                                      
======================================================= ==================================================
Dependent Variable: Differenced kingaku                 Method: MLE                                       
Start Date: 2018-01-09 03:00:00                         Log Likelihood: -5401.6313                        
End Date: 2019-01-01 03:00:00                           AIC: 10829.2627                                   
Number of observations: 357                             BIC: 10879.6732                                   
==========================================================================================================
Latent Variable                          Estimate   Std Error  z        P>|z|    95% C.I.                 
======================================== ========== ========== ======== ======== =========================
AR(1)                                    0.2036     0.0581     3.5023   0.0005   (0.0897 | 0.3175)        
AR(2)                                    -0.9277    0.0475     -19.5352 0.0      (-1.0208 | -0.8346)      
AR(3)                                    -0.0777    0.0804     -0.9658  0.3342   (-0.2353 | 0.08)         
AR(4)                                    -0.4857    0.0463     -10.4841 0.0      (-0.5765 | -0.3949)      
AR(5)                                    -0.5869    0.0552     -10.6292 0.0      (-0.6952 | -0.4787)      
MA(1)                                    -0.8687    0.0775     -11.2101 0.0      (-1.0205 | -0.7168)      
MA(2)                                    0.989      0.0902     10.9702  0.0      (0.8123 | 1.1657)        
MA(3)                                    -0.5284    0.1211     -4.3651  0.0      (-0.7657 | -0.2912)      
MA(4)                                    0.47       0.0942     4.9874   0.0      (0.2853 | 0.6547)        
MA(5)                                    0.0097     0.0715     0.1353   0.8924   (-0.1305 | 0.1499)       
Beta 1                                   0.0        59845.8347 0.0      1.0      (-117297.836 | 117297.836
Beta kion_min                            -0.0       755.0035   -0.0     1.0      (-1479.8069 | 1479.8068) 
Normal Scale                             901399.389                                                       
==========================================================================================================

Stellen Sie es schließlich grafisch dar. ダウンロード (3).png

model.plot_fit(figsize=(15, 10))

Hmm. Gleich wie das ARIMA-Modell.

abschließend

Das Zeitreihenanalyseprogramm selbst mit PyFlux war sehr einfach zu erstellen. Sowohl ARIMA als auch ARIMAX haben eine gute Auf- und Abwärtsrichtung, aber die Breite ist gering und die Genauigkeit des Modells verbessert sich nicht. Es ist schwierig, die optimale Anzahl für jeden Parameter anzugeben.

Der Rest kann saisonal sein. (Ich konnte es nicht mit PyFlux verwenden, SARIMA?) Auch diesmal hat die erklärende Variable unter Verwendung der Temperatur überhaupt nicht geholfen, so dass auch hier Raum für Verbesserungen zu bestehen scheint.

Recommended Posts

Herausforderung für die zukünftige Umsatzprognose: ② Zeitreihenanalyse mit PyFlux
Herausforderung für die zukünftige Umsatzprognose: ⑤ Zeitreihenanalyse von Prophet
Herausforderung für die zukünftige Umsatzprognose: ④ Zeitreihenanalyse unter Berücksichtigung der Saisonalität nach Statistikmodellen
Herausforderung für die zukünftige Umsatzprognose: ③ Optimierung der PyFlux-Parameter
Zeitreihenanalyse Teil 3 Prognose
Herausforderung für die zukünftige Umsatzprognose: ① Was ist Zeitreihenanalyse?
Python: Zeitreihenanalyse
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
Eine Lernmethode für Anfänger zum Erlernen der Zeitreihenanalyse
Zeitreihenanalyse Teil 4 VAR
Zeitreihenanalyse Teil 1 Autokorrelation
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Veranschaulichen Sie sofort die vorherrschende Periode in Zeitreihendaten mithilfe der Spektralanalyse
Zeitreihenanalyse 2 Stabilität, ARMA / ARIMA-Modell
So vergleichen Sie Zeitreihendaten-Derivative DTW, DTW-
Ich habe versucht, Zeitreihen zu analysieren! (AR-Modell)
Zeitreihenanalyse Teil 2 AR / MA / ARMA
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
matplotlib Schreiben Sie Text in ein Zeitreihendiagramm
Umgang mit Zeitreihendaten (Implementierung)
Zeitreihenanalyse Nr. 6 Gefälschte Rückkehr und republikanischer Teil
Einführung in die Zeitreihenanalyse ~ Saisonales Anpassungsmodell ~ In R und Python implementiert