Módulo 6 — Disrupción de la red: a quién quitar primero

En el módulo 5 identificamos los actores clave. Ahora respondemos la pregunta del taller: a quién quitar primero para que la red deje de funcionar.

Code
library(dplyr); library(ggplot2); library(readr); library(scales); library(leaflet); library(tidyr)
dismantle <- read_csv("../outputs/dismantling.csv", show_col_types = FALSE)
auc <- read_csv("../outputs/dismantling_auc.csv", show_col_types = FALSE)
wilcox <- read_csv("../outputs/dismantling_wilcoxon.csv", show_col_types = FALSE)
blancos <- read_csv("../outputs/blancos_disrupcion.csv", show_col_types = FALSE)
knitr::opts_chunk$set(message = FALSE, warning = FALSE)

1. ¿Qué es la disrupción y por qué es el objetivo final?

  • Definición: acciones de intervención —judiciales, financieras o policiales— orientadas a romper la estructura funcional de la red para que ya no opere como sistema.
  • No busca arrestar a todos los miembros (objetivo rara vez alcanzable), sino degradar la capacidad operativa retirando los nodos clave.
  • La analogía: una red criminal es como una empresa — no hace falta despedir a todos para quebrarla; basta retirar a quienes sostienen la coordinación y luego a quienes dirigen cada departamento.
  • En términos de redes: disrupción = remoción estratégica de vértices. La pregunta operativa no es “¿quién es más importante?” sino “¿a quién quitar primero para que la red deje de funcionar con el menor esfuerzo?”

2. Estrategias: cómo elegimos a quién retirar

