Un algorithme qui découpe une série en périodes homogènes et donne la date de chaque changement : un niveau qui monte, une variance qui s'envole. On l'utilise pour dater une dérive machine, l'effet d'une hausse de prix ou une cassure dans les ventes, sans connaître la date à l'avance.
Résumer une courbe bruitée par quelques paliers horizontaux. Combien de paliers faut-il, et où placer les marches, pour la décrire fidèlement sans coller au bruit ?
Un changement de moyenne (le niveau), de variance (l'agitation) ou des deux. Ce choix fixe le coût d'une période : l'écart entre ses points et sa propre moyenne.
Ajouter une rupture réduit toujours l'écart. Une pénalité par rupture empêche de découper le bruit : une rupture n'est gardée que si le gain dépasse son prix.
L'algorithme PELT parcourt les découpages possibles et abandonne ceux qui ne peuvent plus gagner. Il rend le découpage optimal pour ce coût et cette pénalité, pas une approximation.
2 000 heures de température d'une machine. La température suit un cycle de 24 h, qu'on efface en passant en moyenne journalière avant de chercher les ruptures.
Sur le jeu d'exemple, une seule rupture ressort : la température moyenne passe d'environ 60 °C à plus de 64 °C à partir du 28 février. C'est la date à donner à la maintenance pour chercher la cause : réglage, pièce changée, encrassement.
En surveillance, on mesure le nombre de jours entre le vrai changement et sa détection, et le nombre de fausses ruptures par mois. On les calcule sur des incidents passés dont la date est connue.
Noms donnés pour R (changepoint) et Python (ruptures).
Le prix d'une rupture. Trop bas, le bruit est découpé ; trop haut, de vrais changements passent. MBIC en R, ou environ 3 × log(n) en Python, sont de bons points de départ. La pénalité se compare à un écart au carré : standardiser la série rend le réglage comparable d'un capteur à l'autre.
Le type de changement cherché. Niveau seul : cpt.mean ou model="l2". Agitation : cpt.var. Les deux : cpt.meanvar ou model="normal".
Durée minimale d'une période, pour ne pas isoler un seul jour atypique. En Python, jump=1 teste toutes les positions ; la valeur par défaut (5) ne teste qu'un point sur cinq.
Agréger les heures en jours efface les cycles et le bruit, au prix d'une date moins fine. Le bon pas est celui de la décision : le jour pour la maintenance, la semaine pour les ventes.
# Capteurs machine : détection de ruptures en R
library(changepoint)
capteurs <- read.csv("capteurs_machine.csv")
# Moyenne journalière : on efface le cycle de 24 h pour ne garder que le niveau
capteurs$jour <- substr(capteurs$horodatage, 1, 10)
temp_jour <- tapply(capteurs$temperature, capteurs$jour, mean)
# PELT : découpage optimal, chaque rupture coûte une pénalité (MBIC)
res <- cpt.mean(as.numeric(temp_jour), method = "PELT", penalty = "MBIC")
ruptures <- cpts(res)
cat("Nombre de ruptures :", length(ruptures), "\n")
cat("Dernier jour avant rupture :", names(temp_jour)[ruptures], "\n")
cat("Niveau moyen par segment :", round(param.est(res)$mean, 1), "°C\n")
plot(res, xlab = "Jour", ylab = "Température moyenne (°C)")
# Capteurs machine : détection de ruptures en Python
import numpy as np
import pandas as pd
import ruptures as rpt
capteurs = pd.read_csv("capteurs_machine.csv", parse_dates=["horodatage"])
# Moyenne journalière : on efface le cycle de 24 h pour ne garder que le niveau
temp_jour = capteurs.groupby(capteurs["horodatage"].dt.date)["temperature"].mean()
signal = temp_jour.values
# PELT : découpage optimal, chaque rupture coûte une pénalité
algo = rpt.Pelt(model="l2", min_size=2, jump=1).fit(signal)
fins = algo.predict(pen=3 * np.log(len(signal))) # fins de segment, la dernière = longueur de la série
print("Nombre de ruptures :", len(fins) - 1)
debut = 0
for fin in fins:
print(f"{temp_jour.index[debut]} -> {temp_jour.index[fin - 1]} : {signal[debut:fin].mean():.1f} °C en moyenne")
debut = fin
Une anomalie est un point ou un court épisode qui sort de l'ordinaire puis revient à la normale. Une rupture est un changement durable : après elle, la série vit à un autre niveau. Sur le jeu d'exemple, les pics isolés de température sont des anomalies, le saut de fin février est une rupture.
Partir d'un critère standard (MBIC, BIC), puis vérifier sur des événements connus. Tracer le nombre de ruptures en fonction de la pénalité aide : la bonne valeur se trouve souvent sur un plateau où ce nombre ne bouge plus. En R, penalty = "CROPS" calcule d'un coup les solutions de toute une plage de pénalités.
La segmentation binaire coupe la série en deux, puis recommence dans chaque morceau : rapide, mais approchée. PELT trouve le découpage optimal pour le coût pénalisé, avec un temps de calcul souvent proche du linéaire. Sauf série gigantesque, PELT est le bon choix par défaut.
Retire la saisonnalité et la tendance. Les ruptures se cherchent ensuite sur ce qui reste.
Voir la fiche → des régimes qui reviennentQuand la série alterne entre quelques états (calme, agité) qui reviennent, plutôt qu'une suite de périodes uniques.
Voir la fiche → pour les pics isolésSignale un point anormal, pas un changement durable. En surveillance, les deux se complètent.
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