SAR (Suspicious Activity Report): reporte de operación sospechosa presentado por los bancos ante el FinCEN (unidad de inteligencia financiera de EE. UU.) y filtrado por la ICIJ en los FinCEN Files (2020).
Cada fila = un flujo que un banco juzgó sospechoso entre un banco originador y un banco beneficiario, con fechas y montos.
⚠️ Sospecha no es delito: la presencia de un banco en estos datos significa que reportó (o apareció en) movimientos que activaron sus controles antilavado, no que se le haya comprobado participación criminal. La red muestra dónde se detectó actividad sospechosa, con el sesgo de reporte que eso implica.
2. Vocabulario
SAR: reporte de operación sospechosa. Un mismo SAR (un mismo formulario) puede contener varias filas de transacciones.
Originador: banco que envía el dinero. Beneficiario: banco que lo recibe.
Chronnet: la red de trabajo de todo el taller (módulo 2). Nodo = banco; arista dirigida = co-actividad en días consecutivos (peso = producto de eventos). Los montos no viven en las aristas: se calculan desde los reportes y se pegan como atributos (monto_total por banco, monto circulado por par).
3. AED — Conteos y tipos de variable
Conteos básicos. Ojo a la diferencia entre filas y SARs:
Los originadores top son por donde el dinero reportado como sospechoso sale.
Patrón fraccionamiento: muchos reportes de montos pequeños (movimientos bajo umbrales de reporte).
Patrón consolidación: pocos reportes, montos muy grandes (el dinero se junta antes de seguir).
Ninguno de los dos patrones implica por sí solo ilicitud — ambos ocurren en comercio legítimo.
Lo que una investigación prioriza: la combinación de ambos extremos en la misma red.
5. AED — Top países en los flujos
Cada país suma el monto donde aparece como originador o beneficiario.
Las etiquetas muestran monto | nº de transacciones:
Code
paises <-bind_rows( tx %>%transmute(pais = originator_bank_country, monto = amount_transactions, n = number_transactions), tx %>%transmute(pais = beneficiary_bank_country, monto = amount_transactions, n = number_transactions)) %>%group_by(pais) %>%summarise(monto =sum(monto, na.rm =TRUE),n_transacciones =sum(n, na.rm =TRUE),.groups ="drop") %>%mutate(pais =ifelse(is.na(pais), "(Sin país registrado)", pais)) %>%slice_max(monto, n =15)ggplot(paises, aes(x =reorder(pais, monto), y = monto /1e9)) +geom_col(fill ="#0D9488") +geom_text(aes(label =paste0(round(monto /1e9, 1), " B | ", scales::comma(n_transacciones), " tx")),hjust =-0.05, size =3, color ="#334155") +coord_flip(clip ="off") +scale_y_continuous(expand =expansion(mult =c(0, 0.25))) +labs(x ="", y ="Monto reportado (miles de millones USD)") +theme_minimal()
5.1 Los NA de país: qué son y cómo los tratamos
Code
n_sin <-sum(is.na(tx$originator_bank_country) |is.na(tx$beneficiary_bank_country))n_bancos_sin <- tx %>%filter(is.na(originator_bank_country) |is.na(beneficiary_bank_country)) %>%summarise(n =n_distinct(c(originator_bank_id, beneficiary_bank_id), na.rm =TRUE)) %>%pull(n)cat("Registros con al menos un extremo sin país:", n_sin, "(", round(100*n_sin/nrow(tx),1), "%)\n")
Registros con al menos un extremo sin país: 0 ( 0 %)