Módulo 3: Cohort Retention
La curva de retención
Descripción
Ya sabes agrupar usuarios en cohortes (lección 2). El siguiente paso es hacerle a cada cohorte la pregunta que de verdad importa: semana tras semana, ¿qué porcentaje de la cohorte original sigue activo? La respuesta, graficada semana por semana desde la entrada, es la curva de retención (retention curve): la herramienta central de todo este módulo, y probablemente el gráfico individual más citado en cualquier reunión seria sobre la salud de un producto.
Una curva de retención casi siempre tiene la misma forma característica, sin importar el producto: empieza en 100% (por definición — en su propia semana de entrada, toda la cohorte está, técnicamente, activa), cae fuerte en las primeras semanas, y después —si el producto entrega valor real— la caída se frena y el porcentaje se estabiliza. Esa forma de "tobogán que termina en un rellano" es tan reconocible que, con solo mirar la silueta de una curva, un equipo de producto experimentado puede diagnosticar la salud del negocio antes de leer un solo número.
Conexión con el módulo. Esta lección construye retentionCurve(), la función que vas a reutilizar sin cambios en las lecciones 4, 6 y 8. Todo lo que sigue en el módulo —identificar la meseta, comparar cohortes en una tabla, comparar control contra variant— parte de esta misma función.
Una analogía: la cohorte de enero del gimnasio, semana por semana
Retomando la cohorte de 100 personas que se inscribió el primer día de enero: si dibujas, semana por semana, qué porcentaje de esas 100 personas específicas siguió yendo, obtienes exactamente una curva de retención. La semana 1 es casi siempre 100% o cerca — la inscripción y la primera visita suelen coincidir. La semana 4 puede estar en 35%: dos de cada tres ya dejaron de ir, el entusiasmo de año nuevo se enfrió para la mayoría. Pero la semana 12 es la que de verdad importa: si el porcentaje sigue en caída libre, el gimnasio tiene un problema real — está perdiendo, mes tras mes, a prácticamente todos los que alguna vez se inscribieron. Si en cambio la semana 12 está cerca de la semana 8, y esa cerca de la semana 6 —el número dejó de moverse mucho—, encontraste algo valioso: un grupo de gente que de verdad incorporó el gimnasio a su rutina, y no parece que vaya a dejar de ir pronto. Eso es, exactamente, lo que la próxima lección llama la meseta; esta lección se queda en el paso anterior: calcular la curva completa, semana por semana, para poder verla.
Ejemplo trabajado: la curva de retención de la cohorte del 6 de julio
Mercado tiene una cohorte de 1,000 usuarios que entraron la semana del 6 de julio. El equipo de datos midió cuántos de esos mismos 1,000 usuarios siguieron activos cada semana siguiente. Vamos a calcular la curva completa, en porcentaje, y a identificar en qué semana empieza a estabilizarse:
// La cohorte de Mercado que entro la semana del 6 de julio: 1000 usuarios se
// registraron esa semana. cohort[0] es esa misma semana de entrada (semana 0);
// cohort[n] es cuantos de esos MISMOS 1000 usuarios siguieron activos n semanas despues.
function retentionCurve(cohort, plateauThreshold = 2) {
const initialSize = cohort[0];
const rates = cohort.map((active) => (active / initialSize) * 100);
// Buscamos la meseta retrocediendo desde la ultima semana: mientras el cambio
// semana a semana sea chico (<= plateauThreshold puntos porcentuales), seguimos
// extendiendo la meseta hacia atras. Nos detenemos en el primer salto grande.
let plateauStart = rates.length - 1;
for (let week = rates.length - 1; week > 0; week--) {
const delta = Math.abs(rates[week] - rates[week - 1]);
if (delta <= plateauThreshold) {
plateauStart = week - 1;
} else {
break;
}
}
return { rates, plateauStart, plateauValue: rates[rates.length - 1] };
}
const julyWeek1Cohort = [1000, 400, 300, 260, 250, 248];
console.log('=== Curva de retencion: cohorte del 6 de julio ===\n');
const result = retentionCurve(julyWeek1Cohort);
result.rates.forEach((rate, week) => {
const marker = week === result.plateauStart ? ' <- arranca la meseta' : '';
console.log(' semana ' + week + ': ' + julyWeek1Cohort[week] + ' activos (' + rate.toFixed(1) + '%)' + marker);
});
console.log('\nMeseta desde la semana ' + result.plateauStart + ', estabilizada cerca de ' + result.plateauValue.toFixed(1) + '%.');
Qué esperar. Al correr el archivo con Node, la salida es exactamente esta:
=== Curva de retencion: cohorte del 6 de julio ===
semana 0: 1000 activos (100.0%)
semana 1: 400 activos (40.0%)
semana 2: 300 activos (30.0%)
semana 3: 260 activos (26.0%) <- arranca la meseta
semana 4: 250 activos (25.0%)
semana 5: 248 activos (24.8%)
Meseta desde la semana 3, estabilizada cerca de 24.8%.
La misma curva, dibujada en ASCII, se ve así:
100% |*
|
75% |
|
50% |
| *
40% |
30% | *
26% | * . . . . <- la meseta: 26.0% -> 25.0% -> 24.8%
+--+--+--+--+--+--+
0 1 2 3 4 5 semanas desde la entrada
Fíjate en el patrón que retentionCurve() detecta automáticamente: entre la semana 0 y la semana 1, la cohorte pierde 60 puntos porcentuales de golpe (100% → 40%) — la caída más brusca de toda la curva, típica de cualquier producto: la mayoría de la gente prueba algo una vez y no repite. Entre la semana 1 y la semana 2, la caída ya es más chica (10 puntos). Y a partir de la semana 3, el cambio semana a semana nunca vuelve a superar los 2 puntos porcentuales —el umbral (plateauThreshold) que la función usa para decidir "esto ya se estabilizó"—. Ese punto, semana 3, es la meseta: de ahí en adelante, la cohorte del 6 de julio se comporta como un grupo estable de compradores recurrentes, no como gente que sigue abandonando.
Por qué la curva, y no un solo número
Es tentador resumir todo esto en un solo dato —"retención del 24.8%"— y de hecho esa cifra final tiene un nombre formal que vas a ver en la lección 7 (retención D35, en este caso). Pero reducir la curva completa a un solo número final tira a la basura la parte más informativa: la forma de la caída. Dos cohortes pueden terminar exactamente en el mismo 25% final y haber llegado ahí de maneras completamente distintas — una cayendo rápido y estabilizándose temprano (como la del 6 de julio, que se asienta en la semana 3), otra cayendo lento y sin haberse estabilizado todavía cuando se corta la medición. La primera es una señal de salud clara; la segunda es una señal de alarma disfrazada de un número que "se ve igual". La lección 4 desarrolla exactamente esta distinción.
Errores comunes
Mirar solo el número de la última semana disponible. Qué pasa: un reporte dice "la retención de la cohorte del 6 de julio es 24.8%" y ahí termina, sin mostrar cómo se llegó a ese número. Por qué pasa: un solo número cabe en una casilla de spreadsheet; una curva completa de seis puntos no. Cómo detectarlo: nadie en la sala puede decir en qué semana la curva se estabilizó, solo el valor final. Cómo corregirlo: como en el ejemplo de hoy, reporta siempre la curva completa (o al menos el punto de la meseta y su valor), no solo el último dato — la forma de la caída es la mitad de la información.
Comparar la semana 1 de una cohorte contra la semana 5 de otra. Qué pasa: alguien compara "la cohorte A tiene 40% de retención" (medida en su semana 1) contra "la cohorte B tiene 25%" (medida en su semana 5), como si fueran números equivalentes. Por qué pasa: ambos son porcentajes de retención, y comparar dos porcentajes se siente automáticamente válido, sin fijarse en a qué semana de vida corresponde cada uno. Cómo detectarlo: la comparación no menciona el número de semana junto a cada porcentaje. Cómo corregirlo: siempre compara el mismo punto de la curva —misma semana desde la entrada— entre dos cohortes. La lección 6 dedica una sección completa a esta trampa exacta, con la tabla de cohortes.
Tratar el 100% de la semana 0 como si fuera un logro. Qué pasa: alguien reporta "retención de la semana 0: 100%" como si fuera una señal positiva sobre el producto. Por qué pasa: 100% suena a un número perfecto, y es fácil olvidar que es una tautología matemática, no una medición. Cómo detectarlo: se cita el 100% de la semana 0 como evidencia de algo, en vez de darlo por sentado. Cómo corregirlo: recuerda que cohort[0] es, por definición, el tamaño inicial de la cohorte — la semana 0 siempre da 100% sin importar el producto, porque "activo en la semana de entrada" y "entró" son, literalmente, lo mismo. La información real de la curva empieza en la semana 1.
Ejercicios
Ejercicio 1 — Calcula la curva a mano. Una segunda cohorte de Mercado, la del 13 de julio, tiene estos datos: [800, 360, 280, 264, 260]. Sin ejecutar Node, calcula el porcentaje de retención de cada semana.
Ver solución
Dividiendo cada valor por 800 (el tamaño inicial) y multiplicando por 100: semana 0 = 100.0%, semana 1 = 360/800 = 45.0%, semana 2 = 280/800 = 35.0%, semana 3 = 264/800 = 33.0%, semana 4 = 260/800 = 32.5%. La caída entre semana 2 y semana 3 es de apenas 2 puntos, y entre semana 3 y 4 es de 0.5 puntos — con el mismo umbral de 2 puntos que usa retentionCurve(), esta cohorte ya se estabiliza desde la semana 2, un poco antes que la del 6 de julio.
Ejercicio 2 — Predice el efecto del umbral. En el código de hoy, plateauThreshold está en 2 puntos porcentuales. Si lo cambiaras a 0.5, ¿la meseta detectada en la cohorte del 6 de julio ([1000, 400, 300, 260, 250, 248]) empezaría antes, después, o en la misma semana? Razona sin ejecutar el código.
Ver solución
Después. Con un umbral más estricto (0.5 en vez de 2), la función exige que el cambio semana a semana sea todavía más chico para considerarlo "estable". Revisando los deltas: semana 3→4 es 1.0 punto (26.0% → 25.0%), que ya no pasa un umbral de 0.5. Solo semana 4→5 (25.0% → 24.8%, delta de 0.2) pasa el umbral de 0.5. Como el algoritmo retrocede desde el final y se detiene en el primer salto que supera el umbral, con 0.5 la meseta arrancaría recién en la semana 4, una semana más tarde que con el umbral de 2. Un umbral más estricto siempre detecta la meseta más tarde (o nunca la detecta, si la curva sigue moviéndose más de lo que el umbral permite).
Ejercicio 3 — Diseña una curva sana desde cero. Sin ejecutar Node, inventa un arreglo cohort de 5 números (empezando en 500) donde la meseta, según el algoritmo de retentionCurve() con el umbral por defecto de 2 puntos, arranque exactamente en la semana 2.
Ver solución
Una respuesta válida: [500, 200, 150, 148, 147]. Las tasas son 100%, 40%, 30%, 29.6%, 29.4%. Los deltas: semana 1→2 es 10 puntos (no pasa el umbral), semana 2→3 es 0.4 puntos (sí pasa), semana 3→4 es 0.2 puntos (sí pasa) — el algoritmo retrocede desde el final, encuentra que 3→4 y 2→3 son chicos, y se detiene en el salto grande de 1→2, dejando plateauStart = 2. Cualquier arreglo con esa misma forma —caída fuerte hasta la semana 2, luego cambios menores a 2 puntos— es una solución igualmente válida.
Resumen y siguiente paso
En esta lección construiste retentionCurve(): convierte una cohorte de números absolutos en un porcentaje comparable semana a semana, y detecta automáticamente dónde empieza a estabilizarse. Sobre la cohorte real del 6 de julio de Mercado, viste una caída fuerte en las primeras dos semanas (100% → 40% → 30%) seguida de una meseta que arranca en la semana 3, cerca del 25%. Y viste por qué reducir toda esa curva a un solo número final —sin la forma de la caída— esconde exactamente la información que más importa.
Antes de avanzar deberías poder: calcular una curva de retención a partir de un arreglo de activos por semana, leer en qué semana se estabiliza, y explicar por qué el 100% de la semana 0 no es una señal, sino una tautología.
La lección 4 se detiene específicamente en esa meseta: qué la hace "sana" (mayor que cero, estable de verdad) contra lo que ocurre cuando nunca aparece — el balde con fugas que sigue perdiendo agua sin parar, semana tras semana.
Recursos
- Andrew Chen, "New data shows losing 80% of mobile users is normal, and why the best apps do better" — andrewchen.com. El análisis clásico de curvas de retención de la industria móvil, con la misma forma de "caída fuerte y luego meseta" que la cohorte de Mercado de hoy. En inglés.
- Amplitude, "What Is Cohort Retention Analysis: Essential Metrics Guide" — amplitude.com/explore/analytics/cohort-retention-analysis. Describe la forma típica de la curva —caída inicial seguida de un aplanamiento— con el mismo lenguaje que esta lección. En inglés.
- Reforge, "Why Retention Is The Silent Killer" — reforge.com/blog/retention-engagement-growth-silent-killer. Explica por qué mejorar retención se traduce en que la curva se aplane más arriba (y no en que deje de caer del todo) — el puente directo hacia la lección 4. En inglés.