El grafico de embudo es ideal para mostrar la perdida entre etapas desde el ingreso hasta la conversion. Los trapezoides transmiten el volumen restante por su ancho.
import numpy as np
import matplotlib.pyplot as plt
steps = ["Visita", "Vista de producto", "Agregar al carrito", "Datos de pago", "Compra completada"]
counts = np.array([12000, 5400, 2600, 1800, 1250])
max_width = counts[0]
fig, ax = plt.subplots(figsize=(6, 4))
y_positions = np.arange(len(steps), 0, -1)
for idx, (step, count) in enumerate(zip(steps, counts)):
width = count / max_width
left = 0.5 - width / 2
ax.fill_between(
[left, left + width],
[y_positions[idx]] * 2,
[y_positions[idx] - 0.8] * 2,
color=plt.cm.Blues(0.3 + idx * 0.12),
)
ax.text(
0.5,
y_positions[idx] - 0.4,
f"{step}\n{count:,}",
ha="center",
va="center",
color="white",
fontsize=11,
)
ax.set_xlim(0, 1)
ax.set_ylim(0, len(steps) + 0.5)
ax.axis("off")
ax.set_title("Embudo de compra en e-commerce")
conversion = counts[-1] / counts[0]
ax.text(0.02, 0.3, f"CVR: {conversion:.1%}", fontsize=11, fontweight="bold")
fig.tight_layout()
plt.show()

Consejos de lectura #
- El ancho de cada etapa representa usuarios restantes; los saltos grandes son cuellos de botella.
- Mostrar CVR del inicio al final refuerza el impacto.
- Cambia los nombres de las etapas para adaptarlo a tu flujo.