Cómo detectar anomalías en Real-Time Analytics: paso a paso
Aprende a detectar anomalías en Real-Time Analytics aplicando una técnica simple de z-score sobre ventanas temporales. Detectar anomalías en Real-Time Analytics es útil para identificar fallos, picos de tráfico o comportamientos sospechosos de inmediato y disparar alertas.
Requisitos previos
- Cuenta y acceso a una plataforma que soporte consultas en tiempo real (por ejemplo, Azure Data Explorer / Kusto o similar).
- Stream de datos con timestamp y una métrica numérica (p. ej.: latency, cpu, requests).
- Noções básicas de KQL (Kusto Query Language) ou SQL de streaming.
Paso 1: Entender por qué usar z-score en Real-Time Analytics
El z-score normaliza valores respecto a la media y la desviación estándar de la ventana. Sirve para detectar valores que se alejan mucho del comportamiento normal. En Real-Time Analytics es simple, eficiente y fácil de interpretar: valores con z-score por encima de un umbral (p. ej.: 3) se consideran anómalos.
Paso 2: Agregar la métrica por ventanas temporales
Primero, se calculan la media y la desviación estándar en una ventana deslizante (p. ej.: 5 minutos) para tener contexto temporal. En KQL se usa bin() con summarize por sliding_window o make-series; aquí mostramos un ejemplo con summarize por 1 minuto y un windowing sencillo.
// Exemplo KQL: agregação por 1 minuto
let WindowSize = 1m;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), count = count() by bin(Timestamp, WindowSize)
| order by Timestamp asc
Paso 3: Calcular el z-score para cada punto en tiempo real
Para cada evento o valor agregado, se calcula z = (valor - media) / desviación. Si procesas evento a evento, únelo al contexto de la ventana correspondiente. Usando las agregaciones del paso anterior, aplica la fórmula.
// Exemplo KQL: calcular z-score por ventana
let WindowSize = 1m;
let Threshold = 3.0;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), last_value = max(MetricValue) by bin(Timestamp, WindowSize)
| extend z_score = iff(stdev_value == 0, 0.0, (last_value - avg_value) / stdev_value)
| extend is_anomaly = abs(z_score) > Threshold
| order by Timestamp asc
Paso 4: Tratar ventanas con pocos datos y evitar falsos positivos
Si la ventana tiene pocos eventos, la media y la desviación no son fiables. Define un mínimo de count e ignora ventanas pequeñas. También puedes suavizar la media usando EWMA para reducir la sensibilidad al ruido.
// Exemplo KQL: ignorar janelas com poucos pontos
let WindowSize = 1m;
let MinCount = 5;
let Threshold = 3.0;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), cnt = count(), last_value = max(MetricValue) by bin(Timestamp, WindowSize)
| where cnt >= MinCount
| extend z_score = (last_value - avg_value) / stdev_value
| extend is_anomaly = abs(z_score) > Threshold
| order by Timestamp asc
Paso 5: Generar alertas en tiempo real
Cuando is_anomaly es true, crea una acción: registra en una tabla de alertas, envía a un webhook o a un sistema de notificación. Muchos sistemas de Real-Time Analytics permiten enlazar una query a una alerta. Guarda información útil: Timestamp, valor, z_score, ventana.
// Exemplo KQL: resultados de anomalia para exportar
let WindowSize = 1m;
let MinCount = 5;
let Threshold = 3.0;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), cnt = count(), last_value = max(MetricValue) by bin(Timestamp, WindowSize)
| where cnt >= MinCount
| extend z_score = (last_value - avg_value) / stdev_value
| where abs(z_score) > Threshold
| project AlertTime = Timestamp, Value = last_value, z_score, cnt, avg_value
Verificar el resultado
Confirma que tienes filas con is_anomaly = true o que la query de alertas devuelve eventos. Valida manualmente algunos eventos: compara el valor y el contexto (media y stdev) para garantizar que son realmente anomalías. Verifica también ventanas con cnt < MinCount para no perder casos importantes.
Conclusión
Detectar anomalías en Real-Time Analytics con z-score es un enfoque rápido e interpretable para identificar desviaciones. Próximos pasos: experimentar con EWMA, modelos de aprendizaje automático (p. ej.: Isolation Forest) o combinar múltiples métricas para reducir falsos positivos. Consejo: empieza con umbrales conservadores y ajústalos en función de falsos positivos/negativos — ¿cuál es la métrica que más te preocupa?