¿Qué detección de valores atípicos puede detectar estos valores atípicos?

7

Tengo un vector y quiero detectar valores atípicos en él.

La siguiente figura muestra la distribución del vector. Los puntos rojos son valores atípicos. Los puntos azules son puntos normales. Los puntos amarillos también son normales.

Necesito un método de detección de valores atípicos (un método no paramétrico) que pueda detectar puntos rojos como valores atípicos. Probé algunos métodos como IQR, desviación estándar, pero también detectan puntos amarillos como valores atípicos.

Sé que es difícil detectar solo el punto rojo, pero creo que debería haber una forma (incluso una combinación de métodos) para resolver este problema.

ingrese la descripción de la imagen aquí

Los puntos son lecturas de un sensor por un día. Pero los valores del sensor cambian debido a la reconfiguración del sistema (el entorno no es estático). Los tiempos de las reconfiguraciones son desconocidos. Los puntos azules corresponden al período anterior a la reconfiguración. Los puntos amarillos son para después de la reconfiguración, lo que causa una desviación en la distribución de las lecturas (pero son normales). Los puntos rojos son el resultado de la modificación ilegal de los puntos amarillos. En otras palabras, son anomalías que deben detectarse.

Me pregunto si la estimación de la función de suavizado del núcleo ('pdf', 'survivor', 'cdf', etc.) podría ayudar o no. ¿Alguien ayudaría sobre su funcionalidad principal (u otros métodos de suavizado) y la justificación para usar en un contexto para resolver un problema?

Arkan
fuente
3
¿Qué hace que estos valores atípicos y no los amarillos? ¿Tiene ejemplos de valores atípicos o acaba de obtener un conjunto? ¿Se parece a este? Cuantas dimensiones
Jan van der Vegt
Gracias. Los puntos son lecturas de un sensor por un día. Pero los valores del sensor cambian debido a las reconfiguraciones del sistema (el entorno no es estático). Los puntos azules corresponden al período anterior a la reconfiguración. Los puntos amarillos son para después de la reconfiguración, lo que causa una desviación en la distribución de las lecturas (pero son normales). Los puntos rojos son el resultado de la modificación ilegal de los puntos amarillos. Es una dimensión.
Arkan
1
¿Con qué frecuencia ocurren estas reconfiguraciones? ¿Siempre ocurren estos puntos rojos? Puede ver algunos métodos de suavizado de series temporales.
Jan van der Vegt
Es dinámico y nada es definitivo. No. Los puntos rojos son anomalías creadas por modificaciones ilegales y no siempre ocurren. ¿Le pediría que nombre algunos métodos conocidos (métodos de suavizado)? ¿Cuál es su funcionalidad principal?
Arkan
Cuando busca cambios de nivel, puede encontrar cambios en la intersección. Publique sus datos Vea el documento de Balke Detectando cambios de nivel en series temporales Nathan S. Balke Journal of Business & Economic Statistics Vol. 11, N ° 1 (enero de 1993), págs. 81-92
Tom Reilly el

Respuestas:

3

Puede ver sus datos como una serie temporal en la que una medición ordinaria produce un valor muy cercano al valor anterior y una recalibración produce un valor con una gran diferencia con respecto al predecesor.

Aquí hay datos de muestra simulados basados ​​en la distribución normal con tres medios diferentes similares a su ejemplo. ingrese la descripción de la imagen aquí

Al calcular la diferencia con el valor anterior (una especie de derivación) obtiene los siguientes datos:

ingrese la descripción de la imagen aquí

Mi interpretación de su descripción es que tolera la recalibración (es decir, puntos a mayor distancia de cero, rojo en el diagrama), pero deben intercambiar entre valores positivos y negativos (es decir, el cambio del estado azul al amarillo y espalda).

Esto significa que puede configurar una alarma para ver un segundo punto rojo, ya sea en el lado negativo o positivo .

