Calcular la nota media ponderada Universidades Españolas.
Los alumnos de la universidad de Cádiz (y andaluces en general)
podemos consultar este dato en la sección de información académica
de la plataforma para prácticas de empresa Ícaro o acudiendo al
Vicerrectorado de Alumnos donde pueden calculárnosla y extendernos
un certificado de nota.
Sin embargo, aunque lo podamos consultar o nos lo puedan hacer,
nunca está de mas comprender como funciona el sistema, y aparte,
calcular otras medias que siendo reales nos convengan más, ya que
el sistema por bloques que se emplea es manifiestamente injusto y
no refleja la nota real del alumno. Según el el cálculo actual,
un alumno con 6,9 es dos veces peor que un alumno con un 7 en
lugar de haber entre ellos una diferencia de una décima.
Este esquema supongo que ha sido heredado de cuando en las
facultades no era obligatorio asignar una nota numérica sino tan
solo APROBADO, NOTABLE, SOBRESALIENTE y MATRÍCULA DE HONOR y en mi
opinión ya está más que superado; en todas las facultades se
utiliza un sistema numérico que permite saber con exactitud la nota
del alumno. Y aunque no se pudiese porque siguiesen existiendo
facultades 'chapadas a la antigua', no es conveniente tener un
estadístico que 'destruye' información como este, que no es
representativo de la nota del alumno y expresa fatal el valor del
mismo. Tiene 'truco'.
Entre estos cálculos para la nota media y algunos
profesores/aplicaciones informáticas en la universidad que
truncaban notas como 6,7 a 6, no me parece raro que los españoles
tengamos una nota media tan ridículamente baja en el currículum, la
cual nos dificulta y mucho la búsqueda de empleo en el extranjero,
donde las universidades si que inflan las finales que da gusto.
Cuando te juegas plazas, becas, puestos de trabajo y tu vida en
general, estas pequeñas idioteces y tristes clasificaciones saltan
a un primer plano y adquieren tanta importancia que me sorprende
que se use este método desde mi punto de vista tan malo. Tener
egresados con notas bajas no debería ser un signo de prestigio.
Pero bueno que me enredo.
La nota media del expediente académico universitario es un número
del 1 al 4, siendo 1 aprobado y 4 matrícula de honor.
La relación es la siguiente, solo se tienen en cuenta las
asignaturas aprobadas:
| Nota 1-10 | Nota 1-4 | Nombre |
| 1 | [5-7) | Aprobado |
| 2 | [7-9) | Notable |
| 3 | [9-10] | Sobresaliente |
| 4 | 10 | Matrícula de Honor |
La manera de calcularla es aplicar la siguiente fórmula, tomando la
nota de cada asignatura, pasándola a la escala anterior y
multiplicándola por sus créditos:
Como comenté antes, este es un estadístico terrible para resumir el
expediente académico de un alumno, debido a los 'saltos' que tiene
en el 7, el 9 y el 10. Una medida, con mucho, más representativa,
sería calcular la media aritmética ponderada con los créditos y
aplicar una 'regla de tres' para pasarlo al intervalo 1-4.
Esto es precisamente lo que también hice, calcular esta y otras
medias para ver que estadístico representaba mejor mi expediente
académico. Con mejor no solo quiero decir que saliese más
favorecido, sino más adecuadamente en vista a los valores de mis
notas (que tienden al 6).
Para calcular la nota a partir de una cantidad numérica 1-10 y
obtener un porcentaje, empleé esta fórmula. Nótese que nota_min y
nota_max son la nota mínima para aprobar y la máxima que es
posible obtener en la Universidad correspondiente.
O la media aritmética normal, sin ponderar con los créditos:
En la Universidad de Cádiz tenemos disponibles nuestro expediente
completo a traves del XXI Portal de donde nos podemos bajar un
xls con las notas de las asignaturas aprobadas.
Lo que hago es seleccionar solo las asignaturas, eliminar las que
no tienen nota (normalmente créditos de libre provinentes de
prácticas de empresa, seminarios o conferencias) y pegarlo sin
cabecera en un csv plano con caracter separador la coma , y
delimitador de texto la doble comilla ".
Tras hacer esto lo que tenemos es un notas.csv con la siguiente estructura:
"1711014 ","ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES","9","TRONCAL","2006-07","JUNIO","APROBADO","6,6" "1711013 ","FUNDAMENTOS DE SISTEMAS DIGITALES","6","TRONCAL","2006-07","FEBRERO","SOBRESALIENTE","9,6" "1711022 ","INFORMÁTICA GENERAL","6","OBLIGATORIA","2006-07","FEBRERO","APROBADO","6,5"
Los campos que nos interesan son el tercero (créditos) y el octavo
y último (nota). Empleando python y su procesador de csv (baterías
incluidas!) podemos fácilmente parsear el fichero y obtener
nuestras notas.
Para ello creé un script que calcula todo esto, siguiendo una
plantilla para una beca del CSIC (Centro Superior de
Investigaciones Científicas) a la hora de realizar los cálculos. La
nota final coincide con la que obtengo en Ícaro, de manera que
supongo que es correcta.
El script lo llamo con ./media.py notas.csv e imprime tanto los
resultados como los cálculos intermedios. Tened en cuenta que la
formula del porcentaje emplea los valores de nota mínima para
aprobar y nota máxima a recibir, que en Cádiz son 5 y 10 pero que
de centro a centro pueden variar.
Para terminar, agradecería muchísimo cualquier tipo de
corrección o aviso de errores. Lo más probable es que haya
metido la pata en algún momento, que ignore algo relacionado con el
cálculo de notas o sobre la organización Universitaria, de manera
que si ves algo que no cuadre, por favor, deja un comentario :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #! /usr/bin/env python # -*- coding: utf-8 -*- import sys import csv def error(text): print "Error:" + text sys.exit() def nota_14(nota): """ Recibe una nota del 5 al 10 Devuelve la nota del 1-4 según la siguiente tabla del CSIC: [5-7) -> 1 [7-9) -> 2 [9-10) -> 3 10 -> 4 Devuelve None si la nota no está en el intervalo [5-10] """ if nota < 5: return None elif nota < 7: return 1.0 elif nota < 9: return 2.0 elif nota < 10: return 3.0 elif nota == 10: return 4.0 def nota_percent(nota): """ Recibe una nota del 0 al 10 Devuelve la nota en porcentaje según la fórmula del CSIC """ nota_min = 5.0 # nota minima para aprobar en Cádiz nota_max = 10.0 # nota máxima en Cádiz return 50.0 + ((50.0 * (nota - nota_min)) / (nota_max - nota_min)) def media(csvfile): """ Toma un csv con las notas y devuelve la media de todas las asignaturas. Asume que la nota de las asignaturas está en el último campo de cada línea. """ try: reader = csv.reader(open(csvfile, 'rb'), delimiter=",", quotechar='"') except: error("No se puede abrir el fichero %s" % csvfile) # cabecera de la tabla print "Nota, Expediente, Percent, 1-4, Creditos, creditos x 1-4" # totales creditos_total = 0.0 nota_total = 0.0 ponderada_14_total = 0.0 ponderada_100_total = 0.0 nasignaturas = 0.0 n = 0 for row in reader: n += 1 if len(row) < 8 : print "La linea: %s no tiene el número de campos necesarios." % str(row) next # El signo decimal es . no , como en españa row = [f.replace(',', '.') for f in row] # Obtener los campos curso = row[4] try: creditos = float(row[2]) except ValueError: print "En la línea linea %d el campo 2 (creditos) %s no es un número" % (n,row[2]) next try: nota = float(row[7]) except ValueError: print "En la línea linea %d el campo 7 (notas) %s no es un número" % (n,row[2]) next # Convertir entre escalas percent = nota_percent(nota) nota14 = nota_14(nota) ponderada_100 = creditos * percent ponderada_14 = creditos * nota14 # Actualizar totales creditos_total += creditos nota_total += nota ponderada_14_total += ponderada_14 ponderada_100_total += ponderada_100 nasignaturas += 1 # curso, nota, percent, 14, creditos, creditos x 14 print "%s %d %d %d %d %d" % (curso, nota, percent, nota14, creditos, ponderada_14) # calcular media_ponderada_14 = ponderada_14_total / creditos_total media_ponderada_100 = ponderada_100_total / creditos_total media_ponderada_100_14 = media_ponderada_100 * (4.0 / 100.0) media_normal = nota_total / nasignaturas #imprimir totales y resultado print " Total Créditos: %d Total creditos x 14: %d" % (creditos_total, ponderada_14_total) print " Media ponderada 1-4: %.2f" % media_ponderada_14 print " Media ponderada 100: %.2f" % media_ponderada_100 print " Media ponderada 100 en 1-4: %.2f" % media_ponderada_100_14 print " Media sin ponderar: %.2f" % media_normal def main(): if len(sys.argv) < 1: error("Numero incorrecto de argumentos. \n\n Use: media.py file.csv") media(sys.argv[1]) main() |