Ir al contenido principal

Análisis de redes sociales en Python

Hoy las redes forman parte de nuestra vida diaria. Aprende a visualizar y entender una red social en Python con NetworkX.
Actualizado 17 sept 2026  · 12 min leer

Explorar con IA

ChatGPTClaudePerplexity

Si quieres aprender sobre análisis de redes, haz el curso Network Analysis in Python (Part 1) de DataCamp.

Las redes están en todas partes: carreteras, tu red de amigos y seguidores en redes sociales o las relaciones entre compañeros de oficina. Juegan un papel clave en nuestro día a día: desde difundir información útil hasta influir en elecciones nacionales. Analizarlas y tomar decisiones con base en ellas es una habilidad esencial para cualquier analista de datos.

Este tutorial se centra en enseñar análisis de redes sociales (SNA) con Python y NetworkX, una librería de Python para estudiar la estructura, dinámica y funciones de redes complejas. Asumimos que ya conoces la sintaxis básica de Python; no necesitas conocimientos previos de SNA.

Introducción

Empecemos por definir qué entendemos por redes sociales. Abajo ves una red donde los nodos son actores de Bollywood. Están conectados con líneas si han trabajado juntos al menos en una película.

bollywood actors

Podemos ver que tanto Amitabh Bachchan como Abhishek Bachchan han trabajado con todos los actores de la red, mientras que Akshay Kumar solo ha trabajado con los dos Bachchan. ¡Interesante!

Esto también es una red social. Cualquier red con conexiones entre individuos, donde esas conexiones representan una relación entre ellos, es una red social. Analizarlas puede darnos gran visibilidad sobre las personas en la red: quién influye de verdad, quién está más conectado, etc.

Cada red consta de:

  • Nodos: Los individuos cuya red estamos construyendo. En el ejemplo anterior, los actores.
  • Aristas: Las conexiones entre nodos. Representan una relación entre los nodos de la red. En nuestro ejemplo, que han trabajado juntos.

Crear una red con NetworkX

Existen muchos tipos de redes. Usaremos NetworkX para construir y analizar diferentes tipos. Para empezar, necesitas instalar NetworkX. Puedes usar:

pip install networkx

o, si trabajas con Anaconda:

conda install -c anaconda networkx

Esto instalará la última versión de NetworkX. El código de este tutorial se ha probado con Python=3.5 y NetworkX=2.0.

Redes simétricas

La primera red de actores que creamos arriba es una red simétrica porque la relación "trabajar juntos en una película" es simétrica. Si A está relacionado con B, B también lo está con A. Vamos a crear en NetworkX la red que vimos arriba.

Usaremos el método Graph() para crear una red nueva y add_edge() para añadir una arista entre dos nodos.

import networkx as nx
G_symmetric = nx.Graph()
G_symmetric.add_edge('Amitabh Bachchan','Abhishek Bachchan')
G_symmetric.add_edge('Amitabh Bachchan','Aamir Khan')
G_symmetric.add_edge('Amitabh Bachchan','Akshay Kumar')
G_symmetric.add_edge('Amitabh Bachchan','Dev Anand')
G_symmetric.add_edge('Abhishek Bachchan','Aamir Khan')
G_symmetric.add_edge('Abhishek Bachchan','Akshay Kumar')
G_symmetric.add_edge('Abhishek Bachchan','Dev Anand')
G_symmetric.add_edge('Dev Anand','Aamir Khan')

Ahora visualicemos la red que acabamos de construir con nx.draw_networkx(G_symmetric).

visualized network

Domina tus habilidades de datos con DataCamp

Más de 10 millones de personas aprenden Python, R, SQL y otras habilidades tecnológicas con nuestros cursos prácticos elaborados por expertos del sector.

Empieza a Aprender
learner-on-couch@2x.jpg

Redes asimétricas

¿Y si la relación entre nodos es "hijo de"? Entonces deja de ser simétrica. Si A es hijo de B, B no es hijo de A. Una red donde la relación es asimétrica (A está relacionado con B, pero eso no implica que B lo esté con A) se denomina red asimétrica. Podemos construir una red asimétrica en NetworkX con el método DiGraph, abreviatura de Directed Graph. Hagamos un grafo asimétrico.

