Modèle Exponentiel Lissé (ETS)

Le modèle Exponentiel Lissé (ETS) est une famille de modèles de séries temporelles qui utilise des moyennes mobiles exponentiellement pondérées pour lisser les données et effectuer des prévisions. Ce modèle est particulièrement utile pour les séries temporelles qui montrent des tendances ou des saisons. Il comprend des variations basées sur trois principaux composants :

  1. Composant de niveau (Level) : Il capture la valeur de base ou le niveau de la série temporelle.

  2. Composant de tendance (Trend) : Il modélise la direction ou la pente de la série temporelle (croissante ou décroissante).

  3. Composant saisonnier (Seasonality) : Il modélise les effets saisonniers ou cycliques présents dans la série temporelle.

Types de modèles ETS

Le modèle ETS est basé sur les combinaisons de trois types de comportements :

  1. Additif : Lorsque l’impact de la tendance ou de la saisonnalité est constant au fil du temps.

    • Modèle additif :

      Yt=Levelt+Trendt+SeasonalitytY_t = Level_t + Trend_t + Seasonality_t

  2. Multiplicatif : Lorsque l’impact de la tendance ou de la saisonnalité varie avec le niveau de la série.

    • Modèle multiplicatif :

      Yt=Levelt×Trendt×SeasonalitytY_t = Level_t \times Trend_t \times Seasonality_t

Composants du modèle ETS

1. Niveau (Level)

Le niveau représente la valeur moyenne de la série à un instant donné. Il est mis à jour par un lissage exponentiel.

2. Tendance (Trend)

Le modèle de tendance peut être linéaire ou exponentiel et capture la croissance ou la décroissance de la série.

3. Saison (Seasonality)

Le composant saisonnier capture les effets de la saisonnalité dans les données, comme les pics et les creux réguliers dans le temps.

Formulation mathématique du modèle ETS

1. Modèle Additif

Pour une série temporelle

YtY_t

, le modèle additif est donné par :

 

Yt=Levelt+Trendt+SeasonalitytY_t = Level_t + Trend_t + Seasonality_t

2. Modèle Multiplicatif

Le modèle multiplicatif est donné par :

 

Yt=Levelt×Trendt×SeasonalitytY_t = Level_t \times Trend_t \times Seasonality_t

Les paramètres de lissage pour chaque composant sont donnés par des équations de mise à jour exponentielle, permettant d’ajuster les valeurs au fil du temps.

Méthode de lissage exponentiel

L’objectif du lissage exponentiel est d’attribuer un poids décroissant aux observations les plus anciennes. La mise à jour des niveaux, tendances et saisonnalités est effectuée à chaque nouveau point de données en utilisant un facteur de lissage (

α\alpha

,

β\beta

,

γ\gamma

).

Où :

