# analisis-de-grafos-en-python-y-networkx
Análisis de Grafos en Python y NetworkX
Volver a la portada del cursoEjecutando el Proyecto Final
Sección 6 · Proyecto Final
Ejecutando el proyecto final
El enunciado dice qué entregar; esta lección, cómo avanzar. Sigue el flujo del video de diseño: datos → red → umbral → estructura → centralidad → comunidades → visualización → recomendaciones. En cada paso tienes un fragmento de referencia y la cifra que debes ver. Si tu número no coincide, revisa antes de continuar.
Paso 1. De los pedidos a la red
Copia datos.py en la primera celda. generar_pedidos() devuelve 3000 pedidos y red_productos(pedidos) la red con mínimo 25: 41 nodos y 136 aristas. Comprueba un par conocido: G["laptop"]["mouse"] debe dar {'weight': 134}. Antes de seguir, justifica el umbral. Reconstruye la red con mínimos de 1, 10, 25, 40 y 60 y anota aristas, densidad y componentes: con 1 hay 594 aristas y densidad 0.724, con 25 quedan 136 y 0.166, con 60 la red se rompe en 16 componentes.
Paso 2. Estructura
La red no es conexa: tiene 2 componentes, porque cuchillos queda aislado. Las medidas de caminos se calculan sobre la componente mayor (40 productos): diámetro 6 y camino medio 2.554. El clustering medio es 0.722, alto: si dos productos se compran con un tercero, suelen comprarse también entre sí. Hay un solo punto de articulación, el tapete de yoga, que es lo único que une al reloj deportivo con el resto.
Paso 3. Centralidad
Junta varias medidas en una tabla:
import pandas as pd
G = red_productos()
medidas = {
"grado": nx.degree_centrality(G),
"intermediacion": nx.betweenness_centrality(G),
"pagerank": nx.pagerank(G, weight="weight"),
}
tabla = pd.DataFrame(medidas).round(3)
print(tabla.sort_values("intermediacion", ascending=False).head(4))
grado intermediacion pagerank
bocina bluetooth 0.300 0.261 0.033
foco inteligente 0.275 0.186 0.039
cable usb-c 0.375 0.174 0.040
audifonos de diadema 0.300 0.162 0.039
El cable usb-c tiene el mayor grado (0.375) y la bocina bluetooth la mayor intermediación (0.261). El primero acompaña a muchos productos; la segunda conecta grupos. PageRank con peso pone arriba a los audífonos inalámbricos (0.045), seguidos del celular gama media (0.041). Agrega cercanía y vector propio a la tabla y comenta qué pregunta responde cada columna.
Decisión: el peso. Revisa los valores por defecto. betweenness_centrality ignora el peso (weight=None); si se lo pasas, lo interpreta como distancia, y en esta red un peso alto significa cercanía, no lejanía. Si quieres una intermediación ponderada, crea un atributo distancia = 1 / weight y úsalo: la bocina bluetooth sigue arriba (0.424) y los audífonos inalámbricos suben al segundo lugar (0.391). pagerank, en cambio, usa weight por defecto; con weight=None el primero pasa a ser el cable usb-c (0.049). Declara en el informe qué versión usaste.
Paso 4. Comunidades
from collections import Counter
cat = categorias()
lv = nx.community.louvain_communities(G, weight="weight", seed=42)
print(len(lv), round(nx.community.modularity(G, lv, weight="weight"), 3))
for c in sorted(lv, key=len, reverse=True):
print(len(c), Counter(cat[n] for n in c).most_common(2))
Debes obtener 6 comunidades con modularidad 0.609: celulares y audio juntos (13 productos, con el cable usb-c), cómputo (7), cocina con el termo (7), deportes con la bocina bluetooth (7), hogar (6) y cuchillos, solo. Compara con greedy_modularity_communities (6 comunidades, 0.602) y con las categorías del catálogo usadas como partición (0.537). Que Louvain supere a las categorías dice algo concreto: los clientes no compran por categoría.
Decisión: la semilla. En esta red, Louvain da el mismo resultado con las semillas 0 a 9. No es una garantía: en otras redes cambia. Fija seed=42 siempre y, si tienes tiempo, prueba otras semillas para mostrar que la partición es estable. El umbral sí cambia el resultado: con mínimo 10 salen 4 comunidades y con 40, 11.
Paso 5. Visualización
Dos figuras bastan si cada una responde una pregunta. La primera: la red con color por comunidad, tamaño por intermediación y grosor por peso, con etiquetas solo en los productos más centrales. La segunda puede ser la matriz de adyacencia ordenada por comunidad o una comparación de rankings de centralidad. Usa spring_layout(G, seed=42) y guarda con savefig.
Paso 6. Recomendaciones
Cada recomendación debe apoyarse en una cifra de los pasos anteriores. Ejemplo del formato: «Colocar la bocina bluetooth en las páginas de audio, hogar y deportes, porque es el producto con mayor intermediación (0.261) y tiene vecinos en tres comunidades: celulares y audio, hogar y deportes». Para el producto aislado, revisa con quién se compra a pesar de no tener aristas: cuchillos aparece en 52 pedidos y su par más frecuente es el molino de café, en 19, por debajo del umbral de 25.
Errores comunes
- Olvidar la semilla. Sin
seed, el dibujo cambia cada vez y Louvain puede cambiar en otras redes; tus cifras dejan de ser reproducibles. - Dibujar todo. 41 nodos con 136 aristas y 41 etiquetas no se leen. Filtra, etiqueta solo lo importante y deja que el color y el tamaño hagan el trabajo.
- Confundir grado con importancia. El cable usb-c tiene más vecinos, pero la bocina bluetooth es el mejor puente. Di qué pregunta responde la medida que eliges.
- Calcular el diámetro sobre la red completa. Con cuchillos aislado,
nx.diameter(G)lanza un error; usa la componente mayor. - Comparar modularidades de redes distintas. 0.609 con mínimo 25 y la modularidad con mínimo 40 vienen de redes diferentes; compara particiones sobre la misma red.
El notebook comunidades-y-recomendaciones compara Louvain, greedy y Girvan-Newman sobre la red de PyShop y verifica los métodos con el club de karate, donde Kernighan-Lin y el primer corte de Girvan-Newman aciertan 32 de 34 miembros con la división real. Úsalo como referencia para el paso 4.