Pandas & NumPy Academy · Lección

Análisis de embudo

Realice el seguimiento del número de usuarios que alcanza cada paso de un embudo de varias etapas y calcule las tasas de conversión entre pasos consecutivos.

Lección 2 de 413 pasos

Análisis de embudo es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 2 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.

¿Qué es un embudo de conversión?

Un embudo de conversión modela el recorrido de un usuario a través de una secuencia de pasos necesarios; por ejemplo, página de inicio → página de producto → añadir al carrito → pago → compra. En cada paso, algunos usuarios abandonan y no llegan al siguiente. El análisis de embudos cuantifica estos abandonos para que los equipos puedan priorizar el paso que deben mejorar primero. El resultado es una tabla que muestra el número de usuarios y la tasa de conversión en cada paso.

import pandas as pd

FUNNEL_STEPS = [
    'homepage',
    'product_page',
    'add_to_cart',
    'checkout',
    'purchase'
]

df = pd.read_csv('clickstream.csv', parse_dates=['timestamp'])
print(df['event_type'].value_counts())

Contar usuarios únicos en cada paso

Para cada paso del embudo, cuente el número de usuarios únicos que activaron ese evento al menos una vez. Use df[df['event_type'] == step]['user_id'].nunique() dentro de un bucle y recopile los resultados en un diccionario. Convertirlo en una Series facilita los cálculos porcentuales posteriores mediante una sola división.

step_counts = {}
for step in FUNNEL_STEPS:
    users = df[df['event_type'] == step]['user_id'].nunique()
    step_counts[step] = users

funnel = pd.Series(step_counts, name='users')
print(funnel)

Calcular las tasas de conversión entre pasos

La tasa de conversión entre pasos muestra qué proporción de los usuarios que completaron el paso N también completó el paso N+1. Calcule esta tasa con funnel.shift(1) (que proporciona el número del paso anterior) y divida: funnel / funnel.shift(1) * 100. El primer paso no tiene un paso anterior, por lo que su tasa es NaN o 100 %, según cómo defina la referencia.

funnel_df = funnel.to_frame()
funnel_df['prev_users'] = funnel_df['users'].shift(1)
funnel_df['step_conversion_%'] = (funnel_df['users'] / funnel_df['prev_users'] * 100).round(1)
print(funnel_df)

Calcular la tasa de conversión global

La tasa de conversión global mide qué proporción de todos los usuarios que entraron en el embudo en el paso 1 completó finalmente el último paso. Divida el número de usuarios del último paso entre el número del primero. En el comercio electrónico, una conversión global del 2–5 % desde la página de inicio hasta la compra es habitual; los valores inferiores indican un abandono crítico en algún punto del embudo.

overall_rate = funnel.iloc[-1] / funnel.iloc[0] * 100
print(f'Overall conversion rate: {overall_rate:.1f}%')

funnel_df['overall_conversion_%'] = (funnel_df['users'] / funnel_df['users'].iloc[0] * 100).round(1)
print(funnel_df[['users', 'overall_conversion_%']])

Embudo ordenado: exigir la secuencia de pasos

Un recuento simple de usuarios únicos considera válidas las entradas de usuarios que accedieron directamente al pago sin visitar la página de producto, lo que infla la conversión en los primeros pasos. Para imponer el orden, compruebe que cada usuario haya alcanzado el paso N solo después de alcanzar el paso N-1. Esto requiere comparar marcas de tiempo: el usuario debe tener un evento product_page antes que su evento add_to_cart.

# Get first occurrence of each step per user
first_events = df.groupby(['user_id', 'event_type'])['timestamp'].min().unstack('event_type')

# Enforce ordering: each step must come after the previous
first_events['valid_to_cart'] = first_events['add_to_cart'] > first_events['product_page']
print(first_events[['product_page', 'add_to_cart', 'valid_to_cart']].head())

Embudo por segmento: tipo de dispositivo

Los distintos segmentos de usuarios pueden presentar tasas de conversión muy diferentes. Ejecute el mismo cálculo del embudo por separado para usuarios de escritorio y móviles mediante groupby('device_type'). Si los usuarios móviles abandonan el proceso en gran medida en el paso de pago, es probable que la página de pago presente un problema de usabilidad en pantallas pequeñas. Los embudos segmentados revelan oportunidades de optimización específicas.

def funnel_for_group(group_df):
    counts = {}
    for step in FUNNEL_STEPS:
        counts[step] = group_df[group_df['event_type'] == step]['user_id'].nunique()
    return pd.Series(counts)

segmented_funnel = df.groupby('device_type').apply(funnel_for_group)
print(segmented_funnel)

