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)
Google Colaboratory
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 |
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))
Da es täglich ist, geht es erheblich auf und ab. Anfang März und Ende des Jahres steigen stark an.
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))
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.
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.
model.plot_fit(figsize=(15, 10))
Hmm. Gleich wie das ARIMA-Modell.
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