G_asymmetric = nx.DiGraph()
G_asymmetric.add_edge('A','B')
G_asymmetric.add_edge('A','D')
G_asymmetric.add_edge('C','A')
G_asymmetric.add_edge('D','E')

Ahora lo visualizamos. Podemos usar la función draw_networkx() como antes. Sin embargo, es posible que los nodos queden demasiado juntos y no se distingan bien. Para evitarlo, podemos forzar un layout que posicione los nodos de forma que se vean claramente, usando spring_layout() y después draw_networkx().

nx.spring_layout(G_asymmetric)
nx.draw_networkx(G_asymmetric)

Abajo puedes ver la red con y sin aplicar el layout. La que usa el layout tiene más claridad.

visualized network 2

Redes ponderadas

Hasta ahora trabajábamos con redes sin pesos, pero también podemos asignar pesos. Por ejemplo, si en la red inicial consideramos como peso el número de películas hechas juntos, obtendremos una red ponderada. Volvamos al ejemplo de actores, pero esta vez añadimos un peso a cada arista que indique cuántas películas han hecho juntos.

G_weighted = nx.Graph()
G_weighted.add_edge('Amitabh Bachchan','Abhishek Bachchan', weight=25)
G_weighted.add_edge('Amitabh Bachchan','Aaamir Khan', weight=8)
G_weighted.add_edge('Amitabh Bachchan','Akshay Kumar', weight=11)
G_weighted.add_edge('Amitabh Bachchan','Dev Anand', weight=1)
G_weighted.add_edge('Abhishek Bachchan','Aaamir Khan', weight=4)
G_weighted.add_edge('Abhishek Bachchan','Akshay Kumar',weight=7)
G_weighted.add_edge('Abhishek Bachchan','Dev Anand', weight=1)
G_weighted.add_edge('Dev Anand','Aaamir Khan',weight=1)
weighted network

La figura superior muestra la red ponderada de actores con un layout circular. El grosor de la arista indica el peso entre dos nodos.

Multigrafo

Podemos asignar distintos atributos a las aristas. Por ejemplo, definir una relación de vecindad entre dos nodos "A" y "B" usando el atributo relation. Si dentro de una red dos nodos están conectados por dos aristas diferentes (relaciones distintas), tenemos un multigrafo. Podemos crear un multigrafo con la clase MultiGraph.