Bombardero Marmite
fuente
Realmente aprecio tu respuesta. Sí, podemos decir que es como una recalibración y esta es una buena analogía. Tu enfoque es bueno. Lo probé El resultado es exactamente como el que dibujaste. El primer punto rojo es el primer punto de los puntos amarillos. El segundo punto es el primer punto de los puntos rojos. El tercer punto rojo es el último punto de los puntos rojos. Por lo tanto, es difícil descubrir el conocimiento de estos datos. Esto se debe a que no pudimos discutir los puntos rojos después del primer punto rojo. Es posible que necesitemos visualizar los datos primarios para concluir, pero esta es una intervención humana.
Arkan
@Marmite Bomber Sería bueno si compartes el fragmento de códigos para captar la idea desde el punto de vista de la programación.
Mario
@Mario buena idea - déjame ver si puedo encontrarlo después de más de dos años;)
Marmite Bomber
@ Mario ve mi otra respuesta;)
Marmite Bomber
@MarmiteBomber gracias por los comentarios, pero ¡estaba interesado en el código Python!
Mario
0

Si usa el registro, puede usar un promedio continuo que se restablece si la configuración cambia. Sin embargo, esto tendrá la debilidad de que necesita al menos algunos datos antes de poder detectar un valor atípico.

Sus datos se ven bastante "agradables" (no demasiado ruido). Recomendaría tomar el promedio de los últimos 10-20 puntos en la misma configuración. Si estos valores son algún tipo de cantidad contada, puede tomar un error de Poisson para puntos de datos individuales y calcular el error en promedio.

¿Cuántos datos históricos tienes? Si tiene mucho, puede usarlo para ajustar su frecuencia de alarma de manera que obtenga una proporción aceptable de todos los valores atípicos reales mientras obtiene un número mínimo de advertencias falsas. Lo que es aceptable depende del problema específico. (Costo de falsos positivos o valores atípicos no detectados y su abundancia).

El burro
fuente
Gracias. Desafortunadamente, las reconfiguraciones son diferentes y esto no nos permite ajustar una frecuencia de alarma. ¿Puedes explicar un poco más sobre promediar puntos recientes?
Arkan
Supongo que estos puntos de datos están en orden cronológico, ¿correcto? Luego puede usar para cada punto la información del eje y (Datos en su diagrama) de los últimos XX puntos. Digamos 10, pero esto obviamente depende un poco de cómo se vean sus datos. Para estos 10 puntos, calcule el promedio o mejor si tiene una estimación de error en las mediciones individuales del error ponderado.
El Burro
Todavía puede ajustar la frecuencia de la alarma porque no define una alarma como una desviación de un valor fijo mayor que X, sino como la desviación de un promedio móvil.
El Burro
Gracias si. Ellos en orden cronológico. Me pregunto si la estimación de la función de suavizado del núcleo es una ayuda o no.
Arkan
Sugeriría comenzar con un promedio móvil simple que se restablezca para cada cambio de configuración y ver si hace el trabajo. Si no tiene la información disponible cuando se produce un cambio de configuración en función de cómo se ve esto a simple vista, no veo otra opción confiable para separar el amarillo del rojo. Al menos en el ejemplo dado, no parece que la forma sea muy diferente entre ambos.
El Burro
0

Vamos a ilustrar el enfoque propuesto en la otra respuesta con un ejemplo simple

Obtener datos

Simularemos los datos con siete fragmentos producidos con distribución normal con diferentes medios.

Esto es importante ya que nos permite distinguir limpiamente entre los grupos y detectar de manera simple los puntos de ruptura. Esta respuesta utiliza un enfoque de umbral elemental, es posible que se requiera una forma más avanzada para sus datos reales.

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)

ingrese la descripción de la imagen aquí

Derive los puntos de ruptura

Con una simple diferencia con respecto al punto anterior lag(y) , obtenemos los valores atípicos. Se clasifican utilizando un umbral.

ingrese la descripción de la imagen aquí

Cambio de clasificación de comportamiento

Basándose en las reglas que describió, los puntos de ruptura se clasifican como OKy problem.

La regla establece que no se permiten dos cambios en la misma dirección. El segundo movimiento en la dirección anterior se considera un problema.

Es posible que deba ajustar esta interpretación simple si su logik es más avanzado.

## 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

Presentación

Finalmente, proyecta los valores atípicos reconocidos a los datos originales

## 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)

ingrese la descripción de la imagen aquí

Bombardero Marmite
fuente