Anomaly Detection en Delphi: Una Librería Open Source para Detectar lo Inesperado
📦 En resumen: La Delphi Anomaly Detection Library es una librería open source gratuita que implementa 7 algoritmos para detectar anomalías en datos: Three Sigma, Sliding Window, EMA, Adaptive, Isolation Forest, DBSCAN y LOF. Permite identificar fraudes, errores, fallos y comportamientos anómalos en aplicaciones Delphi. Es production-ready, thread-safe y soporta tanto análisis en tiempo real como batch. Repositorio GitHub.
Introducción
“Prevenir es mejor que curar” - este antiguo dicho se aplica perfectamente al mundo del desarrollo de software y los sistemas de gestión. Demasiado a menudo nos encontramos persiguiendo problemas que podríamos haber interceptado antes de que causaran daños: pedidos con importes sospechosos, transacciones fraudulentas, sensores que funcionan mal, picos anómalos de tráfico, errores de entrada de datos.
Si tu aplicación gestiona datos, las anomalías no son una cuestión de "si" sino de "cuándo".
Todo sistema que procesa entradas de usuario, lecturas de sensores, transacciones financieras o cualquier forma de datos reales tarde o temprano encontrará valores que no encajan en el patrón esperado. La pregunta no es si las anomalías ocurrirán - ocurrirán. La pregunta es si tu sistema las detectará a tiempo para actuar, o las descubrirá solo después de que el daño esté hecho.
La detección de anomalías no es una funcionalidad opcional para casos límite; es una capa de protección fundamental que toda aplicación basada en datos debería tener.
La detección de anomalías (anomaly detection) es la rama de la ciencia de datos que se ocupa de identificar patrones inesperados, outliers y comportamientos anómalos en los datos. Técnicas que hasta hace pocos años eran dominio exclusivo de científicos de datos e investigadores ahora pueden integrarse directamente en nuestras aplicaciones de gestión, haciéndolas más inteligentes, seguras y fiables.
Es exactamente de esto de lo que hablé en mi charla “Building Applications That Prevent Their Own Disasters” en ITDevCon 2025, el evento principal del año para la comunidad Delphi europea, celebrado el 6 y 7 de noviembre en Milán. También presenté una versión reducida en italiano de la misma charla en ITDevCon Bites en Padua en octubre de 2025. La respuesta fue extraordinaria: decenas de desarrolladores se acercaron contándome escenarios donde estas técnicas podrían haber salvado situaciones críticas o prevenido pérdidas económicas significativas.
De esa presentación nació la idea de lanzar una librería open source completa, lista para usar, que permitiera a la comunidad Delphi integrar fácilmente la detección de anomalías en sus proyectos. Hoy me alegra anunciar que esta librería está disponible en GitHub.
La Librería: Delphi Anomaly Detection Algorithms
La Delphi Anomaly Detection Library es una librería completa que implementa 7 algoritmos diferentes para la detección de anomalías, cubriendo escenarios que van desde el análisis estadístico clásico hasta el machine learning avanzado.
🔗 Repositorio GitHub: github.com/danieleteti/delphi-anomalies-detectors
Características Principales
- 7 Algoritmos de Detección - Desde métodos estadísticos simples hasta técnicas ML avanzadas
- Production Ready - Thread-safe, eficiente en memoria, testeada al 100%
- Real-time & Batch - Soporta tanto datos en streaming como análisis históricos
- Integración Simple - Arquitectura modular, cero dependencias externas
- Performance Monitoring - Métricas integradas y benchmarking
- Hyperparameter Tuning - Grid search y random search con cross-validation
- Factory Patterns - Detectores pre-configurados para casos de uso comunes
Los Algoritmos: Cuál Usar y Cuándo
La librería implementa 7 algoritmos diferentes, cada uno optimizado para escenarios específicos. Aquí una panorámica rápida:
| Algoritmo | Tipo | Caso de uso principal | Rendimiento |
|---|---|---|---|
| Three Sigma | Estadístico | Control de calidad, datos normales | ~100k/seg |
| Sliding Window | Estadístico | Monitoreo de sensores en tiempo real | ~80k/seg |
| EMA | Estadístico | Trading, datos de alta frecuencia | ~100k/seg |
| Adaptive | Estadístico | Sistemas estacionales, patrones variables | ~60k/seg |
| Isolation Forest | ML | Fraudes multidimensionales | ~20k/seg |
| DBSCAN | ML | Clustering comportamental | ~25k/seg |
| LOF | ML | Predicción de abandono, outliers locales | ~20k/seg |
Veámoslos en detalle.
Three Sigma Detector - Control Estadístico de Procesos
El problema: En una línea de producción manufacturera, cada componente debe cumplir tolerancias precisas. Un rodamiento con diámetro de 100mm ± 0.5mm es aceptable; uno de 105mm es un defecto que puede causar fallos en cascada. Los operadores no pueden medir manualmente cada pieza, y los defectos pasan desapercibidos hasta que causan problemas en el ensamblaje o, peor aún, en el cliente.
La solución: El Three Sigma es el algoritmo más clásico e intuitivo. Calcula la media y la desviación estándar de los datos históricos, luego considera anómalo todo lo que se desvía más de 3σ (sigma) de la media. Es la base del control de calidad industrial usado durante décadas.
var
Detector: TThreeSigmaDetector;
Result: TAnomalyResult;
begin
Detector := TThreeSigmaDetector.Create;
try
// Añade datos históricos de producción (diámetros en mm)
Detector.AddValues([100.2, 99.8, 100.5, 99.9, 100.1, 100.3, 99.7]);
Detector.Build;
// Verifica una nueva medición
Result := Detector.Detect(105.5);
if Result.IsAnomaly then
ShowMessage('¡Anomalía detectada en producción!');
finally
Detector.Free;
end;
end;
Sliding Window Detector - Monitoreo en Tiempo Real
El problema: Tu centro de datos aloja servidores críticos. La temperatura ambiente debe mantenerse entre 18°C y 24°C. Un aire acondicionado que falla por la noche puede hacer que la temperatura suba gradualmente - y cuando te das cuenta a la mañana siguiente, los servidores ya se han apagado por protección térmica. Necesitas detectar anomalías en tiempo real, sobre un stream continuo de datos de sensores.
La solución: El Sliding Window Detector mantiene una ventana deslizante de tamaño fijo (ej. últimos 100 valores) y recalcula las estadísticas en tiempo real. Consume memoria constante y se adapta naturalmente a cambios graduales (como la transición día/noche).
var
Detector: TSlidingWindowDetector;
Value: Double;
begin
Detector := TSlidingWindowDetector.Create(100); // Ventana de 100 valores
try
// Inicializa con baseline
Detector.InitializeWindow([21.5, 21.8, 22.0, 21.7, 21.9, 22.1, 21.6]);
// Procesa stream continuo del sensor
while HasIncomingData do
begin
Value := GetNextSensorReading;
if Detector.Detect(Value).IsAnomaly then
TriggerAlert('Temperatura fuera de rango: ' + Value.ToString + '°C');
Detector.AddValue(Value); // Actualiza ventana
end;
finally
Detector.Free;
end;
end;
EMA Detector - Adaptación Rápida
El problema: Gestionas una plataforma de trading. Los precios de las acciones cambian cada milisegundo y necesitas detectar movimientos anómalos instantáneamente - un flash crash, un spike repentino, manipulación de mercado. No puedes permitirte mantener millones de valores históricos en memoria, y los patrones de “normalidad” cambian continuamente durante el día.
La solución: El Exponential Moving Average da más peso a los valores recientes, olvidando gradualmente el pasado. Consume memoria constante O(1) - literalmente unos pocos bytes - y es extremadamente rápido (~100k detecciones/seg). Perfecto para escenarios de ultra alta frecuencia.
var
Detector: TEMAAnomalyDetector;
Price: Double;
begin
Detector := TEMAAnomalyDetector.Create(0.1); // Alpha = sensibilidad
try
// Warm-up con datos normales
Detector.WarmUp([50.2, 50.5, 49.8, 50.1, 50.3]);
// Monitorea precios de bolsa en tiempo real
for Price in StockPrices do
begin
if Detector.Detect(Price).IsAnomaly then
begin
if Price > Detector.CurrentMean then
LogAlert('Spike detectado: ' + Price.ToString)
else
LogAlert('Caída detectada: ' + Price.ToString);
end;
Detector.AddValue(Price);
end;
finally
Detector.Free;
end;
end;
Adaptive Detector - Sistemas que Aprenden
El problema: Tu e-commerce tiene patrones de tráfico que cambian con el tiempo. En diciembre la carga es 10x comparada con febrero. El Black Friday es una anomalía… ¡pero es una anomalía esperada! Si el sistema marca como anómalo cada pico estacional, los operadores empezarán a ignorar las alertas - y cuando llegue un problema real, nadie se dará cuenta.
La solución: El Adaptive Detector se adapta gradualmente a los nuevos patrones, aprendiendo del feedback del usuario. Cuando marca una anomalía, el operador puede confirmar “sí, es anómalo” o “no, es normal” - y el detector aprende. Con el tiempo se vuelve cada vez más preciso para tu contexto específico.
var
Detector: TAdaptiveAnomalyDetector;
CPUUsage: Double;
begin
Detector := TAdaptiveAnomalyDetector.Create(30, 0.05); // Ventana 30 días
try
Detector.InitializeWithNormalData([45, 52, 48, 55, 50, 47, 53]);
for var Day := 1 to 365 do
begin
CPUUsage := GetServerCPU;
if Detector.Detect(CPUUsage).IsAnomaly then
begin
if UserConfirms('CPU alta: ' + CPUUsage.ToString + '% - ¿Es normal?') then
Detector.UpdateNormal(CPUUsage) // Enseña al detector
else
InvestigateCPUSpike;
end
else
Detector.UpdateNormal(CPUUsage); // Aprende automáticamente
end;
finally
Detector.Free;
end;
end;
Isolation Forest - Machine Learning Multidimensional
El problema: Necesitas detectar fraude en tarjetas de crédito. ¿Una transacción de €5.000 es sospechosa? Depende. Si es un cliente premium que compra joyas frecuentemente, no. Si es un cliente que normalmente gasta €50 en el supermercado, sí. ¿Y si esa transacción ocurre a las 3 de la madrugada desde un país extranjero? La “normalidad” depende de múltiples variables combinadas - importe, hora, ubicación, categoría, historial del cliente.
La solución: Isolation Forest es un algoritmo de machine learning no supervisado que identifica anomalías en espacios multidimensionales. Construye “árboles de aislamiento” que separan los puntos: las anomalías, al ser raras y diferentes, se aíslan rápidamente. No requiere definir reglas - aprende de los datos.
var
Detector: TIsolationForestDetector;
Transaction: TArray<Double>;
begin
Detector := TIsolationForestDetector.Create(100, 256, 5); // 100 árboles, 5 features
try
// Training sobre transacciones normales
for var i := 1 to 1000 do
begin
SetLength(Transaction, 5);
Transaction[0] := RandomAmount; // Importe
Transaction[1] := RandomHour; // Hora del día
Transaction[2] := RandomDay; // Día de la semana
Transaction[3] := RandomCategory; // Categoría
Transaction[4] := RandomAge; // Edad del cliente
Detector.AddTrainingData(Transaction);
end;
Detector.Train; // Construye el modelo
// Detecta transacción sospechosa
Transaction := [5000, 3, 2, 5, 35]; // €5000 a las 3 de la madrugada
if Detector.DetectMultiDimensional(Transaction).IsAnomaly then
FlagForFraudReview('¡Puntuación de fraude alta!');
finally
Detector.Free;
end;
end;
DBSCAN - Clustering Basado en Densidad
El problema: Gestionas una cadena retail con decenas de cajas y cajeros. Los robos internos son difíciles de detectar: un cajero deshonesto puede hacer devoluciones ficticias, aplicar descuentos no autorizados, o anular artículos después de que el cliente ha pagado. No puedes definir reglas rígidas (“nunca más de 5 devoluciones al día”) porque los patrones varían por tienda, turno y temporada. Necesitas un sistema que aprenda qué es “normal” para cada contexto.
La solución: DBSCAN (Density-Based Spatial Clustering of Applications with Noise) agrupa automáticamente los comportamientos similares en clusters. Los cajeros con patrones operativos normales forman grupos densos; los que tienen comportamientos anómalos - demasiadas devoluciones, descuentos excesivos, patrones de horario sospechosos - quedan aislados como “ruido” y se marcan para revisión.
var
Detector: TDBSCANDetector;
CashierBehavior: TArray<Double>;
begin
Detector := TDBSCANDetector.Create(
0.3, // Epsilon: radio de vecindad
10 // MinPoints: mínimo de puntos para formar un cluster
);
try
// Training sobre comportamientos históricos de cajeros
// [devoluciones_dia, descuento_medio_%, tickets_anulados, importe_medio]
for var i := 1 to 5000 do
begin
CashierBehavior := [
Random(5), // 0-5 devoluciones/día es normal
Random(8), // 0-8% descuento medio
Random(3), // 0-3 tickets anulados
50 + Random(150) // €50-€200 importe medio
];
Detector.AddTrainingData(CashierBehavior);
end;
Detector.Train;
// Analiza el comportamiento de un cajero sospechoso
CashierBehavior := [12, 15, 8, 35]; // Demasiadas devoluciones, descuentos altos, muchas anulaciones, importe bajo
if Detector.DetectMultiDimensional(CashierBehavior).IsAnomaly then
FlagForAudit('Cajero con patrón operativo anómalo - verificar');
finally
Detector.Free;
end;
end;
Otro ejemplo clásico: pedidos a proveedores en un sistema ERP. Los pedidos siguen patrones relacionados con estacionalidad, cantidades típicas y proveedores habituales. Un pedido de material nunca comprado antes, a un proveedor recién añadido a la base de datos, con importes y cantidades inusuales, emerge automáticamente como anomalía - potencial señal de fraude en compras o error de entrada de datos.
LOF - Local Outlier Factor
El problema: Quieres prevenir el abandono de clientes premium. Un cliente que compra poco es normal si es un cliente ocasional. Pero si un cliente que gastaba €500/mes de repente baja a €50/mes, es una señal de alarma - está a punto de abandonarte. El problema es que “poco” y “mucho” son relativos al segmento del cliente.
La solución: LOF (Local Outlier Factor) compara cada punto con sus “vecinos” en el dataset. Un cliente premium comportándose como un cliente ocasional tiene un LOF alto - es anómalo respecto a su grupo de referencia, aunque su comportamiento sería normal para otros clientes.
var
Detector: TLOFDetector;
CustomerBehavior: TArray<Double>;
begin
Detector := TLOFDetector.Create(20); // k=20 vecinos
try
// Training sobre comportamientos de clientes: [compras_mes, valor_medio, frecuencia_login]
for var i := 1 to 5000 do
begin
CustomerBehavior := [
GetRandomPurchases, // 1-50 compras/mes
GetRandomAvgValue, // €10-€500 valor medio
GetRandomLoginFreq // 1-30 logins/mes
];
Detector.AddTrainingData(CustomerBehavior);
end;
Detector.Train;
// Cliente premium que de repente se comporta como uno ocasional
CustomerBehavior := [2, 450, 1]; // Pocas compras pero alto valor, login raro
if Detector.DetectMultiDimensional(CustomerBehavior).IsAnomaly then
FlagForChurnRisk('Posible abandono de cliente premium');
finally
Detector.Free;
end;
end;
Casos de Uso Reales en Sistemas de Gestión
Veamos escenarios concretos donde esta librería puede marcar la diferencia.
Control de Calidad en Producción
En una línea de producción manufacturera, cada componente debe cumplir tolerancias precisas. El detector Three Sigma identifica automáticamente las piezas fuera de especificación:
type
TQualityController = class
private
FDiameterDetector: TThreeSigmaDetector;
FWeightDetector: TThreeSigmaDetector;
public
procedure CheckComponent(Diameter, Weight: Double);
end;
procedure TQualityController.CheckComponent(Diameter, Weight: Double);
begin
if FDiameterDetector.Detect(Diameter).IsAnomaly then
begin
RejectComponent('Diámetro fuera de tolerancia: ' + Diameter.ToString + 'mm');
NotifyQualityTeam;
end;
if FWeightDetector.Detect(Weight).IsAnomaly then
begin
RejectComponent('Peso fuera de rango: ' + Weight.ToString + 'g');
NotifyQualityTeam;
end;
end;
Resultado: Interceptas defectos antes de que lleguen al ensamblaje o al cliente final.
Monitoreo de Temperatura en Data Center
Los servidores críticos deben operar en rangos de temperatura controlados. El detector Sliding Window monitorea los sensores en tiempo real:
type
TDataCenterMonitor = class
private
FSensors: TDictionary<string, TSlidingWindowDetector>;
public
procedure ProcessReading(SensorID: string; Temperature: Double);
end;
procedure TDataCenterMonitor.ProcessReading(SensorID: string; Temperature: Double);
var
Detector: TSlidingWindowDetector;
begin
if not FSensors.TryGetValue(SensorID, Detector) then
begin
Detector := TSlidingWindowDetector.Create(100);
FSensors.Add(SensorID, Detector);
end;
if Detector.Detect(Temperature).IsAnomaly then
begin
TriggerAlert(Format('Sensor %s: temperatura anómala %.1f°C', [SensorID, Temperature]));
if Temperature > 28 then
ActivateEmergencyCooling;
end;
Detector.AddValue(Temperature);
end;
Resultado: Previenes apagados térmicos y daños al hardware antes de que sea demasiado tarde.
Detección de Fraude en Tarjetas de Crédito
Las transacciones fraudulentas suelen tener patrones multidimensionales anómalos. Isolation Forest analiza simultáneamente importe, hora, ubicación y comportamiento histórico:
type
TFraudDetector = class
private
FDetector: TIsolationForestDetector;
public
function CheckTransaction(Amount, Hour, DayOfWeek, Category,
CustomerAge: Double): Boolean;
end;
function TFraudDetector.CheckTransaction(Amount, Hour, DayOfWeek,
Category, CustomerAge: Double): Boolean;
var
Features: TArray<Double>;
begin
Features := [Amount, Hour, DayOfWeek, Category, CustomerAge];
if FDetector.DetectMultiDimensional(Features).IsAnomaly then
begin
Result := False; // Bloquea la transacción
FlagForManualReview('Transacción sospechosa - puntuación de fraude alta');
NotifyFraudTeam;
end
else
Result := True;
end;
Resultado: Bloqueas fraudes en tiempo real sin impactar a los clientes legítimos.
Control de Cajeros en Retail
Los robos internos son difíciles de detectar con reglas fijas. DBSCAN identifica automáticamente a los cajeros con patrones operativos anómalos:
type
TCashierAudit = class
private
FDetector: TDBSCANDetector;
public
procedure AnalyzeCashier(RefundsPerDay, AvgDiscountPct,
VoidedReceipts, AvgTransactionAmount: Double);
end;
procedure TCashierAudit.AnalyzeCashier(RefundsPerDay, AvgDiscountPct,
VoidedReceipts, AvgTransactionAmount: Double);
var
Behavior: TArray<Double>;
begin
Behavior := [RefundsPerDay, AvgDiscountPct, VoidedReceipts, AvgTransactionAmount];
if FDetector.DetectMultiDimensional(Behavior).IsAnomaly then
begin
FlagForAudit('Patrón operativo anómalo detectado');
GenerateDetailedReport(Behavior);
end;
end;
Resultado: Detectas fraudes internos y comportamientos sospechosos que escaparían a los controles tradicionales.
Anomalías en Pedidos a Proveedores (ERP)
Los pedidos de compra siguen patrones predecibles. Un pedido anómalo puede indicar fraude, error o necesidad de verificación:
type
TPurchaseOrderValidator = class
private
FDetector: TDBSCANDetector;
public
function ValidateOrder(Amount, Quantity: Double;
SupplierAge, CategoryCode: Integer): Boolean;
end;
function TPurchaseOrderValidator.ValidateOrder(Amount, Quantity: Double;
SupplierAge, CategoryCode: Integer): Boolean;
var
OrderFeatures: TArray<Double>;
begin
// [importe, cantidad, antigüedad_proveedor, categoría_mercancía]
OrderFeatures := [Amount, Quantity, SupplierAge, CategoryCode];
if FDetector.DetectMultiDimensional(OrderFeatures).IsAnomaly then
begin
Result := MessageDlg(
'Pedido con características inusuales:' + sLineBreak +
Format('Importe: €%.2f, Cantidad: %.0f', [Amount, Quantity]) + sLineBreak +
'Requiere aprobación manual. ¿Proceder?',
mtWarning, [mbYes, mbNo], 0) = mrYes;
if not Result then
LogSuspiciousOrder(OrderFeatures);
end
else
Result := True;
end;
Resultado: Interceptas pedidos fraudulentos, errores de entrada de datos y situaciones que requieren verificación.
Prevención del Abandono de Clientes Premium (Churn)
El churn (abandono) ocurre cuando un cliente deja de comprar o cancela su suscripción. Detectarlo anticipadamente en clientes premium - aquellos de alto valor - permite intervenir antes de que sea demasiado tarde. LOF compara cada cliente con su grupo de referencia:
type
TChurnPredictor = class
private
FDetector: TLOFDetector;
public
procedure AnalyzeCustomer(PurchasesPerMonth, AvgOrderValue,
LoginFrequency: Double; CustomerID: Integer);
end;
procedure TChurnPredictor.AnalyzeCustomer(PurchasesPerMonth, AvgOrderValue,
LoginFrequency: Double; CustomerID: Integer);
var
Behavior: TArray<Double>;
begin
Behavior := [PurchasesPerMonth, AvgOrderValue, LoginFrequency];
if FDetector.DetectMultiDimensional(Behavior).IsAnomaly then
begin
// Cliente premium con comportamiento de cliente ocasional
FlagChurnRisk(CustomerID, 'Alto riesgo de abandono');
TriggerRetentionCampaign(CustomerID);
NotifyAccountManager(CustomerID);
end;
end;
Resultado: Intervienes proactivamente antes de que los clientes valiosos te abandonen.
Monitoreo de Trading de Alta Frecuencia
Los sistemas de trading deben detectar anomalías en milisegundos. El detector EMA está optimizado para escenarios de ultra alta frecuencia:
type
TTradingMonitor = class
private
FPriceDetector: TEMAAnomalyDetector;
FVolumeDetector: TEMAAnomalyDetector;
public
procedure CheckMarketData(Price, Volume: Double);
end;
procedure TTradingMonitor.CheckMarketData(Price, Volume: Double);
begin
if FPriceDetector.Detect(Price).IsAnomaly then
begin
if Price > FPriceDetector.CurrentMean * 1.1 then
LogAlert('SPIKE: precio +10% en un tick')
else if Price < FPriceDetector.CurrentMean * 0.9 then
LogAlert('CRASH: precio -10% en un tick');
PauseAutomatedTrading; // Protección
end;
if FVolumeDetector.Detect(Volume).IsAnomaly then
LogAlert('Volumen anómalo: posible manipulación');
FPriceDetector.AddValue(Price);
FVolumeDetector.AddValue(Volume);
end;
Resultado: Proteges tus algoritmos de flash crashes y manipulaciones de mercado.
Adaptación Estacional de E-commerce
El tráfico de e-commerce varía drásticamente durante el año. El detector Adaptive aprende los patrones estacionales:
type
TEcommerceMonitor = class
private
FTrafficDetector: TAdaptiveAnomalyDetector;
public
procedure ProcessDailyTraffic(Visitors: Integer);
end;
procedure TEcommerceMonitor.ProcessDailyTraffic(Visitors: Integer);
begin
if FTrafficDetector.Detect(Visitors).IsAnomaly then
begin
// Pide confirmación al operador
if IsExpectedPeak then // Black Friday, Navidad, etc.
begin
FTrafficDetector.UpdateNormal(Visitors); // Aprende
LogInfo('Pico esperado confirmado');
end
else
begin
InvestigateTrafficAnomaly;
LogWarning('Anomalía de tráfico no esperada');
end;
end
else
FTrafficDetector.UpdateNormal(Visitors);
end;
Resultado: El sistema aprende tus patrones estacionales y deja de señalar falsos positivos.
Validación de Entrada de Datos - Prevenir Errores Humanos
Imagina un sistema de gestión donde los operadores introducen facturas. Con la detección de anomalías puedes alertarlos en tiempo real sobre importes sospechosos:
type
TInvoiceValidator = class
private
FDetectors: TDictionary<string, TSlidingWindowDetector>;
public
function ValidateAmount(SupplierCode: string; Amount: Double): Boolean;
end;
function TInvoiceValidator.ValidateAmount(SupplierCode: string;
Amount: Double): Boolean;
var
Detector: TSlidingWindowDetector;
begin
// Un detector por proveedor
if not FDetectors.TryGetValue(SupplierCode, Detector) then
begin
Detector := TSlidingWindowDetector.Create(50);
FDetectors.Add(SupplierCode, Detector);
end;
if Detector.Detect(Amount).IsAnomaly then
begin
Result := MessageDlg(
Format('Importe inusual para %s: €%.2f' + sLineBreak +
'¿Confirmas la entrada?', [SupplierCode, Amount]),
mtWarning, [mbYes, mbNo], 0) = mrYes;
end
else
Result := True;
if Result then
Detector.AddValue(Amount); // Aprende
end;
Resultado: Reduce errores de escritura (€10.000 en lugar de €1.000), importes duplicados, anomalías en precios.
Sistema de Alerta DDoS
Protege tus servicios web de ataques distribuidos:
var
TrafficDetector: TSlidingWindowDetector;
begin
TrafficDetector := TSlidingWindowDetector.Create(60); // 1 minuto
while ServiceRunning do
begin
RequestsPerSecond := GetCurrentRPS;
if TrafficDetector.Detect(RequestsPerSecond).IsAnomaly then
begin
LogSecurity('Posible DDoS: ' + RequestsPerSecond.ToString + ' req/s');
EnableRateLimiting;
NotifySecurityTeam;
end;
TrafficDetector.AddValue(RequestsPerSecond);
Sleep(1000);
end;
end;
Escenario Knight Capital - La Lección de 440 Millones
En mi charla de ITDevCon conté el caso de Knight Capital Group (2012): un bug de software generó órdenes anómalas durante 45 minutos, causando una pérdida de 440 millones de dólares y la quiebra de la empresa.
Con detección de anomalías este desastre habría sido evitable:
var
OrderVolumeDetector: TEMAAnomalyDetector;
OrderFrequencyDetector: TSlidingWindowDetector;
begin
OrderVolumeDetector := TEMAAnomalyDetector.Create(0.05);
OrderFrequencyDetector := TSlidingWindowDetector.Create(100);
// Antes de cada orden
if OrderVolumeDetector.IsAnomaly(OrderVolume) or
OrderFrequencyDetector.IsAnomaly(OrdersPerSecond) then
begin
LogCritical('¡ANOMALÍA DE TRADING DETECTADA!');
HaltTradingSystem;
NotifyRiskManagement;
Exit; // Bloquea la orden
end;
// Procesa orden normal...
end;
Un simple check habría salvado la empresa.
Monitoreo IoT y Mantenimiento Predictivo
Sensores industriales que predicen fallos antes de que ocurran:
type
TSensorMonitor = class
private
FTempDetector: TEMAAnomalyDetector;
FVibrationDetector: TAdaptiveAnomalyDetector;
FPressureDetector: TSlidingWindowDetector;
public
procedure ProcessSensorData(Temp, Vibration, Pressure: Double);
end;
procedure TSensorMonitor.ProcessSensorData(Temp, Vibration, Pressure: Double);
begin
if FTempDetector.IsAnomaly(Temp) then
ScheduleMaintenance('Temperatura anómala del motor');
if FVibrationDetector.IsAnomaly(Vibration) then
ScheduleMaintenance('Vibraciones excesivas del rodamiento');
if FPressureDetector.IsAnomaly(Pressure) then
ScheduleMaintenance('Presión hidráulica fuera de rango');
// Actualiza los modelos
FTempDetector.AddValue(Temp);
FVibrationDetector.UpdateNormal(Vibration);
FPressureDetector.AddValue(Pressure);
end;
Resultado: Reduce paradas de máquina, previene fallos catastróficos, optimiza el mantenimiento.
Evaluación y Optimización
La librería incluye un framework completo para evaluar la precisión de los detectores y optimizar automáticamente los parámetros.
Framework de Evaluación
Si tienes datos etiquetados (sabes cuáles son anomalías reales), puedes medir el rendimiento:
uses AnomalyDetection.Evaluation;
var
Dataset: TLabeledDataset;
Evaluator: TAnomalyDetectorEvaluator;
Result: TEvaluationResult;
begin
Dataset := TLabeledDataset.Create('Test Production Data');
Dataset.LoadFromCSV('sensor_data.csv', 0, 1, True);
Detector := TSlidingWindowDetector.Create(100);
Evaluator := TAnomalyDetectorEvaluator.Create(Detector, Dataset);
try
Result := Evaluator.Evaluate;
WriteLn('Accuracy: ', Result.ConfusionMatrix.GetAccuracy:0:3);
WriteLn('Precision: ', Result.ConfusionMatrix.GetPrecision:0:3);
WriteLn('Recall: ', Result.ConfusionMatrix.GetRecall:0:3);
WriteLn('F1-Score: ', Result.ConfusionMatrix.GetF1Score:0:3);
finally
Evaluator.Free;
end;
end;
Hyperparameter Tuning Automático
Encuentra automáticamente los parámetros óptimos:
var
Tuner: THyperparameterTuner;
BestConfig: TTuningResult;
begin
Tuner := THyperparameterTuner.Create(adtThreeSigma, Dataset);
try
Tuner.OptimizationMetric := 'F1';
// Testea todas las combinaciones
BestConfig := Tuner.GridSearch(
[2.0, 2.5, 3.0, 3.5], // Valores de sigma a probar
nil, nil, nil
);
ShowMessage(Format('Mejor sigma: %.2f (F1: %.3f)',
[BestConfig.Config.SigmaMultiplier, BestConfig.Score]));
finally
Tuner.Free;
end;
end;
La librería testea automáticamente decenas de combinaciones y te dice cuál es la mejor para tus datos.
Cómo Empezar
Clona el repositorio:
git clone https://github.com/danieleteti/delphi-anomalies-detectors.git
Añade las units a tu proyecto y usa el factory pattern para empezar inmediatamente:
uses
AnomalyDetection.Types, AnomalyDetection.Factory;
var
Detector: IAnomalyDetector;
begin
// Factory pre-configurado para tu escenario
Detector := Factory.CreateForFinancialData; // Datos financieros
// Detector := Factory.CreateForWebTrafficMonitoring; // Seguridad web
// Detector := Factory.CreateForIoTSensors; // Sensores IoT
Detector.AddValues([100, 105, 98, 102, 107, 99, 103]);
Detector.Build;
if Detector.IsAnomaly(150) then
ShowMessage('¡Anomalía detectada!');
end;
El repositorio incluye demos completas para cada algoritmo en la carpeta Samples\, una suite de 84 tests DUnitX con cobertura del 100%, y sigue principios SOLID para máxima extensibilidad. Todos los detectores son thread-safe y optimizados para entornos de producción (~20k a ~100k detecciones/seg según el algoritmo).
Conclusiones
La detección de anomalías ya no es dominio exclusivo de científicos de datos y grandes corporaciones. Con esta librería puedes integrar inteligencia en tus aplicaciones Delphi en minutos, previniendo errores, fraudes, fallos y situaciones críticas.
La librería es el resultado de meses de trabajo, investigación bibliográfica, implementación y testing. Fue diseñada para ser production-ready desde el primer día: thread-safe, performante, testeada y documentada.
Ya sea que estés desarrollando un ERP, un sistema de monitoreo industrial, una plataforma financiera o una aplicación IoT, la detección de anomalías puede marcar la diferencia entre un sistema reactivo (que descubre los problemas después) y uno proactivo (que los previene).
La librería es open source y gratuita (licencia Apache 2.0). 🎓 Está en preparación un curso específico sobre cómo usar la librería y aplicar los algoritmos de detección de anomalías en tus proyectos. 📄 Además, próximamente saldrá un Paper exclusivo para los supporters AllAccess+ en Patreon, con profundizaciones técnicas, comparaciones entre algoritmos y guías avanzadas.
🏢 Para necesidades empresariales - training, workshops, consultoría o soporte enterprise - bit Time Professionals ofrece servicios de formación y consultoría en italiano, inglés y español: professionals@bittime.it | www.bittimeprofessionals.com
Preguntas Frecuentes (FAQ)
¿Qué es la detección de anomalías (anomaly detection)?
La detección de anomalías es un conjunto de técnicas que identifican automáticamente datos, eventos o comportamientos que se desvían significativamente del patrón normal. Se usa para detectar fraudes, fallos, errores de entrada de datos, intrusiones de seguridad y cualquier situación “fuera de lo ordinario”.
¿Qué algoritmos de detección de anomalías están disponibles en la librería Delphi?
La librería implementa 7 algoritmos:
- Three Sigma - Control estadístico clásico basado en media y desviación estándar
- Sliding Window - Monitoreo en tiempo real con ventana deslizante
- EMA (Exponential Moving Average) - Adaptación rápida para datos de alta frecuencia
- Adaptive Detector - Sistema que aprende del feedback del usuario
- Isolation Forest - Machine learning para anomalías multidimensionales
- DBSCAN - Clustering basado en densidad para patrones complejos
- LOF (Local Outlier Factor) - Comparación con vecinos locales en el dataset
¿Qué algoritmo de detección de anomalías debo usar?
La elección depende del escenario:
- Three Sigma: Control de calidad, datos con distribución normal
- Sliding Window: Monitoreo de sensores, streams de datos continuos
- EMA: Trading de alta frecuencia, datos que cambian rápidamente
- Adaptive: Sistemas con estacionalidad, patrones que evolucionan
- Isolation Forest: Fraudes, transacciones con muchas variables
- DBSCAN: Clustering comportamental, análisis de cajeros/usuarios
- LOF: Predicción de abandono (churn), comparación entre grupos de clientes
¿La librería es gratuita?
Sí, la Delphi Anomaly Detection Library es completamente open source y gratuita con licencia Apache 2.0. Puedes usarla en proyectos comerciales sin restricciones.
¿Se puede usar la detección de anomalías en tiempo real?
Sí. Los algoritmos Sliding Window, EMA y Adaptive están optimizados para procesamiento en tiempo real sobre streams de datos. Soportan throughput de 20.000 a 100.000 detecciones por segundo.
¿Necesito conocimientos de machine learning para usar la librería?
No. La librería incluye factories pre-configurados para escenarios comunes (datos financieros, sensores IoT, tráfico web) que permiten empezar sin conocer los detalles de los algoritmos. Para quienes quieran profundizar, hay documentación completa y un curso dedicado disponible.
¿En qué sectores se usa la detección de anomalías?
Los casos de uso más comunes incluyen:
- Finanzas: Fraude en tarjetas de crédito, trading anómalo
- Retail: Robos internos, comportamientos sospechosos de cajeros
- Manufactura: Control de calidad, mantenimiento predictivo
- IT: Seguridad (DDoS, intrusiones), monitoreo de servidores
- Sanidad: Parámetros vitales anómalos, errores de dosificación
- ERP: Validación de entrada de datos, pedidos sospechosos
🔗 Repositorio GitHub: github.com/danieleteti/delphi-anomalies-detectors
📖 Documentación completa disponible en el repositorio
💬 ¿Preguntas? Abre una issue en GitHub
Daniele Teti
Comments
comments powered by Disqus