Je travaille avec une grande quantité de séries chronologiques. Ces séries temporelles sont essentiellement des mesures de réseau toutes les 10 minutes, et certaines sont périodiques (c'est-à-dire la bande passante), d'autres pas (c'est-à-dire la quantité de trafic de routage).
Je voudrais un algorithme simple pour faire une "détection des valeurs aberrantes" en ligne. Fondamentalement, je souhaite conserver en mémoire (ou sur disque) l'intégralité des données historiques de chaque série chronologique et détecter toute valeur aberrante dans un scénario réel (chaque fois qu'un nouvel échantillon est capturé). Quel est le meilleur moyen d’atteindre ces résultats?
J'utilise actuellement une moyenne mobile afin de supprimer un peu de bruit, mais ensuite? Des choses simples comme l'écart type, fou, ... par rapport à l'ensemble des données ne fonctionnent pas bien (je ne peux pas supposer que les séries chronologiques sont stationnaires), et j'aimerais quelque chose de plus "précis", idéalement une boîte noire telle que:
double outlier_detection (double * vecteur, double valeur);
où vecteur est le tableau de double contenant les données historiques et la valeur renvoyée est le score d'anomalie pour le nouvel échantillon "valeur".
Réponses:
Voici une simple fonction R qui trouvera des valeurs éloignées de la série temporelle (et les affichera éventuellement dans un graphique). Il traitera les séries chronologiques saisonnières et non saisonnières. L'idée de base est de trouver des estimations robustes de la tendance et des composantes saisonnières et de les soustraire. Puis trouvez des valeurs aberrantes dans les résidus. Le test pour les valeurs aberrantes résiduelles est le même que pour la boîte à moustaches standard - les points supérieurs à 1,5 IQR au-dessus ou en dessous des quartiles inférieur et supérieur sont considérés comme des valeurs aberrantes. Le nombre d'IQR au-dessus / au-dessous de ces seuils est renvoyé sous forme de "score" aberrant. Donc, le score peut être n'importe quel nombre positif et sera égal à zéro pour les non-aberrants.
Je réalise que vous n'implémentez pas ceci dans R, mais je trouve souvent qu'une fonction R est un bon point de départ. Ensuite, la tâche est de traduire cela dans la langue requise.
la source
Une bonne solution aura plusieurs ingrédients, y compris:
Utilisez une fenêtre mobile résistante et lisse pour éliminer la non-stationnarité.
Ré-exprimez les données d'origine de sorte que les résidus par rapport au lissé soient répartis de manière approximativement symétrique. Compte tenu de la nature de vos données, il est probable que leurs racines carrées ou logarithmes donnent des résidus symétriques.
Appliquez les méthodes de la carte de contrôle, ou au moins la pensée de la carte de contrôle, aux résidus.
En ce qui concerne ce dernier point, la carte de contrôle montre que des seuils "conventionnels" tels que 2 SD ou 1,5 fois le IQR au-delà des quartiles fonctionnent mal car ils génèrent trop de faux signaux incontrôlables. Les gens utilisent généralement 3 écarts-types dans les tableaux de contrôle, d'où 2,5 (voire 3) le IQR au-delà des quartiles serait un bon point de départ.
J'ai plus ou moins décrit la nature de la solution de Rob Hyndman en y ajoutant deux points principaux: le besoin éventuel de ré-exprimer les données et la sagesse de faire preuve de plus de prudence en signalant une valeur aberrante. Je ne suis pas sûr que Loess soit bon pour un détecteur en ligne, car cela ne fonctionne pas bien sur les terminaux. Vous pourriez plutôt utiliser quelque chose d'aussi simple qu'un filtre médian en mouvement (comme dans le lissage résistant de Tukey). Si les valeurs aberrantes n'entrent pas en rafales, vous pouvez utiliser une fenêtre étroite (5 points de données, peut-être, qui ne fonctionneront qu'avec une rafale de 3 valeurs aberrantes ou plus dans un groupe de 5).
Une fois que vous avez effectué l'analyse pour déterminer une bonne ré-expression des données, il est peu probable que vous deviez changer la ré-expression. Par conséquent, votre détecteur en ligne n'a vraiment besoin que de référencer les valeurs les plus récentes (la dernière fenêtre) car il n'utilisera pas du tout les données précédentes. Si vous avez de très longues séries chronologiques, vous pouvez aller plus loin dans l'analyse de l'autocorrélation et de la saisonnalité (telles que les fluctuations journalières ou hebdomadaires récurrentes) afin d'améliorer la procédure.
la source
(Cette réponse répond à une question en double (maintenant fermée) de Détecter les événements en attente , qui présente certaines données sous forme graphique.)
La détection des valeurs aberrantes dépend de la nature des données et de ce que vous êtes prêt à assumer à leur sujet. Les méthodes générales reposent sur des statistiques robustes. L'esprit de cette approche est de caractériser la majeure partie des données de manière à ne pas être influencé par des valeurs aberrantes, puis de pointer sur des valeurs individuelles ne correspondant pas à cette caractérisation.
Comme il s’agit d’une série chronologique, le fait de devoir (re) détecter les valeurs aberrantes sur une base continue s’ajoute à la complication. Si cela doit être fait au fur et à mesure du déroulement de la série, nous ne pouvons utiliser que des données plus anciennes pour la détection, pas des données futures! De plus, comme protection contre les nombreux tests répétés, nous voudrions utiliser une méthode qui a un très faible taux de faux positifs.
Ces considérations suggèrent d'exécuter un test des valeurs aberrantes de fenêtre mobile simple et robuste sur les données . Il existe de nombreuses possibilités, mais une solution simple, facile à comprendre et à appliquer est basée sur un MAD en cours: déviation absolue médiane par rapport à la médiane. Il s'agit d'une mesure fortement robuste de la variation dans les données, semblable à un écart-type. Un pic éloigné serait supérieur de plusieurs DAM ou plus à la médiane.
Il reste encore quelques ajustements à faire : quelle déviation par rapport au volume de données devrait être considérée comme dépassée et combien de temps dans le passé faut-il regarder? Laissons cela comme paramètres d'expérimentation. Voici unex=(1,2,…,n) n=1150 y
R
implémentation appliquée aux données (avec pour émuler les données) avec les valeurs correspondantes :n = 1150 yAppliqué à un ensemble de données tel que la courbe rouge illustrée dans la question, il produit ce résultat:
Les données sont affichées en rouge, la fenêtre de 30 jours des seuils médians + 5 * MAD en gris et les valeurs aberrantes - qui sont simplement les valeurs de données situées au-dessus de la courbe grise - en noir.
(Le seuil ne peut être calculé qu'à partir de la fin de la fenêtre initiale. Le premier seuil est utilisé pour toutes les données de cette fenêtre initiale: c'est pourquoi la courbe grise est plate entre x = 0 et x = 30.)
Les effets de la modification des paramètres sont (a) l’augmentation de la valeur de
window
aura tendance à lisser la courbe grise et (b) l’augmentation dethreshold
la valeur de la courbe grise. Sachant cela, on peut prendre un segment initial des données et identifier rapidement les valeurs des paramètres qui séparent le mieux les pics périphériques du reste des données. Appliquez ces valeurs de paramètre à la vérification du reste des données. Si un graphique montre que la méthode se détériore avec le temps, cela signifie que la nature des données change et que les paramètres peuvent nécessiter un réajustement.Notez que cette méthode suppose peu de choses sur les données: elles ne doivent pas nécessairement être distribuées normalement; ils ne doivent présenter aucune périodicité; ils n'ont même pas besoin d'être non négatif. Tout ce qu’elle suppose, c’est que les données se comportent de manière raisonnablement similaire dans le temps et que les pics périphériques sont visiblement plus élevés que le reste des données.
Si quelqu'un souhaite expérimenter (ou comparer une autre solution à celle proposée ici), voici le code que j'ai utilisé pour produire des données telles que celles présentées dans la question.
la source
Si des hypothèses concernant une approche particulière vous inquiètent, une approche consiste à former un certain nombre d'apprenants sur des signaux différents, puis à utiliser des méthodes d'ensemble et à agréger les «votes» de vos apprenants pour établir la classification des valeurs aberrantes.
BTW, cela peut valoir la peine d'être lu ou écrémé, car il fait référence à quelques approches du problème.
la source
Je suppose qu'un modèle de série chronologique sophistiqué ne fonctionnera pas pour vous en raison du temps nécessaire pour détecter les valeurs éloignées à l'aide de cette méthodologie. Par conséquent, voici une solution de contournement:
Commencez par établir un modèle de trafic «normal» de base pour une année sur la base d'une analyse manuelle des données historiques, qui prend en compte l'heure du jour, le jour de la semaine par rapport au week-end, le mois de l'année, etc.
Utilisez cette ligne de base avec un mécanisme simple (par exemple, la moyenne mobile suggérée par Carlos) pour détecter les valeurs éloignées.
Vous pouvez également consulter la documentation sur le contrôle statistique des processus pour trouver des idées.
la source
Ajustez les données de manière saisonnière, de sorte qu'un jour normal semble plus plat. Vous pouvez prélever l'échantillon de 17h00 et soustraire ou diviser la moyenne des 30 derniers jours à 17h00. Recherchez ensuite les N écarts-types (mesurés à l'aide de données pré-ajustées) pour les valeurs aberrantes. Cela pourrait être fait séparément pour les "saisons" hebdomadaires et quotidiennes.
la source
Une alternative à l'approche décrite par Rob Hyndman serait d'utiliser Holt-Winters Forecasting . Les bandes de confiance dérivées de Holt-Winters peuvent être utilisées pour détecter les valeurs éloignées. Voici un article décrivant comment utiliser Holt-Winters pour "Détection de comportement aberrant dans les séries chronologiques pour la surveillance du réseau". Une implémentation pour RRDTool peut être trouvée ici .
la source
L'analyse spectrale détecte la périodicité dans des séries chronologiques stationnaires. L’approche du domaine fréquentiel basée sur l’estimation de la densité spectrale est une approche que je vous recommanderais tout d’abord.
Si, pour certaines périodes, irrégularité signifie un pic beaucoup plus élevé que ce qui est typique pour cette période, la série présentant de telles irrégularités ne serait pas stationnaire et une analyse spectrale ne serait pas appropriée. Mais en supposant que vous ayez identifié la période comportant les irrégularités, vous devriez pouvoir déterminer approximativement la hauteur maximale normale et pouvoir ensuite fixer un seuil à un niveau supérieur à cette moyenne pour désigner les cas irréguliers.
la source
S'agissant d'une série chronologique, un simple filtre exponentiel http://en.wikipedia.org/wiki/Exponential_smoothing lissera les données. C'est un très bon filtre car vous n'avez pas besoin d'accumuler d'anciens points de données. Comparez chaque valeur de données lissée récemment avec sa valeur non lissée . Une fois que l'écart dépasse un certain seuil prédéfini (selon ce que vous pensez être une valeur aberrante dans vos données), votre valeur aberrante peut alors être facilement détectée.
Dans CI, procédez comme suit pour un exemple 16 bits en temps réel (je pense que cela se trouve quelque part ici <Explication - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -approximation-a-un-filtre-moyenne-mobile >)
la source
Vous pouvez utiliser l'écart type des N dernières mesures (vous devez choisir un N approprié). Un bon score d'anomalie serait le nombre d'écarts-types d'une mesure par rapport à la moyenne mobile.
la source
ce que je fais est de regrouper les mesures par heure et par jour de la semaine et de comparer les écarts types de ces mesures. Ne corrige toujours pas pour des choses comme les vacances et la saisonnalité été / hiver, mais c'est correct la plupart du temps.
L'inconvénient est que vous devez vraiment collecter une année environ de données pour en avoir suffisamment pour que stddev commence à avoir un sens.
la source
Je suggère le schéma ci-dessous, qui devrait être implémenté dans un jour ou deux:
Entraînement
Calcul de la "valeur aberrante":
Pour l'échantillon unique dont vous souhaitez connaître la "valeur aberrante":
Ce sera votre score aberrant: 100% est une aberration extrême.
PS Pour calculer la distance de Mahalanobis , utilisez la matrice de corrélation, pas la matrice de covariance. Ceci est plus robuste si les mesures de l'échantillon varient en unité et en nombre.
la source
Pour le cas où il faut rapidement calculer les valeurs aberrantes, on pourrait utiliser l’idée de Rob Hyndman et Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , bibliothèque (spoutlier), fonction qsp) pour calculer les valeurs aberrantes comme suit:
la source
la détection d'anomalies nécessite la construction d'une équation qui décrit l'attente. La détection d'intervention est disponible dans un contexte non causal et causal. Si l'on a une série de prédicteurs comme le prix, les choses peuvent devenir un peu compliquées. Les autres réponses ne semblent pas prendre en compte la cause attribuable aux séries de prédicteurs spécifiés par l'utilisateur, telles que le prix, et pourraient donc être erronées. La quantité vendue peut dépendre du prix, peut-être des prix antérieurs et peut-être de la quantité vendue dans le passé. La base de la détection des anomalies (impulsions, impulsions saisonnières, changements de niveau et tendances de l'heure locale) se trouve dans https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf
la source