Saltar al contenido

lección 3

Martes: limpiar y construir la tabla de modelado

Unificar escalas, limpiar imposibles, y resumir los sensores a una fila por parcela unida con la cosecha: la tabla con la que se modela.

⏱ 55 min

## Martes, 10:00. El día menos glamuroso y el más importante

Ayer dibujaste el mapa; hoy toca el trabajo que nadie enseña en los cursos pero que ocupa la mayor parte del tiempo de un científico de datos: dejar los datos en condiciones de que un modelo los pueda usar. No es glamuroso y no sale en las fotos, pero es donde se gana o se pierde el proyecto. Un modelo entrenado sobre datos sucios aprende la suciedad; da igual lo sofisticado que sea el algoritmo. Hoy tienes dos trabajos encadenados: primero limpiar cada tabla por separado, y después juntarlas en una sola —una fila por parcela— con el número que quieres predecir al lado. A esa tabla final se le llama la tabla de modelado, y es el entregable del martes.

Conviene tener claro desde el principio el orden de las dos mitades, porque hacerlas al revés estropea el resultado. Primero se limpia, después se agrega. Si resumieras los sensores a una media por parcela ANTES de arreglar las dos escalas de la humedad, estarías promediando manzanas con naranjas: valores de 0,42 mezclados con valores de 42 en la misma media, que saldría disparada hacia abajo y sin sentido. La limpieza va primero porque cambia los números que luego se van a resumir. Lo mismo con los valores imposibles: si no los apartas antes de promediar, un 150 te sube la media de toda la parcela.

El orden importa. Limpiar va antes de agregar porque la limpieza cambia los números que luego se promedian. Agregar las dos escalas sin unificar da una media sin sentido.

## Primer trabajo: la humedad, dos escalas y los imposibles

Empiezas por la columna que ayer te chirrió. La regla que dedujiste con Dídac es sencilla: los valores menores que 1 son del lote viejo (vienen en tanto por uno) y hay que multiplicarlos por 100 para pasarlos a porcentaje; los que ya están por encima de 1 son del lote nuevo y se dejan como están. En pandas, seleccionar las filas que cumplen una condición y cambiarles solo a ellas un valor se hace con `.loc`, indicando primero la condición y luego la columna. Después, los valores físicamente imposibles —menores que 0 o mayores que 100— se marcan como nulo (en pandas, `np.nan`), porque no sabemos cuál era el valor real y forzarlos a un número sería inventar un dato.

El orden de las dos operaciones de humedad también importa, y es sutil. Primero se unifica la escala (multiplicar por 100 los menores que 1) y DESPUÉS se marcan los imposibles. Si lo hicieras al revés, un valor del lote viejo como 0,42 nunca sería mayor que 100, pero uno de 1,5 (que en realidad es un 150% imposible mal medido) pasaría la primera criba y se multiplicaría a 150. Hacerlo en el orden correcto deja la columna coherente: todo en porcentaje y sin imposibles.

## Segundo trabajo: texto que debería ser número, y categorías de veinte formas

La superficie viene como «0,3 ha» y el fertilizante como «76 kg»: texto con la unidad pegada y, en el caso de la superficie, con coma decimal en lugar de punto. Para convertirlos en números hay que quitar la unidad, cambiar la coma por un punto y pasar a decimal. Y ojo con un detalle real de estos datos: a veces la unidad viene pegada sin espacio («0,4ha», «42kg»), así que lo más seguro es quitar directamente el texto «ha» o «kg» en lugar de confiar en que siempre haya un espacio delante.

Las categorías son el otro clásico. El tipo de cultivo viene escrito de veinte maneras distintas: «tomate», «TOMATE», «Tomate», « tomate » con espacios, «Brócoli» con tilde y «brocoli» sin ella. Para el modelo, «Tomate» y «tomate» tienen que ser la misma cosa, así que hay que normalizarlas a una forma canónica: quitar espacios de los extremos, pasar a minúsculas y quitar los acentos. Al hacerlo, las veinte variantes se colapsan a seis cultivos de verdad: tomate, pimiento, lechuga, brocoli, citrico y almendro. El mismo tratamiento deja el tipo de suelo en tres: franco, arcilloso y arenoso (donde «arcillosa», en femenino, cae también en «arcilloso»).

