lección 3
Martes: limpiar y construir el target
Limpiar la suciedad, construir el target cruzando con renovaciones (solo el 10,95% no renueva) y resumir el comportamiento a una cifra por socio.
⏱ 55 min
## Martes, 10:00. Hoy se limpia
Ayer dibujaste el mapa; hoy toca ensuciarse las manos. Un modelo no puede aprender de una columna que dice «12,89 €» en vez de 12.89, ni de un canal que aparece escrito de catorce formas distintas, ni de una edad de 221 años. Antes de modelar nada hay que dejar los datos coherentes, y esa es la tarea del día. Vas a escribir el fichero `src/02_limpiar.py`, y lo vas a hacer en tres pasos: primero limpiar la ficha de socios, después construir el target cruzando con renovaciones, y por último resumir el comportamiento a una fila por socio. Al cerrar el día tendrás la tabla de modelado: una fila por socio, con las features y el target al lado.
## Lo primero: números que vienen como texto
La cuota mensual llega como «12,89 €»: un número con un símbolo de euro pegado y una coma donde debería ir el punto decimal. pandas lo lee como texto y no se puede promediar. Para convertirlo en número hay que hacer tres cosas en orden: quitar el «€» y los espacios, cambiar la coma por un punto (porque Python usa el punto como separador decimal), y entonces convertir a número con `.astype(float)`. Los importes de las donaciones tienen el mismo problema, pero con una trampa añadida: parte de las filas ya vienen limpias y numéricas («41.53»), así que la limpieza tiene que funcionar también sobre las que ya están bien, sin romperlas. Quitar un «€» que no está no hace daño; cambiar una coma que no hay tampoco. Por eso la misma receta sirve para todas.
## Lo segundo: un canal escrito de catorce maneras
El canal de captación es la señal que Marisol intuye, pero viene hecho un desastre: catorce variantes para cuatro canales de verdad. Hay «Calle», «calle» y «CALLE»; hay «F2F», «f2f» y «face to face», que son todos lo mismo que calle (el captador con el peto); hay «WEB», «Web» y «web»; hay «evento», «Evento» y «EVENTO»; y hay «referido» y «boca a boca», que son lo mismo. Si no lo unificas, el modelo tratará «Calle» y «calle» como dos canales distintos, y la señal se diluye en catorce casillas casi vacías en vez de concentrarse en cuatro. Normalizar texto es un patrón que se repite siempre: poner todo en minúsculas, quitar espacios de los extremos, quitar acentos, y mapear cada variante a su valor canónico.
## Lo tercero: edades imposibles
Entre los socios hay 221 con una edad imposible: mayores de 110 o cero o negativa, cortesía de formularios mal validados. No se pueden «arreglar» con un número inventado, porque no sabemos cuál era la edad real. Lo honesto es marcar como nulo todo lo que caiga fuera de un rango razonable (de 16 a 110 años) y dejar que el hueco se trate como lo que es: un dato que falta. Más adelante decidirás qué hacer con los nulos, pero el primer paso es no dejar que un 221 contamine la media de edad.
## Y ahora sí: construir el target y ver el reparto
Con la ficha limpia, toca construir el target. En la tabla de renovaciones, la columna `renovo` vale 1 si el socio renovó y 0 si no. Lo que queremos predecir es lo contrario —quién NO renueva—, así que el target es `no_renovo = 1 - renovo`. Y entonces llega la cifra que define todo el caso: ¿qué proporción de socios tiene `no_renovo = 1`? Al calcularlo, te sale 1.643 de 15.000, el 10,95%. Casi 9 de cada 10 renuevan. Lo anotas como dato de contexto, sin darle todavía toda la importancia que tiene. Álvaro ya te dejó caer que importa, y Jon lo dijo a su manera, pero la consecuencia completa no la verás hasta el jueves.
La fecha de renovación y el motivo de baja de la tabla de renovaciones son POSTERIORES a la decisión del socio: solo se conocen cuando ya ha renovado o se ha ido. Sirven para construir el target, pero NUNCA pueden ser predictores: usarlos sería dejar que el modelo mire el futuro. Esa higiene temporal ya la traes de tu primer trabajo, y aquí es la única que hay: no hay ninguna columna tramposa escondida en las features. El reto del caso es otro, el desbalanceo.
## Y por último: resumir el comportamiento
Las donaciones, los emails y los eventos tienen varias filas por socio, pero el modelo necesita una fila por socio. Así que hay que resumir: contar cuántas donaciones puntuales hizo cada socio y sumar su importe total, contar cuántos emails abrió y clicó, y marcar si asistió a algún evento. Eso se hace con `groupby` por el socio_id, que agrupa las filas de cada socio, y una función de agregación (`count`, `sum`, `max`). Al unir esas cifras resumidas con la ficha del socio con un `merge`, aparece un detalle importante: los 300 socios que no tienen ninguna fila de email, y los que nunca han donado, quedan con nulos. Esos nulos significan «cero actividad», así que se rellenan con `fillna(0)`. El resultado es la tabla de modelado: 15.000 filas, una por socio, con sus features y el target, y sin un solo nulo.
Hoy construyes la tabla de modelado a partir de los CSV crudos de datos/. A partir de mañana, para que puedas centrarte en el modelo, te damos esa tabla ya hecha y validada como datos/tabla_modelo.csv (una fila por socio, 15.000 filas, con el canal ya codificado en número como canal_cod y sin ningún nulo). Es la misma que montas hoy; te la damos resuelta para que los ejercicios de modelado partan todos del mismo punto y los números salgan reproducibles.
volver a la visión del caso y descargar los datasets## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...
Regístrate para guardar tu progreso.