Pandas & NumPy Academy · Lección

Visualizar los recorridos de los usuarios

Represente el embudo como un gráfico de barras horizontal y la matriz de retención como un mapa de calor para comunicar las conclusiones a las partes interesadas.

Lección 4 de 413 pasos

Visualizar los recorridos de los usuarios es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Por qué visualizar los recorridos de los usuarios?

Las tablas de eventos sin procesar y las tasas de conversión expresadas como números son difíciles de comunicar a las partes interesadas no técnicas. Las representaciones visuales de los recorridos de los usuarios —gráficos de embudo, mapas de calor de retención y diagramas de Sankey— hacen que los patrones sean evidentes de inmediato. El objetivo no es sustituir los números, sino presentarlos de forma que los hallazgos sean evidentes a simple vista y se reduzca la carga cognitiva de la audiencia.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Assume funnel_summary and retention_pct are already computed
print('Visualisation libraries loaded')

Gráfico de barras horizontales para el embudo

Un gráfico de barras horizontales es la visualización de embudo más sencilla y fácil de interpretar. Cada barra representa un paso del embudo y su longitud representa el número de usuarios. Ordene los pasos de arriba abajo según el orden del embudo para que el gráfico se lea como un embudo que se ensancha. Utilice un único color contrastante para todas las barras, de modo que la atención se centre en los valores y no en la variedad de colores.

FUNNEL_STEPS = ['homepage', 'product_page', 'add_to_cart', 'checkout', 'purchase']
users = [10000, 7200, 4100, 2300, 980]

fig, ax = plt.subplots(figsize=(9, 5))
bars = ax.barh(FUNNEL_STEPS[::-1], users[::-1], color='steelblue', height=0.6)
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()

Anotación de las tasas de conversión en el gráfico

Añada las anotaciones de la tasa de conversión en el extremo derecho de cada barra mediante ax.text(). Muestre tanto el número absoluto de usuarios como el porcentaje de conversión entre pasos, para que el gráfico comunique toda la información necesaria sin una tabla de datos adicional. Coloque el texto ligeramente fuera del extremo de la barra, con un pequeño desplazamiento horizontal, para que no se superponga al color de relleno.

conversions = [None, 72.0, 56.9, 56.1, 42.6]

for i, (u, c) in enumerate(zip(users[::-1], conversions[::-1])):
    label = f'{u:,} users'
    if c is not None:
        label += f'  ({c}% conv)'
    ax.text(u + 100, i, label, va='center', fontsize=9)

plt.tight_layout()
plt.show()

Revisión del mapa de calor de retención

El mapa de calor de retención es el resultado estándar del análisis de cohortes. Cada fila es una cohorte, cada columna es un desplazamiento semanal y cada celda se colorea según el porcentaje de retención. Utilice el mapa de colores RdYlGn (rojo = bajo, verde = alto) con vmin=0, vmax=100 explícitos, para que la escala de colores sea coherente entre las presentaciones y no se reajuste en cada mapa de calor.

import numpy as np

# Simulated retention data for illustration
data = [[100, 55, 42, 38, 35, 33],
        [100, 52, 40, 36, 33, 0],
        [100, 58, 45, 41, 0, 0],
        [100, 60, 48, 0, 0, 0]]
retention_pct = pd.DataFrame(data, columns=range(6),
                             index=['Wk1', 'Wk2', 'Wk3', 'Wk4'])

fig, ax = plt.subplots(figsize=(10, 4))
sns.heatmap(retention_pct, annot=True, fmt='.0f', cmap='RdYlGn',
            vmin=0, vmax=100, linewidths=0.5, ax=ax)
ax.set_title('Cohort Retention Heatmap')
plt.tight_layout()
plt.show()

Enmascaramiento de celdas incompletas de cohortes

Las cohortes más recientes aún no han tenido tiempo de completar todos los desplazamientos semanales. Esas celdas deben aparecer vacías, no como 0 %, para que los lectores no confundan la ausencia de datos con una retención nula. Cree una máscara booleana donde el valor de la celda sea 0 y el índice de la columna supere el número de semanas que lleva existiendo la cohorte; después, pásela a sns.heatmap(mask=...).

mask = retention_pct == 0  # cells with no data yet

fig, ax = plt.subplots(figsize=(10, 4))
sns.heatmap(retention_pct, annot=True, fmt='.0f', cmap='RdYlGn',
            vmin=0, vmax=100, linewidths=0.5,
            mask=mask, ax=ax)
ax.set_title('Cohort Retention (incomplete cells masked)')
plt.tight_layout()
plt.show()

Representación de la curva de retención media

Visualice la curva de retención media representando las medias de las columnas de la matriz de retención. Esta única línea resume el perfil general de retención del producto. Añada una banda sombreada para ±1 desviación estándar, con el fin de mostrar la variabilidad entre cohortes. Una banda estrecha significa que las cohortes se comportan de forma similar; una banda amplia sugiere diferencias importantes entre cohortes que conviene investigar.

avg = retention_pct.mean(axis=0)
std = retention_pct.std(axis=0)

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(avg.index, avg, marker='o', color='steelblue', linewidth=2)
ax.fill_between(avg.index, avg - std, avg + std, alpha=0.2, color='steelblue')
ax.set_xlabel('Week Number')
ax.set_ylabel('Avg Retention %')
ax.set_title('Average Cohort Retention Curve')
plt.tight_layout()
plt.show()

Embudo segmentado: escritorio frente a móvil

Representar los embudos de distintos segmentos uno junto a otro revela si los problemas del producto son generales o específicos de un dispositivo. Cree un gráfico de barras agrupadas con dos grupos de barras por paso del embudo utilizando ax.bar() con un desplazamiento en el eje x. Como alternativa, dibuje dos gráficos de embudo independientes en una cuadrícula de subgráficos 1×2 mediante plt.subplots(1, 2) para facilitar la comparación.

