Quelle détection de valeurs aberrantes peut détecter ces valeurs aberrantes?


7

J'ai un vecteur et je veux y détecter des valeurs aberrantes.

La figure suivante montre la distribution du vecteur. Les points rouges sont des valeurs aberrantes. Les points bleus sont des points normaux. Les points jaunes sont également normaux.

J'ai besoin d'une méthode de détection des valeurs aberrantes (une méthode non paramétrique) qui peut simplement détecter les points rouges comme des valeurs aberrantes. J'ai testé certaines méthodes comme l'IQR, l'écart type mais elles détectent également les points jaunes comme des valeurs aberrantes.

Je sais qu'il est difficile de détecter uniquement le point rouge, mais je pense qu'il devrait y avoir un moyen (même une combinaison de méthodes) de résoudre ce problème.

entrez la description de l'image ici

Les points sont des lectures d'un capteur pour une journée. Mais les valeurs du capteur changent à cause de la reconfiguration du système (l'environnement n'est pas statique). L'époque des reconfigurations est inconnue. Les points bleus correspondent à la période précédant la reconfiguration. Les points jaunes sont pour après la reconfiguration ce qui provoque des écarts dans la distribution des lectures (mais sont normaux). Les points rouges sont le résultat d'une modification illégale des points jaunes. En d'autres termes, ce sont des anomalies qui doivent être détectées.

Je me demande si l'estimation de la fonction de lissage du noyau ('pdf', 'survivant', 'cdf', etc.) pourrait aider ou non. Quelqu'un pourrait-il m'aider sur ses principales fonctionnalités (ou autres méthodes de lissage) et sa justification à utiliser dans un contexte pour résoudre un problème?


3
Qu'est-ce qui fait ces valeurs aberrantes et non les jaunes? Avez-vous des exemples de valeurs aberrantes ou avez-vous simplement obtenu un ensemble? Cela ressemble-t-il à celui-ci? Combien de dimensions?
Jan van der Vegt

Merci. Les points sont des lectures d'un capteur pour une journée. Mais les valeurs du capteur changent à cause des reconfigurations du système (l'environnement n'est pas statique). Les points bleus correspondent à la période précédant la reconfiguration. Les points jaunes sont pour après reconfiguration ce qui provoque un écart dans la distribution des lectures (mais sont normaux). Les points rouges sont le résultat d'une modification illégale des points jaunes. C'est une dimension.
Arkan

1
À quelle fréquence ces reconfigurations se produisent-elles? Ces points rouges se produisent-ils toujours? Vous pouvez examiner certaines méthodes de lissage des séries chronologiques.
Jan van der Vegt

C'est dynamique et rien n'est définitif. Non. Les points rouges sont des anomalies créées par des modifications illégales et ne se produisent pas toujours. Pourrais-je vous demander de nommer certaines méthodes bien connues (méthodes de lissage)? Quelle est leur principale fonctionnalité?
Arkan

Lorsque vous recherchez des changements de niveau, vous pouvez trouver des changements dans l'interception. Publiez vos données Voir l'article de Balke Détecter les changements de niveau dans les séries chronologiques Nathan S. Balke Journal of Business & Economic Statistics Vol. 11, n ° 1 (janvier 1993), pp. 81-92
Tom Reilly

Réponses:


3

Vous pouvez visualiser vos données comme une série chronologique où une mesure ordinaire produit une valeur très proche de la valeur précédente et un recalibrage produit une valeur avec une grande différence par rapport au prédécesseur.

Voici des exemples de données simulées basées sur une distribution normale avec trois moyennes différentes similaires à votre exemple. entrez la description de l'image ici

En calculant la différence avec la valeur précédente (une sorte de dérivation), vous obtenez les données suivantes:

entrez la description de l'image ici

Mon interprétation de votre description est que vous tolérez le recalibrage (c'est-à-dire des points sur une plus grande distance de zéro, le rouge dans le diagramme), mais ils doivent échanger entre des valeurs positives et négatives (c'est-à-dire correspondant au passage de l'état bleu au jaune et retour).

Cela signifie que vous pouvez configurer une alarme en voyant un deuxième point rouge du côté négatif ou positif .


J'apprécie vraiment votre réponse. Oui, on peut dire que c'est comme un recalibrage et c'est une bonne analogie. Votre approche est bonne. Je l'ai testé. Le résultat est exactement comme celui que vous avez dessiné. Le premier point rouge est le premier point des points jaunes. Le deuxième point est le premier point des points rouges. Le troisième point rouge est le dernier point des points rouges. Par conséquent, il est difficile de découvrir des connaissances à partir de ces données. C'est parce que nous n'avons pas pu discuter des points rouges après le premier point rouge. Nous pouvons avoir besoin de visualiser les données primaires pour conclure, mais il s'agit d'une intervention humaine.
Arkan

@Marmite Bomber Ce serait bien si vous partagez l'extrait de code pour saisir l'idée d'un point de vue de la programmation.
Mario

@Mario bonne idée - laissez-moi voir si je peux le trouver après plus de deux ans;)
Marmite Bomber

@Mario voir mon autre réponse;)
Marmite Bomber

@MarmiteBomber merci pour les commentaires mais mec j'étais intéressé par le code Python!
Mario

0

Si vous utilisez la journalisation, vous pouvez utiliser une moyenne mobile qui se réinitialise si la configuration change. Cependant, cela aura la faiblesse d'avoir besoin d'au moins certaines données avant de pouvoir détecter une telle valeur aberrante.

