Ejercicio 48: Construcción y Análisis de Redes Basadas en Similitud
Este ejercicio tiene como objetivo que los estudiantes trabajen con redes basadas en similitud, utilizando cosine similarity o correlación para construir grafos y analizar sus componentes. Se explorará cómo construir redes a partir de datos estructurados y cómo analizar la estructura resultante con NetworkX y Pandas.
Objetivos
- Construir una matriz de similitud a partir de un dataset seleccionado.
- Aplicar un umbral para definir conexiones en la red.
- Construir un grafo con NetworkX y analizar sus componentes conexas.
- Convertir el grafo en un DataFrame de Pandas para análisis estadístico.
- Visualizar la red resultante.
Selección del Dataset
Los estudiantes deben elegir uno de los siguientes datasets, cada uno de los cuales es adecuado para construir redes basadas en similitud:
MovieLens 100K (Red de Usuarios y Películas)
- Fuente: MovieLens 100K
- Descripción: Se crea una red de usuarios basada en la similitud de sus calificaciones de películas.
- Construcción de la red: La correlación entre usuarios define las conexiones.
Datos Financieros (Mercado de Acciones)
- Fuente: yfinance
- Descripción: Se analiza la similitud en la evolución de los precios de las acciones.
- Construcción de la red: La correlación entre series de tiempo de rendimientos de activos define las conexiones.
Expresión Génica (Datos Biomédicos)
- Fuente:
sklearn.datasets.fetch_openml('GDS1615')
- Descripción: Se analizan similitudes entre genes a partir de datos de expresión génica.
- Construcción de la red: La correlación entre los niveles de expresión de los genes define las conexiones.
- Fuente:
Parte A: Construcción de la Matriz de Similitud
El primer paso es calcular la similitud entre entidades del dataset seleccionado.
Tareas
- Cargar el dataset seleccionado en un DataFrame de Pandas.
- Construir una matriz de similitud utilizando correlación de Pearson o cosine similarity.
- Elegir un umbral para definir qué valores de similitud se considerarán conexiones en la red.
Pregunta de reflexión: ¿Cómo afecta el umbral a la estructura de la red resultante?
Parte B: Construcción del Grafo con NetworkX
A partir de la matriz de similitud, se generará un grafo donde los nodos representan entidades y los enlaces indican una alta similitud.
Tareas
- Crear el DataFrame de conexiones (edges)
# TODO: Implementar
edges_df = (similarity_matrix
.stack() # Convierte la matriz en formato largo
.reset_index() # Convierte índices en columnas
.rename(columns={'level_0': 'Entidad 1', 'level_1': 'Entidad 2', 0: 'Similitud'})
.query("`Entidad 1` != `Entidad 2` and Similitud > @threshold")) # Filtra conexiones válidas
Construir el grafo con NetworkX
- Crear un grafo
G = nx.Graph()
. - Agregar nodos y aristas desde el DataFrame de conexiones.
- Crear un grafo
Extraer componentes conexas
- Listar las componentes conexas en la red y analizar su distribución.
Pregunta de reflexión: ¿Qué significa que existan componentes separadas en la red?
Parte C: Conversión de NetworkX a Pandas y Análisis
Exploraremos cómo transformar la estructura de NetworkX en DataFrames de Pandas para análisis estadístico.
Tareas
- Convertir los nodos en un DataFrame con información de grado
# TODO: Implementar
nodes_df = pd.DataFrame({
"Nodo": list(G.nodes),
"Grado": [G.degree(n) for n in G.nodes]
})
- Convertir las aristas en un DataFrame
# TODO: Implementar
edges_df = pd.DataFrame(G.edges(), columns=["Entidad 1", "Entidad 2"])
- Calcular estadísticas básicas de la red
- Distribución de grados.
- Tamaño de las componentes conexas.
Pregunta de reflexión: ¿Cómo podemos interpretar los nodos con mayor grado en la red?
Parte D: Visualización del Grafo
Finalmente, se visualizará la red utilizando NetworkX y Matplotlib.
Tareas
- Dibujar el grafo con etiquetas
# TODO: Implementar
plt.figure(figsize=(8, 6))
nx.draw(G, with_labels=False, node_size=50, edge_color="gray", alpha=0.6)
plt.title("Red de Similitud")
plt.show()
- Probar diferentes layouts para mejorar la visualización
- Fruchterman-Reingold (
spring_layout
) - Circular (
circular_layout
)
- Fruchterman-Reingold (
Pregunta de reflexión: ¿Cómo cambia la interpretación del grafo con diferentes layouts?
Entrega esperada
- Código en Python estructurado y documentado utilizando Pandas y NetworkX.
- Un archivo con la red creada en formato DataFrame (
edges_df
,nodes_df
). - Un análisis sobre las componentes conexas y distribución de grados.
- Un gráfico visual de la red construida.
- Reflexiones sobre cómo los diferentes umbrales afectan la red generada.