[PYTHON] Herausforderung für die zukünftige Umsatzprognose: ⑤ Zeitreihenanalyse von Prophet

Einführung

Bis zum letzten Mal haben wir zukünftige Umsätze mithilfe des ARIMA-Modells der Zeitreihenanalyse prognostiziert. Ich habe vor, verschiedene Anstrengungen zu unternehmen, aber die Parameter, die angepasst werden können, sind begrenzt und die Genauigkeit verbessert sich nicht.

Daher möchte ich anstelle des ARIMA-Modells vom aktuellen Trend des Deep Learning lernen. Es ist jedoch schwierig, plötzlich von vorne zu beginnen. Daher möchte ich dieses Mal Prophet verwenden, eine von Facebook veröffentlichte Zeitreihenanalysebibliothek, die häufig als "Apropos Zeitreihenanalyse" verwendet wird.

Ich habe programmiert, während ich mir die folgenden Seiten angesehen habe, aber es hat an einigen Stellen nicht so funktioniert, wie ich es erwartet hatte. Wird die Version der Bibliothek geändert?

Oder besser gesagt, Prophet wurde 2017 veröffentlicht. Ich habe gelebt, ohne das zu wissen. .. ..

Analyseumgebung

Google Colaboratory

Zieldaten

Wie bei [Letztes Mal] verwenden die Daten den täglichen Umsatz und die Temperatur (Durchschnitt, Maximum, Minimum) 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

Das Abrufen von Daten von BigQuery zu Pandas ist der gleiche wie zuvor. Da ich jedoch die Zukunft vorhersage, mache ich die letzten 2 Jahre (df) und die Zukunft 1 Monat (df_future).

Danach müssen Sie das Datumselement auch in den Typ datetime64 konvertieren. Außerdem sollte das Datum in ds geändert und der vorhergesagte Wert (hier der Verkaufsbetrag) in den Variablennamen y geändert werden.

import pandas as pd

query = """
SELECT * 
FROM `myproject.mydataset.mytable`
WHERE CAST(Datum als Zeitstempel) between CAST("{from_day}" AS TIMESTAMP) AND CAST("{to_day}" AS TIMESTAMP) ORDER BY p_date'
"""

df = pd.io.gbq.read_gbq(query.format(from_day="2017-01-01",to_day="2018-12-31"), project_id="myproject", dialect="standard")
df_future = pd.io.gbq.read_gbq(query.format(from_day="2019-01-01",to_day="2019-01-31"), project_id="myproject", dialect="standard")

from datetime import datetime

#Konvertieren Sie Datumselemente in den Typ datetime64
def strptime_with_offset(string, format='%Y-%m-%d'):
  base_dt = datetime.strptime(string, format)
  return base_dt

df['Datum'] = df['Datum'].apply(strptime_with_offset)

df.rename(columns={'Verkaufszahlen': 'y','Datum': 'ds'}, inplace=True)

2. Modelllernen

Rufen Sie den Propheten an und fügen Sie dem Modell verschiedene Dinge hinzu.

from fbprophet import Prophet

#Das Modell ist nicht linear
model = Prophet(growth='logistic', daily_seasonality=False)

#Sie können ein Land angeben, in dem Feiertage hinzugefügt werden sollen
model.add_country_holidays(country_name="JP")

#Fügen Sie Saisonalität mit monatlichen Elementen hinzu
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)

#Variablen, die der Prognose hinzugefügt werden sollen
features_list =["Durchschnittstemperatur","Höchste Temperatur","Niedrigste Temperatur"]

for f in features_list:
  model.add_regressor(f)

#Bei Nichtlinearität ist CAP unerlässlich. Geben Sie daher den oberen Grenzwert ein.
df['cap']=15000000 

model.fit(df)

Dadurch wird das Modell trainiert. Sie können problemlos Elemente usw. hinzufügen, daher scheint es gut zu sein, beim Hinzufügen und Subtrahieren verschiedener Elemente zu lernen.

Wenden Sie dann das resultierende Modell auf zukünftige Daten an.

#Wie weit prognostizieren Sie? Geben Sie hier 30 Tage an
future = model.make_future_dataframe(periods=30, freq='D')
future["cap"]=15000000

#Df, weil wir Variablen benötigen, um die Vorhersage der Temperatur usw. zu ergänzen._Vorhersage nach dem Zusammenführen mit der Zukunft
future=pd.merge(future, df_future, on="ds")
df_forecast = model.predict(future)

Das Vorhersageergebnis wird jetzt in df_forecast gespeichert. Wenn man sich den Inhalt ansieht, scheint es, dass er mit dem Wert yhat eingegeben wird. Darüber hinaus wird es durch die Breite von yhat_lower und yhat_upper vorhergesagt. Darüber hinaus werden verschiedene Trends sowie die Auswirkungen von Saisonalität und Temperatur analysiert.

3. Visualisieren Sie die Vorhersageergebnisse

Lassen Sie uns die Analyseergebnisse auf leicht verständliche Weise grafisch darstellen. Sie können die Umsatzprognose und die tatsächlichen Ergebnisse des letzten Monats vergleichen.

from matplotlib import pyplot as plt
% matplotlib inline

df_output=pd.merge(df_forecast, df_future, on="ds")

#Aus irgendeinem Grund ist in der aktuellen Version ein Fehler ohne Folgendes aufgetreten
pd.plotting.register_matplotlib_converters()

df_output.plot(figsize=(18, 12), x="ds", y=["yhat","y"])

image.png

Die Prognose (yhat) ist etwas höher, aber es scheint, dass die Zukunftsprognose durch Anheben und Absenken einen ziemlich guten Trend zeigt.

Sie können auch den Trend und die Periodizität extrahieren und sehen.

model.plot_components(df_forecast)
plt.show()

image.png

»Urlaub ist ein Tag für Erwachsene, nicht wahr? Es ist durchdringend. ――In der Woche sind Wochenenden an Samstagen und Sonntagen immer noch teuer. ――Monatlich ist matschig. Bedeutet das, dass das Monatsende und der Monatsanfang hoch sind?

abschließend

Es war nicht einfach, wie die Artikelnamen ds und y, und die Programme der Pioniere an einigen Stellen, die Fehler verursachten, aber als es fertig war, war es sehr einfach zu verschieben.

Die Formel ist nicht im Programm enthalten, aber beim Vergleich von y und yhat liegt der monatliche Fehler innerhalb von etwa 10%, sodass ich der Meinung bin, dass er ausreichend verwendet werden kann.

Dieses Mal wurde die Verkaufsmenge des gesamten Geschäfts verwendet, aber in Zukunft möchte ich etwas mit höherer Genauigkeit finden, wie die Anzahl der Besucher und die Verkaufsmenge nur einer bestimmten Kategorie.

Recommended Posts

Herausforderung für die zukünftige Umsatzprognose: ⑤ Zeitreihenanalyse von Prophet
Herausforderung für die zukünftige Umsatzprognose: ② Zeitreihenanalyse mit PyFlux
Herausforderung für die zukünftige Umsatzprognose: ④ Zeitreihenanalyse unter Berücksichtigung der Saisonalität nach Statistikmodellen
Umsatzprognose für die Zeitreihenanalyse
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
Einfache Vorhersage von Zeitreihen mit Prophet
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Zeitreihenanalyse 2 Stabilität, ARMA / ARIMA-Modell
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
Vorhersage der Zukunft der Bevölkerungsentwicklung in Numazu City durch Zeitreihen-Regressionsanalyse mit Prophet