Validación y Análisis · Tema 43

Reproducibilidad

Otro equipo, tu código y tus datos, mismo resultado: sin semillas, versiones y entorno archivados no hay ciencia, hay anécdota.

01 · Punto de partida

Si no repite, no decide

Presentás «MAE 0,42» y te preguntan con qué semilla, qué versión y qué datos. «No me acuerdo» invalida todo lo anterior (Temas 5–42): nadie puede auditar, repetir ni confiar. Reproducir es el precio de decidir.

  • ¿Qué código exacto corrió (versión)?
  • ¿Con qué semillas y datos?
  • ¿En qué entorno (librerías)?
  • ¿Otro puede repetir bit a bit?

02 · Definición

Reproducible, replicable y robusto

⟲

Reproducible

Mismos datos y código dan mismo resultado. El mínimo exigible: tu experimento repetido por otro.

⧉

Replicable

Nuevos datos, mismo protocolo, misma conclusión. Más fuerte: valida más allá de tu muestra.

🛡

Robusto

Mismo resultado con detalles cambiados (semilla, versión menor). Lo que sobrevive al ruido operativo.

Tres niveles, tres exigencias.
NivelCambiaDebe mantenerse
ReproducibleQuién corre, cuándoResultado bit a bit
ReplicableDatos frescosConclusión (no el decimal)
RobustoSemilla, versión menorVeredicto (no el p exacto)

03 · Método

Checklist en 5 piezas

  1. 1
    Versionar código (git + tag).

    Cada resultado cita commit/tag. «Última versión» no es versión.

  2. 2
    Fijar y archivar semillas.

    Maestra + derivadas (Tema 29) en config y log. Sin semilla no hay repetición.

  3. 3
    Congelar entorno.

    Versiones de Python/librerías (requirements). «En mi máquina da» no es evidencia.

  4. 4
    Archivar datos + reglas de limpieza.

    Crudos, scripts y limpios con hash (Tema 10). Sin linaje no hay auditoría.

  5. 5
    Un comando que repite todo.

    Script que de cero regenera tablas y gráficos. Si hay pasos manuales, fallará.

código + semillas→entorno + datos→un comando

04 · Verificar que repite

El test del colega escéptico

Prueba

Borrar y repetir

Otro corre el comando en máquina limpia: ¿mismas tablas? Si falla, falta pieza (casi siempre semilla o dato).

Blindaje

Hash y manifiesto

Manifiesto con commit, semillas, hash de datos y versiones. Todo veredicto cita su manifiesto (Tema 44).

Flotantes
Bit a bit solo en igual CPU/librería; entre plataformas vale tolerancia 1e-9, no igualdad ciega.
Azar ordenado
Paralelo asigna semilla por índice (Tema 29): el orden de llegada no cambia resultados.
«Funciona acá»
Sin entorno congelado es anécdota local. Contenedor o requirements con versiones fijas.

05 · Representación en Python

Manifiesto que audita solo

Python en tu navegador. Sin manifiesto, el resultado es huérfano.

manifiesto = {
    "commit": "a3f9c1e",
    "maestra": 20240501,
    "datos_hash": "sha256:9f2c…",
    "python": "3.11.5",
    "n": 64,
}
faltan = [k for k in ["commit", "maestra", "datos_hash", "python"] if k not in manifiesto]
print("manifiesto:", manifiesto)
print("¿Reproducible?", "SÍ" if not faltan else f"NO, faltan {faltan}")

Cinco campos bastan para empezar: el resto (w, T, tol) vive en config versionada.

Semilla que se imprime sola

import random
MAESTRA = 20240501
print([MAESTRA+i for i in range(3)], "(réplica i → semilla única y logueada)")

06 · Exploración

Laboratorio: puntaje de reproducibilidad

Activá las 4 piezas (código versionado, semillas, entorno, datos con hash) y el n documentado. El puntaje pondera lo crítico: sin semillas o sin código no hay repetición posible. Llegá a 100.

EXPERIMENTO 43

Checklist que puntúa

100 = otro repite bit a bit

Los resultados numéricos aparecen debajo.
Puntaje100
Pieza crítica—
Nivel—
Veredicto—

Con las 4 piezas, otro repite bit a bit: reproducible.

Barras: código (35), semillas (35), entorno (15), datos (15). Sin código o semillas el techo es 65: nunca reproducible.

Preguntas para explorar

  1. Apagá semillas: ¿puntaje y veredicto? ¿Por qué es crítica aunque el resto esté?
  2. Apagá código con todo lo demás: ¿puntaje? ¿Qué puede repetir otro sin versión exacta?
  3. Con entorno+datos a medias (1/2): ¿nivel? ¿Qué falta para replicable (no solo reproducible)?
Ver respuestas sugeridas
  1. 65, irreproducible: sin semillas el azar no se repite (Tema 29). Crítica e innegociable.
  2. 65 también: sin commit exacto nadie sabe qué corrió. «Casi igual» no es igual.
  3. Parcial (~85): reproduce hoy, frágil mañana. Para replicable faltan datos frescos con mismo protocolo (Tema 7).

07 · Comprensión

Confusiones frecuentes

«Reproducible = replicable»

Reproducible repite lo mismo; replicable confirma con datos nuevos. Lo primero es higiene, lo segundo es ciencia.

«Con el código alcanza»

Código sin semillas/datos/entorno no repite. Las cuatro piezas o nada.

«Versión aproximada vale»

«Librería X 2.x» cambia resultados. Versiones fijas o contenedor: aproximado no reproduce.

«Documento al final si hay tiempo»

Al final no hay tiempo ni memoria. Manifiesto y log desde el primer día (Tema 44).

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: auditar manifiesto

¿Reproducible este manifiesto?

m = {"commit": "a3f", "maestra": 7}
print("Faltan entorno y hash: parcial, no reproducible")
Ver solución razonada

No: sin entorno ni hash de datos otro no puede repetir bit a bit. Puntaje ~65: irreproducible.

Ejercicio 2: comando único

¿Qué debe hacer reproducir.sh?

print("instalar entorno fijo + correr config + regenerar tablas y figuras")
Ver solución

De cero a resultados sin pasos manuales. Si pide clicks, fallará.

Ejercicio 3: bit a bit vs. tolerancia

¿Igualdad exacta entre plataformas?

Ver una posible respuesta
print("Igual CPU: bit a bit. Distinta: tolerancia 1e-9 + misma conclusión.")

Flotantes migran con plataforma: la conclusión debe sobrevivir, el decimal puede temblar.

09 · Síntesis

Ideas para recordar

  • Código(v) + datos(hash) + semillas + entorno = resultado repetible.
  • Sin semillas o sin versión no hay repetición: críticas innegociables.
  • Un comando de cero a tablas; log con manifiesto al inicio.
  • Reproducible (mismo) → replicable (nuevo) → robusto (cambios).
  • Lo no versionado no existe.

En el próximo tema dejaremos constancia: documentación de experimentos.