import plotly.graph_objects as go
import plotly.io as pio
pio.renderers.default = "notebook"
# Etapas y valores del proceso
stages = [
"Búsqueda automática (keywords)",
"Exclusión títulos/abstracts (dobles)",
"Exclusión por contenido (temas)",
"Revisión manual",
"Resultados finales (coincidencias)"
]
values = [904, 299, 256, 72, 72]
fig = go.Figure(go.Funnel(
y=stages,
x=values,
text=[f"{v}" for v in values],
textposition="inside",
textinfo="value+percent initial",
opacity=0.9
))
fig.update_layout(
title="Proceso de Selección de Artículos",
margin=dict(l=80, r=40, t=60, b=40)
)
fig.show()Los gráficos de embudo son una herramienta común para representar datos en las diferentes etapas de un proceso empresarial o en análisis de datos el resultado de un proceso de limpeza de datos o selección de caracterisiticas. Su función principal es mostrar cómo un conjunto inicial de elementos disminuye progresivamente a medida que avanza por las distintas fases de un flujo.
En el ámbito de la inteligencia de negocios, se utilizan con frecuencia para identificar posibles áreas problemáticas de un proceso. Por ejemplo, en el análisis de ventas permiten observar los ingresos o pérdidas en cada etapa y visualizar el porcentaje de usuarios o clientes que avanzan en el proceso. Utilizado tambien en las revisión sistematicas de literatura.
¿Cuándo utilizar un gráfico de embudo?
- Procesos de ventas o marketing digital, donde se analiza el abandono de usuarios en cada fase.
- Flujos de conversión (por ejemplo: visitas → registros → compras).
- Procesos de atención al cliente, donde interesa identificar los puntos donde los usuarios se detienen o se retiran.
Es importante recordar que un embudo no explica las causas de los descensos, sino que ofrece una visión general que sirve de punto de partida para un análisis más profundo.
Estadísticas relevantes en un gráfico de embudo
En cada etapa, se pueden resaltar diferentes métricas:
- Recuentos absolutos: el número total de usuarios que permanece en cada fase.
- Proporciones relativas: el porcentaje de retención respecto al valor inicial.
- Tasas de abandono entre etapas: muestran cuánto disminuye el conjunto en cada transición.
Siempre que la visualización lo permita, es recomendable incluir tanto los valores absolutos como los relativos, cuidando de no sobrecargar el gráfico.
Problemas comunes y mejores prácticas
- Representación triangular distorsionada: en algunos casos se dibuja un triángulo donde cada etapa se ajusta al ancho correspondiente. Esto puede engañar visualmente sobre la magnitud de las pérdidas.
- Espaciado inconsistente entre fases: si los intervalos no son uniformes, se dificulta la comparación entre etapas.
- Incluir al menos tres etapas. Si solo existen dos, es preferible usar otros gráficos de parte–todo (gráfico barras o una barras apilada).
- Mantener claridad visual en las proporciones representadas.
- Usar el embudo como visualización general y complementarlo con otras métricas o gráficos que expliquen el motivo de las caídas.
Dataset:
Systematic Literature Review on Recommender System: Approach, Problem, Evaluation Techniques, Datasets Link articulo 
import plotly.graph_objects as go
# Etapas y valores del proceso
stages = [
"Búsqueda automática (keywords)",
"Exclusión títulos/abstracts (dobles)",
"Exclusión por contenido (temas)",
"Revisión manual",
"Resultados finales (coincidencias)"
]
values = [904, 299, 256, 72, 72]
fig = go.Figure(go.Funnel(
y=stages,
x=values,
text=[f"{v}" for v in values],
textposition="inside",
textinfo="value+percent initial",
opacity=0.5,
marker=dict(color="red")
))
fig.update_layout(
title="Proceso de Selección de Artículos",
margin=dict(l=80, r=40, t=60, b=40),
plot_bgcolor="white", # fondo del área del gráfico
paper_bgcolor="white" # fondo general
)
fig.show()Realice la búsqueda de un artículo de revisión sistemática (SLR) de su interés y elabore un gráfico de embudo (del proceso de selección de articulos).

import plotly.graph_objects as go
# Etapas y valores del proceso
stages = [
"All sources Removal of duplicates",
"Exclusion/inclusion citeria",
"Candidate Papers",
"Selected primary papers"
]
values = [1073, 996, 12, 12]
fig = go.Figure(go.Funnel(
y=stages,
x=values,
text=[f"{v}" for v in values],
textposition="inside",
textinfo="value+percent initial",
opacity=0.5,
marker=dict(color="red")
))
fig.update_layout(
title="Proceso de Selección de Artículos",
margin=dict(l=80, r=40, t=60, b=40),
plot_bgcolor="white", # fondo del área del gráfico
paper_bgcolor="white" # fondo general
)
fig.show()