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.
| Nivel | Cambia | Debe mantenerse |
|---|---|---|
| Reproducible | Quién corre, cuándo | Resultado bit a bit |
| Replicable | Datos frescos | Conclusión (no el decimal) |
| Robusto | Semilla, versión menor | Veredicto (no el p exacto) |
03 · Método
Checklist en 5 piezas
- 1Versionar código (git + tag).
Cada resultado cita commit/tag. «Última versión» no es versión.
- 2Fijar y archivar semillas.
Maestra + derivadas (Tema 29) en config y log. Sin semilla no hay repetición.
- 3Congelar entorno.
Versiones de Python/librerías (requirements). «En mi máquina da» no es evidencia.
- 4Archivar datos + reglas de limpieza.
Crudos, scripts y limpios con hash (Tema 10). Sin linaje no hay auditoría.
- 5Un comando que repite todo.
Script que de cero regenera tablas y gráficos. Si hay pasos manuales, fallará.
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.
Checklist que puntúa
100 = otro repite bit a bit
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
- Apagá semillas: ¿puntaje y veredicto? ¿Por qué es crítica aunque el resto esté?
- Apagá código con todo lo demás: ¿puntaje? ¿Qué puede repetir otro sin versión exacta?
- Con entorno+datos a medias (1/2): ¿nivel? ¿Qué falta para replicable (no solo reproducible)?
Ver respuestas sugeridas
- 65, irreproducible: sin semillas el azar no se repite (Tema 29). Crítica e innegociable.
- 65 también: sin commit exacto nadie sabe qué corrió. «Casi igual» no es igual.
- 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.