Saltar al contenido

Indice / Practicas / EJ-5.7

EJ-5.7 · Imputar notas invalidas con la mediana

Practica de: 5.4 Valores ausentesDificultad: M

Mismo archivo que EJ-1.3, política opuesta. Allá se descarta lo que no sirve; acá no se pierde ni una fila. Los dos resultados son correctos, y por eso hay que decir cuál se eligió.

Qué hay que hacer

A partir de estudiantes_notas.csv, producir notas_imputadas.csv: las 40 filas, con las tres notas completas y dentro del rango 0 a 10, más el promedio.

Toda nota que falte o que sea imposible se reemplaza por la mediana de su columna. Y queda anotado cuántas notas de cada alumno son inventadas: esa columna es tan importante como las notas.

ELI5Explicado facil

Un profesor pierde algunas notas de su planilla. Tiene dos opciones:

  • Sacar a esos alumnos de la lista. La planilla queda impecable y hay alumnos que desaparecieron.
  • Ponerles la nota típica del curso y escribir al lado «esta la puse yo». La planilla queda completa, y cualquiera que la lea sabe cuáles son reales.

Este ejercicio hace lo segundo. Lo que no se puede hacer es inventar la nota y no decirlo.

Archivos

Ausente y fuera de rango terminan igual, pero no son lo mismo

Una nota vacía y un 99 en una escala de 0 a 10 reciben el mismo tratamiento: los dos se imputan. Pero llegaron por caminos distintos, y eso importa para el informe: en un caso nadie cargó el dato, en el otro alguien cargó uno malo. La columna notas_imputadas los junta a propósito, porque para quien lee el promedio la pregunta es una sola: ¿cuántas de estas notas son de verdad?

Cómo saber si te salió

python comparar.py mi_salida.csv notas_imputadas.csv

Antes de arrancar, mirá los datos

estudiantes_notas.csv (entrada) · 40 filas, se muestran 5
legajoestudiantenota_1nota_2nota_3
L2601Karina Acosta9.74.78.6
L2602Santiago Ramos6.03.84.2
L2603Carla Luna8.13.63.8
L2604Lucas Núñez7.37.43.4
L2605Tamara Torres9.59.57.8

Fijate en nota_3: tiene dos guiones sueltos, y con eso alcanza para que pandas lea la columna entera como texto.

El contrato de salida

notas_imputadas.csv · 40 filas

ColumnaTipoQue lleva
legajotextoEl legajo original, sin tocar
estudiantetextoSin espacios en los extremos
nota_1decimalEntre 0 y 10, redondeada a 2 decimales
nota_2decimalEntre 0 y 10, redondeada a 2 decimales
nota_3decimalEntre 0 y 10, redondeada a 2 decimales
notas_imputadasenteroCuantas de las tres notas de esa fila las pusimos nosotros: 0, 1, 2 o 3
promediodecimalMedia de las tres notas ya imputadas, redondeada a 2 decimales

Orden de las filas: legajo ascendente. Es unico, asi que no hace falta desempate. Indice: no se escribe: to_csv(index=False)

Que hacer con cada defecto

DefectoDondeAccionAdonde va
nota ausente: campo vacio o los tokens NaN, N/A, null y -5 celdas de nota_3imputar imputar con la mediana de las notas VALIDAS de esa misma columnanotas_imputadas.csv, sumando 1 a notas_imputadas de esa fila
nota fuera del rango 0 a 10: 12.5, 10.5 y 99.02 celdas de nota_1 (L2609, L2634) y 1 de nota_2 (L2626)tratarla tratarla como si faltara e imputar con la mediana de su columna. NO se recorta con clip: recortar convierte un imposible en un valor creiblenotas_imputadas.csv, sumando 1 a notas_imputadas de esa fila
nota negativa (-1.0)1 celda de nota_3, la de L2618es es un caso mas de fuera de rango: se imputa igualnotas_imputadas.csv
ninguna fila se descartalas 40esta esta es la politica del ejercicio, y es lo unico que lo diferencia de EJ-1.3 sobre el mismo archivonotas_imputadas.csv
Orden de comprobacion

Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:

  1. marcar como invalida toda nota ausente o fuera del rango 0 a 10
  2. calcular la mediana de cada columna SOLO con sus notas validas
  3. imputar
  4. recien despues calcular el promedio de las tres notas

Si la mediana se calcula antes de marcar lo invalido, el 99 de nota_2 la corre para arriba y las imputaciones quedan mal. Y si el promedio se calcula antes de imputar, las filas con una nota faltante promedian dos notas en vez de tres.

Conteos clave

Si estos numeros no te dan, algo se desvio antes de que llegues a comparar los archivos.

filas de entrada40
notas_imputadas.csv40
notas imputadas en total9
filas con alguna nota imputada9
imputadas en nota_12
imputadas en nota_21
imputadas en nota_36
mediana de nota_16.05
mediana de nota_25.4
mediana de nota_36.05
por motivo

Invariantes

Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:

len(salida) == 40
salida['legajo'].is_unique
salida[['nota_1', 'nota_2', 'nota_3']].notna().all().all()
salida[['nota_1', 'nota_2', 'nota_3']].ge(0).all().all()
salida[['nota_1', 'nota_2', 'nota_3']].le(10).all().all()
int(salida['notas_imputadas'].sum()) == 9
salida['notas_imputadas'].between(0, 3).all()
(salida['promedio'] - salida[['nota_1','nota_2','nota_3']].mean(axis=1)).abs().max() < 0.005
PISTASSi te trabas, abri esto
  • La mediana de una columna se calcula con las notas validas de ESA columna, no con las tres juntas.
  • clip(0, 10) parece la solucion elegante y es la trampa: un 99 recortado a 10 queda indistinguible de un 10 real, para siempre.
  • Redondear la mediana a 2 decimales antes de imputar evita que el archivo tenga un valor con 15 decimales escondido.
  • notas_imputadas cuenta por fila, no por columna: es la suma de las tres banderas.
  • Compara tu resultado con EJ-1.3, que resuelve el mismo archivo descartando. Ninguno de los dos es el correcto: son dos politicas, y el enunciado es el que elige.

Así tiene que quedar

notas_imputadas.csv (objetivo) · 40 filas, se muestran 5
legajoestudiantenota_1nota_2nota_3notas_imputadaspromedio
L2601Karina Acosta9.74.78.607.67
L2602Santiago Ramos6.03.84.204.67
L2603Carla Luna8.13.63.805.17
L2604Lucas Núñez7.37.43.406.03
L2605Tamara Torres9.59.57.808.93
clip(0, 10) es la solución elegante y equivocada

Recortar deja todo dentro del rango en una línea, sin perder ninguna fila y sin tener que calcular ninguna mediana. El problema es que un 99 recortado a 10 es indistinguible de un 10 real, para siempre, y ese alumno pasa a ser el mejor del curso por un error de tipeo.

Imputar con la mediana también inventa un número - pero lo deja marcado en notas_imputadas, y ahí está toda la diferencia.

Dos órdenes que cambian el resultado

Uno. La mediana se calcula después de marcar lo inválido. Si el 99 entra en el cálculo, la mediana de nota_2 se corre para arriba y las imputaciones quedan mal.

Dos. El promedio se calcula después de imputar. Si se calcula antes, las filas con una nota faltante promedian dos notas en vez de tres, y salen infladas sin que nada avise.