Un modèle qui prévoit plusieurs séries à la fois, chacune à partir de son propre passé et du passé des autres. Prix, volumes, stocks, budget publicitaire : quand les séries s'influencent mutuellement, le VAR (vecteur autorégressif) capte ces effets croisés et permet de tester qui entraîne qui.
La pub de la semaine dernière fait vendre cette semaine, et les ventes de la semaine dernière décident du budget pub de cette semaine. Chacune des deux séries se prévoit en regardant le passé des deux.
Chaque série est expliquée par ses propres valeurs passées et par celles des autres séries, sur les p dernières périodes. C'est une régression linéaire par série.
p est choisi par un critère d'information (AIC, BIC) qui pénalise les modèles trop lourds. Avec k séries, chaque retard ajoute k × k coefficients.
Le modèle prolonge toutes les séries ensemble. On teste la causalité de Granger (le passé de A aide-t-il à prévoir B ?) et on trace les fonctions de réponse : l'effet d'un choc sur une série, semaine après semaine.
Budget publicitaire et ventes, en k€ par semaine, sur 200 semaines. Les données sont simulées : la pub d'une semaine fait monter les ventes de la suivante, et le budget pub est ajusté aux ventes récentes.
Le modèle retrouve l'effet simulé : environ 3 k€ de ventes supplémentaires la semaine suivante pour 1 k€ de pub. Le test de Granger confirme très nettement que la pub aide à prévoir les ventes ; l'effet inverse, des ventes sur le budget, est plus faible. On obtient aussi les 4 prochaines semaines des deux séries.
Le test de Granger dit si une série apporte une information utile pour prévoir l'autre ; ce n'est pas une preuve de cause à effet au sens métier. La qualité de prévision se mesure, comme toujours, sur des semaines non vues.
Noms donnés pour R (vars) et Python (statsmodels).
Le nombre de périodes passées. On le choisit par critère d'information : VARselect en R, select_order en Python. L'AIC tend à choisir plus de retards que le BIC ; sur peu de données, préférer le plus petit.
Le VAR suppose des séries stables autour d'une moyenne. On vérifie avec un test (ADF, KPSS) et on différencie les séries qui ont une tendance. Si des séries non stationnaires évoluent ensemble à long terme, le VECM (vars et urca en R, statsmodels en Python) est plus adapté.
Constante, tendance, les deux ou aucune. La constante (type = "const") est le choix par défaut sur des séries stationnaires non centrées.
Des variables qui influencent les séries sans en dépendre (jours fériés, météo) peuvent être ajoutées sans devenir des équations du système.
# Pub et ventes : modèle VAR en R
library(vars)
# Simulation de 200 semaines : la pub pousse les ventes, les ventes fixent le budget pub
set.seed(42)
pub <- numeric(200)
ventes <- numeric(200)
pub[1] <- 14
ventes[1] <- 257
for (i in 2:200) {
pub[i] <- 2 + 0.5 * pub[i - 1] + 0.02 * ventes[i - 1] + rnorm(1, 0, 2)
ventes[i] <- 60 + 3 * pub[i - 1] + 0.6 * ventes[i - 1] + rnorm(1, 0, 10)
}
donnees <- data.frame(pub, ventes) # en k€ par semaine
# Nombre de semaines passées à prendre en compte, choisi par critère AIC
print(VARselect(donnees, lag.max = 6, type = "const")$selection)
modele <- VAR(donnees, lag.max = 6, ic = "AIC", type = "const")
print(round(coef(modele)$ventes, 3))
# Causalité de Granger : la pub passée aide-t-elle à prévoir les ventes ?
print(causality(modele, cause = "pub")$Granger)
# Prévision conjointe des 4 prochaines semaines
print(predict(modele, n.ahead = 4)$fcst)
# Pub et ventes : modèle VAR en Python
import numpy as np
import pandas as pd
from statsmodels.tsa.api import VAR
# Simulation de 200 semaines : la pub pousse les ventes, les ventes fixent le budget pub
rng = np.random.default_rng(42)
pub, ventes = [14.0], [257.0]
for t in range(1, 200):
pub.append(2 + 0.5 * pub[-1] + 0.02 * ventes[-1] + rng.normal(0, 2))
ventes.append(60 + 3 * pub[-2] + 0.6 * ventes[-1] + rng.normal(0, 10))
donnees = pd.DataFrame({"pub": pub, "ventes": ventes}) # en k€ par semaine
# Nombre de semaines passées à prendre en compte, choisi par critère AIC
modele = VAR(donnees)
print("Retards retenus (AIC) :", modele.select_order(maxlags=6).aic)
resultat = modele.fit(maxlags=6, ic="aic")
print(resultat.params.round(2))
# Causalité de Granger : la pub passée aide-t-elle à prévoir les ventes ?
print("p-valeur pub -> ventes :", round(resultat.test_causality("ventes", ["pub"], kind="f").pvalue, 4))
# Prévision conjointe des 4 prochaines semaines
prev = resultat.forecast(donnees.values[-resultat.k_ar:], steps=4)
print(pd.DataFrame(prev, columns=donnees.columns).round(1))
Une série A cause B au sens de Granger si le passé de A améliore la prévision de B, au-delà de ce qu'apporte le passé de B seul. C'est un test statistique sur les coefficients du VAR. Il ne prouve pas une causalité réelle : une troisième variable peut piloter les deux.
ARIMA prévoit une seule série à partir de son propre passé. Le VAR prévoit plusieurs séries ensemble, chacune à partir du passé de toutes. On l'utilise quand les séries s'influencent mutuellement.
Chaque retard ajoute k × k coefficients pour k séries. Avec 3 séries et 4 retards, chaque équation compte 12 coefficients plus une constante, soit 39 au total. Il faut nettement plus d'observations que de coefficients par équation, d'où des modèles volontairement compacts.
Une série cible et des variables externes supposées connues. Plus simple quand les influences ne vont que dans un sens.
Voir la fiche → la version à une sérieLe VAR généralise l'autorégression d'ARIMA à plusieurs séries, sans la partie moyenne mobile.
Voir la fiche → l'option non linéaireUn réseau de neurones récurrent qui gère beaucoup de séries et des relations non linéaires. Plus de données, moins d'interprétation.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus