1.2
Alertes & signaux faibles
L'agrégat national paraît sain : les Distributeurs remontent même de +31,6 % en septembre. Pourtant, deux quartiers décrochent.
Deux méthodes complémentaires :
SQL : chaque canal × zone comparé à sa moyenne des 3 derniers mois, avec un seuil statistique (écart > 2σ, loi de Poisson) pour ignorer le bruit.
Python · CUSUM : accumule les petits écarts et repère les dérives qui s'installent, que la moyenne mobile finit par absorber.
Le SQL attrape Tampouy. Le CUSUM retrouve Tampouy et Tanghin, les deux zones sabotées dans la simulation, et rien d'autre.
Part de la zone dans les ventes Distributeurs
référence = moyenne 2025
sql/03_alertes.sql SQL
analysis/ruptures.py — CUSUM Python
def cusum_lower(z_scores, k=0.5, h=5.0):
"""CUSUM unilatéral : renvoie le premier mois où la dérive cumulée dépasse h."""
statistic = 0.0
for i, z in enumerate(z_scores):
statistic = max(0.0, statistic - z - k)
if statistic > h:
return i
return None
# Ventes attendues ~ Binomiale(total du canal, part historique de la zone)
expected = watch["channel_total"] * ref_share
z = (watch["sales"] - expected) / np.sqrt(expected * (1 - ref_share))
idx = cusum_lower(z.to_numpy())