Fonctions :

  • ExponentialSmoothing()

    La fonction ExponentialSmoothing() de statsmodels permet d'ajuster un modèle de lissage exponentiel à une série temporelle. Ce modèle est particulièrement utile pour les séries temporelles qui présentent des tendances, des saisonnalités, ou les deux. Le lissage exponentiel donne plus de poids aux observations récentes, ce qui permet de mieux prédire les valeurs futures.

    Importation :

    from statsmodels.tsa.holtwinters import ExponentialSmoothing

    Attributs :

    Nom Type Description
    trend str, optionnel Spécifie la composante de tendance à utiliser dans le modèle. Les options sont 'add' (tendance additive), 'mul' (tendance multiplicative), ou None (pas de tendance).
    seasonal str, optionnel Indique la composante saisonnière à utiliser. Les options sont 'add' (saisonnalité additive), 'mul' (saisonnalité multiplicative), ou None (pas de saisonnalité).
    seasonal_periods int, optionnel Le nombre de périodes dans une saison. Par exemple, 12 pour une saisonnalité mensuelle (annuelle) ou 4 pour une saisonnalité trimestrielle.
    exogenous array-like, optionnel Variables exogènes à inclure dans le modèle. Si présentes, elles seront utilisées comme facteurs influençant les prévisions.
    initialization_method str, optionnel La méthode d'initialisation des paramètres. Les options sont 'estimated' (paramètres estimés) ou 'legacy-heuristic' (méthode heuristique classique).

    Exemple de code :

    from statsmodels.tsa.holtwinters import ExponentialSmoothing
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Création d'une série temporelle d'exemple avec une tendance et une saisonnalité
    np.random.seed(0)
    dates = pd.date_range('2020-01-01', periods=100, freq='D')
    data = 10 + np.sin(np.linspace(0, 20, 100)) + 0.5 * np.random.normal(size=100)  # Série avec une tendance et une saisonnalité
    
    # Création d'une DataFrame
    series = pd.Series(data, index=dates)
    
    # Définir le modèle de lissage exponentiel avec tendance additive et saisonnalité additive sur une période de 12
    model = ExponentialSmoothing(series, trend='add', seasonal='add', seasonal_periods=12)
    
    # Ajuster le modèle
    fitted_model = model.fit()
    
    # Affichage des résultats du modèle
    print(fitted_model.summary())
    
    # Prédictions avec le modèle de lissage exponentiel
    forecast = fitted_model.forecast(steps=10)  # Prédire les 10 prochaines valeurs
    
    # Affichage de la série temporelle et des prévisions
    plt.plot(series, label='Données historiques')
    plt.plot(pd.date_range('2020-04-10', periods=10, freq='D'), forecast, label='Prévisions', color='red')
    plt.legend()
    plt.show()
    Résultat du code

    Explication du code :

    Les bibliothèques nécessaires sont importées :

    • ExponentialSmoothing de statsmodels.tsa.holtwinters permet de modéliser des séries temporelles en utilisant le lissage exponentiel, avec des options pour inclure une tendance et une saisonnalité.
    • pandas pour la gestion des données sous forme de DataFrame.
    • numpy pour les calculs mathématiques et la génération de données aléatoires.
    • matplotlib.pyplot pour créer des visualisations graphiques.
    Création d'une série temporelle d'exemple avec une tendance et une saisonnalité

    Une graine aléatoire est fixée pour garantir la reproductibilité des résultats. Une série de 100 dates est générée à partir du 1er janvier 2020 avec une fréquence journalière. Les données sont créées en ajoutant une composante sinusoidale (pour la saisonnalité) et un bruit aléatoire à une valeur constante (pour la tendance).

    Création d'une DataFrame

    Les données générées sont converties en un objet pandas.Series, avec les dates comme index pour former une série temporelle.

    Définir le modèle de lissage exponentiel

    Un modèle de lissage exponentiel est défini en choisissant les options suivantes :

    • trend='add' : une tendance additive est utilisée, ce qui signifie que la tendance est ajoutée à la série.
    • seasonal='add' : une composante saisonnière additive est utilisée.
    • seasonal_periods=12 : la saisonnalité est considérée sur une période de 12 unités (par exemple, 12 mois ou 12 jours).
    Ajuster le modèle

    Le modèle de lissage exponentiel est ensuite ajusté à la série temporelle à l'aide de la méthode fit().

    Affichage des résultats du modèle

    Une fois le modèle ajusté, un résumé des résultats est affiché avec la méthode summary(), contenant des informations détaillées sur les paramètres du modèle, leur significativité, ainsi que les performances du modèle.

    Prédictions avec le modèle de lissage exponentiel

    Le modèle ajusté est utilisé pour prédire les 10 prochaines valeurs de la série temporelle à l'aide de la méthode forecast().

    Affichage de la série temporelle et des prévisions

    Un graphique est tracé pour afficher à la fois les données historiques et les prévisions obtenues avec le modèle de lissage exponentiel. La série historique est représentée en bleu, tandis que les prévisions sont tracées en rouge.