Zeitreihenanalyse durch allgemeines Gaußsches Zustandsraummodell unter Verwendung von Python [Implementierungsbeispiel unter Berücksichtigung von Extrinsik und Saisonalität]

Was ist in diesem Artikel zu tun?

Einführung

Ich studiere Zeitreihenanalyse mit ** "Grundlagen der Zeitreihenanalyse und Zustandsraummodellen: Theorie und Implementierung mit R und Stan gelernt" ** (sogenanntes Hayashimoto). Da ich jedoch an Python gewöhnt bin, habe ich die Implementierung in R übersprungen und sie unter Bezugnahme auf den folgenden Artikel im Blog des Autors implementiert. --State Space Model von Python: https://logics-of-blue.com/python-state-space-models/

In diesem Artikel konnte ich verstehen, wie das allgemeine Gaußsche Zustandsraummodell von Python implementiert wird, aber die Implementierungsmethode und der Effekt bei extrinsischer Natur wurden nicht gezeigt. Daher werden wir ** separate Daten verwenden, um die Implementierung und die Auswirkungen von extrinsischen Daten zusammenzufassen. ** ** **

Datenaufbereitung

--Verwenden Sie die Strombedarfsdaten von TEPCO für 2019: http://www.tepco.co.jp/forecast/index-j.html

python


df = pd.read_csv("data/juyo-2019.csv",encoding="shift-jis")
df.head()

Da die Daten stündlich sind, reorganisieren Sie sie in tägliche Daten. Sie können dies sofort mit der Groupby-Funktion tun. Korrigieren Sie dann den Index der Daten bis heute.

python


df["date"] = pd.to_datetime(df["date"],format="%Y/%m/%d")
df["power"] = df["power"].values.astype(int)
daily_data = df.groupby("date")["power"].sum().reset_index()
daily_data = daily_data.set_index(["date"])
rcParams["figure.figsize"] = [12,5]
daily_data.plot()

ダウンロード (5).png

Wenn wir uns die Daten ansehen, können wir sehen, dass es ** periodische Zacken ** gibt. Da dies alle 7 Tage schwankt, kann geschlossen werden, dass es sich um einen Zyklus handelt, der sich auf den Werttag bezieht. Mit anderen Worten, der Strombedarf ändert sich je nachdem, ob es sich um einen Urlaub handelt oder nicht.

Darüber hinaus wird davon ausgegangen, dass nicht nur die Tage, sondern auch die Feiertage den Strombedarf beeinflussen. Feiertage treten nicht periodisch auf und können als extrinsisch modelliert werden.

** Zusammenfassend werden wir versuchen, genauer zu modellieren, indem wir Folgendes modellieren.

Wenn Saisonalität und Extrinsik nicht berücksichtigt werden

Lassen Sie uns zunächst modellieren, ohne die Saisonalität, dh den Tag des Monats, zu berücksichtigen. Modell unter Verwendung eines lokalen linearen Modells, das Saisonalität und extrinsische Natur nicht berücksichtigt. Für diese Modellierung

python


#Lokales lineares Trendmodell
mod_trend = sm.tsa.UnobservedComponents(daily_data,"local linear trend")
res_trend = mod_trend.fit(method="bfgs")

rcParams["figure.figsize"] = 15,15
fig = res_trend.plot_components()

ダウンロード (8).png

In der Abbildung sind oben die tatsächlichen Daten, die zweite der Status und die dritte die Trenddaten. ** Sie können sehen, dass der Trend durcheinander ist, ohne die Periodizität zu berücksichtigen. ** ** **

Wenn man die Saisonalität berücksichtigt

Als nächstes unter Berücksichtigung der Periodizität. Alles, was Sie tun müssen, ist, das saisonale Argument in Unobserved Components einzufügen. Hier wird das Argument auf 7 gesetzt, da der Tag berücksichtigt wird. Ein Diagramm mit der Saisonalität wurde zum vierten Teil der Abbildung hinzugefügt. Sie können sehen, dass es periodisch schwankt.

python


#Lokales lineares Trendmodell mit Saisonalität
mod_season_trend = sm.tsa.UnobservedComponents(daily_data.power,
                                              "local linear trend",
                                              seasonal = 7)

res_season_trend = mod_season_trend.fit(
    method='bfgs', 
    maxiter=1000, 
)

rcParams["figure.figsize"] = 15,20
fig = res_season_trend.plot_components()

ダウンロード (9).png

** Der große Unterschied zum vorherigen besteht darin, dass die Trenddaten nicht mehr gezackt sind. ** ** ** Durch Entfernen der Periodizität kann der Trend genauer als zuvor gesehen werden. (Ich mache mir Sorgen, dass die ersten Daten pro Monat im periodischen Diagramm hoch sind ...)

