Saltar al contenido

lección 4

Día 2 (tarde) — El ranking de superficie

Con las tablas ya limpias, bajas a SQL y montas la foto que mira Growth: altas y CAC por canal (el cupón gana en las dos), ingreso de primeras cuotas (que lidera Anuncios, no el cupón) y horas de vídeo (que vuelve a liderar el cupón por volumen). Y el contexto que no es la historia: categoría y plan. Todo parece darle la razón a Diego. Todavía.

60 min

### De limpiar en Pandas a analizar en SQL

Recuerda lo que hiciste esta mañana: cargaste siete ficheros crudos, reconciliaste diecinueve grafías de canal en cinco, convertiste importes y fechas, deduplicaste pagos y tomaste las dos decisiones sobre los nulos con significado. Ese trabajo de Pandas —explorar y limpiar— es la mitad sucia del oficio. Ahora empieza la otra mitad, la del análisis, y cambias de herramienta: a partir de aquí trabajas en SQL sobre las tablas ya saneadas. No porque Pandas no sirva —sirve—, sino porque el análisis de AulaViva cruza cinco tablas por varias claves, y para eso SQL es más directo, más legible y es como trabaja el equipo. La limpieza se quedó en el cuaderno de Pandas; los números que van a Looker, y los que le vas a enseñar a Elena, salen en SQL.

Las tablas con las que trabajas ahora ya tienen el canal mapeado a los cinco nombres, los importes como números, las fechas como fechas y los duplicados fuera. Es la foto limpia de lo que esta mañana viste sucio. Tu primer objetivo hoy es honesto y hasta cómodo: darle a Diego lo que pide y confirmar su titular. Porque antes de desmontar una creencia hay que demostrarla, y el cupón, en la superficie, manda. Vas a comprobarlo con tus propias consultas, no de oídas.

### Confirmar antes de refutar

Podría parecer raro que, sospechando ya que el cupón no es lo que parece, tu primer movimiento sea darle la razón a Diego calculando sus altas y su CAC. Pero es una decisión deliberada y de método: antes de refutar una creencia hay que demostrarla, no negarla. Si llegaras a la demo del viernes diciendo «el cupón no es tan bueno» sin haber confirmado antes que sí lidera en altas y CAC, Diego te desmontaría en diez segundos enseñando el panel de Looker, y tu credibilidad se iría con él. En cambio, si tú mismo confirmas su titular con tus consultas —«sí, Diego, el cupón trae el 38 % de las altas al CAC más bajo, lo he calculado»—, cuando después señales lo que falta, nadie podrá acusarte de no haber mirado su parte.

Hay algo más profundo en esto que pura táctica. Confirmar primero la hipótesis que vas a acabar matizando te obliga a entenderla de verdad, no a atacar un muñeco de paja. A veces, al confirmarla, descubres que tenía más razón de la que creías y ajustas tu conclusión; otras, confirmas justo lo que sospechabas. En cualquier caso, sales con la certeza de haber sido justo con el argumento contrario, y esa justicia se nota en cómo presentas: no como quien viene a ganar una discusión, sino como quien ha mirado todo y cuenta lo que hay. El orden del buen análisis no es «buscar lo que confirma mi sospecha», sino «medir lo que todos ven y luego medir lo que nadie ha mirado».

### Altas por canal: el cupón es el número uno, y es verdad

La primera consulta es la más simple y la que más le gusta a Growth: cuántas altas trae cada canal y qué porcentaje del total representa. Contar altas es contar filas de usuarios agrupadas por canal. El porcentaje se saca con una función de ventana —SUM(COUNT(*)) OVER ()— que calcula el total de todas las altas sin cerrar los grupos, para poder dividir cada canal entre el total. El resultado confirma a Diego al pie de la letra: el cupón trae el 38 % de las altas, casi cuatro de cada diez, muy por encima de anuncios (24 %), SEO (20 %), referido (12 %) y empresas (6 %). Si el negocio se midiera por altas, la conversación habría terminado aquí y Diego tendría razón.

Merece la pena detenerse en cómo se calcula ese porcentaje, porque el truco lo vas a usar todo el día. Cuando agrupas por canal con GROUP BY, cada canal se convierte en una fila y pierdes el total: COUNT(*) te da las altas de cada canal, pero para el porcentaje necesitas también el total de todas. Ahí entra la función de ventana. Una función de ventana calcula sobre un conjunto de filas sin colapsarlas: SUM(COUNT(*)) OVER () suma los recuentos de todos los grupos y pega ese total en cada fila, para que puedas dividir. Es como tener, al lado de cada canal, una columna invisible que dice «y el total de todos es 40.000». Sin ventana tendrías que hacer una subconsulta aparte para el total y cruzarla; la ventana lo hace en la misma línea.

### El CAC: siempre por CTE, nunca cruzando campañas con usuarios

El segundo número que pide Diego es el CAC, el coste de adquisición: cuánto cuesta de media traer un alta por cada canal. La definición es sencilla —coste total de las campañas del canal dividido por las altas atribuidas al canal—, pero la forma de calcularlo esconde una trampa clásica que hay que evitar. La tentación es cruzar directamente la tabla de campañas con la de usuarios por el canal y dividir. Es un error: como un canal tiene varias campañas y muchos usuarios, ese cruce empareja cada campaña con cada usuario del mismo canal y multiplica las filas, así que tanto el coste como las altas salen inflados por un factor enorme y el CAC, aunque a veces parezca razonable, está calculado sobre números falsos.

La forma correcta es calcular por separado, en dos subconsultas (CTE, las cláusulas WITH que dan nombre a un resultado intermedio): una que suma el coste de las campañas por canal, otra que cuenta las altas por canal, y luego unir las dos por canal y dividir. Así cada número se calcula sobre su propia tabla, sin multiplicaciones. Y la unión tiene que ser un LEFT JOIN desde las altas, porque SEO y referido no tienen campañas de pago: si usaras un INNER JOIN, esos dos canales desaparecerían del CAC. Hecho así, el resultado vuelve a coronar al cupón: su CAC es de unos 6 € por alta, el más bajo de todos, frente a los 22 € de anuncios y los 40 € de empresas. Barato y masivo: la mina de oro, en la foto de Growth.

El CAC se calcula por CTE, agregando coste y altas por separado. El JOIN directo de campañas con usuarios multiplica las filas y da un CAC calculado sobre números falsos

Consejo de senior: cada vez que dividas dos cantidades que vienen de tablas distintas, y las dos son «una fila por muchas» respecto al grupo (muchas campañas por canal, muchos usuarios por canal), agrégalas por separado antes de dividir. Si las juntas primero y agregas después, el JOIN multiplica y el cociente sale mal aunque parezca creíble. La regla mental: «agregar y luego unir», no «unir y luego agregar». Esta es la trampa que más veces convierte un CAC, un ticket medio o una tasa en un número con pinta de correcto y completamente falso.

### Pensar en piezas: las CTE como bloques de construcción

Fíjate en la forma de la consulta del CAC, porque la vas a repetir toda la semana: primero una CTE que calcula los costes por canal, luego otra que cuenta las altas por canal, y al final una consulta que las une y divide. Una CTE (las cláusulas WITH) es un resultado intermedio con nombre, un bloque que calculas aparte y luego usas como si fuera una tabla. Pensar en piezas —«primero calculo esto, lo llamo costes; luego calculo aquello, lo llamo altas; después los junto»— es la forma de atacar cualquier métrica que combine cosas que se cuentan de maneras distintas. En lugar de intentar hacerlo todo en una consulta gigante y enrevesada, la partes en pasos legibles, cada uno con un nombre que dice qué es.

Esta manera de trabajar no es solo más limpia: es más segura y más fácil de depurar. Si el CAC sale raro, puedes ejecutar solo la CTE de costes y ver si el problema está ahí, o solo la de altas; cada pieza se comprueba por separado. Una consulta monolítica de treinta líneas, en cambio, o funciona entera o falla entera, y encontrar dónde está el error es una pesadilla. Verás que casi todas las métricas de valor del jueves siguen este mismo molde: una CTE para las altas, otra para el valor, otra para la finalización, y al final una consulta que las cose. Aprende el patrón ahora con el CAC, porque es el andamio de todo el análisis que viene: divide el cálculo en piezas con nombre y únelas al final.

El patrón CTE: calcula cada pieza con nombre por separado (costes, altas) y únelas al final. Cada bloque se comprueba solo, y la consulta se lee casi como una frase

Consejo de senior: nombra las CTE por lo que contienen, no por cómo las calculas. «costes», «altas», «valor», «renovadores» se leen solas; «cte1», «tabla_temporal», «paso2» obligan a volver a leer la consulta para entenderla. Un buen nombre de CTE convierte una consulta larga en algo que se lee casi como una frase: «con las altas y los costes, une y divide». Cuando dentro de tres meses vuelvas a esta consulta —o cuando la herede otro analista— esos nombres serán la diferencia entre entenderla en diez segundos o en diez minutos. El código se escribe una vez y se lee muchas; escríbelo para quien lo lee.

### Cómo se lee un ranking sin tragárselo

Tienes dos rankings que coronan al cupón (altas y CAC) y la tentación de escribir «el cupón gana» y cerrar. Pero un analista con oficio lee un ranking con una pregunta detrás: ¿esta métrica mide lo que me importa, o mide algo que se le parece? Las altas miden cuánta gente entra, no cuánta se queda. El CAC mide cuánto cuesta que entren, no cuánto dejan luego. Los dos son ciertos y los dos son irrelevantes para la pregunta de Elena, que es sobre valor. Ordenar por la métrica equivocada da un ranking impecable de lo que no importa. La habilidad no está en calcular el ranking —eso lo hace el ORDER BY—, sino en preguntarse si la columna por la que ordenas es la que decide.

Hay una prueba mental rápida para detectar una métrica sospechosa: imagina que la maximizas al extremo y mira si el negocio mejora. Si AulaViva optimizara solo las altas, regalaría la suscripción: infinitas altas, CAC casi cero, y la empresa en quiebra, porque nadie pagaría. El hecho de que llevar una métrica al extremo lleve al negocio al desastre es la señal de que esa métrica no mide valor, mide movimiento. Las altas y el CAC pasan esa prueba con un suspenso: se pueden disparar regalando el producto. La renovación y el LTV no: no puedes fingir que alguien renueva y paga durante meses. Por eso unas son de vanidad y otras de valor.

Consejo de senior: cuando alguien te traiga un ranking y te pida que lo confirmes, confírmalo si es correcto —no seas el analista que niega lo evidente por llevar la contraria— pero añade siempre la pregunta que falta. «Sí, el cupón lidera en altas, es correcto. ¿Miramos también qué pasa con esos alumnos después?» Esa segunda frase es la que te distingue de una calculadora. Confirmar sin más te convierte en alguien que produce los números que le piden; confirmar y ampliar te convierte en alguien en quien se confía para pensar, no solo para contar. La diferencia de sueldo entre las dos cosas es enorme.

### Las otras dos caras de la vanidad: primeras cuotas y horas de vídeo

Growth no solo mira altas y CAC; también mira el ingreso que entra y las horas de vídeo que se consumen, y aquí aparece el primer matiz que conviene no esconder. Si sumas el importe de los pagos de tipo «alta» —lo que ingresa cada canal en primeras cuotas—, el cupón NO es el primero: lo lidera Anuncios, con unos 467.000 €, mientras el cupón se queda en unos 278.000 €. ¿Por qué, si el cupón trae muchísimas más altas? Porque el cupón cobra su primera cuota con descuento: un alta de cupón paga 4,99 € donde un alta normal paga 14,99 €. Muchas altas que pagan poco cada una suman menos que menos altas que pagan la cuota entera. Es la primera grieta, pequeña, en el relato de la mina de oro.

En cambio, si miras las horas de vídeo consumidas —la suma de los minutos vistos, dividida entre sesenta—, el cupón vuelve a la cabeza con unas 219.000 horas, por delante de anuncios y SEO. Pero ojo con leer esto como una victoria del cupón: lidera por puro volumen. Tiene tantísimas altas que, aunque cada alumno vea poco, la suma total es alta. Es exactamente la trampa del agregado que ya conoces: un total grande puede esconder un valor por cabeza minúsculo. Por alumno, el del cupón ve poquísimo; en total, como son legión, suman mucho. Guárdate esa distinción entre «total» y «por alumno», porque es la llave del jueves.

La foto de Growth corona al cupón en tres de cuatro, pero las tres son captación o volumen. La única que roza el dinero —el ingreso de primera cuota— ya se le escapa

### Cómo viaja el dato del pago hasta el canal

Habrás notado que casi todas las consultas de valor repiten la misma cadena de JOIN: pagos, luego suscripciones, luego usuarios. No es casualidad ni manía: es que el dato tiene que viajar por ahí a la fuerza. El importe vive en pagos, pero pagos no sabe de qué canal es; solo sabe a qué suscripción pertenece (suscripcion_id). La suscripción tampoco sabe el canal, pero sí de qué alumno es (usuario_id). Y es el alumno, en la tabla usuarios, quien guarda el canal. Así que para saber «cuánto ha pagado el canal cupón» hay que empezar en el pago, saltar a su suscripción, de ahí a su alumno, y solo entonces leer el canal. Tres tablas encadenadas para una pregunta que suena a una sola.

La cadena del valor: el importe está en pagos y el canal en usuarios, así que toda métrica de valor por canal recorre pagos → suscripciones → usuarios

Consejo de senior: antes de escribir un JOIN, di en voz alta la frase «necesito X, que está en la tabla A, pero para llegar a A desde donde estoy tengo que pasar por B». Esa frase te dibuja la cadena de JOINs y evita el error clásico de intentar unir dos tablas que no comparten ninguna clave directa. Aquí, pagos y usuarios no comparten columna: no puedes unirlos directamente, tienes que pasar por suscripciones. Pensar la ruta antes de teclearla es lo que distingue un JOIN que funciona de un mensaje de error de «columna no encontrada».

### El contexto que NO es la historia: categoría y plan

Antes de cerrar el día conviene enmarcar el negocio con dos cortes de contexto, y es importante entender que son contexto, no hallazgo. El primero: las matrículas por categoría de curso. Salen muy repartidas entre las seis categorías —negocios, ofimática, marketing, programación, idiomas y diseño—, sin que ninguna domine. El segundo, y este es el que hay que vigilar: el reparto de plan (mensual/anual) dentro de cada canal. Sale prácticamente idéntico en los cinco canales, en torno al 68 % mensual y 32 % anual. Y eso es una señal importante: si todos los canales tienen el mismo mix de plan, el plan NO puede explicar por qué unos canales valen más que otros. El plan es ruido de contexto, no la palanca.

No caigas en la tentación de convertir el plan en el titular. En algún negocio parecido, el tipo de plan sí es el motor de la retención —el anual retiene más que el mensual, sin más—. Aquí no: como el mix mensual/anual es casi igual en todos los canales, el plan no separa a los canales y no explica la diferencia de valor. Si te lanzas a «el problema es que el cupón trae mensuales», te equivocas de historia y se lo tendrás que desdecir a Elena. El motor de este caso es el canal, no el plan. Compruébalo y descártalo, no lo asumas.

### Cómo distinguir el contexto de la historia

Llevas calculadas ya muchas cosas —altas, CAC, ingresos, horas de vídeo, categorías, planes— y conviene parar un momento para clasificarlas, porque no todas juegan el mismo papel. Hay tres tipos de número en un análisis, y confundirlos es una fuente clásica de informes que no llevan a ninguna parte. Está el hallazgo: el número que, si cambia, cambia la decisión (aquí será la cuota de valor por canal). Está el contexto: el número que ayuda a entender el escenario pero no mueve la decisión por sí solo (las matrículas por categoría, el reparto geográfico). Y está el ruido: el número que parece que podría importar y resulta que no separa nada (el mix de plan, igual en todos los canales). Un buen análisis sabe cuál es cuál y le da a cada uno su peso.

La prueba para clasificar un número es preguntarse: «si esto cambiara, ¿cambiaría mi recomendación?». Si la respuesta es sí, es hallazgo. Si es «no, pero ayuda a entender», es contexto. Si es «no, y además es igual en todos los grupos», es ruido y hay que decirlo explícitamente para que nadie se agarre a él. El error del analista novato es presentarlo todo con el mismo énfasis, como si diez números fueran diez hallazgos; el resultado es un informe donde no se distingue lo que decide de lo que decora, y quien lo lee se pierde. El analista con oficio jerarquiza: un hallazgo, rodeado del contexto justo para entenderlo, con el ruido descartado de forma explícita. Menos números, mejor ordenados, deciden más.

### Una petición de Paula que guardas para el jueves

A media tarde te escribe Paula, la responsable del catálogo, con una de sus «cositas». Está convencida de que si el cupón sale mal en algo será porque mete gente en los cursos de programación, «que no termina nadie de lo difíciles que son», y que en ese caso el problema sería el curso, no el canal. Es una hipótesis razonable y hay que tomarla en serio: si un canal trajera alumnos sobre todo a las categorías más difíciles, saldría peor en finalización sin que el canal tuviera la culpa. Pero no es el eje de tu encargo, y hoy no la persigues. La anotas y la guardas para el jueves, cuando la vas a poner a prueba con datos como un control de robustez —comprobar que la conclusión aguanta aunque metas esa variable—. Absorber un cambio de alcance sin perder el hilo del encargo principal es parte del oficio.

1Paula Rivas 16:12
2Oye, ya que estas con los canales... le echas un ojo a la finalizacion POR CATEGORIA? 👀
3Estoy casi segura de que el cupon sale mal solo porque mete gente en programacion, que no
4la termina nadie de lo dificil que es. Si es eso, el problema es el curso, no el canal.
5Seria clave para el comite. Es una cosita, no?

La corazonada de Paula: una explicación alternativa razonable. No es un segundo hallazgo; es la hipótesis que el jueves habrá que probar y descartar con datos

### Por qué esto no sale del panel de Looker

Quizá te preguntes por qué has tenido que bajar a escribir SQL contra las tablas crudas si AulaViva tiene Looker, el panel de crecimiento que Growth mira cada mañana. La respuesta explica buena parte del valor de tu puesto. Un panel como Looker es magnífico para responder deprisa las preguntas que alguien ya previó: enseña altas por canal, CAC, ingresos del mes, todo bonito y actualizado. Pero un panel solo sabe responder lo que le programaron, y a nadie se le ocurrió programar «cuánto valor a largo plazo deja cada canal», porque esa pregunta cruza cinco fuentes que en el panel viven separadas: la captación en una pestaña, los pagos en otra, las matrículas en ninguna. El panel enseña lo que ya sabes preguntar; tú estás aquí para responder lo que nadie había preguntado.

Esa es la frontera entre un panel y un analista, y conviene tenerla clara para tu carrera. El panel es el mapa de las carreteras conocidas; el analista es quien abre camino cuando la respuesta no está en ninguna carretera. Growth vive en el panel y por eso ve un solo lado de la historia —el que el panel enseña—. Tú bajas a los datos crudos, unes por usuario_id, por suscripcion_id y por canal, y construyes una métrica que no existía. Cuando esa métrica esté validada, se llevará al panel para que todos la vean cada día; pero alguien tenía que descubrirla primero, y ese trabajo, el de cruzar lo que nadie había cruzado, no lo hace un panel. Lo haces tú, en SQL.

El panel responde lo que ya se preguntó; el analista responde lo que nadie había preguntado. Por eso el valor por canal se construye en SQL y no sale de Looker

Cierras el día con la foto de Growth montada y una sensación rara: todo le da la razón a Diego. El cupón gana en altas, gana en CAC, gana en horas de vídeo. Solo el ingreso de primeras cuotas se le escapa, y por un motivo técnico que parece menor. Si te quedaras aquí, escribirías el informe que Diego quiere y volcarías el presupuesto en el cupón. Pero todavía no has mirado lo único que de verdad importa en una suscripción: si esos alumnos aprenden y se quedan. Eso empieza mañana, y es donde la foto bonita se rompe.

Consejo de senior: cuando toda la evidencia apunta cómodamente en la misma dirección —aquí, «el cupón es genial»—, es justo el momento de sospechar más, no menos. Los análisis que confirman lo que todos ya creen rara vez cambian algo; los que valen la pena suelen empezar con esa incomodidad de «todo cuadra demasiado». No es que haya que buscar problemas donde no los hay, sino que una conclusión unánime en la superficie merece que rasques debajo antes de firmarla. Si mañana la finalización hubiera dado que el cupón también gana, habrías cerrado el caso tranquilo; que dé lo contrario es la señal de que había algo que mirar.

Regístrate para guardar tu progreso.