
METIS 3: la misma verdad, dos gráficas, dos conclusiones
Lo que ha cambiado por dentro (breve)
METIS ya sabía leer un archivo de datos, decirte exactamente qué hay dentro y ayudarte a limpiarlo dejando por escrito lo que le hiciste. Le faltaba dibujar.
Ahora dibuja, con matplotlib en el servidor, y con dos decisiones de diseño que conviene explicar antes de nada.
Es un catálogo cerrado. Cuatro tipos de gráfica —serie temporal, nube de puntos, histograma y medias por grupo— y cada uno es una función escrita a mano en Python, parametrizada. El modelo de inteligencia artificial no elige la gráfica, no la configura y no escribe su código. La alternativa habría sido pedirle a la IA que generara el código de la gráfica y ejecutarlo, y eso es ejecutar código arbitrario en el ordenador donde están los documentos del centro. No se hace aquí, y no se va a hacer.
Y mide cuánto deforma. Esta es la parte nueva de verdad. Un eje vertical que no empieza en cero multiplica la pendiente que ves por un factor que se puede calcular con una división. Una ventana recortada tiene una tendencia que se puede comparar con la de la serie completa. Una línea de tendencia explica un porcentaje de la variación que se puede calcular. Los puntos que caen fuera del eje elegido se pueden contar.
Son cuatro números, no cuatro opiniones. Así que METIS los calcula y los pone debajo de la gráfica. La gráfica engañosa se puede dibujar —hace falta poder dibujarla para aprender a reconocerla— pero no se puede dibujar en silencio.
Con eso montado, lo demás es el ejercicio. Y va explicado para hacerlo tal cual en clase.
El ejercicio: dos conjuntos de datos y el mismo truco
Vas a trabajar con dos archivos. Uno tiene datos reales de un observatorio; el otro son datos inventados por un programa, y ahora verás por qué.
A los dos les vas a aplicar exactamente las mismas trampas. Y van a pasar cosas opuestas. Ahí está todo.
Antes de empezar: dos cosas de la página
Los campos Y mínimo e Y máximo solo se dejan escribir cuando eliges “Lo elijo yo” en el desplegable del eje vertical. Si están grises, es que estás en otra opción.
Los campos de Ventana se quedan con lo que hayas escrito. Hay que vaciarlos a mano al pasar de un ejercicio al siguiente, o seguirás mirando un trozo de los datos sin darte cuenta.
Primera parte: el CO₂ de la atmósfera
De dónde salen estos datos
Del observatorio de Mauna Loa, en Hawái. Es la serie de medidas directas de CO₂ atmosférico más larga que existe: la empezó Charles David Keeling en 1958 y no se ha interrumpido desde entonces. Los datos son públicos, del Global Monitoring Laboratory de la NOAA, y están en gml.noaa.gov/ccgg/trends/data.html — el archivo se llama co2_annmean_mlo.csv.
Son 67 medias anuales, en partes por millón:
| Año | ppm | Año | ppm | Año | ppm | Año | ppm |
|---|---|---|---|---|---|---|---|
| 1959 | 315.98 | 1976 | 332.03 | 1993 | 357.21 | 2010 | 390.10 |
| 1960 | 316.91 | 1977 | 333.84 | 1994 | 358.96 | 2011 | 391.85 |
| 1961 | 317.64 | 1978 | 335.41 | 1995 | 360.97 | 2012 | 394.06 |
| 1962 | 318.45 | 1979 | 336.84 | 1996 | 362.74 | 2013 | 396.74 |
| 1963 | 318.99 | 1980 | 338.76 | 1997 | 363.88 | 2014 | 398.81 |
| 1964 | 319.62 | 1981 | 340.12 | 1998 | 366.84 | 2015 | 401.01 |
| 1965 | 320.04 | 1982 | 341.48 | 1999 | 368.54 | 2016 | 404.41 |
| 1966 | 321.37 | 1983 | 343.15 | 2000 | 369.71 | 2017 | 406.76 |
| 1967 | 322.18 | 1984 | 344.87 | 2001 | 371.32 | 2018 | 408.72 |
| 1968 | 323.05 | 1985 | 346.35 | 2002 | 373.45 | 2019 | 411.65 |
| 1969 | 324.62 | 1986 | 347.61 | 2003 | 375.98 | 2020 | 414.21 |
| 1970 | 325.68 | 1987 | 349.31 | 2004 | 377.70 | 2021 | 416.41 |
| 1971 | 326.32 | 1988 | 351.69 | 2005 | 379.98 | 2022 | 418.53 |
| 1972 | 327.46 | 1989 | 353.20 | 2006 | 382.09 | 2023 | 421.08 |
| 1973 | 329.68 | 1990 | 354.45 | 2007 | 384.02 | 2024 | 424.61 |
| 1974 | 330.19 | 1991 | 355.70 | 2008 | 385.83 | 2025 | 427.35 |
| 1975 | 331.13 | 1992 | 356.54 | 2009 | 387.64 |
De 315,98 ppm en 1959 a 427,35 en 2025. Una subida de 111,37 ppm, un 35,2 % sobre el valor de partida.
Un detalle práctico que te va a pasar al subirlo: este archivo empieza con 43 líneas de comentario que arrancan con #. METIS las salta para leer la tabla, pero te avisa de que están ahí y de que no son basura: traen la fuente, las unidades, la licencia y hasta la nota de que las medidas se trasladaron temporalmente a Maunakea porque el volcán Mauna Loa entró en erupción en noviembre de 2022. Eso es la mitad de los metadatos del archivo. Léelas.
A. La gráfica honesta
Sube co2_annmean_mlo.csv y baja al bloque “Dibujar y comparar”.
| Control | Valor |
|---|---|
| Tipo de gráfica | Serie temporal (línea) |
| Eje horizontal (X) | year |
| Eje vertical (Y) | mean |
| Eje vertical: desde dónde | Desde cero |
Pulsa Dibujar.
Sale una curva que sube suavemente. Y debajo, en verde: “Esta gráfica no deforma nada: el eje empieza en cero o está ajustado a los datos, no falta ningún punto y no hay ninguna ventana recortada.”
Guarda esta imagen mentalmente. Es la referencia contra la que vas a comparar todo lo demás.
B. El eje truncado
Cambia solo una cosa: el desplegable del eje vertical a “Lo elijo yo”, y escribe Y mínimo = 310 y Y máximo = 430. Dibujar.
La misma curva se ha convertido en un acantilado. Y el aviso te dice el número exacto:
El eje vertical no empieza en cero: va de 310 a 430. Eso multiplica por 3,56 la pendiente que se ve, comparada con un eje que empezara en cero.
No ha cambiado ni un dato. Solo el eje.
Preguntas para responder por escrito:
- ¿Cuál de las dos gráficas miente? (Respuesta incómoda: ninguna. Las dos dibujan exactamente los mismos 67 números.)
- ¿Cuál elegirías si quisieras alarmar a alguien? ¿Y si quisieras tranquilizarlo?
- Si mañana ves esta gráfica en un periódico o en un vídeo, ¿qué es lo primero que vas a mirar?
C. El engaño contrario: aplanar
Deja “Lo elijo yo” y cambia a Y mínimo = 0 y Y máximo = 5000. Dibujar.
Ahora la subida de 67 años es una rayita plana pegada al suelo. Y el aviso:
El eje vertical va de 0 a 5000, mucho más ancho que el recorrido real de los datos (de 316 a 427,4). Eso divide por 11,7 la pendiente que se ve: aplasta una variación que existe hasta hacerla parecer una raya plana.
Esto no es un ejercicio teórico. Es el equivalente exacto de un argumento que circula de verdad: “el CO₂ solo es el 0,04 % de la atmósfera”. Y es cierto. En 1959 era el 0,0316 % y en 2025 es el 0,0427 %. Dibujado en un eje de 0 a 100 %, la subida de 67 años son 0,0111 puntos porcentuales: invisible.
Los números son exactos. La conclusión es falsa. Porque lo que importa de un gas de efecto invernadero no es qué fracción del aire ocupa, sino cuánta radiación retiene — y eso ha aumentado un 35 % respecto a 1959.
Pregunta: acabas de ver el mismo dato como una catástrofe (B) y como algo irrelevante (C). ¿Qué eje es el correcto?
No hay una respuesta única, y esa es la lección: depende de qué pregunta estés respondiendo. Si preguntas “¿cuánto ha cambiado esto respecto a como estaba?”, el eje ajustado es el honesto. Si preguntas “¿qué fracción del aire es?”, el eje de 0 a 100 % es el honesto. Lo deshonesto es elegir el eje según la conclusión que quieres que saque el otro.
D. Recortar la ventana
Vuelve el eje a “Ajustado a los datos”. En Ventana: X desde escribe 1998 y en X hasta, 2012. Dibujar.
Aquí pasa algo que probablemente no esperabas. METIS avisa de que estás mirando 15 de 67 filas, y calcula la tendencia dentro y fuera de la ventana:
Estás mirando 15 de 67 filas: has dejado 52 fuera. En la serie completa la tendencia es +1,672 por unidad de ‘year’; en esta ventana es +1,983 (1,19 veces la de la serie completa).
Es decir: recortando la ventana, la subida sale más empinada, no más plana.
Eso importa, porque el periodo 1998-2012 se usa a veces para argumentar que “el calentamiento se pausó”. Ese argumento existe y es sobre la temperatura global, donde efectivamente hubo un tramo de subida más lenta que luego se explicó y se superó. Pero sobre el CO₂ no funciona en absoluto.
Reto: busca una ventana en la que el CO₂ baje. Prueba varias. Cuantas quieras.
No la vas a encontrar. En 67 años no hay un solo año en que la media anual bajara respecto al anterior. La subida más pequeña de la serie fue de 0,42 ppm y la mayor de 3,53. La ventana de 10 años menos favorable de toda la serie (1959-1969) sube 8,64 ppm.
Eso es la definición práctica de un dato robusto: puedes deformar la gráfica todo lo que quieras, y el hecho sigue ahí.
Y de paso, algo que el suavizado esconde y que sí es real: la subida se está acelerando. De 0,947 ppm/año entre 1959 y 1975, a 2,482 ppm/año entre 2009 y 2025. Casi el triple. Puedes verlo poniendo una media móvil de 10 en el campo de Extras y comparándola con la curva sin suavizar.
Vacía los dos campos de Ventana antes de seguir.
Segunda parte: horas de móvil y calificaciones
Por qué estos datos son inventados
Este segundo archivo, movil_y_notas.csv, tiene 180 alumnos con sus horas de móvil al día, sus horas de sueño, su nota del curso anterior y su nota media actual. No existe ninguno de esos 180 alumnos. Son números generados por un programa.
Hay dos razones, y las dos importan.
La primera es de protección de datos: cualquier dato real sobre el uso del móvil y las notas de menores es un dato personal, y no tiene sitio en un ejercicio de clase.
La segunda es más interesante: los datos están calibrados a propósito para reproducir lo que dice la investigación científica de verdad, que no es lo que dice la conversación de la calle.
Lo que dice la evidencia real
Esto merece leerse despacio, porque probablemente contradiga lo que te han repetido:
El metaanálisis más grande sobre el asunto (Adelantado-Renau y otros, JAMA Pediatrics, 2019, con 106.653 participantes) encontró que el tiempo de pantalla total no tiene una asociación estadísticamente significativa con el rendimiento académico. El tamaño del efecto fue −0,29 con un intervalo de confianza de −0,65 a 0,08 — y ese intervalo cruza el cero, que en estadística significa “no podemos descartar que el efecto sea nulo”.
La revisión más amplia (Sanders y otros, Nature Human Behaviour, 2024, con 1.937.501 participantes) da r = −0,14 para lectoescritura. Y r = +0,15, con el signo cambiado, cuando la misma pantalla se usa acompañado de un adulto.
Y el dato que le da la vuelta a todo (Chew, Current Addiction Reports, 2026): en los estudios que siguen a los mismos alumnos a lo largo del tiempo, las malas notas predicen más videojuegos después (r = −0,29) mucho mejor que los videojuegos predicen malas notas después (r = −0,09). La flecha causal apunta sobre todo al revés de como se cuenta: no es tanto que jugar baje las notas, es que quien lleva mal el curso se refugia en jugar.
Por si faltaba algo: el tiempo de pantalla que la gente declara en las encuestas apenas coincide con lo que registran los propios móviles (Parry y otros, Nature Human Behaviour, 2021). Estamos midiendo mal una cosa que además correlaciona poco.
Traducido: la asociación existe, pero es débil (explica entre el 1 % y el 4 % de la variación), viene de datos que no permiten hablar de causas, se mide con cuestionarios poco fiables, y en lo poco que hay a largo plazo la causa parece ir en el otro sentido.
Cómo está construido el archivo
Con un mecanismo que puedes leer entero, porque el código está más abajo:
- La nota del curso anterior predice fuerte la nota actual. Eso sí está bien establecido.
- Esa misma nota anterior predice también, en negativo, las horas de móvil: quien iba peor antes usa más el móvil ahora.
- El efecto directo del móvil sobre la nota se fija en un valor prácticamente nulo.
Resultado: en el conjunto entero aparece una correlación negativa entre móvil y notas, del tamaño que reporta la literatura. Pero esa correlación no viene de que el móvil baje las notas. Viene de que la nota anterior mueve las dos cosas a la vez.
Eso es lo que tienes que descubrir. Y es lo que la gráfica ingenua esconde.
E. La gráfica que casi todo el mundo daría por buena
Sube movil_y_notas.csv.
| Control | Valor |
|---|---|
| Tipo de gráfica | Dispersión (nube de puntos) |
| Eje horizontal (X) | horas_movil_dia |
| Eje vertical (Y) | nota_media |
| Eje vertical: desde dónde | Lo elijo yo |
| Y mínimo / Y máximo | 4 y 8 |
| Extras | marca Línea de tendencia |
Dibujar.
Sale una nube de puntos con una línea naranja que baja claramente de izquierda a derecha. Es exactamente la gráfica que ilustraría un titular del tipo “los móviles hunden las notas de los adolescentes”.
Y saltan tres avisos a la vez. Léelos los tres:
Uno. La línea tiene r = −0,171 y explica el 2,9 % de la variación de los datos. O sea: el 97,1 % de lo que pasa en esta nube NO lo explica esa línea. La línea existe porque se la has pedido, no porque los puntos la sigan.
Dos. El eje multiplica por 2,50 la pendiente que se ve.
Tres, y este es el que más duele: 42 de los 180 alumnos (el 23,3 %) quedan fuera del eje y no se dibujan. No están tapados: no aparecen. Casi una cuarta parte de los datos, y son precisamente los casos extremos, los que más se notarían.
F. La misma gráfica, honesta
Cambia solo Y mínimo a 0 y Y máximo a 10 — que es la escala real de una nota. Dibujar.
La línea sigue estando ahí, pero ahora es casi horizontal dentro de una nube que ocupa toda la pantalla. Desaparecen dos de los tres avisos: ya caben todos los puntos, y el eje ya no exagera nada.
Y queda el que importa, que no ha cambiado: sigue explicando el 2,9 %.
Preguntas:
- ¿Ha cambiado algún dato entre E y F?
- ¿Cuál de las dos usarías para defender que el móvil baja las notas? ¿Y para defender que no influye?
- Las dos gráficas son ciertas. ¿Entonces?
G. Qué sí predice la nota
Deja el eje en 0-10 y cambia solo el eje horizontal a nota_curso_anterior. Dibujar.
Ahora r = +0,706 y explica el 49,9 % de la variación. Y fíjate en algo importante: el aviso de “la línea explica poco” ha desaparecido. Los puntos sí siguen la línea.
Esto es lo que parece una correlación de verdad. Compárala con la de E, lado a lado si puedes.
La pregunta central del ejercicio: las dos son nubes de puntos con una línea encima. Una explica el 50 % y la otra el 3 %. Si solo hubieras visto la de E, ¿qué habrías concluido? ¿Qué te habría hecho falta para no equivocarte?
La respuesta es corta: mirar el número, no la línea.
H. El remate: separar por grupos
Este paso se hace a mano, porque METIS todavía no sabe filtrar por columnas. Y merece la pena.
Abre movil_y_notas.csv en una hoja de cálculo. Ordena por nota_curso_anterior. Parte los 180 alumnos por la mitad usando la mediana, que en este archivo sale 6,05: los 90 con nota anterior más baja y los 90 con nota anterior más alta. Y calcula, en cada grupo por separado, la correlación entre horas_movil_dia y nota_media.
En la hoja de cálculo las funciones son MEDIANA para el corte y COEF.DE.CORREL (o CORREL en algunas versiones) para la correlación. Si redondeas el corte a 6,0 sale exactamente lo mismo: en este archivo no hay ningún alumno con la nota anterior entre 6,0 y 6,05.
Te va a salir:
| Grupo | Correlación móvil ↔ nota | Variación explicada |
|---|---|---|
| Los 180 juntos | −0,171 | 2,9 % |
| Nota anterior ≤ 6,05 (90 alumnos) | −0,103 | 1,1 % |
| Nota anterior > 6,05 (90 alumnos) | +0,010 | 0,0 % |
En el grupo de mejor nota anterior el signo se ha invertido.
Lo que ha pasado es esto: la correlación del conjunto entero no medía el efecto del móvil. Medía que la nota anterior empuja a la vez las dos cosas — quien iba peor antes usa más el móvil y sigue sacando peor nota. En cuanto separas por nota anterior, el efecto del móvil se evapora.
Esto tiene nombre en estadística: variable de confusión. Y es la razón por la que “correlación no implica causalidad” no es una frase para repetir en un examen, sino algo que hay que saber comprobar.
La conclusión, que es todo el ejercicio
Piensa en lo que has hecho.
Al CO₂ le has aplicado todas las trampas que existen: le has truncado el eje, se lo has aplanado, le has recortado la ventana. Y el hecho no se ha movido. Sigue subiendo en todas las gráficas, en todas las ventanas, con todos los ejes.
Al móvil le has quitado una sola trampa de eje, y el efecto se ha quedado en el 3 % de la variación. Y al separar por grupos ha desaparecido del todo.
Mismo maltrato. Resultados opuestos.
Por eso la lección de esta práctica no es “las gráficas engañan”. Esa conclusión lleva al cinismo, a no creerse nada, y a quien miente le viene fenomenal que no te creas nada. La lección es esta:
Que una gráfica esté manipulada no significa que el hecho sea falso. Y que un hecho tenga una gráfica bonita no significa que sea cierto.
Hay que mirar los números: el eje, cuántos puntos hay, cuántos faltan, qué porcentaje de la variación explica la línea, y qué pasa si separas por grupos.
Eso son cinco comprobaciones, se hacen en dos minutos, y son la diferencia entre creerse las cosas y saberlas.
Lo que hay por debajo
Para quien quiera ver cómo se calculan los avisos. Los cuatro son aritmética simple, y ahí está el punto: no hace falta inteligencia artificial ninguna para medir una distorsión.
El factor del eje
La idea: con un eje que va de 0 al máximo, un cambio de valor D ocupa D/máximo de la altura del dibujo. Con un eje de inferior a superior, el mismo cambio ocupa D/(superior−inferior). El cociente entre las dos fracciones es cuántas veces más grande se ve la misma variación.
def _aviso_eje(valores, inferior, superior):
"""Mide cuanto exagera la pendiente visual un eje que no empieza en cero.
Con un eje de 0 a maximo, un cambio de valor D ocupa D/maximo de la altura
del dibujo. Con un eje de 'inferior' a 'superior', el mismo cambio ocupa
D/(superior-inferior). El cociente entre las dos fracciones es cuantas
veces mas grande se ve la misma variacion. Es aritmetica, no opinion."""
dato_max = float(np.max(valores))
dato_min = float(np.min(valores))
if dato_max <= 0:
return None
recorrido_desde_cero = dato_max - min(0.0, dato_min)
recorrido_elegido = superior - inferior
if recorrido_elegido <= 0:
return None
factor = recorrido_desde_cero / recorrido_elegido
# El engano contrario, y se usa igual: un eje absurdamente ancho aplasta
# una variacion real hasta convertirla en una raya plana. Es el truco del
# "solo es el 0,04 % de la atmosfera": los numeros son exactos y la
# conclusion es falsa.
if factor <= FACTOR_AVISO_APLANADO:
return {
"tipo": "eje_aplanado",
"factor": round(factor, 3),
"texto": (
f"El eje vertical va de {inferior:.4g} a {superior:.4g}, mucho "
f"más ancho que el recorrido real de los datos "
f"(de {dato_min:.4g} a {dato_max:.4g}). Eso **divide por "
f"{1 / factor:.1f}** la pendiente que se ve: aplasta una "
f"variación que existe hasta hacerla parecer una raya plana. "
f"Es el engaño contrario al del eje truncado, y se usa igual."
),
}
if factor < FACTOR_AVISO_EJE:
return None
return {
"tipo": "eje_truncado",
"factor": round(factor, 2),
"texto": (
f"El eje vertical no empieza en cero: va de {inferior:.4g} a "
f"{superior:.4g}. Eso multiplica por **{factor:.2f}** la pendiente "
f"que se ve, comparada con un eje que empezara en cero. Los datos "
f"son los mismos; lo que cambia es lo empinada que parece la subida."
),
}
Los puntos que desaparecen
def _aviso_puntos_fuera(valores, inferior, superior):
"""Cuenta los datos que quedan FUERA del eje elegido y no se dibujan.
Es el engano mas silencioso de todos: al recortar el eje a mano, los
valores que caen fuera desaparecen del dibujo sin dejar rastro. Quien mire
la grafica no tiene forma de saber que faltan. Aqui se cuentan y se dicen,
porque es exactamente el tipo de perdida invisible que este proyecto
persigue en todas sus piezas."""
valores = np.asarray(valores, dtype=float)
fuera = int(np.sum((valores < inferior) | (valores > superior)))
if fuera == 0:
return None
total = int(len(valores))
porcentaje = fuera / total * 100
return {
"tipo": "puntos_fuera",
"fuera": fuera,
"texto": (
f"**{fuera} de los {total} datos ({porcentaje:.1f} %) quedan fuera "
f"del eje y no se dibujan.** No están tapados: no aparecen. Quien "
f"mire esta gráfica no puede saber que faltan, y suelen ser "
f"precisamente los casos extremos, que son los que más se notarían."
),
}
La tendencia de la ventana comparada con la de la serie completa
def _aviso_ventana(marco_completo, marco_ventana, x, y):
"""Compara la tendencia dentro de la ventana con la de la serie completa."""
if len(marco_ventana) == len(marco_completo):
return None
def pendiente_de(m):
xs = _numerica(m, x)
ys = _numerica(m, y)
valido = xs.notna() & ys.notna()
if pd.api.types.is_datetime64_any_dtype(xs):
xs_num = xs[valido].astype("int64") / 1e9 / 86400 / 365.25
else:
xs_num = xs[valido]
return _pendiente(np.asarray(xs_num, dtype=float),
np.asarray(ys[valido], dtype=float))
completa = pendiente_de(marco_completo)
ventana = pendiente_de(marco_ventana)
if completa is None or ventana is None:
return None
fuera = len(marco_completo) - len(marco_ventana)
texto = (
f"Estás mirando {len(marco_ventana)} de {len(marco_completo)} filas: "
f"has dejado {fuera} fuera. "
)
if completa != 0:
proporcion = ventana / completa
if proporcion < 0:
texto += (
f"**Y la tendencia se ha dado la vuelta**: en la serie completa "
f"es {completa:+.4g} por unidad de '{x}', y en esta ventana es "
f"{ventana:+.4g}. Recortando la ventana has cambiado el signo "
f"de la conclusión."
)
else:
texto += (
f"En la serie completa la tendencia es {completa:+.4g} por unidad "
f"de '{x}'; en esta ventana es {ventana:+.4g} "
f"({proporcion:.2f} veces la de la serie completa)."
)
else:
texto += f"En esta ventana la tendencia es {ventana:+.4g}."
return {"tipo": "ventana_recortada", "texto": texto}
La línea de tendencia y lo que explica
def _aviso_tendencia(r2, r, n):
"""Avisa cuando se dibuja una recta encima de una nube que no la sigue."""
if r2 is None:
return None
porcentaje = r2 * 100
base = (
f"La línea de tendencia tiene r = {r:+.3f} y explica el "
f"**{porcentaje:.1f} %** de la variación de los datos ({n} puntos)."
)
if r2 < R2_AVISO_TENDENCIA:
return {
"tipo": "tendencia_debil",
"texto": base + (
f" Es decir: el {100 - porcentaje:.1f} % de lo que pasa en esta "
"nube NO lo explica esa línea. La línea existe porque se la has "
"pedido, no porque los puntos la sigan."
),
}
return {"tipo": "tendencia", "texto": base}
Y el generador del archivo del móvil
La semilla es fija, así que este código produce siempre exactamente el mismo archivo. Cualquiera puede reproducirlo y comprobar que las correlaciones son las que digo.
def generar_filas():
aleatorio = random.Random(SEMILLA)
filas = []
for indice in range(1, NUMERO_ALUMNOS + 1):
# Nota del curso anterior: centrada en 6, con dispersion realista.
nota_anterior = limitar(aleatorio.gauss(6.0, 1.6), 1.0, 10.0)
centrada = (nota_anterior - 6.0) / 1.6
# Horas de movil: la empuja hacia arriba una nota anterior baja.
horas_movil = 3.4 + PESO_NOTA_ANTERIOR_EN_MOVIL * centrada
horas_movil += aleatorio.gauss(0, 1.15)
horas_movil = limitar(horas_movil, 0.5, 9.0)
# Horas de sueno: algo menos si se usa mucho el movil, pero poco
# (la literatura da 3-5 minutos menos por hora extra de pantalla).
horas_sueno = 7.6 - 0.07 * (horas_movil - 3.4) + aleatorio.gauss(0, 0.6)
horas_sueno = limitar(horas_sueno, 4.5, 10.0)
# Nota actual: la manda la nota anterior. El movil casi no pinta.
nota = (6.0
+ PESO_NOTA_ANTERIOR * centrada * 1.6
+ EFECTO_DIRECTO_MOVIL * (horas_movil - 3.4)
+ aleatorio.gauss(0, 1.05))
nota = limitar(nota, 0.0, 10.0)
filas.append({
"alumno_id": f"A{indice:04d}",
"horas_movil_dia": round(horas_movil, 1),
"horas_sueno": round(horas_sueno, 1),
"nota_curso_anterior": round(nota_anterior, 1),
"nota_media": round(nota, 1),
})
return filas
Lo que METIS sigue sin hacer
- No ejecuta código generado por la IA. Ni aquí ni en ningún otro paso.
- No filtra por columnas, y por eso el paso H se hace a mano. Es el candidato más claro para la próxima versión: poder pintar la misma nube separada en dos colores según el valor de una tercera columna haría visible la variable de confusión en la propia gráfica, sin salir de la página.
- No calcula columnas nuevas. Para dibujar el CO₂ como fracción de la atmósfera habría que crear una columna
mean/10000, y METIS no puede. Por eso el paso C se hace con el eje ancho, que produce el mismo efecto visual. - No sabe qué mide cada columna. No sabe que una ocultación no puede pasar del 100 % ni que una nota no puede pasar de 10. Sabrá lo que se le diga, cuando se le diga.
El paso siguiente
El paso 3 de la secuencia: analizar dos conjuntos sobre lo mismo, uno sesgado y otro no, con las mismas herramientas de los pasos anteriores, y ver cómo se llega a conclusiones distintas con un método idéntico.
Pero eso será otra entrada.





