La prévision la plus simple : le mois prochain ressemblera à la moyenne des derniers mois. Elle ne capte ni tendance ni saison, mais elle sert de référence que tout modèle doit battre. Calculée sur 12 mois, elle sert aussi à lire la tendance de fond d'une série saisonnière.
Pour estimer votre facture d'électricité du mois prochain, vous faites la moyenne des trois dernières. Simple, souvent pas si mal, mais toujours en retard quand l'hiver arrive.
k périodes : 3 mois pour suivre les variations récentes, 12 mois pour lisser toute une année.
Chaque mois, on ajoute le dernier mois connu et on retire le plus ancien. Le résultat sert de prévision pour le mois suivant.
La moyenne mobile sert d'étalon. On mesure son erreur sur une période passée, puis on exige de tout modèle plus complexe qu'il fasse nettement mieux.
Une série de janvier 2017 à décembre 2025, avec une tendance à la hausse et un cycle annuel marqué. On veut une prévision du mois suivant et une lecture de la tendance, sans outil spécialisé.
Sur les 24 derniers mois, la moyenne des 3 derniers mois se trompe de 5,7 % en moyenne, celle des 12 derniers de 6,1 %. La simple répétition du même mois l'an dernier fait mieux : 5,1 %. La moyenne sur 12 mois, sans saisonnalité, montre une tendance passée de 1 563 à 1 608 en 2025.
La MAPE est l'erreur moyenne en % des ventes réelles. On calcule toujours deux références : la moyenne mobile et le naïf saisonnier. Sur une série saisonnière, un modèle qui ne bat pas ces deux-là n'apporte rien.
Pas d'algorithme à entraîner, mais trois choix qui font la qualité de la référence. Fonctions : stats::filter en R, rolling en pandas.
Petite (3 mois), la moyenne suit vite les changements mais reste bruitée. Grande (12 mois), elle est stable mais réagit lentement. Pour des données saisonnières, une fenêtre égale à la période (12 mois) annule la saison.
Pour prévoir, la moyenne ne doit utiliser que le passé (sides = 1, ou rolling puis shift). Une moyenne centrée, qui utilise aussi les mois suivants, sert seulement à décrire l'historique.
La comparaison se fait sur des mois que la méthode n'a pas vus, sur au moins une année complète pour couvrir toutes les saisons. Une seule année atypique suffit à fausser le classement.
# Prévision des ventes : moyenne mobile en R
ventes <- read.csv("ventes_mensuelles.csv")
y <- ventes$ventes
n <- length(y)
# Prévision du mois suivant = moyenne des k derniers mois connus
prev_mm <- function(k) c(rep(NA, k), stats::filter(y, rep(1 / k, k), sides = 1)[k:(n - 1)])
# Référence naïve saisonnière : le même mois l'an dernier
naif_saison <- c(rep(NA, 12), y[1:(n - 12)])
# Erreur moyenne en % (MAPE) sur les 24 derniers mois, prévus un mois à l'avance
test <- (n - 23):n
mape <- function(prevu) round(mean(abs(y[test] - prevu[test]) / y[test]) * 100, 1)
cat("MAPE (%) mm3 :", mape(prev_mm(3)), "| mm6 :", mape(prev_mm(6)), "| mm12 :", mape(prev_mm(12)),
"| naïf saisonnier :", mape(naif_saison), "\n")
# Moyenne mobile sur 12 mois : la saisonnalité s'annule, il reste la tendance
tendance <- stats::filter(y, rep(1 / 12, 12), sides = 1)
cat("Tendance fin 2025 :", round(tendance[n]), "| fin 2024 :", round(tendance[n - 12]), "\n")
cat("Prévision de janvier 2026 (mm3) :", round(mean(tail(y, 3))), "\n")
# Prévision des ventes : moyenne mobile en Python
import pandas as pd
ventes = pd.read_csv("ventes_mensuelles.csv", parse_dates=["mois"], index_col="mois")["ventes"]
# Prévision du mois suivant = moyenne des k derniers mois connus (shift : pas de triche)
prev = pd.DataFrame({"reel": ventes})
for k in [3, 6, 12]:
prev[f"mm{k}"] = ventes.rolling(k).mean().shift(1)
# Référence naïve saisonnière : le même mois l'an dernier
prev["naif_saison"] = ventes.shift(12)
# Erreur moyenne en % (MAPE) sur les 24 derniers mois, prévus un mois à l'avance
test = prev.iloc[-24:]
erreurs = test.drop(columns="reel").sub(test["reel"], axis=0).abs().div(test["reel"], axis=0)
print("MAPE (%) :")
print((erreurs.mean() * 100).round(1))
# Moyenne mobile sur 12 mois : la saisonnalité s'annule, il reste la tendance
tendance = ventes.rolling(12).mean()
print("Tendance fin 2025 :", round(tendance.iloc[-1]), "| fin 2024 :", round(tendance.iloc[-13]))
print("Prévision de janvier 2026 (mm3) :", round(ventes.iloc[-3:].mean()))
On écrit dans une cellule la moyenne des k cellules précédentes, par exemple =MOYENNE(B2:B4) pour 3 mois, puis on recopie la formule vers le bas. Le résultat en face d'un mois sert de prévision pour le mois suivant.
La moyenne mobile donne le même poids aux k derniers mois et ignore les plus anciens. Le lissage exponentiel donne un poids qui décroît avec l'ancienneté : le dernier mois compte le plus, mais tout l'historique contribue.
Chaque fenêtre de 12 mois contient exactement un mois de chaque sorte : un janvier, un février, et ainsi de suite. Les hauts et les bas de la saison se compensent, il ne reste que le niveau moyen de l'année glissante, c'est-à-dire la tendance.
Donne plus de poids aux mois récents au lieu de tous les compter pareil. Réagit plus vite, avec un seul paramètre.
Voir la fiche → pour tendance et saisonUn lissage qui suit en plus la tendance et la saisonnalité. La méthode à essayer quand la moyenne mobile ne suffit plus.
Voir la fiche → pour analyser la sérieSépare proprement tendance, saisonnalité et reste, là où la moyenne mobile sur 12 mois ne donne que la tendance.
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