Normalizar categorías es colapsar las variantes de escritura en una forma única. Veinte grafías de cultivo se reducen a seis cultivos de verdad que el modelo puede distinguir.

## Y la cosecha: seis básculas que mintieron

Falta limpiar el target. La cosecha trae, entre sus dos mil filas, seis parcelas con un rendimiento imposible: entre 60.000 y 95.000 kilos por hectárea, cuando lo normal en estos cultivos va de unos cientos a unos dieciséis mil. Son errores de báscula: alguien tecleó mal, o la máquina pesó dos veces. Si dejaras esos seis valores en la tabla de modelado, el modelo intentaría explicar unos números que no son reales y se volvería loco; peor aún, la media del target subiría de forma engañosa. La regla es sencilla: antes de entrenar, se quitan las filas de cosecha por encima de un umbral razonable (20.000 kg/ha), que son esas seis. No es tirar datos a la ligera: es apartar valores que sabemos que no pueden ser reales.

Consejo de senior: un outlier (un valor extremo) no siempre es un error, y no siempre se borra. La parcela que riega el triple que la media es un outlier y es un dato buenísimo, no se toca. Pero una cosecha de 90.000 kg/ha en un cultivo que da como mucho 16.000 es físicamente imposible: eso sí es un error. La diferencia es si el valor extremo es posible en el mundo real o no. Antes de quitar un outlier, pregúntate siempre: ¿esto puede pasar de verdad, o es que alguien tecleó mal?

## El segundo trabajo: de muchas lecturas a una fila por parcela

Con las tablas limpias llega el paso que convierte un montón de extractos en algo modelable. El modelo necesita una fila por parcela —una parcela, una predicción—, pero los sensores tienen muchas lecturas por parcela a lo largo de la campaña. Hay que resumir esas lecturas en unos pocos números que describan la campaña entera de cada parcela: la humedad media del suelo, la temperatura media, la lluvia total caída (acumulada, sumando), las horas de sol totales (acumuladas) y, del NDVI, el verdor medio de la campaña. En pandas, resumir por grupos se hace con `.groupby`, agrupando por `parcela_id` y pidiendo la operación que corresponda a cada columna: media para unas, suma para otras.

Por qué media para unas y suma para otras no es un capricho: depende de qué signifique la magnitud. La humedad y la temperatura son estados: tiene sentido su valor típico a lo largo de la campaña, así que se promedian. La lluvia y las horas de sol son cantidades que se acumulan: lo que importa es el total que recibió la parcela, así que se suman. Confundir las dos cosas —sumar la humedad, por ejemplo— daría un número sin significado. Pensar qué operación pide cada columna es parte del oficio.

El último movimiento es unir todo: la ficha de parcela limpia (cultivo, superficie, suelo, riego, fertilizante), las agregaciones de sensores y NDVI, y la cosecha limpia (el target). Se cruzan por `parcela_id` con `.merge`. El resultado es la tabla de modelado: una fila por parcela, con sus features a la izquierda y el rendimiento a la derecha. Como la cosecha ya no tiene las seis parcelas de báscula mala, y como solo entran las parcelas que aparecen en las cuatro tablas, la tabla final se queda en 1.994 filas. Esa es la tabla sobre la que mañana entrenarás el primer modelo.

La agregación convierte las muchas lecturas de cada parcela en una fila. Media para los estados, suma para las cantidades. Unida a la cosecha limpia, da la tabla de modelado de 1.994 filas.

Al terminar el martes tienes el fichero `src/02_limpiar.py` completo y, sobre todo, la tabla de modelado guardada. Mañana no vas a volver a limpiar: vas a cargar esa tabla ya lista y entrenar. Por eso el martes es el día más importante aunque sea el menos vistoso: todo lo que venga después se apoya en que esta tabla esté bien hecha.

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 parcela, 1.994 filas, con el cultivo y el suelo ya codificados en número). Es la misma que montas hoy; te la damos resuelta para que los ejercicios de modelado partan todos del mismo punto exacto.

volver a la visión del caso y descargar los datasets

Regístrate para guardar tu progreso.