Python Advanced Series

2. Detección de anomalías sin reglas

2. Rule-Free Anomaly Detection

Utiliza Isolation Forest para detectar fraudes o registros estadísticamente sospechosos que escapan a los filtros tradicionales.

Use Isolation Forest to detect fraud or statistically suspicious records that escape traditional filters.

⚠️ Advertencia de ciberseguridad, datos y producción ⚠️ Cybersecurity, data, and production warning

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes modelos contra datos reales, sensibles, financieros, médicos, personales o ambientes de producción sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios, revisión humana y cumplimiento de los protocolos de ciberseguridad y privacidad de tu organización.

This exercise is for learning and testing only. Do not run models against real, sensitive, financial, medical, personal, or production data without authorization, backups, prior testing, least-privilege permissions, change control, human review, and compliance with your organization's cybersecurity and privacy protocols.

Objetivo del ejercicio

Exercise objective

Crear un modelo sencillo de detección de anomalías usando Isolation Forest. La idea no es definir reglas manuales, sino dejar que el algoritmo identifique registros raros en función de variables numéricas como monto y frecuencia.

Create a simple anomaly detection model using Isolation Forest. The idea is not to define manual rules, but to let the algorithm identify unusual records based on numeric variables such as amount and frequency.

Datos sintéticos

Synthetic data

IDMontoFrecuenciaDescripción
10011202Compra normal
1002951Compra normal
10031503Compra normal
1004180018Posible anomalía
10051102Compra normal
100625001Posible anomalía

Ejemplo base

Base example

from sklearn.ensemble import IsolationForest

model = IsolationForest(contamination=0.01)
# -1 = anomalía/anomaly, 1 = normal
df['es_anomalia'] = model.fit_predict(df[['monto', 'frecuencia']])

Script completo

Complete script

# ==========================================================
# Python Advanced Topic 02
# Rule-Free Anomaly Detection with Isolation Forest
# ==========================================================

import pandas as pd
from sklearn.ensemble import IsolationForest

# 1. Create synthetic data
records = [
    {"id": 1001, "monto": 120,  "frecuencia": 2},
    {"id": 1002, "monto": 95,   "frecuencia": 1},
    {"id": 1003, "monto": 150,  "frecuencia": 3},
    {"id": 1004, "monto": 1800, "frecuencia": 18},
    {"id": 1005, "monto": 110,  "frecuencia": 2},
    {"id": 1006, "monto": 2500, "frecuencia": 1},
    {"id": 1007, "monto": 130,  "frecuencia": 2},
    {"id": 1008, "monto": 105,  "frecuencia": 1},
    {"id": 1009, "monto": 160,  "frecuencia": 3},
    {"id": 1010, "monto": 145,  "frecuencia": 2}
]

df = pd.DataFrame(records)

# 2. Select numeric columns for the model
features = df[["monto", "frecuencia"]]

# 3. Train Isolation Forest
# contamination estimates the expected percentage of anomalies
model = IsolationForest(contamination=0.20, random_state=42)

# 4. Predict anomalies
# 1 = normal record, -1 = anomaly
df["resultado_modelo"] = model.fit_predict(features)

# 5. Add readable label
df["clasificacion"] = df["resultado_modelo"].map({1: "Normal", -1: "Anomaly"})

# 6. Add anomaly score
# Lower scores are more suspicious
_df_scores = model.decision_function(features)
df["anomaly_score"] = _df_scores.round(4)

# 7. Export report
output_file = "anomaly_detection_report.csv"
df.to_csv(output_file, index=False)

# 8. Show suspicious records first
print(df.sort_values("anomaly_score"))
print(f"\nReport created: {output_file}")

Salida esperada en consola

Expected console output

     id  monto  frecuencia  resultado_modelo clasificacion  anomaly_score
5  1006   2500           1                -1       Anomaly        -0.1264
3  1004   1800          18                -1       Anomaly        -0.0937
8  1009    160           3                 1        Normal         0.0125
2  1003    150           3                 1        Normal         0.0198
9  1010    145           2                 1        Normal         0.0441
6  1007    130           2                 1        Normal         0.0512
0  1001    120           2                 1        Normal         0.0584
4  1005    110           2                 1        Normal         0.0617
7  1008    105           1                 1        Normal         0.0669
1  1002     95           1                 1        Normal         0.0721

Report created: anomaly_detection_report.csv

Reporte CSV generado

Generated CSV report

IDMontoFrecuenciaClasificaciónAnomaly Score
100625001Anomaly-0.1264
1004180018Anomaly-0.0937
10011202Normal0.0584
1002951Normal0.0721

Aplicaciones reales

Real-world applications

  • Detectar transacciones sospechosas.
  • Identificar registros fuera del patrón normal.
  • Priorizar revisiones manuales de auditoría.
  • Encontrar outliers antes de generar reportes oficiales.
  • Detect suspicious transactions.
  • Identify records outside the normal pattern.
  • Prioritize manual audit reviews.
  • Find outliers before generating official reports.

Recomendaciones

Recommendations

  • No asumir que una anomalía es fraude automáticamente.
  • Validar siempre los resultados con revisión humana.
  • Ajustar contamination según el contexto real.
  • Usar variables numéricas confiables y bien limpias.
  • Do not assume every anomaly is fraud automatically.
  • Always validate results with human review.
  • Adjust contamination based on the real context.
  • Use reliable and clean numeric variables.

Valor del tópico

Topic value

Este patrón permite pasar de filtros rígidos a una evaluación estadística más flexible. Es útil cuando los registros sospechosos no siguen una regla simple, pero sí se comportan diferente al grupo principal.

This pattern moves from rigid filters to a more flexible statistical evaluation. It is useful when suspicious records do not follow a simple rule, but behave differently from the main group.