
METIS 9: la recta que explicaba el 99 % del pasado y falló por 26 partes por millón
Lo que ha cambiado por dentro
Esta entrega vuelve a 1º de Bachillerato, y sale directamente del currículo. En la Orden de 30 de mayo de 2023, el saber básico CDPC.1.B.2 termina con una frase que no estaba en el currículo anterior:
«…Técnicas de predicción de datos como sistemas de apoyo a la decisión.»
Sistemas de apoyo a la decisión. Es decir: gente decidiendo cosas de verdad a partir de una línea estirada. Merece que se enseñe bien.
METIS ya sabía calcular una recta de tendencia. Lo que no sabía hacer era lo único que convierte una tendencia en una predicción: dejar que la recta se salga del rango de los datos. Ahora la serie temporal tiene dos campos nuevos:
- Ajustar la recta solo hasta — el año del corte.
- Estirarla hasta — hasta dónde llega la línea de puntos.
Y con eso vienen tres decisiones que conviene explicar antes del ejercicio.
1. La recta no mira ni un punto posterior al corte
Es la regla que hace honesto todo lo demás. Si la recta se ajustara con todos los datos y luego la dibujáramos «prediciendo» un tramo que ya conoce, no estaríamos prediciendo nada: estaríamos describiendo.
No es una promesa: está probado. La batería de pruebas coge el mismo tramo de ajuste y le pega dos futuros opuestos —una columna de +9999 y otra de −9999— y comprueba que la pendiente, el corte y el r² del ajuste salen idénticos en los dos casos. Lo único que cambia es el error medido. Si algún día alguien toca esa función y deja que se cuele un dato del futuro, esa prueba se pone roja.
2. Lo que se mide no es el r², es el error contra la realidad
Aquí está el corazón del asunto, y es la razón de ser de la entrada entera.
El r² dice qué bien se ajusta la recta a los datos que ya ha visto. Es una nota sobre el pasado. Y todo el mundo lo usa como si fuera una garantía sobre el futuro.
Así que METIS hace otra cosa: coge los puntos reales que existen después del corte, calcula qué predecía la recta para cada uno, y los resta. Error medio, error máximo, y el error en el último dato disponible. Números, no confianza.
3. Cuando no se puede comprobar, se dice
Si predices más allá de donde hay datos, no hay nada contra lo que contrastar. METIS no se calla ni disimula: avisa de que esa predicción no se puede comprobar y de que una recta dibujada no es una recta que acierte. Es exactamente el caso en el que casi todo el mundo se cree su propio gráfico.
Los avisos, con sus umbrales
| Aviso | Cuándo salta |
|---|---|
prediccion_comprobada | Siempre que haya datos reales tras el corte. Da el predicho, el real y la diferencia |
prediccion_sin_comprobar | No hay ni un dato después del corte |
extrapolacion_larga | Estiras más de un 50 % de lo que usaste para ajustar (FRACCION_AVISO_EXTRAPOLACION) |
ajuste_flojo | El r² del ajuste baja de 0,5 (R2_AVISO_AJUSTE) |
41 comprobaciones nuevas, 175 en total entre las cuatro baterías, y una pasada de regresión sobre las gráficas de las entradas 3, 7 y 8 para confirmar que siguen dando exactamente lo mismo.
El ejercicio
Dos archivos que ya conoces, los dos con datos reales:
co2_annmean_mlo.csv— CO₂ atmosférico medido en Mauna Loa por la NOAA, 67 medias anuales desde 1959.temperatura_mundo.csv— temperatura global de la NASA (GISTEMP v4), 146 años desde 1880.
Ningún dato inventado en toda la actividad.
PASO A — Predecir el presente desde el año 2000
Sube co2_annmean_mlo.csv, limpia y baja a 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 |
| Predicción: ajustar la recta solo hasta | 2000 |
| Predicción: estirarla hasta | 2025 |
Le estás pidiendo esto: ponte en el año 2000, no mires nada de lo que vino después, ajusta una recta a los cuarenta y dos años que tienes, y dime cuánto CO₂ habrá en 2025.
Sale una recta continua sobre el tramo conocido y una línea de puntos que sigue hacia la derecha, con una vertical marcando dónde se corta.
Los números:
La recta explica el 98,9 % de los datos con los que se ajustó.
Para 2025 predice 400,84 ppm. El valor real es 427,35 ppm.
Se ha quedado 26,51 por debajo. Error medio sobre los 25 años comprobables: 13,11.
Párate en el 98,9 %. Ese es un ajuste que en cualquier informe se presentaría como excelente. Y la predicción falla por veintiséis partes por millón, que es casi una cuarta parte de todo lo que ha subido el CO₂ en la historia de la serie.
METIS te avisa además de que estás estirando la recta un 61 % de lo que usaste para ajustarla.
PASO B — La tabla que hay que construir
Ahora repite lo mismo cambiando solo el año de corte, y apunta tres cosas cada vez: el r² del ajuste, lo que predice para 2025, y el error. Todo está en el texto que sale debajo de la gráfica.
| Ajustar hasta | r² del ajuste | Predice para 2025 | Error real |
|---|---|---|---|
| 1980 | 0,9836 | 384,43 | −42,92 |
| 1990 | 0,9826 | 396,02 | −31,33 |
| 2000 | 0,9891 | 400,84 | −26,51 |
| 2010 | 0,9874 | 406,78 | −20,57 |
| 2015 | 0,9860 | 409,78 | −17,57 |
| 2020 | 0,9830 | 413,17 | −14,18 |
Mira las dos columnas del medio como si fueran una sola cosa, porque es el hallazgo de la actividad:
El r² se mueve entre 0,9826 y 0,9891. Prácticamente el mismo en las seis.
El error va de 42,92 a 14,18. Tres veces mayor en unas que en otras.
Y de ahí sale la frase que hay que escribir en el cuaderno:
El r² no te dice nada sobre lo que va a pasar. Solo te dice cómo de bien encaja la recta con lo que ya sabías.
Son dos preguntas distintas y todo el mundo las confunde: ¿esta recta describe bien mis datos? y ¿esta recta va a acertar? La primera se contesta con el r². La segunda solo se contesta esperando a ver qué pasa, o escondiéndole datos a la recta a propósito, que es lo que acabas de hacer.
PASO C — ¿Por qué se queda corta SIEMPRE?
Vuelve a mirar la tabla. Los seis errores son negativos. Las seis rectas se quedan cortas. Eso no es mala suerte seis veces: es una pista sobre la forma de los datos.
Compruébalo. Mide la pendiente por tramos, poniendo la ventana en cada uno y leyendo la pendiente que da METIS:
| Tramo | Sube |
|---|---|
| 1959-1979 | 1,03 ppm por año |
| 1980-2000 | 1,53 ppm por año |
| 2001-2025 | 2,30 ppm por año |
El CO₂ no sube: acelera. Cada tramo sube más deprisa que el anterior, y en sesenta y seis años el ritmo se ha más que duplicado.
Y ahí está la explicación completa: una recta tiene una sola pendiente. Si los datos aceleran y tú les ajustas una recta, esa recta se queda con una especie de pendiente media del pasado, que ya es más suave que la pendiente de ahora. Al estirarla, se va quedando cada vez más atrás.
Ajustar una recta a algo que no es una recta no es un error de cálculo. Es una suposición sobre cómo funciona el mundo.
Y esa suposición —«lo que ha pasado hasta aquí seguirá pasando igual»— es la que va dentro de toda extrapolación, aunque nadie la escriba.
PASO D — La temperatura, que es más ruidosa
Sube temperatura_mundo.csv y haz lo mismo: ajustar hasta 2000, estirar hasta 2025.
- La recta explica el 65,9 % de los datos de ajuste. Bastante peor que el CO₂, y con razón: la temperatura da botes de año en año.
- Predice +0,40 para 2025. El real es +1,19.
- Se queda 0,79 grados corta. Casi el triple de lo que predecía.
Repite la tabla del paso B:
| Ajustar hasta | r² | Predice 2025 | Error |
|---|---|---|---|
| 1950 | 0,2269 | +0,19 | −1,00 |
| 1975 | 0,3985 | +0,20 | −0,99 |
| 2000 | 0,6590 | +0,40 | −0,79 |
| 2010 | 0,7205 | +0,51 | −0,68 |
| 2015 | 0,7452 | +0,56 | −0,63 |
Aquí el r² sí mejora al acercarse el corte, y el error también baja. Pero fíjate en la magnitud: incluso ajustando con todo hasta 2015, la recta se queda a 0,63 grados de la realidad, cuando el total acumulado desde 1880 es de 1,36. Se equivoca en casi la mitad de todo el fenómeno.
Y otra vez: los cinco errores son negativos. También la temperatura acelera.
PASO E — El desastre: la ventana plana
Esto es la continuación directa de la entrega anterior. Allí vimos que de 1940 a 1975 la serie sale casi plana: treinta y seis años en los que alguien podría haber dicho «esto no sube» con una gráfica delante dándole la razón.
Vamos a dejar que ese alguien prediga.
| Control | Valor |
|---|---|
| Ventana: X desde | 1940 |
| Predicción: ajustar la recta solo hasta | 1975 |
| Predicción: estirarla hasta | 2025 |
Resultado:
Predice −0,14 para 2025. El valor real es +1,19.
Se equivoca en 1,33 grados. Error medio sobre los 50 años comprobables: 0,63.
Y saltan cuatro avisos a la vez, que conviene leer los cuatro:
[ventana_recortada] Estás mirando 86 de 146 filas: has dejado 60 fuera.
[prediccion_comprobada] Para 2025 tu recta predecía -0.14 y el valor real fue 1.19: se ha quedado 1.33 por debajo.
[extrapolacion_larga] Has ajustado la recta con 35 unidades de datos y la estás estirando 50 más, o sea un 143 % de lo que usaste para ajustarla.
[ajuste_flojo] La recta explica solo el 4 % de la variación de los datos con los que la has ajustado. Ya falla sobre lo que sí conoce: no hay ningún motivo para creerla sobre lo que no conoce.
Ese último aviso es el que quiero que te lleves. Una recta con un r² del 4 % no es una recta: es una raya que pasa por en medio de una nube. Y aun así se dibuja perfectamente, y se estira perfectamente, y se puede meter en una presentación perfectamente.
El dibujo no se queja nunca. Los números sí.
PASO F — Y ahora predice 2050
Última prueba. Vuelve al CO₂, quita la ventana, y pon:
| Control | Valor |
|---|---|
| Predicción: ajustar la recta solo hasta | 2025 |
| Predicción: estirarla hasta | 2050 |
Ahora usas los 67 años. El r² del ajuste es 0,9806. La línea de puntos sale hacia 2050 con una pinta estupenda.
Y METIS te dice esto:
[prediccion_sin_comprobar] No hay ningún dato real después de 2025, así que esta predicción no se puede comprobar. La recta puede estar muy bien o muy mal y este archivo no lo sabe. Que una recta se dibuje no significa que acierte.
Contesta esto por escrito, que es la pregunta de la actividad:
- Acabas de comprobar en el paso B que todas las rectas ajustadas al CO₂ se quedan cortas, y por cuánto. ¿En qué dirección crees que se equivoca esta?
- Si fueras quien tiene que decidir algo importante a partir de esta gráfica, ¿qué le pedirías a quien te la enseña?
Lo que hay que llevarse de aquí
Uno. El r² mide el pasado. La predicción es sobre el futuro. Son dos preguntas distintas y una no responde a la otra: en el paso B tuviste seis rectas con el mismo r² y errores que iban de 14 a 43.
Dos. La única manera honesta de saber si un método predice es esconderle datos a propósito y comprobar. Eso que has hecho hoy tiene nombre —validación— y no es un truco de clase: es exactamente el procedimiento con el que se comprueba cualquier sistema de aprendizaje automático. Se le enseña una parte de los datos, se le esconde otra, y se le mide con la que no ha visto. Si alguna vez te cuentan que un modelo «acierta el 95 %», la pregunta es: ¿sobre datos que no había visto?
Tres. Extrapolar es suponer que el mundo sigue funcionando igual fuera del rango donde has mirado. A veces es razonable. Pero es una suposición, no un cálculo, y va escondida dentro de cada línea de puntos que veas en un periódico.
Para quien acabe pronto
1. Busca el corte que acierta. En el CO₂, ¿existe algún año de corte con el que la recta prediga bien 2025? Prueba varios y quédate con el mejor. Y ahora la pregunta difícil: ¿te sirve de algo saberlo? Has encontrado ese corte sabiendo ya la respuesta. En el año 2000 no la sabías.
2. Suaviza antes de predecir. El campo de media móvil sigue ahí. Pon una media móvil de 5 sobre la temperatura y vuelve a predecir. ¿Cambia mucho el error? ¿Y qué has perdido por el camino? (La entrega 3 ya avisaba de que suavizar esconde los cambios reales que duran menos que la ventana.)
3. La curva que sí encaja. METIS solo ajusta rectas, a propósito. Si el CO₂ acelera, una parábola encajaría mejor. Busca en qué consiste el ajuste polinómico y explica qué riesgo nuevo aparece cuando le das al ajuste más libertad para curvarse. (Pista: si le das suficiente libertad, una curva puede pasar exactamente por todos tus puntos. ¿Sería esa la mejor predicción posible?)
Lo que hay por debajo
La función que predice
Toda la lógica está aquí, y son quince líneas de aritmética. Fíjate en el orden: primero se recorta el tramo de ajuste, y solo con ese tramo se llama a polyfit. Los puntos posteriores se usan después, y únicamente para restar.
def _predecir(xs, ys, ajustar_hasta, predecir_hasta):
"""Ajusta una recta usando SOLO los puntos hasta 'ajustar_hasta' y la
estira hasta 'predecir_hasta'.
La regla que hace honesto todo el ejercicio: para calcular la recta no se
mira ni un solo punto posterior al corte. Ni uno. Despues se compara lo
que la recta predecia con los puntos reales que si existen mas alla del
corte, y esa comparacion -no el r2 del ajuste- es la que dice si la recta
servia para algo.
Si no hay ningun punto real despues del corte, no se puede comprobar
nada, y eso se dice en vez de disimularlo.
Devuelve un dict con la recta, el ajuste y la comprobacion, o lanza
ErrorGrafica si lo que se pide no tiene sentido.
"""
ajuste = xs <= ajustar_hasta
if int(ajuste.sum()) < PUNTOS_MIN_AJUSTE:
raise ErrorGrafica(
f"Solo hay {int(ajuste.sum())} punto(s) hasta {_formato_x(ajustar_hasta)}: "
f"hacen falta al menos {PUNTOS_MIN_AJUSTE} para ajustar una recta. "
f"Corta más adelante."
)
if predecir_hasta <= ajustar_hasta:
raise ErrorGrafica(
f"'Predecir hasta' ({_formato_x(predecir_hasta)}) tiene que ser posterior "
f"a 'Ajustar hasta' ({_formato_x(ajustar_hasta)}). Si no, no estás "
f"prediciendo nada."
)
x_ajuste, y_ajuste = xs[ajuste], ys[ajuste]
if np.var(x_ajuste) == 0:
raise ErrorGrafica("Todos los puntos del tramo de ajuste tienen la misma X.")
pendiente, corte = np.polyfit(x_ajuste, y_ajuste, 1)
def recta(valores):
return pendiente * np.asarray(valores, dtype=float) + corte
r2 = _r_cuadrado(x_ajuste, y_ajuste)
r2 = None if r2 is None else r2[0]
# La comprobacion: solo con puntos reales POSTERIORES al corte.
posteriores = xs > ajustar_hasta
comprobacion = []
for valor_x, real in zip(xs[posteriores], ys[posteriores]):
predicho = float(recta(valor_x))
comprobacion.append({"x": float(valor_x), "real": float(real),
"predicho": predicho, "error": predicho - float(real)})
resultado = {
"pendiente": float(pendiente),
"corte": float(corte),
"r2_ajuste": None if r2 is None else round(r2, 4),
"puntos_ajuste": int(ajuste.sum()),
"ajuste_desde": float(x_ajuste.min()),
"ajuste_hasta": float(ajustar_hasta),
"predecir_hasta": float(predecir_hasta),
"rango_ajuste": float(ajustar_hasta) - float(x_ajuste.min()),
"extrapolacion": float(predecir_hasta) - float(ajustar_hasta),
"comprobables": len(comprobacion),
}
if comprobacion:
errores = [abs(c["error"]) for c in comprobacion]
ultimo = comprobacion[-1]
peor = max(comprobacion, key=lambda c: abs(c["error"]))
resultado.update({
"error_medio": round(sum(errores) / len(errores), 4),
"error_maximo": round(max(errores), 4),
"ultimo": {k: round(v, 4) for k, v in ultimo.items()},
"peor": {k: round(v, 4) for k, v in peor.items()},
})
return resultado, recta
Y los avisos
Ninguno es una opinión: los cuatro son una comparación entre dos números.
def _avisos_prediccion(prediccion, nombre_y):
"""Los avisos de una prediccion. Todos son aritmetica, ninguno es opinion."""
avisos = []
if prediccion["comprobables"] == 0:
avisos.append({"tipo": "prediccion_sin_comprobar", "texto": (
f"No hay ningún dato real después de {_formato_x(prediccion['ajuste_hasta'])}, "
f"así que **esta predicción no se puede comprobar**. La recta puede estar "
f"muy bien o muy mal y este archivo no lo sabe. Que una recta se dibuje no "
f"significa que acierte.")})
else:
u = prediccion["ultimo"]
signo = "por debajo" if u["error"] < 0 else "por encima"
avisos.append({"tipo": "prediccion_comprobada", "texto": (
f"**La predicción se puede comprobar, y este es el resultado.** Para "
f"{_formato_x(u['x'])} tu recta predecía **{u['predicho']:.2f}** y el valor real "
f"fue **{u['real']:.2f}**: se ha quedado **{abs(u['error']):.2f} {signo}**. "
f"Sobre los {prediccion['comprobables']} años que se pueden comprobar, el error "
f"medio es de **{prediccion['error_medio']:.2f}** y el mayor error es de "
f"**{prediccion['error_maximo']:.2f}** ({nombre_y}).")})
if prediccion["rango_ajuste"] > 0:
fraccion = prediccion["extrapolacion"] / prediccion["rango_ajuste"]
if fraccion > FRACCION_AVISO_EXTRAPOLACION:
avisos.append({"tipo": "extrapolacion_larga", "texto": (
f"Has ajustado la recta con **{_formato_x(prediccion['rango_ajuste'])} "
f"unidades** de datos y la estás estirando **"
f"{_formato_x(prediccion['extrapolacion'])} más**, o sea un "
f"**{fraccion*100:.0f} %** de lo que usaste para ajustarla. Cuanto más "
f"lejos estiras una recta, menos tiene que ver con los datos y más con "
f"tu confianza en la recta.")})
r2 = prediccion["r2_ajuste"]
if r2 is not None and r2 < R2_AVISO_AJUSTE:
avisos.append({"tipo": "ajuste_flojo", "texto": (
f"La recta explica solo el **{r2*100:.0f} %** de la variación **de los datos "
f"con los que la has ajustado**. Ya falla sobre lo que sí conoce: no hay "
f"ningún motivo para creerla sobre lo que no conoce.")})
return avisos
Lo que METIS sigue sin hacer
- No ejecuta código generado por la IA. Ni aquí ni en ningún paso.
- Solo ajusta rectas. Nada de polinomios, exponenciales ni medias móviles ponderadas. Es una limitación deliberada: con un solo tipo de ajuste, la conversación va sobre qué significa predecir y no sobre qué fórmula elijo. El paso 3 de «si acabas pronto» está justo para tocar ese techo.
- No da intervalos de confianza. Una predicción seria no es un número, es un número con un margen. METIS da el número pelado y el error medido contra la realidad, que para 1º de Bachillerato es más honesto y mucho más fácil de entender que una banda.
- No sabe qué mide tu columna. No sabe que el CO₂ no puede bajar de cero ni que una temperatura tiene límites físicos. Si estiras la recta lo suficiente, te dibujará números imposibles sin inmutarse.
Nota para el profesorado sobre el currículo
Esta actividad cubre la parte de predicción del saber básico CDPC.1.B.2 de Creación Digital y Pensamiento Computacional (Orden de 30 de mayo de 2023). Conviene decir lo que no cubre: ese mismo saber empieza con «Simulación de fenómenos naturales y sociales. Descripción del modelo. Identificación de agentes», y el criterio de evaluación asociado, el 2.2, está redactado como «Utilizar una variedad de datos para simular fenómenos naturales y sociales». La simulación con agentes sigue sin tocarse, y quien programe la materia con esto debe saberlo al escribirla, no al evaluar.
El paso siguiente
Queda pendiente medir el volumen: qué cambia de verdad entre analizar 100 filas y 1.000. Eso espera a tener un ordenador en condiciones en el instituto, porque medir tiempos en una máquina prestada no sirve para nada.
Pero eso será otra entrada.




