Python Advanced Series — Redes Complejas

14. Análisis de grafos de conexiones

14. Connection Graph Analysis

Mapea relaciones ocultas para detectar cuentas duplicadas o posibles fraudes corporativos.

Map hidden relationships to detect duplicate accounts or potential corporate fraud.

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

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes scripts contra datos reales, ambientes de producción, APIs externas, portales con login, datos sensibles, sistemas críticos o repositorios empresariales sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios y cumplimiento de los protocolos de ciberseguridad de tu organización.

This exercise is for learning and testing only. Do not run scripts against real data, production environments, external APIs, login portals, sensitive data, critical systems, or enterprise repositories without authorization, backups, prior testing, least-privilege permissions, change control, and compliance with your organization's cybersecurity protocols.

Objetivo del ejercicio

Exercise objective

Usar NetworkX para representar conexiones entre usuarios, dispositivos o IPs y encontrar relaciones compartidas.

Use NetworkX to represent connections among users, devices, or IPs and find shared relationships.

Datos sintéticos

Synthetic data

usuarioip
Usuario_AIP_192.168.1.5
Usuario_BIP_192.168.1.5
Usuario_CIP_192.168.1.8

Ejemplo base

Base example

import networkx as nx

G = nx.Graph()
G.add_edge("Usuario_A", "IP_192.168.1.5")
G.add_edge("Usuario_B", "IP_192.168.1.5")
# NetworkX detecta relaciones | NetworkX detects relationships

Resultado esperado

Expected result

ipusuarios_conectadosriesgo
IP_192.168.1.5Usuario_A, Usuario_Breview
IP_192.168.1.8Usuario_Cnormal

Script completo

Complete script

# ==========================================================
# Python Advanced Topic 14
# Connection Graph Analysis with NetworkX
# ==========================================================

# pip install networkx pandas

import networkx as nx
import pandas as pd

df = pd.DataFrame({
    "usuario": ["Usuario_A", "Usuario_B", "Usuario_C", "Usuario_D"],
    "ip": ["IP_192.168.1.5", "IP_192.168.1.5", "IP_192.168.1.8", "IP_192.168.1.9"]
})

G = nx.Graph()
for _, row in df.iterrows():
    G.add_edge(row["usuario"], row["ip"])

summary = []
for ip in df["ip"].unique():
    users = list(G.neighbors(ip))
    summary.append({
        "ip": ip,
        "usuarios_conectados": ", ".join(users),
        "cantidad_usuarios": len(users),
        "riesgo": "review" if len(users) > 1 else "normal"
    })

out = pd.DataFrame(summary)
out.to_csv("connection_graph_summary.csv", index=False)
print(out)

Salida esperada en consola

Expected console output

              ip    usuarios_conectados  cantidad_usuarios  riesgo
0  IP_192.168.1.5  Usuario_A, Usuario_B                  2  review
1  IP_192.168.1.8             Usuario_C                  1  normal
2  IP_192.168.1.9             Usuario_D                  1  normal

Aplicaciones reales

Real-world applications

  • Detectar usuarios compartiendo IP o dispositivo.
  • Analizar relaciones entre cuentas.
  • Mapear proveedores, clientes y transacciones.
  • Identificar comunidades o nodos críticos.
  • Detect users sharing IP or device.
  • Analyze account relationships.
  • Map vendors, customers, and transactions.
  • Identify communities or critical nodes.

Recomendaciones

Recommendations

  • No concluir fraude solo por una conexión.
  • Combinar grafos con reglas y revisión humana.
  • Anonimizar datos sensibles cuando sea posible.
  • Guardar evidencia reproducible del análisis.
  • Do not conclude fraud from one connection alone.
  • Combine graphs with rules and human review.
  • Anonymize sensitive data when possible.
  • Keep reproducible evidence of the analysis.

Valor del tópico

Topic value

Los grafos permiten ver relaciones que una tabla plana oculta, especialmente cuando la señal aparece en conexiones compartidas.

Graphs reveal relationships hidden by flat tables, especially when the signal appears in shared connections.