Vos données sont plutôt "sympas" (pas trop de bruit). Je recommanderais de prendre la moyenne des 10-20 derniers points dans la même configuration. Si ces valeurs sont une sorte de quantité comptée, vous pouvez prendre une erreur de poisson pour des points de données individuels et calculer l'erreur en moyenne.

De combien de données historiques disposez-vous? Si vous en avez beaucoup, vous pouvez l'utiliser pour affiner votre taux d'alarme de manière à obtenir un ratio acceptable de toutes les valeurs aberrantes réelles tout en obtenant un nombre minimal de fausses alertes. Ce qui est acceptable dépend du problème spécifique. (Coût des faux positifs ou valeurs aberrantes non détectées et leur abondance).


Merci. Malheureusement, les reconfigurations sont différentes et cela ne nous permet pas de régler un taux d'alarme. Pouvez-vous expliquer un peu plus la moyenne des points récents?
Arkan

Je suppose que ces points de données sont dans l'ordre chronologique - n'est-ce pas? Ensuite, vous pouvez pour chaque point utiliser les informations de l'axe des y (Données dans votre tracé) des XX derniers points. Disons 10, mais cela dépend évidemment un peu de l'apparence de vos données. Pour ces 10 points, vous calculez ensuite la moyenne ou mieux si vous avez une estimation d'erreur sur les mesures individuelles de l'erreur pondérée.
El Burro

Vous pouvez toujours régler le taux d'alarme car vous ne définissez pas une alarme comme un écart par rapport à une valeur fixe supérieure à X mais comme l'écart par rapport à une moyenne mobile.
El Burro

Merci, oui. Ils dans l'ordre chronologique. Je me demande si l'estimation de la fonction de lissage du noyau est une aide ou non.
Arkan

Je suggère de commencer avec une moyenne mobile simple qui se réinitialise à chaque changement de configuration et de voir si cela fait le travail. Si vous ne disposez pas des informations disponibles lorsqu'un changement de configuration se produit en fonction de l'apparence à l'œil nu, je ne vois aucune autre option fiable pour séparer le jaune du rouge. Au moins dans l'exemple donné, il ne semble pas que la forme soit très différente entre les deux.
El Burro

0

Permet d'illustrer l'approche proposée dans l' autre réponse avec un exemple simple

Obtenir des données

Nous simulerons les données avec sept morceaux produits avec une distribution normale avec des moyennes différentes.

Ceci est important car il nous permet de bien distinguer les groupes et de détecter simplement les points de rupture. Cette réponse utilise une approche de seuil élémentaire, un moyen plus avancé pourrait être nécessaire pour vos données réelles.

dt <- rbind(
data.frame(color=1, x =  round(runif(50, min = 0, max = 50)), y = rnorm (50,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 50, max = 65)), y = rnorm (15,mean=4.5, sd=.03)),
data.frame(color=2, x =  round(runif(15, min = 65, max = 80)), y = rnorm (15,mean=3.3, sd=.03)),
data.frame(color=1, x =  round(runif(70, min = 80, max = 150)), y = rnorm (70,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 150, max = 165)), y = rnorm (15,mean=3.3, sd=.03)), 
data.frame(color=3, x =  round(runif(15, min = 165, max = 180)), y = rnorm (15,mean=2.9, sd=.03)), 
data.frame(color=1, x =  round(runif(120, min = 180, max = 300)), y = rnorm (120,mean=3.9, sd=.03))
)
dt$color <- as.factor(dt$color)
dt <- as_tibble(dt)

entrez la description de l'image ici

Dérivez les points de rupture

Avec une simple différence par rapport au point précédent, lag(y) nous obtenons les valeurs aberrantes. Ils sont classés en utilisant un seuil.

entrez la description de l'image ici

Changement de classification des comportements

Sur la base des règles que vous avez décrites, les points de rupture sont classés comme OKet problem.

La règle stipule que deux changements dans la même direction ne sont pas autorisés. Le deuxième mouvement dans la direction previos est considéré comme un problème.

Vous devrez peut-être ajuster cette interprétation simple si votre logik est plus avancé.

## extract outliers and get previous value
dt2 <- filter(dt2, diff != 0) %>%
   mutate(cs = cumsum(diff),
          prev = lag(diff),
          cls = case_when(
                      diff * prev >  0 ~ "problem",
                      TRUE ~ "OK"))
## show 
dt2 %>% select(x,y,diff,prev,cls)                       
## # A tibble: 6 x 5
##       x     y  diff  prev cls    
##   <dbl> <dbl> <dbl> <dbl> <chr>  
## 1    50  4.53     1    NA OK     
## 2    66  3.32    -1     1 OK     
## 3    80  3.87     1    -1 OK     
## 4   151  3.32    -1     1 OK     
## 5   167  2.91    -1    -1 problem
## 6   180  3.87     1    -1 OK

Présentation

Enfin, vous projetez les valeurs aberrantes reconnues aux données d'origine

## project in the original data
ggplot(data=dt, mapping = aes(x=x, y=y) )  +
  geom_point(mapping = aes(color = color) )  +
  scale_color_manual(values=c("blue", "yellow", "red","green","red")) +
  theme(legend.position="none") +
  geom_vline(data=dt2, aes(xintercept=x, color=cls),
             linetype="dashed", size = 2)

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.