Procesos Estocásticos y Cadenas de Markov · Tema 45

Usuarios con Markov

Clicks, abandono y conversión: el funnel como cadena absorbente con compra y fuga.

01 · Punto de partida

Cada click es un paso, cada fuga una absorción

Visita → explora → carrito → compra… o abandono en cualquier punto. El funnel es una cadena con dos trampas rivales (Tema 32): compra y abandono.

La pregunta es la conversión: qué fracción de visitas termina en compra según las chances por etapa.

  • ¿Qué etapas: visita, explora, carrito?
  • ¿Qué chance de avanzar vs fugar en cada una?
  • ¿Qué conversión total resulta?
  • ¿Qué etapa pierde más y conviene arreglar?

02 · Definición

Etapas, avances y fugas

Tres números por etapa:

→

Avanza

Chance de pasar a la próxima etapa (explora→carrito).

✕

Fuga

Chance de abandonar ahí. El resto (1 − avanza − fuga) se queda.

$

Conversión

P(compra | visita): absorción en compra desde el inicio.

Con explora 0,6, carrito 0,4 y compra 0,5 (fugas 0,2/0,3/0,5): conversión ≈ 12 %.

Funnel ejemplo con fugas por etapa.
EtapaAvanzaFuga
Visita 00,60 a explora0,20 abandona
Explora 10,40 a carrito0,30 abandona
Carrito 20,50 compra0,50 abandona

03 · Anatomía

Cuello, fuga y reingreso

Cuatro lecturas del funnel:

Cuello
La etapa con menor avance×llegada: donde más se pierde en absoluto. Ahí rinde optimizar.
Fuga por etapa
P(abandono | etapa): el diagnóstico local. Alta = fricción (precio, formulario).
Conversión total
De visita a compra: el KPI. Sube mejorando cuellos, no todo parejo.
Reingreso
Volver atrás (carrito→explora) alarga el camino: modelarlo evita sobrestimar.

Mejorar cuello

Rinde mucho

Subir el avance donde más se pierde multiplica la conversión.

Mejorar parejo

Rinde poco

Pulir etapas sanas casi no mueve el total.

04 · Ejemplos

Funnels que se modelan igual

Cambia el negocio, no la matriz:

Etapas→avances/fugas→conversión
  1. 1
    E-commerce.

    Visita→carrito→compra con abandono en cada click.

  2. 2
    SaaS trial.

    Registro→uso→pago vs churn: conversión a pago.

  3. 3
    App móvil.

    Instalación→onboarding→activo vs desinstala.

  4. 4
    Contenido.

    Portada→nota→suscripción vs rebote.

  5. 5
    Soporte.

    Ticket→resolución vs abandono del canal.

05 · Representación en Python

Funnel como P 5×5 absorbente

En Python, el funnel es P con dos trampas (compra 3, abandono 4). Simular hasta absorber da conversión y fugas por etapa.

Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Subí el avance del carrito y mirá la conversión.

import random

# 0 visita, 1 explora, 2 carrito, 3 compra, 4 abandona.
P = [[0.2, 0.6, 0.0, 0.0, 0.2],
     [0.0, 0.3, 0.4, 0.0, 0.3],
     [0.0, 0.0, 0.0, 0.5, 0.5],
     [0.0, 0.0, 0.0, 1.0, 0.0],
     [0.0, 0.0, 0.0, 0.0, 1.0]]

def comprar(semilla=7):
    random.seed(semilla)
    x = 0
    while x not in (3, 4):
        u, ac = random.random(), 0.0
        for j, p in enumerate(P[x]):
            ac += p
            if u < ac:
                x = j
                break
    return x == 3

print([comprar(s) for s in range(10)])

Unos compran (True), la mayoría abandona: conversión de un dígito, típica.

Conversión simulada

2000 visitas hasta absorber:

import random

P = [[0.2, 0.6, 0.0, 0.0, 0.2],
     [0.0, 0.3, 0.4, 0.0, 0.3],
     [0.0, 0.0, 0.0, 0.5, 0.5],
     [0.0, 0.0, 0.0, 1.0, 0.0],
     [0.0, 0.0, 0.0, 0.0, 1.0]]