G = nx.MultiGraph()
G.add_edge('A','B',relation ='neighbor')
G.add_edge('A','B',relation='friend)
G.add_edge('B','C', relation='neighbor')
G.add_edge('D','C',relation='friend')

Este código construirá un grafo con dos aristas entre A y B. Podemos comprobar las conexiones con G.edges(); la salida mostrará:

MultiEdgeDataView([('A', 'B', {'relation': 'neighbor'}), ('A', 'B', {'relation': 'friend'}), ('B', 'C', {'relation': 'neighbor'}), ('B', 'D', {'relation': 'neighbor'}), ('C', 'D', {'relation': 'friend'})])

Conectividad de la red

Una vez construida la red, ¿podemos saber más sobre un nodo en particular? Sí, veamos algunas métricas.

Grado

El grado de un nodo es el número de conexiones que tiene. NetworkX tiene la función degree para calcular el grado de un nodo en la red.

nx.degree(G_symmetric, 'Dev Anand`)

Esto devolverá 3, ya que Dev Anand ha trabajado con tres actores en la red.

Coeficiente de agrupamiento

En las redes sociales, las personas que comparten conexiones tienden a asociarse entre sí. Es decir, existe una tendencia a formar clústeres. Podemos calcular los clústeres de un nodo mediante el coeficiente de agrupamiento local, que es la fracción de pares de amigos (conexiones) del nodo que también están conectados entre sí. Para determinarlo, usamos la función nx.clustering(Graph, Node).

En la red simétrica de actores, verás que Dev Anand tiene un coeficiente de agrupamiento local de 1 y Abhishek Bachchan uno de 0,67.

El coeficiente de agrupamiento medio (la suma de todos los coeficientes locales dividida por el número de nodos) para la red simétrica de actores es 0,867. Podemos obtenerlo con:

nx.average_clustering(G_symmetric)

Distancia

También podemos obtener el camino más corto entre dos nodos y su longitud en NetworkX usando nx.shortest_path(Graph, Node1, Node2) y nx.shortest_path_length(Graph, Node1, Node2), respectivamente.

Si ejecutas

nx.shortest_path(G_symmetric, 'Dev Anand', 'Akshay Kumar')

Devuelve

['Dev Anand', 'Amitabh Bachchan', 'Akshay Kumar']

Podemos calcular la distancia de un nodo a todos los demás usando búsqueda en anchura (BFS) desde ese nodo. NetworkX ofrece la función bfs_tree para ello. Si pruebas T = nx.bfs_tree(G_symmetric, 'Dev Anand') y dibujas ese árbol, obtendrás una estructura que indica cómo llegar al resto de nodos de la red partiendo de Dev Anand.

nodes

Excentricidad

La excentricidad de un nodo A se define como la mayor distancia entre A y cualquier otro nodo. Puede obtenerse con la función nx.eccentricity(). En la red simétrica de actores, Dev Anand tiene excentricidad 2 y Abhishek Bachchan excentricidad 1 (está conectado con todos).

Influencers en la red

Arriba vimos medidas de distancia en la red; son útiles para entender cómo se propaga la información. Ahora veremos cómo encontrar los nodos (personas) más importantes. Estos parámetros se denominan medidas de centralidad.

Piensa en la persona más popular de tu instituto o en la estrella del equipo de béisbol. Podían hacer que tu experiencia fuese un infierno o un paraíso. ¿Qué les daba ese poder? Las medidas de centralidad nos ayudan a identificar popularidad, afinidad e influencia dentro de la red.

Centralidad de grado

Las personas más populares o con más afinidad suelen ser quienes tienen más amigos. La centralidad de grado mide cuántas conexiones tiene un nodo. Parte de la idea de que los nodos importantes tienen muchas conexiones. NetworkX incluye la función degree_centrality() para calcularla en todos los nodos de una red.

Centralidad de vector propio

No solo importa con cuántas personas te conectas, sino con quién te conectas. En las carreteras de Delhi, cuando la policía de tráfico detiene a alguien por infringir una norma, muchas veces lo primero que oye es: "¿Sabes con quién estoy relacionado?".

La centralidad de vector propio mide exactamente esto: un nodo es importante si está conectado con otros nodos importantes. Podemos usar la función eigenvector_centrality() de NetworkX para calcularla en todos los nodos.

El algoritmo PageRank de Google es una variante de la centralidad de vector propio.

Centralidad de intermediación

La centralidad de intermediación es la centralidad del control. Representa la frecuencia con la que un punto aparece en las geodésicas (caminos más cortos) que conectan pares de puntos. Cuantifica cuántas veces un nodo concreto aparece en el camino más corto elegido entre otros dos. Los nodos con alta centralidad de intermediación juegan un papel clave en el flujo de comunicación/información dentro de la red. Pueden ejercer control e influencia estratégica: alguien en esa posición puede influir en todo el grupo, reteniendo o sesgando la información en tránsito.

NetworkX tiene la función betweenness_centrality() para medirla. Permite elegir si normalizar los valores, incluir pesos en el cálculo y si contar los extremos en los caminos más cortos.

Poniéndolo todo en práctica

Empecemos con datos de Facebook. Para este análisis usaremos el dataset combinado de ego-networks de Facebook: contiene la red agregada de las listas de amigos de diez personas. Puedes descargar el archivo facebook_combined.txt desde la web de la Universidad de Stanford.

También puedes obtener tus propios datos de Facebook/Twitter usando sus APIs. Estate atento al próximo tutorial, donde aprenderemos a usar las APIs de Facebook y Twitter para obtener datos y aplicar lo que has visto aquí para analizarlos.

Leemos el archivo y construimos el grafo:

G_fb = nx.read_edgelist("facebook_combined.txt", create_using = nx.Graph(), nodetype=int)

La red tiene 4.039 nodos conectados por 88.234 aristas. Sí, es una red grande. Puedes ver esta información con la función info().

[In]: print(nx.info(G_fb))


[Out]: Name:
       Type: Graph
       Number of nodes: 4039
       Number of edges: 88234
       Average degree:  43.6910

Esta es la red:

network

También podemos visualizar la red de forma que el color del nodo varíe con el grado y el tamaño del nodo con la centralidad de intermediación. El código es:

pos = nx.spring_layout(G_fb)
betCent = nx.betweenness_centrality(G_fb, normalized=True, endpoints=True)
node_color = [20000.0 * G_fb.degree(v) for v in G_fb]
node_size =  [v * 10000 for v in betCent.values()]
plt.figure(figsize=(20,20))
nx.draw_networkx(G_fb, pos=pos, with_labels=False,
                 node_color=node_color,
                 node_size=node_size )
plt.axis('off')

El grafo resultante es:

resulting graph

También puedes obtener las etiquetas de los nodos con mayor centralidad de intermediación con:

sorted(betCent, key=betCent.get, reverse=True)[:5]

La tabla siguiente recoge las cinco etiquetas de nodos con valores más altos en cada medida de centralidad.

Centralidad de grado Centralidad de vector propio Centralidad de intermediación
107 1912 107
1684 2266 1684
1912 2206 3437
3437 2233 1912
0 2464 1085

Vemos que hay nodos comunes entre la centralidad de grado, que mide conexiones, y la centralidad de intermediación, que controla el flujo de información. Es lógico: los nodos más conectados suelen estar en caminos cortos entre otros. El nodo 1912 es importante porque destaca en las tres medidas de centralidad consideradas.

Referencias

  • Los datos de actores se obtuvieron del sitio IMDB
  • El mejor lugar para aprender más sobre NetworkX y sus funciones es su documentación

Si quieres aprender más sobre análisis de redes sociales en Python, haz el curso Analyzing Social Media Data in Python de DataCamp.

Temas
Python
Análisis de datos

Sigue aprendiendo sobre Python y análisis de datos

Curso

Análisis de datos de redes sociales con Python

4 h
24.4K
En este curso, aprenderás a recopilar datos de Twitter y a analizar textos, redes y origen geográfico de Twitter.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

21 herramientas esenciales de Python

Conozca las herramientas esenciales de Python para el desarrollo de software, raspado y desarrollo web, análisis y visualización de datos y aprendizaje automático.
Abid Ali Awan's photo

Abid Ali Awan

6 min

Tutorial

Tutorial de Generación de nubes de palabras en Python

Aprende a realizar Análisis exploratorios de datos para el Procesamiento del lenguaje natural utilizando WordCloud en Python.
Duong Vu's photo

Duong Vu

11 min

GNN

Tutorial

Introducción completa a las redes neuronales gráficas (GNN)

Aprenda todo sobre las redes neuronales gráficas, incluyendo qué son las GNN, los diferentes tipos de redes neuronales gráficas y para qué se utilizan. Además, aprenda a crear una red neuronal gráfica con Pytorch.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Tutorial

Tutorial de análisis NLTK del sentimiento para principiantes

Tutorial de análisis del sentimiento NLTK (natural language toolkit) de Python. Aprende a crear y desarrollar análisis del sentimiento utilizando Python. Sigue pasos específicos para extraer y analizar texto para el procesamiento del lenguaje natural.
Moez Ali's photo

Moez Ali

13 min

Tutorial

Introducción a las redes neuronales profundas

Comprender las redes neuronales profundas y su importancia en el mundo moderno del aprendizaje profundo de la inteligencia artificial
Bharath K's photo

Bharath K

13 min

Tutorial

Funciones en Python: cómo llamar y escribir funciones

Descubre cómo escribir funciones en Python reutilizables y eficientes. Domina los parámetros, las sentencias return y temas avanzados como las funciones lambda. Organiza mejor tu código con main() y otras buenas prácticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Ver MásVer Más