Tenemos un demonio que lee datos de algunos sensores, y entre las cosas que calcula (además de simplemente informar del estado) está el tiempo medio que tardan los sensores en cambiar de un valor a otro. Mantiene una media de 64 puntos de datos y asume que el tiempo de ejecución es bastante constante.
Por desgracia, como demuestra el gráfico siguiente, los datos de entrada no son los más prístinos:
(Cada línea representa un conjunto diferente de datos; el eje x no significa realmente nada, aparte de un vago eje temporal histórico).
Mi solución obvia sería crear un histograma de los datos y luego elegir la moda. Sin embargo, me preguntaba si habría otros métodos que dieran mejores resultados o fueran más adecuados para operar con una media corrida. Algunas búsquedas rápidas en Wikipedia sugieren que los algoritmos para detectar valores atípicos también pueden ser adecuados. La simplicidad es una ventaja, ya que el demonio está escrito en C.
Editar : He buscado en Wikipedia y he encontrado estas técnicas:
-
Criterio de Chauvenet: utilizando la media y la desviación típica, calcular la probabilidad de que ocurra un dato concreto y excluirlo si la probabilidad es realmente tan mala es inferior al 50%. Aunque esto parece adecuado para corregir una media sobre la marcha, no estoy muy convencido de su eficacia: parece que con conjuntos de datos grandes no querría descartar puntos de datos.
-
La prueba de Grubbs: Otro método que utiliza la diferencia de la media a la desviación típica, y tiene alguna expresión para cuando se rechaza la hipótesis de "no valores atípicos"
-
La distancia del cocinero: Mide la influencia que tiene un punto de datos en una regresión por mínimos cuadrados; nuestra aplicación probablemente lo rechazaría si superase 1
-
Media truncada: Descarta el extremo inferior y el extremo superior, y luego toma la media como normal
¿Alguien tiene alguna experiencia concreta y puede comentar estas técnicas estadísticas?
Además, algunos comentarios sobre la situación física: estamos midiendo el tiempo medio hasta la finalización de una lavadora mecánica, por lo que su tiempo de funcionamiento debería ser bastante constante. No estoy seguro de si en realidad tiene una distribución normal.
Edición 2 : Otra pregunta interesante: cuando el demonio está arrancando, es decir, no tiene datos previos que analizar, ¿cómo debería tratar los datos entrantes? ¿Simplemente no hacer ninguna poda de valores atípicos?
Edición 3 : Una cosa más... si el hardware cambia de tal forma que los tiempos de ejecución sean diferentes, ¿merece la pena hacer el algoritmo lo suficientemente robusto como para que no descarte estos nuevos tiempos de ejecución?