Analyse de séries temporelles par modèle général d'espace d'états gaussien à l'aide de Python [Exemple d'implémentation considérant extrinsèque et saisonnalité]

Que faire dans cet article

introduction

J'étudie l'analyse de séries chronologiques en utilisant ** "Bases de l'analyse des séries temporelles et des modèles d'espace d'état: théorie et implémentation apprises avec R et Stan" ** (soi-disant Hayashimoto). Cependant, comme je suis habitué à Python, j'ai sauté l'implémentation en R et l'ai implémentée en me référant à l'article suivant sur le blog de l'auteur. --Modèle d'espace d'état par Python: https://logics-of-blue.com/python-state-space-models/

Dans cet article, j'ai pu comprendre comment implémenter le modèle général d'espace d'états gaussien par Python, mais la méthode d'implémentation et l'effet en cas de nature extrinsèque n'étaient pas affichés. Par conséquent, nous utiliserons ** des données séparées pour résumer la mise en œuvre et les effets des données extrinsèques. ** **

Préparation des données

python


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

Étant donné que les données sont horaires, réorganisez-les en données quotidiennes. Vous pouvez le faire tout de suite en utilisant la fonction groupby. Corrigez ensuite l'index des données à ce jour.

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

En regardant les données, nous pouvons voir qu'il y a des ** irrégularités périodiques **. Comme cela fluctue tous les 7 jours, on peut en déduire qu'il s'agit d'un cycle lié au jour de valeur. En d'autres termes, la demande d'électricité change selon qu'il s'agit de vacances ou non.

De plus, il est présumé que non seulement les jours mais aussi les vacances affectent la demande d'électricité. Les vacances ne se produisent pas périodiquement et peuvent être modélisées comme extrinsèques.

** En résumé, nous essaierons de modéliser plus précisément en modélisant ce qui suit. --Périodique: se produit tous les 7 jours sur une journée

Lorsque la saisonnalité et les extrinsèques ne sont pas pris en compte

Tout d'abord, modélisons sans tenir compte de la saisonnalité, c'est-à-dire du jour du mois. Modèle utilisant un modèle linéaire local qui ne tient pas compte de la saisonnalité et de la nature extrinsèque. Pour cette modélisation

python


#Modèle de tendance linéaire local
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

Dans la figure, le haut correspond aux données réelles, le second à l'état et le troisième aux données de tendance. ** Vous pouvez voir que la tendance est foirée sans tenir compte de la périodicité. ** **

Lorsque l'on considère la saisonnalité

Ensuite, en considérant la périodicité. Tout ce que vous avez à faire est de mettre l'argument saisonnier dans Composants non observés. Ici, l'argument est mis à 7 car le jour est pris en compte. Un graphique montrant la saisonnalité a été ajouté au quatrième de la figure. Vous pouvez voir qu'il fluctue périodiquement.

python


#Modèle de tendance linéaire local avec saisonnalité
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

** La grande différence par rapport à la précédente est que les données de tendance ne sont plus irrégulières. ** ** En supprimant la périodicité, la tendance peut être vue avec plus de précision qu'auparavant. (Je crains que les premières données par mois sur le graphique de périodicité soient élevées ...)

Vous pouvez également voir que le graphique de niveau a considérablement diminué au début du mois de mai. Ceci est probablement dû à la GW plutôt qu'au changement d'état. Alors maintenant, considérons un modèle où les vacances sont incorporées comme extrinsèques.

Quand la saisonnalité et extrinsèque sont considérées

Enfin, il s'agit d'un modèle lorsque des facteurs extrinsèques sont également pris en compte. Considérez les vacances comme extrinsèques. Importez jpholiday pour mettre le drapeau de vacances. (Voici le code lors de l'utilisation de google colab) Ajoutez une colonne de vacances qui sera 1 pour les vacances.

Le samedi et le dimanche étant fermés depuis le début, le drapeau de vacances n'est pas activé.

python


#Mettre un drapeau de vacances, dans le cas de google colab
!pip install jpholiday
import jpholiday

#Drapeau de vacances
daily_data["holiday"] = 0
for i in range(len(daily_data)):
  if daily_data.index[i].dayofweek != 6: #Seulement sinon dimanche
    date_i = daily_data.index[i] #Date
    if jpholiday.is_holiday(date_i): #Pour les jours fériés
      daily_data.loc[date_i,"holiday"] = 1
daily_data.head()

Si ce n'est que des vacances, vous ne pouvez pas envisager de vacances consécutives. Réécrivez manuellement les vacances d'hiver de décembre à janvier, la GW en mai et les vacances d'Obon en août au 1.

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

Enfin, créez un modèle de tendance linéaire local avec des propriétés extrinsèques et tracez-le. ** Mettez exog dans l'argument et spécifiez l'indicateur de vacances créé précédemment. ** **

python


#Modèle de tendance linéaire local avec saisonnalité et nature extrinsèque
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, 
)

#Dessin de l'état / tendance / effets saisonniers estimés
rcParams['figure.figsize'] = 15, 20
fig = res_season_exog_trend.plot_components()

ダウンロード (10).png

En se concentrant sur le début du mois de mai, la diminution est ** légèrement ** supprimée par rapport au cas de la seule périodicité. Cependant, il semble que cette diminution ne soit pas complètement supprimée uniquement par l'ajout du drapeau de vacances.

Il semble qu'une amélioration supplémentaire soit nécessaire, mais c'était la limite de mes capacités actuelles. .. ..

Résumé

Merci d'avoir lu pour moi jusqu'à la fin.

Article de référence

--Modèle d'espace d'état par Python: https://logics-of-blue.com/python-state-space-models/

Recommended Posts

Analyse de séries temporelles par modèle général d'espace d'états gaussien à l'aide de Python [Exemple d'implémentation considérant extrinsèque et saisonnalité]
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
Modèle d'espace d'état gaussien général en Python
Python: Analyse des séries temporelles: Constantity, modèle ARMA / ARIMA
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python
Python: analyse des séries chronologiques
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 5: Formation et enregistrement des modèles à l'aide de T-SQL
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
[Statistiques] [Analyse des séries chronologiques] Tracez le modèle ARMA et saisissez la tendance.
Implémenter un modèle avec état et comportement (3) - Exemple d'implémentation par décorateur
Analyse des séries chronologiques 2 Stabilité, modèle ARMA / ARIMA
J'ai essayé l'analyse de séries chronologiques! (Modèle AR)
Tutoriel de recommandation utilisant l'analyse d'association (implémentation python)
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Analyse des séries chronologiques n ° 6 Faux retour et partie républicaine
Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models