def destino():
    x = 0
    while x not in (3, 4):
        u, ac = random.random(), 0.0
        for j, p in enumerate(P[x]):
            ac += p
            if u < ac:
                x = j
                break
    return x

random.seed(5)
N = 2000
print("conversión:", round(sum(destino() == 3 for _ in range(N)) / N, 3))

06 · Exploración

Laboratorio: encontrar el cuello

Movete carrito (1→2) y compra (2→3): las barras son llega-a-carrito, compra y abandono (300 visitas). La conversión responde más al cuello que al resto: probá qué slider la mueve más.

EXPERIMENTO 45

Funnel en vivo

visita → explora → carrito → compra/abandono

Los resultados numéricos aparecen debajo.
Conversión0 %
Llega a carrito0 %
Abandono0 %
Cuellocarrito

Con carrito 0,40 y compra 0,50: conversión ≈ 12 %.

Verde = compra, gris = abandono; la intermedia marca cuántos pisan carrito. Sin carrito no hay compra.

Preguntas para explorar

  1. Subí carrito de 0,4 a 0,8. ¿La conversión se duplica? ¿Y al revés con compra?
  2. ¿Qué slider es el cuello con valores base? (El que más mueve al moverlo 0,1.)
  3. ¿Conversión + abandono suman 100 %? ¿Por qué (trampas rivales)?
Ver respuestas sugeridas
  1. Sí, casi ×2 (12 % → 24 %): el funnel multiplica avances.
  2. El carrito: filtra antes y más. Arreglarlo rinde doble.
  3. Sí: toda visita termina en una trampa. Sin reingresos eternos.

07 · Comprensión

Confusiones frecuentes

«Conversión = compra/carrito»

Esa es la última etapa. La conversión global es compra/visita: producto de etapas.

«Abandono es 1 − conversión»

Sí, con dos trampas y sin eternos. Con reingresos largos, parte sigue navegando.

«Mejorar todo 10 % suma 10 %»

No: multiplica. Subir dos etapas 10 % cada una sube ≈ 21 % el total.

«El funnel es lineal»

Tiene vueltas (carrito→explora) y saltos (visita→abandono). Lineal es el dibujo, no la matriz.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: conversión por producto

Con avances 0,6 – 0,4 – 0,5 sin reingresos, ¿conversión teórica? Verificá el producto.

print(0.6 * 0.4 * 0.5)
Ver solución razonada

0,12 (12 %): cada etapa filtra. Sin reingresos el producto es exacto.

Ejercicio 2: cuello comparados

Sin ejecutar primero: ¿rinde más +0,1 en carrito (0,4→0,5) o en compra (0,5→0,6)? Calculalo.

base = 0.6 * 0.4 * 0.5
print("carrito:", 0.6 * 0.5 * 0.5, "| compra:", 0.6 * 0.4 * 0.6, "| base:", base)
Ver solución

Carrito 0,15 vs compra 0,144: gana el carrito (filtra antes).

Ejercicio 3: fugas por etapa

De 2000 rutas, contá abandonos por última etapa visitada. ¿Dónde está el cuello?

Ver una posible respuesta
import random

P = [[0.2, 0.6, 0.0, 0.0, 0.2],
     [0.0, 0.3, 0.4, 0.0, 0.3],
     [0.0, 0.0, 0.0, 0.5, 0.5],
     [0.0, 0.0, 0.0, 1.0, 0.0],
     [0.0, 0.0, 0.0, 0.0, 1.0]]
random.seed(8)
fuga = {0: 0, 1: 0, 2: 0}
for _ in range(2000):
    x, ult = 0, 0
    while x not in (3, 4):
        ult = x
        u, ac = random.random(), 0.0
        for j, p in enumerate(P[x]):
            ac += p
            if u < ac:
                x = j
                break
    if x == 4:
        fuga[ult] += 1
print(fuga)

El grueso fuga en 0 y 1 (visita/explora): pocos llegan al carrito. Cuello temprano.

09 · Síntesis

Ideas para recordar

  • Funnel = Markov absorbente (compra/abandono).
  • Conversión = absorción en compra desde visita.
  • Sin reingresos: producto de avances.
  • El cuello (menor avance×llegada) manda la mejora.
  • En Python: rutas + fugas por etapa.

En el próximo tema optimizaremos máquinas: sistemas informáticos.