Sie können auch sehen, dass das Level-Diagramm Anfang Mai erheblich abgenommen hat. Dies ist wahrscheinlich eher auf das GW als auf die Zustandsänderung zurückzuführen. Betrachten wir als nächstes ein Modell, wenn Feiertage als extrinsisch berücksichtigt werden.

Wenn Saisonalität und Extrinsik berücksichtigt werden

Schließlich ist es ein Modell, bei dem auch extrinsische Faktoren berücksichtigt werden. Betrachten Sie Feiertage als extrinsisch. Importieren Sie jpholiday, um die Feiertagsflagge zu setzen. (Hier ist der Code bei Verwendung von Google Colab) Fügen Sie eine Feiertagsspalte hinzu, die für Feiertage 1 ist.

Da Samstag und Sonntag von Anfang an geschlossen sind, ist die Feiertagsflagge nicht gesetzt.

python


#Setzen Sie eine Urlaubsflagge, im Fall von Google Colab
!pip install jpholiday
import jpholiday

#Feiertagsflagge
daily_data["holiday"] = 0
for i in range(len(daily_data)):
  if daily_data.index[i].dayofweek != 6: #Nur wenn nicht Sonntag
    date_i = daily_data.index[i] #Datum
    if jpholiday.is_holiday(date_i): #Für Feiertage
      daily_data.loc[date_i,"holiday"] = 1
daily_data.head()

Wenn es nur ein Feiertag ist, können Sie keine aufeinander folgenden Feiertage berücksichtigen. Schreiben Sie die Winterferien von Dezember bis Januar, die GW im Mai und die Obon-Ferien im August bis zum 1. August manuell um.

python


list1 = daily_data.query("20190101 <= index <= 20190104").index
list2 = daily_data.query("20190429 <= index <= 20190503").index
list3 = daily_data.query("20190812 <= index <= 20190816").index
list4 = daily_data.query("20191230 <= index <= 20191231").index

for i in list1:
  daily_data.loc[i,"holiday"]=1
for i in list2:
  daily_data.loc[i,"holiday"]=1
for i in list3:
  daily_data.loc[i,"holiday"]=1
for i in list4:
  daily_data.loc[i,"holiday"]=1

Erstellen Sie schließlich ein lokales lineares Trendmodell mit extrinsischen Eigenschaften und zeichnen Sie es auf. ** Geben Sie exog in das Argument ein und geben Sie die zuvor erstellte Feiertagsflagge an. ** ** **

python


#Lokales lineares Trendmodell mit Saisonalität und extrinsischer Natur
mod_season_exog_trend = sm.tsa.UnobservedComponents(
    daily_data.power,
    "local linear trend",
    seasonal=7,
    exog=daily_data.holiday
)

res_season_exog_trend = mod_season_exog_trend.fit(
    method="bfgs",
    maxiter=1000, 
)

#Zeichnung der geschätzten Zustands- / Trend- / Saisoneffekte
rcParams['figure.figsize'] = 15, 20
fig = res_season_exog_trend.plot_components()

ダウンロード (10).png

Mit Blick auf Anfang Mai wird der Rückgang im Vergleich zur Periodizität allein leicht unterdrückt. Es scheint jedoch, dass dieser Rückgang nicht nur durch Hinzufügen der Feiertagsflagge vollständig unterdrückt wird.

Es scheint, dass weitere Verbesserungen erforderlich sind, aber dies war die Grenze meiner derzeitigen Fähigkeiten. .. ..

Zusammenfassung

Danke, dass Sie bis zum Ende für mich gelesen haben.

Referenzartikel

--State Space Model von Python: https://logics-of-blue.com/python-state-space-models/

Recommended Posts

Zeitreihenanalyse durch allgemeines Gaußsches Zustandsraummodell unter Verwendung von Python [Implementierungsbeispiel unter Berücksichtigung von Extrinsik und Saisonalität]
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Allgemeines Gaußsches Zustandsraummodell in Python
Python: Zeitreihenanalyse: Konstanz, ARMA / ARIMA-Modell
Einführung in die Zeitreihenanalyse ~ Saisonales Anpassungsmodell ~ In R und Python implementiert
Python: Zeitreihenanalyse
[In-Database Python Analysis Tutorial mit SQL Server 2017] Schritt 5: Training und Speichern von Modellen mit T-SQL
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
[Statistik] [Zeitreihenanalyse] Zeichnen Sie das ARMA-Modell und erfassen Sie die Tendenz.
Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur
Zeitreihenanalyse 2 Stabilität, ARMA / ARIMA-Modell
Ich habe versucht, Zeitreihen zu analysieren! (AR-Modell)
Empfehlungs-Tutorial mit Assoziationsanalyse (Python-Implementierung)
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Zeitreihenanalyse Nr. 6 Gefälschte Rückkehr und republikanischer Teil
Herausforderung für die zukünftige Umsatzprognose: ④ Zeitreihenanalyse unter Berücksichtigung der Saisonalität nach Statistikmodellen