steps = ['Homepage', 'Product', 'Cart', 'Checkout', 'Purchase']
desktop = [5000, 3800, 2300, 1500, 700]
mobile = [5000, 3400, 1800, 900, 280]

x = range(len(steps))
fig, ax = plt.subplots(figsize=(10, 5))
ax.bar([i - 0.2 for i in x], desktop, width=0.4, label='Desktop', color='steelblue')
ax.bar([i + 0.2 for i in x], mobile, width=0.4, label='Mobile', color='darkorange')
ax.set_xticks(list(x))
ax.set_xticklabels(steps)
ax.legend()
ax.set_title('Funnel by Device Type')
plt.tight_layout()
plt.show()

Distribución de la frecuencia de eventos

Visualizar la distribución de eventos por sesión muestra si las sesiones se concentran en un número reducido de eventos (lo que sugiere que los usuarios alcanzan rápidamente su objetivo) o abarcan un intervalo amplio (lo que sugiere recorridos complejos o confusión). Represéntela con ax.hist() sobre la columna event_count, utilizando una escala logarítmica en el eje y si la distribución presenta un sesgo marcado hacia la derecha.

import numpy as np

event_counts = pd.Series([3, 5, 2, 8, 1, 12, 3, 4, 6, 20, 2, 3, 1, 7, 5])

fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(event_counts, bins=15, color='steelblue', edgecolor='white')
ax.set_xlabel('Events per Session')
ax.set_ylabel('Number of Sessions')
ax.set_title('Session Event Frequency Distribution')
plt.tight_layout()
plt.show()

Secuencias de eventos principales

Muestre las secuencias más frecuentes de dos eventos (bigramas) en el flujo de clics para comprender las rutas habituales de los usuarios. Agrupe por sesión, ordene por event_rank y extraiga pares consecutivos mediante zip(events, events[1:]). Cuente la frecuencia de los pares con un Counter y represente los 10 principales en un gráfico de barras horizontales. Esto revela qué rutas de navegación predominan en el comportamiento de los usuarios.

from collections import Counter

events_per_session = [['homepage', 'product_page', 'add_to_cart'],
                       ['homepage', 'search', 'product_page'],
                       ['homepage', 'product_page', 'purchase']]

bigrams = Counter()
for session in events_per_session:
    for pair in zip(session, session[1:]):
        bigrams[pair] += 1

print(bigrams.most_common(5))

Distribución de la duración de las sesiones

Un histograma de la duración de las sesiones revela si los usuarios interactúan brevemente (menos de 2 minutos), de forma moderada o intensamente. Utilice un eje x con escala logarítmica si un número reducido de sesiones muy largas comprimiera la mayor parte de los datos en el intervalo situado más a la izquierda. Superponga una línea vertical en la mediana con ax.axvline() para facilitar la interpretación de la duración de una sesión «típica».

durations = pd.Series([1.2, 3.5, 0.5, 12.3, 2.1, 8.7, 1.8, 0.3, 45.1, 4.6])

fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(durations, bins=20, color='steelblue', edgecolor='white')
ax.axvline(durations.median(), color='red', linestyle='--', label=f'Median: {durations.median():.1f} min')
ax.set_xlabel('Session Duration (min)')
ax.set_ylabel('Sessions')
ax.legend()
plt.tight_layout()
plt.show()

Guardado de la figura del panel

Combine varias visualizaciones en una única figura de panel mediante una cuadrícula de subgráficos con plt.subplots(2, 2, figsize=(14, 10)). Asigne el gráfico de barras de embudo, el mapa de calor de retención, la curva de retención media y la distribución de eventos a cada panel. Guárdela como PNG para su distribución en la web o como PDF para informes imprimibles. Una figura unificada es más fácil de compartir que cuatro archivos independientes.

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# Panel 1: funnel
axes[0, 0].barh(FUNNEL_STEPS[::-1], users[::-1], color='steelblue')
axes[0, 0].set_title('Funnel')

# Panel 2: retention heatmap
sns.heatmap(retention_pct, ax=axes[0, 1], cmap='RdYlGn', annot=True, fmt='.0f', vmin=0, vmax=100)
axes[0, 1].set_title('Cohort Retention')

fig.suptitle('User Journey Dashboard', fontsize=16)
plt.tight_layout()
fig.savefig('user_journey_dashboard.png', dpi=150, bbox_inches='tight')
print('Dashboard saved')

Comprobación rápida

Compruebe su comprensión de los conceptos de Análisis de datos de esta lección.

Resumen de la lección

En esta lección aprendió a: crear gráficos de barras de embudo y mapas de calor de retención con anotaciones, representar curvas de retención media con bandas de variabilidad y combinar varios gráficos en una única figura de panel guardada como PNG. A continuación, exploraremos la detección y eliminación de registros duplicados en la limpieza avanzada de datos.

Gratis para empezar

Aprende Python con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
30
Lecciones
120

Preguntas frecuentes

¿La lección «Visualizar los recorridos de los usuarios» es gratis?

Sí — el texto completo de «Visualizar los recorridos de los usuarios» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Visualizar los recorridos de los usuarios»?

Represente el embudo como un gráfico de barras horizontal y la matriz de retención como un mapa de calor para comunicar las conclusiones a las partes interesadas. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Visualizar los recorridos de los usuarios»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Creación de sesiones y secuenciación de eventos
  2. Análisis de embudo
  3. Tabla de retención por cohortes
  4. Visualizar los recorridos de los usuarios
← Volver a Pandas & NumPy Academy