Identificar el paso con mayor abandono

El paso con la mayor pérdida absoluta de usuarios es el objetivo de optimización prioritario. Encuéntrelo calculando la diferencia entre los recuentos de usuarios de pasos consecutivos con funnel.diff(): el valor más negativo corresponde al mayor abandono. Presente este hallazgo tanto numérica como visualmente para las partes interesadas.

dropoffs = funnel.diff().abs()
biggest_drop = dropoffs.idxmax()
biggest_drop_count = dropoffs.max()

print(f'Biggest drop-off: {biggest_drop} ({biggest_drop_count:.0f} users lost)')

Tiempo entre pasos del embudo

El tiempo que tardan los usuarios en pasar de un paso al siguiente revela la fricción. Si los usuarios esperan horas entre añadir un producto al carrito y realizar el pago, un correo electrónico sobre el carrito abandonado podría recuperarlos. Calcule el tiempo mediano entre cada par de pasos mediante el DataFrame first_events: reste las columnas de marcas de tiempo adyacentes y calcule la mediana entre todos los usuarios.

for i in range(1, len(FUNNEL_STEPS)):
    prev = FUNNEL_STEPS[i-1]
    curr = FUNNEL_STEPS[i]
    delta = (first_events[curr] - first_events[prev]).dt.total_seconds() / 60
    print(f'{prev} -> {curr}: median {delta.median():.1f} min, 90th pct {delta.quantile(0.9):.1f} min')

Tendencia semanal del embudo

Realice un seguimiento de si las tasas de conversión mejoran o empeoran semana a semana calculando el embudo por separado para cada semana. Agrupe la tabla de primeros eventos por semana mediante first_events['homepage'].dt.isocalendar().week y calcule la tasa de conversión global de cada semana. Una caída repentina en una semana concreta puede coincidir con un lanzamiento de producto o un cambio de marketing.

df['week'] = df['timestamp'].dt.isocalendar().week

weekly_conv = []
for week, wdf in df.groupby('week'):
    top = wdf[wdf['event_type'] == FUNNEL_STEPS[0]]['user_id'].nunique()
    bot = wdf[wdf['event_type'] == FUNNEL_STEPS[-1]]['user_id'].nunique()
    weekly_conv.append({'week': week, 'conversion_%': bot/top*100 if top else 0})

print(pd.DataFrame(weekly_conv))

Crear el DataFrame resumen del embudo

Reúna todas las métricas del embudo en un DataFrame resumen limpio que pueda exportarse a un informe o utilizarse en una visualización. Incluya columnas para el nombre del paso, el número de usuarios, la conversión entre pasos, la conversión global y los usuarios perdidos. Este único DataFrame debe ser el resultado del análisis del embudo y resultar legible tanto para ingenieros como para responsables de producto.

summary = pd.DataFrame({
    'step': FUNNEL_STEPS,
    'users': [step_counts[s] for s in FUNNEL_STEPS]
})
summary['users_lost'] = summary['users'].shift(-1).rsub(summary['users'])
summary['step_conv_%'] = (summary['users'] / summary['users'].shift(1) * 100).round(1)
summary['overall_conv_%'] = (summary['users'] / summary['users'].iloc[0] * 100).round(1)
print(summary)

Visualizar el embudo como un gráfico de barras

Represente el embudo como un gráfico de barras horizontales, donde la longitud de cada barra represente el número de usuarios en ese paso. La forma de embudo surge de manera natural cuando las barras se ordenan de arriba (más usuarios) hacia abajo (menos usuarios). Anote en cada barra el porcentaje de conversión entre pasos para que el gráfico sea autosuficiente y no requiera una tabla de datos adicional para interpretarlo.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
ax.barh(summary['step'][::-1], summary['users'][::-1], color='steelblue')
for i, row in summary[::-1].iterrows():
    ax.text(row['users'], i - summary.index[0], f'  {row['step_conv_%']}%', va='center')
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()

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: contar usuarios únicos en cada paso del embudo, calcular las tasas de conversión entre pasos y globales y segmentar embudos por tipo de dispositivo y hacer un seguimiento de las tendencias de conversión semanales. A continuación, exploraremos las tablas de retención por cohortes para hacer un seguimiento de cuántos usuarios regresan semana tras semana.

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 «Análisis de embudo» es gratis?

Sí — el texto completo de «Análisis de embudo» 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 «Análisis de embudo»?

Realice el seguimiento del número de usuarios que alcanza cada paso de un embudo de varias etapas y calcule las tasas de conversión entre pasos consecutivos. 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 2 de 4.

¿Cuánto tiempo toma la lección «Análisis de embudo»?

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