Cinco estrategias de retirada iterativa sobre el chronnet completo, colapsado a no dirigido:

  • DEG (grado): retira el vértice de mayor grado — decapita hubs, los de más conexiones.
  • BTW (intermediación): retira el de mayor betweenness — corta puentes, los que conectan circuitos.
  • KB (Katz-Bonacich, \(\alpha = 0.1\), \(\beta = 1\)): pondera contribuciones de toda la red atenuadas por longitud de camino, \(c = \alpha A'c + \beta\) — premia a los que están bien posicionados y conectados con otros bien posicionados.
  • CI (influencia colectiva, radio \(d = 3\)): retira el vértice óptimo para fragmentación por percolación, \(CI_i = (k_i - 1)\sum_{j: d(i,j)=d}(k_j - 1)\) — cuenta no solo sus conexiones, sino las de su vecindario a distancia 3.
  • RND: retirada aleatoria (línea base: qué pasa si se actúa sin inteligencia de red).

3. Protocolos: cómo ejecutamos la retirada

Dos protocolos, según cómo actúa la fuerza pública en la realidad:

  • Secuencial (\(b = 1\)) = capturas individuales: se retira un objetivo, se recalcula la red, se elige el siguiente. Lento pero preciso — cada decisión usa la red actual.

  • Bloque (\(b = 5\)) = redada: se retiran los 5 mejores candidatos de una sola vez, como cuando no hay tiempo para ir uno por uno. Rápido pero tosco — los 5 fueron elegidos sobre la red antes de caer el primero.

  • “batch = 1” en las tablas = protocolo individual; “batch = 5” = redada.

  • Tras cada retiro, el grafo se restringe al componente conectado más grande: lo que importa es la pieza que sigue operando, no los restos aislados.

4. Cómo medimos el daño: tres observables

Para cada paso \(i\) de la simulación:

\[p_i^{edges} = \frac{|E(g_i)|}{|E(g_0)|} \quad\text{(aristas que sobreviven)}\] \[p_i^{CC} = \mathrm{transitivity}(g_i) \quad\text{(agrupamiento residual)}\] \[\frac{|\mathrm{LCC}(g_i)|}{N_0} \quad\text{(fracción de la red que sigue conectada)}\]

  • Efectividad = área bajo la curva (AUC) de cada trayectoria: valores bajos = fragmentación más rápida.
  • Significancia vs. azar = Wilcoxon apareado unilateral (estrategia < RND) paso a paso, que controla la dependencia entre pasos consecutivos.

5. Resultados: AUC por estrategia y protocolo

Code
auc %>%
  mutate(across(starts_with("auc"), ~ round(.x, 3))) %>%
  arrange(batch, auc_edges) %>%
  knitr::kable(col.names = c("Estrategia", "b", "Pasos", "AUC aristas", "AUC CC", "AUC LCC"))
Estrategia b Pasos AUC aristas AUC CC AUC LCC
DEG 1 50 0.734 0.112 0.988
KB 1 50 0.735 0.110 0.988
BTW 1 50 0.739 0.118 0.988
CI 1 50 0.804 0.103 0.987
RND 1 50 0.980 0.118 0.989
DEG 5 10 0.719 0.111 0.987
KB 5 10 0.721 0.108 0.987
BTW 5 10 0.724 0.117 0.987
CI 5 10 0.791 0.102 0.986
RND 5 10 0.972 0.117 0.988

Cómo leer la tabla:

  • AUC menor = mejor ataque (la curva cayó más rápido).
  • Aristas: DEG (0.734), KB (0.735) y BTW (0.739) lideran; CI va detrás (0.804); RND, último (0.980).
  • Cohesión (CC): CI domina (0.103, el más bajo de todos); el azar queda en 0.118.
  • LCC: empate ~0.99 en todas — nadie fragmenta la red al 2% de remoción.
Code
wilcox %>%
  mutate(p_wilcoxon = ifelse(p_wilcoxon < 0.001, "< 0.001", round(p_wilcoxon, 3))) %>%
  arrange(observable, batch, p_wilcoxon) %>%
  knitr::kable(col.names = c("Observable", "b", "Estrategia", "p (Wilcoxon vs. RND)"))
Observable b Estrategia p (Wilcoxon vs. RND)
cc 1 BTW 0.033
cc 1 DEG < 0.001
cc 1 KB < 0.001
cc 1 CI < 0.001
cc 5 KB 0.014
cc 5 DEG 0.019
cc 5 BTW 0.423
cc 5 CI < 0.001
edges 1 DEG < 0.001
edges 1 BTW < 0.001
edges 1 KB < 0.001
edges 1 CI < 0.001
edges 5 DEG < 0.001
edges 5 BTW < 0.001
edges 5 KB < 0.001
edges 5 CI < 0.001
lcc 1 DEG < 0.001
lcc 1 BTW < 0.001
lcc 1 KB < 0.001
lcc 1 CI < 0.001
lcc 5 DEG 0.002
lcc 5 BTW 0.002
lcc 5 KB 0.002
lcc 5 CI 0.004
  • El \(p\) del Wilcoxon pregunta si la ventaja es consistente paso a paso o producto de un solo punto afortunado.
  • Lectura: todas las estrategias dirigidas superan al azar con p < 10⁻³ (batch 5) o p < 10⁻⁹ (batch 1) — la ventaja no es ruido.

6. Trayectorias de fragmentación

Lectura de la figura (filas = observable; columnas = protocolo):

  • Eje X = fracción de nodos restantes: el ataque avanza de derecha (red intacta) a izquierda.
  • Eje Y = fracción que sobrevive del observable; curva más baja = mejor ataque.
  • Fila aristas: las dirigidas se separan pronto del azar; CI va un escalón arriba (destruye aristas más lento que DEG/KB/BTW).
  • Fila transitividad: curvas planas y juntas — la cohesión es lo más resistente; solo CI baja claramente del azar.
  • Fila LCC: las 5 curvas están encimadas (solo se ve la última, gris): ninguna estrategia fragmenta la red. La superposición perfecta ES el resultado.
Code
d_long <- dismantle %>%
  pivot_longer(c(edges, cc, lcc), names_to = "observable", values_to = "valor") %>%
  mutate(observable = recode(observable,
                             edges = "Fracción de aristas", cc = "Transitividad",
                             lcc = "Tamaño LCC normalizado"),
         estrategia = factor(estrategia, levels = c("KB", "DEG", "BTW", "CI", "RND")))

ggplot(d_long, aes(fraccion, valor, color = estrategia)) +
  geom_line(linewidth = 1) +
  facet_grid(observable ~ factor(paste0("b = ", batch)), scales = "free_y") +
  scale_color_manual(values = c("KB" = "#B45309", "DEG" = "#0D9488", "BTW" = "#D4883A",
                                "CI" = "#64748B", "RND" = "#9CA3AF")) +
  labs(x = "Fracción de nodos restantes", y = "", color = "") +
  theme_minimal() + theme(legend.position = "bottom")

Lectura criminal

  • Atacar con inteligencia de red erosiona las aristas ~3× más rápido que actuar a ciegas (AUC 0.72–0.74 dirigido vs. 0.98 aleatorio; p < 10⁻⁹).
  • El daño se concentra en aristas y cohesión: el componente principal aguanta — ni el ataque dirigido al 2% de los nodos lo fragmenta.
  • La robustez de una red libre de escala no admite golpe de gracia: exige operaciones sostenidas.
  • Las estrategias no empatan: cada una destruye una cosa distinta — esa diferencia es la decisión operativa.

7. Top 15 blancos prioritarios

  • Método: ranking combinado prioridad = rank(intermediación) + rank(fuerza) — menor = mejor blanco (topología + dinero).
  • Lectura: el #1 en intermediación y top-5 en dinero lidera; mover volumen sin estar en el camino (caso Rosbank: fuerza #1, intermediación #14) queda por debajo.
  • El JSON completo para el agente IA está en outputs/agente/blancos_disrupcion.json.
Code
blancos %>%
  slice_head(n = 15) %>%
  select(bank_name, country, intermediacion, fuerza, prioridad) %>%
  mutate(fuerza = dollar(fuerza)) %>%
  knitr::kable()
bank_name country intermediacion fuerza prioridad
Credit Suisse AG Switzerland 593752.55 $1,881,702,238 5
AS Expobank Latvia 334264.43 $2,666,430,134 5
Deutsche Bank AG Netherlands 318187.83 $1,664,219,281 8
Rosbank Russia 114564.01 $3,546,572,824 15
Credit Suisse Ag Switzerland 202362.34 $716,197,270 30
DBS Bank Ltd Singapore 208931.36 $671,430,098 31
Norvik Banka JSC Latvia 139885.34 $762,138,351 31
JSC Norvik Banka Latvia 262141.36 $513,755,534 35
AS Expobank Latvia 221234.31 $493,949,576 38
Hong Kong And Shanghai Banking Corp Hong Kong 91443.21 $875,138,633 38
Rosbank Russia 74597.52 $1,207,455,548 38
LTB Bank Latvia 108671.09 $574,837,983 42
Citibank N.A. United States 96260.65 $532,061,571 50
HSBC Hong Kong Hong Kong 219075.93 $315,367,995 51
Bank Soyuz Russia 55906.18 $805,642,191 51

8. Mapa de blancos

  • Fondo OpenStreetMap; radio ∝ prioridad (menor prioridad = radio mayor).
  • Interruptor de capas para quitar/poner los flujos entre blancos (solo pares con dinero documentado).
  • Tooltip: banco, país, prioridad, dinero y coordenadas.
Code
readRDS("../outputs/widgets/mapa_blancos.rds")

9. Mapa mundial de flujos (contexto completo)

  • Los 500 flujos más grandes; cada banco en su sede con tooltip espacio-temporal completo.
  • Fondo OpenStreetMap; control de capas para quitar/poner las aristas.
Code
readRDS("../outputs/widgets/mapa_flujos.rds")

10. Secuencia en dos fases: la decisión operativa

Los resultados muestran una división del trabajo entre las estrategias:

  • Aristas: DEG, KB y BTW lideran empatadas (AUC 0.72–0.74) — y todas muy por debajo del azar (0.98): el ataque dirigido elimina aristas ~3 veces más rápido que actuar a ciegas.
  • Cohesión: CI domina (AUC CC 0.103, el más bajo de todas): su vecindario a 3 saltos desarma los triángulos; es la única que erosiona el agrupamiento más rápido que el azar.
  • Conectividad global: empate (AUC LCC ≈ 0.99): ninguna estrategia fragmenta el componente principal al 2% — la robustez de la red no se vence en corto plazo.

Recomendación práctica, en dos fases:

  1. Fase 1 — Aislar: intervenciones tipo BTW sobre los puentes entre comunidades. No es la que más aristas quita, pero deja los circuitos incomunicados y su efecto se acumula: cada puente cortado no se repone.
  2. Fase 2 — Erosionar la cohesión: operaciones sostenidas tipo CI sobre los núcleos que sobreviven. Es la que más rápido degrada el agrupamiento — desorganiza la célula local — y la única compatible con una campaña de meses, no de un día.

Lectura criminal

  • Separar los objetivos — aislar vs. desorganizar — es la lección central del módulo.
  • Un fiscal que solo persigue “a los de más dinero” (fuerza) deja intactos los puentes que recomponen la red.
  • Uno que solo corta puentes deja comunidades enteras operando en local.
  • La secuencia correcta convierte dos operaciones mediocres en una estrategia eficaz.