El problema educativo: un análisis lógico estructural

Libro
📄 Descargar PDF ← Volver a Textos

Análisis numérico de la repitencia y la acumulación de materias pendientes en la escuela secundaria argentina. El documento modela la trayectoria estudiantil como una cadena de Markov y una simulación basada en agentes, y propone un rediseño estructural basado en continuidad pedagógica, áreas integradas y aprendizaje basado en proyectos.

Introducción

Este documento presenta un análisis numérico de la repitencia y la acumulación de exámenes de aprobación pendiente —las llamadas «previas»— en la escuela secundaria argentina. El Prólogo estableció el encuadre epistemológico del trabajo: por qué se simplifica, qué tipo de análisis es este y para qué sirve. Esta Introducción se limita a dos propósitos complementarios: describir el recorrido del documento capítulo por capítulo, y señalar el contexto institucional y político que lo motiva.

La pregunta que motiva este análisis es engañosamente simple: ¿qué ocurre cuando cada docente aprueba, en promedio, al 90% de sus estudiantes? A primera vista, aprobar a 27 de cada 30 alumnos parece un resultado más que aceptable. Sin embargo, cuando esa tasa se aplica de manera sistemática a doce materias por año y a cinco años de escolaridad, el panorama cambia drásticamente. Un 10% de desaprobación por materia, acumulado en una estructura de sesenta asignaturas, no es un detalle menor: es una fuente sostenida de deuda académica y repitencia.

Este trabajo intenta mostrar, desde una perspectiva puramente estadística, que la creencia individual de éxito docente es insuficiente cuando se la evalúa desde la lógica del sistema. No se trata de culpabilizar a los docentes, sino de evidenciar que el diseño institucional actual, incluso bajo supuestos deliberadamente optimistas, conduce a una acumulación creciente de materias pendientes y a un aumento progresivo de la repitencia.

Es importante aclarar que el modelo utilizado es conservador. Se asumen condiciones que subestiman la gravedad del problema: se ignora el abandono escolar, el cambio de escuela, las diferencias extremas de rendimiento y las correlaciones entre materias. En consecuencia, los resultados obtenidos deben interpretarse como un piso para los sectores más desfavorecidos y como un techo para los más favorecidos. Dicho de otro modo: si aun con estos supuestos optimistas el sistema muestra signos de colapso numérico, la realidad difícilmente será más benigna.

El análisis se centra en el comportamiento promedio de los estudiantes, suponiendo que todos son iguales en términos probabilísticos. Esto no desconoce la diversidad real, pero permite observar qué le sucede a un estudiante promedio cuando atraviesa una estructura de sesenta materias con probabilidades constantes de aprobación. A partir de ese punto de partida, se proyectarán cohortes, se calcularán probabilidades de repitencia y se estimará la acumulación de exámenes pendientes año a año, explicitando en cada paso las fórmulas utilizadas y las razones de su elección.

El documento está organizado en siete capítulos y un apéndice técnico. El Capítulo 1 presenta la aritmética básica de la aprobación individual y la falacia de la composición. El Capítulo 2 introduce el modelo de cadena de Markov para describir la trayectoria de un estudiante a través del stock de materias pendientes. El Capítulo 3 escala el análisis al nivel institucional y calcula el estado estacionario de deuda académica. El Capítulo 4 abandona el supuesto de homogeneidad y construye una simulación basada en agentes con distribución Beta-Binomial, motivación endógena y abandono. El Capítulo 5 presenta los experimentos contrafactuales: reducción de materias, umbral proporcional, continuidad pedagógica y aprendizaje basado en proyectos. El Capítulo 6 analiza el sesgo del superviviente en los años superiores. El Capítulo 7 sintetiza los hallazgos, dialoga con la literatura y responde a las objeciones más probables. El apéndice reúne el código Python completo, las fórmulas y los parámetros del modelo, para que cualquier lector pueda reproducir los resultados.

La comparación con el sistema universitario resulta inevitable. La universidad, en tanto institución no obligatoria, suele tolerar y hasta naturalizar prácticas que funcionan como filtro social: selecciona, jerarquiza y distingue según el rendimiento académico. Ese comportamiento, discutible en sí mismo, resulta funcional a la formación de profesionales altamente especializados. Pero la escuela secundaria argentina se concibe a sí misma de otra manera: como institución obligatoria, niveladora e inclusiva, encargada de dotar a todos los jóvenes de herramientas para la vida y para el mercado laboral. Si la escuela secundaria, en sus prácticas concretas, se comporta como filtro, deja de cumplir su promesa. Y si, aun declarándose niveladora, su diseño estructural genera riesgos elevados de desaprobación y repitencia, entonces existe una contradicción profunda entre el discurso y la lógica numérica que lo sostiene.

Este documento no ofrece soluciones mágicas ni recetas inmediatas. Su objetivo es más modesto y, a la vez, más urgente: poner sobre la mesa las cifras que permitan a docentes y directivos dimensionar el problema, identificar sus puntos críticos y, eventualmente, diseñar intervenciones basadas en evidencia numérica. Porque el primer paso para enfrentar un problema que se mueve en la oscuridad institucional es, precisamente, sacarlo a la luz y medirlo.

Capítulo 1: La aritmética de la aprobación individual

1.1 El punto de partida: ¿qué significa aprobar al 90%?

Cuando un docente afirma que aprobó al 90% de sus estudiantes, suele interpretarlo como un indicador de éxito. En un aula de 30 estudiantes, implica que 27 aprobaron y 3 no. A primera vista, parece un resultado razonable, incluso meritorio. Sin embargo, esta lectura es incompleta porque no considera el efecto acumulativo de esa tasa a lo largo de todas las materias y de todos los años.

La escuela secundaria argentina está organizada en cinco años, con aproximadamente doce materias por año. Un estudiante debe aprobar sesenta asignaturas para egresar. Si cada docente, en promedio, desaprueba al 10% de sus estudiantes, la pregunta relevante no es cuántos estudiantes desaprueba cada docente por separado, sino cuál es la probabilidad de que un estudiante atraviese las sesenta materias sin acumular deudas. Esa pregunta solo puede responderse desde una lógica de probabilidades, no desde la suma de intenciones individuales.

1.2 Supuestos del modelo básico

Para comenzar, se adoptan los siguientes supuestos simplificadores:

  1. Cada año tiene exactamente doce materias.
  2. La probabilidad de aprobar cada materia es constante y se denota con la letra p p .
  3. La probabilidad de desaprobar cada materia es q=1−p q = 1 - p .
  4. Las materias son independientes entre sí: el resultado en una no influye en el resultado en otra.
  5. Todos los estudiantes tienen la misma probabilidad de aprobar; no hay diferencias individuales.
  6. Se repite el año si se acumulan cinco o más materias desaprobadas.

Estos supuestos son deliberadamente optimistas. En la realidad, las materias no son independientes, los estudiantes no son homogéneos y la probabilidad de desaprobar no es constante. Pero precisamente por eso, los resultados de este modelo deben interpretarse como un piso: si aun bajo estas condiciones ideales el sistema muestra riesgos elevados, la realidad será peor.

1.3 La distribución binomial: la herramienta para contar fracasos

Cuando un estudiante cursa doce materias en un año y cada materia tiene una probabilidad q q de ser desaprobada, el número de materias desaprobadas en ese año no es fijo: puede ser cero, una, dos, o más. Para describir cuán probable es cada uno de esos resultados, se utiliza la distribución binomial.

La distribución binomial se aplica cuando se cumplen tres condiciones:

  • Hay un número fijo de intentos (en este caso, doce materias).
  • Cada intento tiene solo dos resultados posibles: aprobar o desaprobar.
  • La probabilidad de desaprobar es la misma en cada intento y los intentos son independientes.

Bajo estas condiciones, la probabilidad de desaprobar exactamente k k materias en un año se calcula con la fórmula:

P(X=k) = ( 12k ) qk (1−q) 12−k P(X = k) = \binom{12}{k} q^k (1-q)^{12-k}

Donde:

  • ( 12k ) \binom{12}{k} es el coeficiente binomial, que cuenta de cuántas maneras se pueden elegir k k materias desaprobadas entre las doce.
  • qk q^k es la probabilidad de desaprobar esas k k materias.
  • (1−q) 12−k (1-q)^{12-k} es la probabilidad de aprobar las restantes.

1.4 Resultados para un año: el primer campanazo

Apliquemos esta fórmula con dos tasas de aprobación habituales en el discurso docente: 95% y 90%.

Caso 1: p=95% p = 95\% ( q=5% q = 5\% )

La probabilidad de que un estudiante termine el año sin ninguna materia desaprobada es:

P(X=0) = 0,9512 ≈ 0,5404 P(X = 0) = 0{,}95^{12} \approx 0{,}5404

Es decir, apenas un 54% de los estudiantes termina el año sin previas. El 46% restante se lleva al menos una materia.

Caso 2: p=90% p = 90\% ( q=10% q = 10\% )

La probabilidad de terminar el año sin previas es:

P(X=0) = 0,9012 ≈ 0,2824 P(X = 0) = 0{,}90^{12} \approx 0{,}2824

Solo un 28% de los estudiantes sale ileso del año. El 72% acumula al menos una materia pendiente.

La tabla siguiente resume la comparación:

Probabilidad de terminar el año sin previas según la tasa de aprobación docente
Tasa de aprobación docente Probabilidad de terminar el año sin previas Probabilidad de llevarse al menos una materia
95%54,0%46,0%
90%28,2%71,8%

Nota metodológica: Es importante precisar que este cálculo —la probabilidad de terminar el año sin ninguna materia desaprobada— no constituye el resultado final del análisis, sino el punto de partida que motiva el desarrollo del modelo completo en los capítulos siguientes. El 28,2% obtenido para una tasa de aprobación del 90% no debe interpretarse como la proporción de estudiantes que egresarán de la escuela secundaria, ni como una predicción de fracaso institucional. Se trata, más bien, de un indicador intermedio que revela la magnitud del desafío: muestra que, incluso bajo un supuesto optimista de aprobación por materia, la mayoría de los estudiantes acumula al menos una deuda a lo largo del año. Pero para saber cuántos de esos estudiantes terminan repitiendo, cuántos abandonan y cuántos egresan en tiempo y forma, es necesario incorporar la dinámica de acumulación de deudas a lo largo de los cinco años, la regla de promoción con umbral de cuatro materias, la efectividad de las mesas de examen, la heterogeneidad entre estudiantes, la motivación y el abandono. Todo eso se desarrolla en los Capítulos 2, 3, 4 y 5, donde el indicador del 28,2% se traduce en tasas concretas de repitencia, abandono y egreso. El lector debe leer este capítulo como la primera pieza de un rompecabezas, no como el diagnóstico completo.

1.5 La falacia de la composición

Los números anteriores revelan un fenómeno que los economistas y filósofos conocen como falacia de la composición: lo que parece verdadero para cada parte no necesariamente es verdadero para el todo. Un docente que aprueba al 90% puede creer honestamente que está haciendo un buen trabajo, porque solo ve a sus tres estudiantes desaprobados en un aula de treinta. Pero cuando doce docentes aplican esa misma lógica simultáneamente, el resultado no es una suma de pequeños fracasos: es una probabilidad abrumadora de que la mayoría de los estudiantes arrastre materias pendientes.

En un aula de treinta estudiantes, con docentes que aprueban al 90%, se espera que solo ocho o nueve estudiantes terminen el año sin ninguna materia previa. Los otros veintiuno o veintidós cargarán con al menos una deuda. Y eso, antes de considerar qué ocurre al año siguiente, cuando esas deudas se acumulen y se sumen a las nuevas.

1.6 Lo que este capítulo muestra

Este primer cálculo es suficiente para cuestionar la idea de que un 90% de aprobación es un éxito pedagógico. No lo es cuando se lo observa desde la perspectiva del estudiante, que debe atravesar doce materias por año. La probabilidad de salir ileso es baja, y la de arrastrar deudas es alta.

El capítulo siguiente abordará la pregunta que naturalmente sigue: si un estudiante arrastra materias pendientes, ¿cuál es la probabilidad de que, en algún momento de su trayectoria, repita el año? Para ello, será necesario incorporar la regla de promoción —hasta cuatro materias desaprobadas— y proyectar la acumulación de deudas a lo largo de los cinco años.

Capítulo 2: El modelo homogéneo — una primera aproximación al riesgo de repitencia

2.1 Del fracaso anual a la repitencia: la noción de stock

En el capítulo anterior vimos que, con una tasa de aprobación del 90% por materia, la probabilidad de terminar el año sin ninguna materia pendiente es baja. Sin embargo, la repitencia no se produce por haberse llevado una materia en algún momento, sino por acumular un número crítico de materias pendientes al mismo tiempo. El sistema permite pasar de año con hasta 4 materias pendientes; si un estudiante tiene 5 o más, repite.

Llamamos stock de materias pendientes a la cantidad de materias que el estudiante adeuda en un momento dado. El stock cambia cada año: se suman las nuevas desaprobaciones y se restan las que se aprueban en las mesas de examen. La regla es simple: si al final del ciclo el stock es 5 o más, el estudiante repite; si es 4 o menos, promociona arrastrando ese stock al año siguiente.

Ejemplo: un estudiante termina primer año con 3 materias pendientes. En las mesas de marzo aprueba 1. Su stock al comenzar segundo año es 2. Durante segundo año desaprueba 2 materias nuevas. Su stock al final del año, antes de mesas, es 4. Si en las mesas no aprueba ninguna, repite; si aprueba al menos 1, promociona con stock 3.

Este mecanismo es el que modelaremos en este capítulo, inicialmente bajo un supuesto simplificador: todos los estudiantes tienen la misma probabilidad de desaprobar cada materia. Llamaremos a esto el modelo homogéneo.

2.2 La cadena de Markov como descripción de la trayectoria

La trayectoria de un estudiante puede describirse mediante una cadena de Markov en tiempo discreto. Una cadena de Markov es un modelo matemático que describe un sistema que evoluciona en pasos (en este caso, años), donde la probabilidad de pasar a un estado futuro depende solo del estado presente, no de la historia previa.

Definimos los estados posibles al inicio de cada año:

  • S0S_0 : el estudiante no tiene materias pendientes.
  • S1S_1 : tiene 1 materia pendiente.
  • S2S_2 : tiene 2 materias pendientes.
  • S3S_3 : tiene 3 materias pendientes.
  • S4S_4 : tiene 4 materias pendientes.
  • RR : repitencia (estado absorbente).

El estado RR es absorbente porque, una vez que el estudiante repite, su trayectoria «normal» de 5 años se interrumpe. En este capítulo, nos interesa calcular la probabilidad de caer en RR al menos una vez durante los 5 años.

2.3 Reglas de transición anual

Cada año, un estudiante que inicia en el estado SdS_d (con dd materias pendientes) experimenta tres etapas:

Etapa 1: Nuevas desaprobaciones.
Durante el año, el estudiante cursa mm materias. En el modelo homogéneo, la probabilidad de desaprobar cada materia es qq , constante para todos los estudiantes y todas las materias. El número de nuevas desaprobaciones XX sigue una distribución binomial:

P(X=x) = ( mx ) qx (1−q) m−x P(X = x) = \binom{m}{x} q^x (1-q)^{m-x}

Etapa 2: Mesas de examen.
Al finalizar el año, el estudiante tiene s=d+X s = d + X materias pendientes (las previas más las nuevas). En las mesas de examen, cada materia pendiente tiene una probabilidad pmesa p_{\text{mesa}} de ser aprobada. En nuestro modelo, asumimos pmesa = 0,25 p_{\text{mesa}} = 0{,}25 (solo se presenta la mitad de los estudiantes y, de ellos, aprueba la mitad). Por lo tanto, el número de materias que permanecen pendientes después de las mesas, YY , sigue una binomial con parámetros ss y qmesa = 1− pmesa = 0,75 q_{\text{mesa}} = 1 - p_{\text{mesa}} = 0{,}75 :

P(Y=y∣s) = ( sy ) (0,75)y (0,25)s−y P(Y = y \mid s) = \binom{s}{y} (0{,}75)^y (0{,}25)^{s-y}

Etapa 3: Regla de repitencia.
Si Y≥5 Y \ge 5 , el estudiante pasa al estado RR (repitencia).

Si Y≤4 Y \le 4 , el estudiante pasa al estado SYS_Y (queda con YY materias pendientes para el próximo año).

2.4 Cálculo de la matriz de transición

Con estas reglas, podemos calcular la probabilidad de transición de cualquier estado SdS_d a cualquier estado SjS_j (con j=0,1,2,3,4 j = 0, 1, 2, 3, 4 ) o a RR . La fórmula general es:

P(Sd→Sj) = ∑ x=0 m ( mx ) qx (1−q) m−x ⋅ ( d+x j ) (0,75)j (0,25)d+x−j P(S_d \to S_j) = \sum_{x=0}^{m} \binom{m}{x} q^x (1-q)^{m-x} \cdot \binom{d+x}{j} (0{,}75)^j (0{,}25)^{d+x-j}

donde el coeficiente binomial ( d+x j ) \binom{d+x}{j} es 0 si d+x<j d+x < j .

Análogamente, la probabilidad de caer en RR es:

P(Sd→R) = ∑ x=0 m ( mx ) qx (1−q) m−x ⋅ ( 1− ∑ j=0 4 ( d+x j ) (0,75)j (0,25)d+x−j ) P(S_d \to R) = \sum_{x=0}^{m} \binom{m}{x} q^x (1-q)^{m-x} \cdot \left( 1 - \sum_{j=0}^{4} \binom{d+x}{j} (0{,}75)^j (0{,}25)^{d+x-j} \right)

Aplicando estas fórmulas con m=12m = 12 , q=0,10q = 0{,}10 y pmesa=0,25p_{\text{mesa}} = 0{,}25 , obtenemos la siguiente matriz de transición (valores redondeados a cuatro decimales):

Matriz de transición del modelo homogéneo
Desde \ Hasta S0S_0 S1S_1 S2S_2 S3S_3 S4S_4 RR
S0S_0 0,39240,38180,17020,04600,00840,0012
S1S_1 0,09810,38970,32890,13920,03660,0075
S2S_2 0,02450,17100,37450,28150,11350,0350
S3S_3 0,00610,06110,22190,35130,23950,1201
S4S_4 0,00150,01990,10130,25420,32330,2997

Observemos que la probabilidad de repitencia crece fuertemente con el stock inicial. Un estudiante que comienza el año con 0 pendientes tiene solo 0,12% de repetir; uno que comienza con 4 pendientes tiene casi 30% de repetir. La deuda acumulada es el principal factor de riesgo.

2.5 Probabilidad de repetir a lo largo de los 5 años

Para calcular la probabilidad de que un estudiante que ingresa a primer año (estado S0S_0 ) repita al menos una vez en los 5 años, debemos iterar la matriz de transición año a año.

Partimos de un vector de distribución inicial: en el año 0, todos los estudiantes están en S0S_0 . Es decir,

v0 = (1,0,0,0,0,0) v_0 = (1, 0, 0, 0, 0, 0)

Después de un año, el nuevo vector es v1=v0⋅M v_1 = v_0 \cdot M , donde MM es la matriz de transición. Después de dos años, v2= v1⋅M= v0⋅M2 v_2 = v_1 \cdot M = v_0 \cdot M^2 , y así sucesivamente. La componente correspondiente a RR en vkv_k nos da la probabilidad acumulada de haber caído en repitencia en algún momento durante los primeros kk años.

Aplicando este procedimiento, obtenemos la siguiente evolución:

Evolución anual del vector de distribución y de la probabilidad acumulada de repitencia
Año S0S_0 S1S_1 S2S_2 S3S_3 S4S_4 RR acumulado
10,39240,38180,17020,04600,00840,0012
20,19590,33070,26720,13740,05030,0185
30,11680,25870,27780,19130,09330,0622
40,07930,20650,26090,21050,11800,1249
50,05920,17060,23780,20970,12640,1963

Al final de los cinco años, la probabilidad de haber repetido al menos una vez es 19,63%.

Este valor es mucho menor que el que habíamos presentado anteriormente (86,9%). La razón es que aquel cálculo estaba basado en una matriz de transición que correspondía a un modelo con heterogeneidad, no al modelo homogéneo que acabamos de describir. El modelo homogéneo subestima la repitencia porque asume que todos los estudiantes tienen la misma probabilidad de desaprobar; en realidad, la variabilidad entre estudiantes hace que el fracaso se concentre en un subgrupo más vulnerable, lo que eleva la repitencia. Abordaremos esa heterogeneidad en el Capítulo 4 mediante simulación computacional.

2.6 Interpretación y limitaciones del modelo homogéneo

El modelo homogéneo es útil como punto de partida: muestra el mecanismo de acumulación de deudas y cómo el riesgo de repitencia crece con el stock. Sin embargo, subestima la realidad. Los datos de escuelas reales muestran tasas de repitencia mucho mayores, y ello se debe, en parte, a que la probabilidad de desaprobar no es uniforme: hay estudiantes con alta probabilidad de fracaso y otros con baja. Esa heterogeneidad produce una mayor varianza en el número de desaprobaciones y, por tanto, una mayor probabilidad de caer en repitencia.

Además, el modelo homogéneo no incorpora el efecto de la motivación, el abandono ni la correlación entre materias. Todos estos factores serán tratados más adelante con un modelo basado en agentes, que es más realista y flexible.

2.7 Síntesis

En este capítulo hemos construido un modelo de cadena de Markov homogéneo para describir la trayectoria de un estudiante a través del stock de materias pendientes. Hemos mostrado que, incluso en este escenario simplificado, la probabilidad de repetir al menos una vez en 5 años es del 19,6%. Si bien este número es menor que el observado en la realidad, confirma que el mecanismo de acumulación de deudas y repitencia es estructural: la deuda genera más deuda, y el riesgo se concentra en quienes arrastran materias.

En el próximo capítulo, abandonaremos el supuesto de homogeneidad y utilizaremos una simulación computacional para capturar la variabilidad entre estudiantes, la motivación y el abandono. Veremos que, al incorporar esos factores, la repitencia y el desgranamiento se acercan a los valores observados en las escuelas reales.

Nota sobre el carácter del «piso conservador». A lo largo del documento se afirma repetidamente que el modelo es conservador, en el sentido de que subestima la gravedad del problema. Esa afirmación es correcta en algunos aspectos, pero no en todos, y conviene precisarla. El modelo subestima la repitencia temprana (predice alrededor del 4% en primer año, mientras que la realidad argentina muestra tasas del 8% al 15%) y subestima el abandono concentrado en los primeros años, porque asume que el fracaso se distribuye de manera más uniforme de lo que ocurre en la realidad. Pero el modelo sobrestima la repitencia acumulada a cinco años, porque al asumir independencia entre materias trata el fracaso como una lotería que tarde o temprano le toca a cualquiera, cuando en la realidad el fracaso se concentra en un subgrupo que abandona tempranamente. Es decir: el modelo es conservador en el corto plazo y optimista en el largo plazo. Los resultados no deben leerse como una predicción exacta, sino como una aproximación estructural que subestima el problema en algunos tramos y lo sobrestima en otros. La conclusión central —que el diseño actual es matemáticamente insostenible— se sostiene bajo cualquiera de las dos lecturas, porque incluso en su versión más optimista el sistema produce desgranamiento masivo.

Capítulo 3: La institución y la acumulación de deuda académica

3.1 De la trayectoria individual a la gestión de cohortes

En el capítulo anterior analizamos la trayectoria de un estudiante individual, modelando su stock de materias pendientes como una cadena de Markov con una barrera absorbente que representa la repitencia. Vimos que, incluso con supuestos optimistas, la probabilidad de repetir al menos una vez a lo largo de la secundaria es alarmantemente alta.

Pero una escuela no es un conjunto de trayectorias aisladas: es un sistema donde las cohortes se superponen, los repitentes se mezclan con los recién llegados y las deudas no resueltas se acumulan de un ciclo al siguiente. En este capítulo cambiaremos la escala de análisis. Ya no seguiremos a un estudiante, sino que observaremos a la institución en su conjunto.

Nos preguntaremos: ¿cómo evoluciona la matrícula por año? ¿Cuántos exámenes de aprobación pendiente se acumulan en la escuela? ¿Qué forma adopta la pirámide educativa y por qué? Y, sobre todo, ¿es sostenible un diseño que genera una deuda académica creciente?

3.2 La pirámide de matrícula como síntoma

Si la escuela secundaria cumpliera su promesa de inclusión y nivelación, la matrícula de cada año debería ser aproximadamente igual a la del año anterior. Si ingresan cien estudiantes a primer año, debería haber cien en segundo, cien en tercero, cien en cuarto y cien egresando al final del ciclo. La pirámide de matrícula tendría forma de columna rectangular.

Sin embargo, la experiencia cotidiana muestra otra cosa. En la mayoría de las escuelas, la cantidad de divisiones de primer y segundo año es mayor que la de tercero, cuarto y quinto. Las aulas de los últimos años son más pequeñas y menos numerosas. La matrícula adopta una forma piramidal: ancha en la base, angosta en la cima.

Esa forma piramidal no es un detalle menor: es la huella visible de un filtro. Cada año, una parte de los estudiantes no promociona y queda rezagada, repitiendo o abandonando. Esos estudiantes no desaparecen, pero ya no avanzan con su cohorte. Se acumulan en los primeros años, engrosando las divisiones inferiores, mientras que los años superiores se vacían.

Nuestro modelo de Markov del capítulo anterior explica por qué ocurre esto. La probabilidad de repetir es alta, y la repitencia actúa como un estado absorbente que interrumpe la trayectoria. Si además consideramos que muchos estudiantes que repiten terminan abandonando, el desgranamiento se acelera.

En las escuelas técnicas, este fenómeno es aún más pronunciado. Suelen tener seis años en lugar de cinco, y con frecuencia más materias por año y mayor carga horaria semanal. Eso significa más filtros, más oportunidades de fracaso y, por lo tanto, una pirámide más empinada.

3.3 Supuestos del modelo de proyección

Para analizar la acumulación de exámenes pendientes a nivel institucional, construiremos un modelo simplificado de flujo de cohortes. Los supuestos son los siguientes:

  1. Cada año ingresan exactamente 100 estudiantes nuevos a primer año.
  2. No hay abandono escolar: todos los estudiantes permanecen en el sistema, ya sea promoviendo o repitiendo. (Más adelante comentaremos el efecto del abandono.)
  3. La probabilidad de desaprobar una materia durante el año es qq y es uniforme para todas las materias y estudiantes.
  4. Cada estudiante cursa mm materias por año. En la secundaria común, m=12m=12 ; en escuelas técnicas, mm puede ser mayor.
  5. Al finalizar cada ciclo, se realizan mesas de examen. Cada materia pendiente tiene una probabilidad pmesap_{\text{mesa}} de ser aprobada. En nuestro modelo conservador, pmesa=0,25p_{\text{mesa}} = 0{,}25 (solo se presenta la mitad de los estudiantes, y de ellos aprueba la mitad). Por lo tanto, la probabilidad de que una materia pendiente permanezca pendiente es qmesa=1−pmesa=0,75q_{\text{mesa}} = 1 - p_{\text{mesa}} = 0{,}75 .
  6. Para simplificar, no distinguimos entre materias pendientes de distintos años; solo contamos el total acumulado.

Estos supuestos son deliberadamente optimistas. En la realidad, la probabilidad de desaprobar no es uniforme, la efectividad de las mesas suele ser menor y el abandono existe. Por lo tanto, los resultados que obtendremos deben interpretarse como un piso: la situación real será peor.

3.4 La recurrencia del stock de pendientes

Llamemos PtP_t al total de exámenes de aprobación pendiente que hay en la escuela al final del año tt , después de las mesas de examen. Queremos encontrar una fórmula que nos permita calcular PtP_t año a año.

Cada año, el proceso es el siguiente:

  1. Se suman los pendientes que venían del año anterior, Pt−1P_{t-1} .
  2. Se generan nuevos pendientes durante el año, que llamaremos NtN_t .
  3. Se realizan las mesas de examen. Cada materia pendiente (antigua o nueva) tiene una probabilidad qmesaq_{\text{mesa}} de permanecer pendiente.

Por lo tanto, el stock al final del año tt es:

Pt = qmesa × ( Pt−1 + Nt ) P_t = q_{\text{mesa}} \times (P_{t-1} + N_t)

Esta es una fórmula recursiva: toma el valor del año anterior, le suma lo nuevo y lo multiplica por la tasa de persistencia. Es la misma lógica que usamos en el modelo de Markov, pero aplicada al stock agregado de toda la escuela.

Ahora necesitamos calcular NtN_t , la cantidad de nuevos exámenes pendientes generados durante el año tt .

Cada estudiante cursa mm materias por año. Si la probabilidad de desaprobar cada materia es qq , el número esperado de materias desaprobadas por estudiante en un año es m×qm \times q . Si hay 100 estudiantes nuevos por cohorte, la primera cohorte genera:

100×m×q 100 \times m \times q

exámenes pendientes en su primer año.

Al año siguiente, hay dos cohortes activas: la que ingresó ese año y la que ingresó el año anterior. Cada una genera la misma cantidad de nuevos pendientes. Por lo tanto, en el año tt (antes de que empiecen a egresar), hay tt cohortes activas, y:

Nt = 100×m×q×t N_t = 100 \times m \times q \times t

Para una secundaria común de cinco años, tt va de 1 a 5. Para una escuela técnica de seis años, tt va de 1 a 6.

3.5 Cálculo año a año para una escuela típica

Apliquemos la recurrencia para una secundaria común, con m=12m=12 , q=0,10q=0,10 , pmesa=0,25p_{\text{mesa}} = 0,25 (por lo tanto qmesa=0,75q_{\text{mesa}} = 0,75 ).

Año 1 (2026):

P0=0 P_0 = 0 N1= 100×12×0,10×1=120 N_1 = 100 \times 12 \times 0,10 \times 1 = 120 P1= 0,75× (0+120) =90 P_1 = 0,75 \times (0 + 120) = 90

Al final del primer año, la escuela tiene 90 materias pendientes.

Año 2 (2027):

N2= 100×12×0,10×2=240 N_2 = 100 \times 12 \times 0,10 \times 2 = 240 P2= 0,75× (90+240) = 0,75×330=247,5 P_2 = 0,75 \times (90 + 240) = 0,75 \times 330 = 247,5

Al final del segundo año, la escuela tiene 247,5 materias pendientes.

Año 3 (2028):

N3= 100×12×0,10×3=360 N_3 = 100 \times 12 \times 0,10 \times 3 = 360 P3= 0,75× (247,5+360) = 0,75×607,5=455,6 P_3 = 0,75 \times (247,5 + 360) = 0,75 \times 607,5 = 455,6

Año 4 (2029):

N4= 100×12×0,10×4=480 N_4 = 100 \times 12 \times 0,10 \times 4 = 480 P4= 0,75× (455,6+480) = 0,75×935,6=701,7 P_4 = 0,75 \times (455,6 + 480) = 0,75 \times 935,6 = 701,7

Año 5 (2030):

N5= 100×12×0,10×5=600 N_5 = 100 \times 12 \times 0,10 \times 5 = 600 P5= 0,75× (701,7+600) = 0,75×1301,7=976,3 P_5 = 0,75 \times (701,7 + 600) = 0,75 \times 1301,7 = 976,3

Al final del quinto año, la escuela tiene 976,3 materias pendientes.

Observemos que el stock crece año a año, a pesar de que las mesas de examen resuelven el 25% de los pendientes. La razón es que cada año se suman más pendientes nuevos de los que se logran resolver. La deuda se acumula como una bola de nieve.

3.6 El régimen permanente: estado estacionario del stock

¿Qué sucede si la escuela sigue funcionando indefinidamente con las mismas reglas? A partir del quinto año, la escuela tiene cinco cohortes activas de manera permanente (en una secundaria común). Eso significa que NtN_t se estabiliza en un valor constante N∗N^* :

N∗ = 100×m×q×5 N^* = 100 \times m \times q \times 5

Para m=12m=12 y q=0,10q=0,10 :

N∗ = 100×12×0,10×5 =600 N^* = 100 \times 12 \times 0,10 \times 5 = 600

Cada año se generan 600 nuevos pendientes. Si las mesas resuelven el 25%, la cantidad de pendientes que permanecen es el 75%. Podemos calcular el stock de equilibrio P∗P^* resolviendo la ecuación:

P∗ = qmesa × (P∗+N∗) P^* = q_{\text{mesa}} \times (P^* + N^*)

Despejando:

P∗ − qmesa⋅P∗ = qmesa⋅N∗ P^* - q_{\text{mesa}} \cdot P^* = q_{\text{mesa}} \cdot N^* P∗ ⋅ (1−qmesa) = qmesa⋅N∗ P^* \cdot (1 - q_{\text{mesa}}) = q_{\text{mesa}} \cdot N^* P∗ = qmesa 1−qmesa ⋅ N∗ P^* = \frac{q_{\text{mesa}}}{1 - q_{\text{mesa}}} \cdot N^*

Con qmesa=0,75q_{\text{mesa}} = 0,75 :

P∗ = 0,750,25 ⋅ N∗ = 3⋅N∗ P^* = \frac{0,75}{0,25} \cdot N^* = 3 \cdot N^*

Sustituyendo N∗=600N^* = 600 :

P∗= 3×600=1800 P^* = 3 \times 600 = 1800

Este es un resultado devastador. Una escuela con cinco cohortes de 100 estudiantes (500 alumnos en total) convivirá permanentemente con 1800 materias pendientes. Eso equivale a un promedio de 3,6 materias pendientes por estudiante, sostenido año tras año.

La deuda no desaparece ni se estabiliza en un nivel manejable: se estabiliza en un nivel absurdamente alto. Es como si un banco tuviera permanentemente una cartera de deudas incobrables que no para de crecer.

3.7 El impacto de la heterogeneidad y las escuelas técnicas

Los cálculos anteriores asumen una probabilidad de desaprobar uniforme del 10%. Pero en la realidad, la desaprobación promedio por materia suele ser mucho mayor. En muchas escuelas, relevamientos internos muestran que la tasa promedio de desaprobación ronda el 30%, con una desviación estándar muy alta. Esto significa que hay materias con desaprobación muy superior a la media y una gran dispersión entre estudiantes.

Si usamos q=0,30q = 0,30 en lugar de q=0,10q = 0,10 , los números se disparan. Recalculemos rápidamente el stock estacionario:

N∗ = 100×12×0,30×5 =1800 N^* = 100 \times 12 \times 0,30 \times 5 = 1800 P∗= 3×1800=5400 P^* = 3 \times 1800 = 5400

Una escuela de 500 estudiantes tendría 5400 materias pendientes permanentes, un promedio de más de diez por estudiante. Es una situación de saturación total.

En las escuelas técnicas, el problema se agrava por dos motivos: el ciclo dura seis años en lugar de cinco, y la cantidad de materias por año suele ser mayor. Si asumimos m=14m=14 y q=0,20q=0,20 (valores conservadores para una técnica), el stock estacionario sería:

N∗ = 100×14×0,20×6 =1680 N^* = 100 \times 14 \times 0,20 \times 6 = 1680 P∗= 3×1680=5040 P^* = 3 \times 1680 = 5040

Además, la heterogeneidad entre materias y estudiantes hace que el stock no se distribuya uniformemente: habrá un grupo de estudiantes con muchas pendientes y otro con pocas. Esa concentración del fracaso agrava el problema, porque los estudiantes con más deudas tienen mayor probabilidad de repetir y abandonar.

3.8 Reducir filtros: el efecto sobre el stock

La propuesta que hemos venido insinuando —reducir la cantidad de materias fragmentadas e integrarlas en áreas— tiene un impacto directo sobre el stock de deuda. Si en lugar de 12 materias por año, un estudiante cursara 6 áreas integradas, la cantidad de filtros se reduciría a la mitad.

Manteniendo la misma probabilidad de desaprobar por área ( q=0,10q=0,10 ) y la misma efectividad de mesas ( pmesa=0,25p_{\text{mesa}}=0,25 ), calculemos el nuevo stock estacionario:

Náreas∗ = 100×6×0,10×5 =300 N^*_{\text{áreas}} = 100 \times 6 \times 0,10 \times 5 = 300 Páreas∗ = 3×300=900 P^*_{\text{áreas}} = 3 \times 300 = 900

El stock permanente de materias pendientes se reduce de 1800 a 900, es decir, a la mitad. Y esto sin bajar la exigencia: solo reorganizando el currículum en bloques más grandes y menos fragmentados.

Si además se mejora la efectividad de las mesas (por ejemplo, con recuperación continua en lugar de exámenes aislados), el stock podría reducirse aún más. Por ejemplo, si pmesap_{\text{mesa}} subiera a 0,50, entonces qmesa=0,50q_{\text{mesa}} = 0,50 , y:

P∗ = 0,500,50 ⋅ N∗ = 1⋅N∗ P^* = \frac{0,50}{0,50} \cdot N^* = 1 \cdot N^*

Con 6 áreas, N∗=300N^*=300 , y P∗=300P^*=300 . Una reducción drástica.

3.9 Síntesis

En este capítulo hemos pasado del análisis individual al institucional. Hemos mostrado que:

  • La acumulación de exámenes pendientes es una consecuencia inevitable del diseño actual.
  • El stock de deuda crece año a año y converge a un régimen permanente insostenible.
  • La pirámide de matrícula es la manifestación visible de ese desgranamiento.
  • Las escuelas técnicas, por su mayor cantidad de años y materias, son especialmente vulnerables.
  • La reducción de filtros (de 12 materias a 6 áreas) disminuye el stock de deuda a la mitad, sin bajar la exigencia.

El problema no es de estudiantes individuales: es de arquitectura. La escuela, tal como está diseñada, genera deuda académica a escala masiva y expulsa a los más vulnerables. En el próximo capítulo, profundizaremos en la heterogeneidad real de estudiantes y materias, y mostraremos cómo esa variabilidad agrava aún más el panorama.

Capítulo 4: De la teoría a la simulación — el modelo basado en agentes

4.1 Objeciones al modelo simplificado

Antes de avanzar, es necesario responder a las objeciones más comunes que pueden plantearse frente a los capítulos anteriores, donde utilizamos modelos analíticos simplificados. Este ejercicio no es un mero formalismo: anticipar las críticas permite fortalecer el modelo y entender sus límites. Cada objeción nos obliga a precisar qué supuestos hemos hecho y por qué, aun así, el análisis es válido.

Objeción 1: «Hay más de una mesa de examen por año.»
Es cierto que en muchas jurisdicciones existen tres instancias: marzo, julio y diciembre. Nuestro modelo asumió una única mesa anual con una efectividad del 25%. Si hubiera tres mesas con la misma efectividad, la probabilidad de que una materia pendiente permanezca después de las tres sería (0,75)3 ≈ 0,42 (0{,}75)^3 \approx 0{,}42 , es decir, la resolución anual subiría al 58%. Pero ese cálculo supone que los estudiantes se presentan en cada mesa con la misma probabilidad y que las mesas son independientes. La experiencia indica que muchos estudiantes no se presentan a la primera mesa, y si fracasan, la desmoralización reduce aún más sus chances futuras. Además, las mesas de diciembre y marzo están muy próximas entre sí. Por lo tanto, el supuesto de una única mesa con 25% de efectividad anual es, en la práctica, una estimación generosa.

Objeción 2: «Las materias no son independientes; si un estudiante va mal en una, es probable que le vaya mal en varias.»
Esta objeción es correcta y muy pertinente. La correlación entre materias significa que el fracaso se concentra en un grupo de estudiantes, mientras que otros aprueban todo. Nuestro modelo binomial asume independencia, lo que dispersa el fracaso de manera más uniforme. Al incorporar heterogeneidad (como haremos en este capítulo), veremos que la concentración del fracaso empeora el panorama: más estudiantes con muchas desaprobaciones y, por lo tanto, más repitencia.

Esta objeción no es meramente teórica. Los cálculos que desarrollaremos en este capítulo la confirman con números concretos. Bajo el supuesto de independencia y homogeneidad (Capítulos 1 a 3), la probabilidad de que un estudiante desapruebe 5 o más materias en un año es de aproximadamente 0,4%. Al incorporar la heterogeneidad entre estudiantes —es decir, al reconocer que la correlación entre sus desempeños concentra el fracaso en un subgrupo vulnerable— esa probabilidad asciende a 7,7%, casi veinte veces mayor. Es decir, la correlación no solo cambia la forma de la distribución: multiplica por veinte la probabilidad de caer en la zona de repitencia. Por lo tanto, nuestro modelo original (que asume independencia) es un piso, no un techo: la realidad, con su carga de correlaciones, es aún más severa de lo que los cálculos del Capítulo 2 sugerían. Este resultado se retomará en el Capítulo 5, donde se muestra que la correlación entre materias refuerza la necesidad de continuidad pedagógica y de agrupamientos que compensen las debilidades de unos tipos de materia con las fortalezas de otros.

Objeción 3: «Los estudiantes no son todos iguales; hay quienes tienen más facilidad y quienes tienen más dificultades.»
Totalmente cierto. La probabilidad de desaprobar varía enormemente entre estudiantes. Un modelo que asume una probabilidad uniforme subestima el riesgo para los más vulnerables y sobrestima la probabilidad de que un estudiante promedio fracase múltiples veces. Incorporaremos esta variabilidad con una distribución de probabilidades individuales.

Objeción 4: «Los estudiantes que acumulan muchas previas abandonan la escuela; no se quedan cargando esa deuda.»
Es cierto que el abandono es una válvula de escape. Sin embargo, el abandono no reduce el problema: lo transforma en exclusión. Si incluyéramos el abandono, el stock de pendientes en la escuela sería menor, pero la pirámide de matrícula se haría aún más empinada, porque los estudiantes desaparecen del sistema. Nuestro modelo, al no incluir abandono, es optimista en términos de retención, pero pesimista en términos de acumulación de deuda. La realidad combina ambos: abandono y deuda.

Objeción 5: «Las materias no tienen todas la misma dificultad; hay materias fáciles y materias difíciles.»
En una escuela real, la desaprobación promedio por materia no es uniforme. Hay materias con tasas de desaprobación muy altas (a menudo Matemática, Física, Química) y otras con tasas bajas (Educación Física, Música). Si incorporamos esta variabilidad, el fracaso se concentra en las materias difíciles, y los estudiantes que las cursan tienen mayor riesgo. Esto agrava el problema. Nuestro modelo, al asumir una tasa uniforme, diluye el riesgo y lo distribuye artificialmente.

Objeción 6: «Repetir el año no es neutro; desmotiva al estudiante y aumenta su probabilidad de volver a fracasar.»
De acuerdo. La repitencia tiene efectos devastadores sobre la autoestima, la motivación y el sentido de pertenencia. Un estudiante que repite tiene altas probabilidades de volver a fracasar o abandonar. Nuestro modelo trata la repitencia como un evento que simplemente interrumpe la trayectoria, sin modificar las probabilidades. Si incluyéramos el daño adicional, la trayectoria de los repetidores sería aún más accidentada, y el desgranamiento mayor.

Todas estas objeciones son válidas, y todas apuntan en la misma dirección: nuestro modelo es un piso. La realidad es peor. Para capturar la complejidad real, necesitamos una herramienta más flexible: una simulación computacional basada en agentes.

4.2 La necesidad de una simulación computacional

Los modelos analíticos presentados en los capítulos anteriores (binomial, cadena de Markov) son útiles para comprender los mecanismos, pero tienen limitaciones serias cuando se incorporan múltiples fuentes de variabilidad y retroalimentación. La repitencia, la motivación, el abandono y la acumulación de deudas interactúan de manera no lineal. Resolver analíticamente esas interacciones es complejo o imposible.

Pensemos en una analogía. Podemos calcular con papel y lápiz la trayectoria de un proyectil si ignoramos la resistencia del aire. Pero si queremos predecir el clima, necesitamos una computadora: hay demasiadas variables que interactúan entre sí. Lo mismo ocurre con el sistema educativo. Los modelos simples son como el cálculo del proyectil: nos dan la idea general. La simulación es como el modelo climático: captura las interacciones entre variables.

La simulación basada en agentes permite representar a cada estudiante como un ente individual con atributos propios (probabilidad de desaprobar, motivación, stock de deudas) y reglas de transición año a año. Así podemos observar las trayectorias de miles de estudiantes y calcular estadísticas agregadas de manera empírica, sin aproximaciones analíticas.

Además, la simulación tiene una ventaja pedagógica: los resultados son directamente verificables y reproducibles mediante código. Cualquiera puede ejecutar el programa y obtener los mismos números.

4.3 Cálculo exacto de la distribución Beta-Binomial

Antes de presentar la simulación, debemos precisar la distribución de la probabilidad individual de desaprobar. Hasta ahora habíamos asumido que todos los estudiantes tenían la misma probabilidad. Ahora reconocemos que esa probabilidad varía.

Imaginemos que la probabilidad de desaprobar de cada estudiante es una característica personal, como la altura o el peso. Algunos estudiantes tienen una probabilidad baja (por ejemplo, 5%), otros una probabilidad alta (por ejemplo, 30%). La mayoría se encuentra en algún punto intermedio.

Para modelar esta variabilidad, usamos una distribución de probabilidad llamada distribución Beta. Esta distribución es ideal porque:

  • Está definida en el intervalo [0,1][0,1] , que es justamente el rango de una probabilidad.
  • Puede adoptar muchas formas: concentrada alrededor de un valor, o dispersa.
  • Es relativamente sencilla de calcular.

La distribución Beta tiene dos parámetros, α\alpha y β\beta , que controlan su forma. La media y la varianza de una Beta se calculan así:

μp = α α+β \mu_p = \frac{\alpha}{\alpha+\beta} σp2 = αβ (α+β)2 (α+β+1) \sigma_p^2 = \frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}

Nosotros elegimos los parámetros para que la media sea μp=0,15\mu_p = 0{,}15 y la desviación estándar sea σp=0,10\sigma_p = 0{,}10 . ¿Por qué estos valores? Porque queremos un escenario moderado: una desaprobación promedio del 15% (no tan alta como el 30% que muestran algunos relevamientos, pero tampoco tan baja como el 5% ideal). La desviación estándar de 10 puntos porcentuales implica que hay una dispersión considerable: muchos estudiantes están por encima o por debajo de la media.

Despejando de las fórmulas, obtenemos:

s= μp(1−μp) σp2 −1 = 0,15×0,850,01 −1 = 12,75−1 = 11,75 s = \frac{\mu_p(1-\mu_p)}{\sigma_p^2} - 1 = \frac{0{,}15 \times 0{,}85}{0{,}01} - 1 = 12{,}75 - 1 = 11{,}75 α= μp⋅s = 0,15×11,75 = 1,7625 \alpha = \mu_p \cdot s = 0{,}15 \times 11{,}75 = 1{,}7625 β= (1−μp) ⋅s = 0,85×11,75 = 9,9875 \beta = (1-\mu_p) \cdot s = 0{,}85 \times 11{,}75 = 9{,}9875

Estos números no tienen una interpretación intuitiva directa, pero son los que producen la media y varianza deseadas. Lo importante es que ahora cada estudiante tendrá su propia probabilidad pip_i , extraída de esta distribución.

Si un estudiante con probabilidad pip_i cursa 12 materias, el número de desaprobaciones XX sigue una distribución Binomial (12,pi) \text{Binomial}(12, p_i) . Como pip_i varía entre estudiantes según la Beta, la distribución incondicional de XX (es decir, si tomamos un estudiante al azar sin conocer su pip_i ) es una Beta-Binomial con parámetros n=12n=12 , α\alpha y β\beta . Su función de masa de probabilidad es:

P(X=k) = ( 12k ) B (k+α,12−k+β) B (α,β) P(X = k) = \binom{12}{k} \frac{\mathrm{B}(k+\alpha,\; 12-k+\beta)}{\mathrm{B}(\alpha,\beta)}

donde B (a,b) \mathrm{B}(a,b) es la función Beta completa, calculable con math.gamma en Python.

Ejecutando el código que se incluye en el apéndice, se obtiene la siguiente tabla exacta:

Distribución Beta-Binomial exacta para n = 12, α = 1,7625, β = 9,9875
kk P(X=k)P(X=k) exacta Porcentaje
00,25814925,81%
10,25974825,97%
20,19724719,72%
30,13018213,02%
40,0775027,75%
50,0420404,20%
60,0207352,07%
70,0092010,92%
80,0036010,36%
90,0012020,12%
100,0003240,03%
110,0000630,01%
120,0000070,00%

Observemos algunos detalles. La probabilidad de no desaprobar ninguna materia ( k=0k=0 ) es 25,81%. La probabilidad de desaprobar exactamente 1 es muy similar: 25,97%. La probabilidad de desaprobar 2 es 19,72%. Si sumamos las tres, vemos que más del 70% de los estudiantes desaprueban 0, 1 o 2 materias. Es decir, la mayoría está en la zona segura.

Pero la cola derecha es preocupante. La probabilidad de desaprobar 5 o más materias (el umbral de repitencia si no hay mesas) es:

P(X≥5) = 1− ( 0,258149+0,259748+0,197247 +0,130182+0,077502 ) ≈0,0772 P(X \ge 5) = 1 - (0{,}258149 + 0{,}259748 + 0{,}197247 + 0{,}130182 + 0{,}077502) \approx 0{,}0772

Es decir, un 7,7% de los estudiantes tendría 5 o más desaprobaciones en su primer año. Esta cifra es mucho más alta que la del modelo homogéneo con q=0,10q=0{,}10 (que daba 0,4%) y muestra el impacto de la heterogeneidad.

¿Por qué tanta diferencia? Porque en el modelo homogéneo, todos los estudiantes tienen la misma probabilidad del 10%. Para desaprobar 5 materias, habría que tener una racha de mala suerte poco probable. En cambio, en el modelo heterogéneo, hay un subgrupo de estudiantes con probabilidad alta (por ejemplo, 25% o 30%), para quienes desaprobar 5 o más materias es bastante probable. Es la heterogeneidad la que engorda la cola derecha.

4.4 La doble exigencia: estudiante aplicado y docente profesional

Hasta aquí hemos modelado la probabilidad de desaprobar como una característica individual del estudiante. Pero en la realidad, la aprobación de una materia depende de dos factores que se combinan: la aplicación del estudiante y la profesionalidad del docente. Ambos son necesarios para que el proceso de enseñanza-aprendizaje culmine en una calificación aprobatoria. Y ambos se distribuyen entre la población de manera aproximadamente normal: hay estudiantes más y menos aplicados, y docentes más y menos profesionales. ¿Qué ocurre cuando se exige que los dos factores sean suficientemente altos al mismo tiempo?

4.4.1 Dos factores, dos reglas de combinación

Supongamos que:

  • La aplicación del estudiante sigue una distribución normal con media μS\mu_S y desviación σS\sigma_S .
  • La profesionalidad del docente sigue una distribución normal con media μD\mu_D y desviación σD\sigma_D .
  • La materia se aprueba si ambos superan un umbral mínimo.

Esta última condición es una regla conjuntiva: se exige que los dos factores sean suficientemente altos a la vez. Simbólicamente, es una regla del tipo «Y». La alternativa es una regla compensatoria: se aprueba si al menos uno de los dos factores es suficientemente alto, lo que equivale a una regla del tipo «O».

La diferencia entre ambas reglas es enorme. Si la probabilidad de que el estudiante sea suficientemente aplicado es pSp_S , y la probabilidad de que el docente sea suficientemente profesional es pDp_D , entonces:

  • Conjunción «Y»: P(aprobar) = pS×pD P(\text{aprobar}) = p_S \times p_D
  • Compensación «O»: P(aprobar) = 1− (1−pS) (1−pD) P(\text{aprobar}) = 1 - (1 - p_S)(1 - p_D)

Apliquemos estas fórmulas con distintos valores:

Comparación entre la regla conjuntiva y la compensatoria según las probabilidades marginales
pSp_S pDp_D Conjunción «Y» Compensación «O» Impuesto
0,500,500,250,750,25
0,310,310,100,520,21
0,160,160,030,290,13
0,100,100,010,190,09
0,310,160,050,420,26
0,160,310,050,420,11

La última columna, que llamamos impuesto de la conjunción, mide cuánto se pierde por exigir ambos factores a la vez: es la diferencia entre pSp_S y pS×pD p_S \times p_D .

4.4.2 Lo que muestra la tabla

El primer resultado es contundente: cuando ambos factores tienen una probabilidad marginal del 50%, la conjunción da 25% y la compensación 75%. Es decir, exigir ambos factores a la vez reduce la aprobación a la tercera parte de lo que daría una regla compensatoria.

El segundo resultado es igualmente importante: el impuesto de la conjunción crece cuando los factores son moderados, no cuando son extremos. Con probabilidades marginales del 50%, el impuesto es de 25 puntos. Con probabilidades del 10%, el impuesto baja a 9 puntos. Esto se debe a que, cuando los factores son moderados, hay muchos casos en los que uno es alto y el otro no: la conjunción descarta esos casos, mientras que la compensación los rescata.

El tercer resultado, quizás el más importante, es el caso asimétrico. Cuando un factor tiene probabilidad 0,31 y el otro 0,16, el impuesto alcanza su máximo: 0,26. Esto significa que el sistema castiga más cuando un factor es el cuello de botella. Si los docentes tienen baja profesionalidad y los estudiantes son moderadamente aplicados, la conjunción es especialmente destructiva, porque el factor débil arrastra al conjunto.

4.4.3 El efecto de la varianza

Hasta aquí trabajamos con probabilidades marginales. Pero en la realidad, las distribuciones tienen varianza. ¿Qué ocurre cuando la varianza cambia?

Si la aplicación del estudiante y la profesionalidad del docente tienen alta varianza, la distribución conjunta tiene colas más pesadas: hay más casos extremos, tanto de éxito como de fracaso. La siguiente tabla ilustra el efecto, con medias iguales al umbral:

Efecto de la varianza sobre la probabilidad de aprobar
σS\sigma_S σD\sigma_D P(aprobar)P(\text{aprobar})
0,50,534,2%
1,01,038,6%
1,51,541,6%
2,02,043,4%
1,00,536,9%
0,51,036,9%

La varianza alta sube la probabilidad de aprobar, pero también polariza: más estudiantes aprueban con todo a favor, y más estudiantes fracasan con todo en contra. Es decir, la varianza alta no es una virtud; es una fuente de desigualdad.

4.4.4 El efecto de la correlación

Los dos factores rara vez son independientes. En el sistema educativo argentino, la correlación entre la aplicación del estudiante y la profesionalidad del docente tiende a ser positiva: los mejores docentes van a las mejores escuelas, donde también están los estudiantes con más apoyo familiar. La siguiente tabla muestra el efecto de la correlación sobre las dos reglas:

Efecto de la correlación entre aplicación y profesionalidad sobre la aprobación
ρ\rho Conjunción «Y» Compensación «O»
−0,500,040,58
−0,200,070,55
0,000,090,52
+0,300,130,48
+0,500,160,45
+0,700,200,42

Cuando la correlación es positiva, la conjunción sube (de 0,09 a 0,20) y la compensación baja (de 0,52 a 0,42). Es decir: la correlación positiva beneficia a los que ya están arriba, y castiga a los que están abajo. Si los estudiantes con más apoyo familiar también tienen los mejores docentes, el sistema funciona bien para ellos y muy mal para los demás. La desigualdad se reproduce.

4.4.5 Lectura pedagógica

Esta subsección aporta cinco conclusiones que se conectan directamente con la tesis del documento.

Primero: la exigencia conjuntiva castiga a los estudiantes promedio. Con factores moderados (50% cada uno), la conjunción da 25% y la compensación 75%. El sistema actual exige la conjunción.

Segundo: el factor débil arrastra al conjunto. Cuando un factor es el cuello de botella —por ejemplo, docentes con baja profesionalidad, o estudiantes con bajo apoyo— el impuesto de la conjunción alcanza su máximo. Mejorar solo el otro factor no resuelve nada.

Tercero: la varianza alta polariza. No basta con mejorar las medias; hay que reducir la dispersión. Un sistema con alta varianza produce más extremos, no más aprobaciones justas.

Cuarto: la correlación positiva beneficia a los que ya están arriba. En un sistema donde los mejores docentes van a las mejores escuelas, la desigualdad se reproduce automáticamente.

Quinto: la solución no es mejorar un solo factor, sino cambiar la lógica de la combinación. En lugar de exigir la conjunción («Y»), permitir la compensación («O»). Eso es lo que hacen el aprendizaje basado en proyectos (compensación intra-área), la continuidad pedagógica (el docente del año siguiente trabaja las deudas) y la evaluación formativa (el proceso acompaña al resultado). Todos transforman la regla «Y» en una regla «O».

Este resultado anticipa el argumento del Capítulo 5: la solución al problema de la repitencia no es mejorar la formación docente ni la aplicación estudiantil por separado, sino cambiar la arquitectura que combina ambos factores. La continuidad pedagógica, al eliminar el umbral de repitencia, transforma la regla conjuntiva del sistema actual en una regla más cercana a la compensación. El aprendizaje basado en proyectos, al permitir que las fortalezas en un área compensen las debilidades en otra, hace lo propio dentro de cada proyecto. La combinación de ambas medidas es la que maximiza el egreso sin sacrificar la exigencia.

Este análisis teórico se integra computacionalmente al modelo basado en agentes en la sección A.19 del Apéndice. Allí se incorpora un parámetro rule_mix que interpola entre la regla conjuntiva (rule_mix = 1) y la compensatoria (rule_mix = 0), y se ejecuta el ABM completo con heterogeneidad de estudiante y de docente. Los resultados confirman la conclusión teórica: con idénticos parámetros de estudiante y docente, el egreso sin repetir varía entre 11,4% (regla conjuntiva) y 95,7% (regla compensatoria) en el régimen tradicional. El análisis de sensibilidad de la sección A.19.3 muestra que el ordenamiento se mantiene en las 12 configuraciones de parámetros probadas, incluyendo variaciones de ±33% en las probabilidades base y de ±50% en las dispersiones. La dirección del efecto no depende de los valores específicos: depende de la lógica estructural de la regla de combinación.

Es importante precisar el estatus epistémico de este resultado. El parámetro rule_mix es una construcción analítica, no una medición empírica. Representa la lógica de combinación entre dos fuentes de falla (la del estudiante y la del docente), pero no es directamente observable. Los resultados deben interpretarse como un experimento computacional condicional: bajo el supuesto de que el sistema actual opera con una regla conjuntiva y la propuesta con una regla compensatoria, la diferencia de egreso es de 84 puntos porcentuales. La validez del resultado depende de la validez del supuesto, no de la simulación en sí. Esa validez se argumenta en las secciones 4.4.1 a 4.4.4 y se somete a verificación de robustez en la sección A.19.3.

4.5 El modelo basado en agentes

La distribución Beta-Binomial anterior describe solo el primer año de un estudiante promedio. No captura la dinámica de motivación, repitencia y abandono a lo largo de los años. Para ello, construimos un modelo computacional donde cada estudiante es un agente autónomo.

¿Qué es un agente? En este contexto, un agente es una representación computacional de un estudiante. Tiene atributos propios (probabilidad de desaprobar, motivación, stock de deudas, curso actual) y reglas que determinan cómo evoluciona año a año. La simulación crea miles de agentes, los hace interactuar con las reglas del sistema educativo, y registra sus trayectorias.

4.5.1 Atributos de cada agente

Cada agente (estudiante) tiene los siguientes atributos:

  • id: identificador único. Sirve para rastrear al estudiante a lo largo de los años.
  • anio_ingreso: año en que ingresó a primer año. Permite agrupar por cohortes.
  • p_base: probabilidad individual de desaprobar, extraída de una Beta( α,β\alpha, \beta ). Es la característica que distingue a un estudiante de otro. Un estudiante con p_base = 0,05 casi nunca desaprueba; uno con p_base = 0,30 desaprueba seguido.
  • curso: año que está cursando (1 a 5). Al inicio, todos están en 1.
  • stock: cantidad de materias pendientes acumuladas. Al inicio, es 0.
  • motivacion: valor entre 0 y 1, inicialmente 1. Representa el estado anímico del estudiante. Con motivación 1, el estudiante rinde al máximo; con motivación baja, su probabilidad de desaprobar aumenta.
  • activo: indica si sigue en el sistema. Si abandona o egresa, deja de ser activo.
  • num_repeticiones: contador de repeticiones. Permite analizar cuántas veces repitió cada estudiante.

Estos atributos son la «memoria» del agente. Año a año, se actualizan según las reglas que describimos a continuación.

4.5.2 Reglas de transición anual

Cada año, para cada estudiante activo, se aplican las siguientes reglas en orden:

1. Probabilidad efectiva
La motivación afecta la probabilidad de desaprobar. Si el estudiante está motivado (motivación = 1), su probabilidad es la base (p_base). Si está desmotivado, la probabilidad aumenta. La fórmula es:

peff = pbase × ( 1+ (1−motivación) ×0,5 ) p_{\text{eff}} = p_{\text{base}} \times \left(1 + (1 - \text{motivación}) \times 0{,}5\right)

Ejemplo: si p_base = 0,15 y motivación = 1, entonces peff=0,15p_{\text{eff}} = 0,15 . Si motivación = 0,5, entonces peff= 0,15× (1+0,5×0,5) =0,15×1,25=0,1875 p_{\text{eff}} = 0,15 \times (1 + 0,5 \times 0,5) = 0,15 \times 1,25 = 0,1875 . Si motivación = 0, peff= 0,15×1,5=0,225 p_{\text{eff}} = 0,15 \times 1,5 = 0,225 . Es decir, un estudiante completamente desmotivado tiene una probabilidad de desaprobar un 50% mayor que uno motivado.

2. Nuevas desaprobaciones
Se muestrea X∼ Binomial (12,peff) X \sim \text{Binomial}(12, p_{\text{eff}}) . Es decir, se simula cuántas materias desaprueba este año.

3. Stock antes de mesas
El stock preliminar es la suma del stock previo más las nuevas desaprobaciones:

s=stock+X s = \text{stock} + X

4. Mesas de examen
Cada materia pendiente tiene una probabilidad pmesa=0,25p_{\text{mesa}} = 0,25 de ser aprobada en la mesa. Se simula el número de aprobadas con Binomial (s,0,25) \text{Binomial}(s, 0{,}25) . El stock final es:

stock_final=s−aprobadas \text{stock\_final} = s - \text{aprobadas}

5. Promoción o repitencia
Si stock_final≥5\text{stock\_final} \ge 5 , el estudiante repite: mantiene el stock y no cambia de curso. Si stock_final≤4\text{stock\_final} \le 4 , promociona: pasa al curso siguiente con ese stock.

6. Motivación
La motivación se actualiza según el resultado:

  • Si repite: motivación baja 0,20 (golpe fuerte).
  • Si promociona con stock ≥4\ge 4 : motivación baja 0,05 (golpe leve).
  • Si promociona con stock <4< 4 : motivación sube 0,02 (refuerzo pequeño).

La motivación se limita al rango [0,1][0,1] .

7. Abandono
Si la motivación cae por debajo de 0,10, el estudiante abandona automáticamente. En caso contrario, la probabilidad de abandono depende del estado:

  • Repitencia: 0,15.
  • Promoción con stock ≥4\ge 4 : 0,05.
  • Promoción con stock <4< 4 : 0,01.

Si la motivación es <0,5< 0,5 , se agrega 0,10 a la probabilidad.

8. Egreso
Si el estudiante promociona desde 5º año, egresa y sale del sistema.

4.5.3 Parámetros del escenario base

Parámetros del modelo basado en agentes en el escenario base
Parámetro Valor Explicación
Ingresantes por año1000Tamaño de cada cohorte
Años simulados20 (2026-2045)Período total
Materias por año12Cantidad de filtros anuales
Media de pip_i (μp\mu_p) 0,15 Probabilidad promedio de desaprobar
Desviación de pip_i (σp\sigma_p) 0,10 Dispersión entre estudiantes
Efectividad de mesas (pmesap_{\text{mesa}}) 0,25 Prob. de aprobar cada pendiente en mesa
Umbral de repitencia5Stock máximo para promocionar
Motivación inicial1,0Todos comienzan motivados
Reducción por repitencia0,20Golpe a la motivación al repetir
Reducción por stock alto0,05Golpe leve por promocionar con 4 previas
Mejora por promoción limpia0,02Refuerzo por promocionar con <4 previas
Influencia de motivación en peffp_{\text{eff}} 0,5 Cuánto afecta la desmotivación
Abandono base por repitencia0,15Prob. de abandonar si repite
Abandono base stock alto0,05Prob. de abandonar si promueve con ≥4
Abandono base stock bajo0,01Prob. de abandonar si promueve limpio
Incremento por baja motivación0,10Suma si motivación < 0,5
Motivación mínima (abandono forzoso)0,10Umbral de abandono automático

Todos estos parámetros son explícitos y modificables. En los capítulos siguientes exploraremos escenarios alternativos cambiando algunos de ellos.

4.6 Código Python

El código completo de la simulación está en el Apéndice. Aquí mostramos solo la parte central para ilustrar la lógica:

class Estudiante:
    def __init__(self, id_estudiante, anio_ingreso, p_base, params):
        self.id = id_estudiante
        self.anio_ingreso = anio_ingreso
        self.p_base = p_base
        self.curso = 1
        self.stock = 0
        self.motivacion = params["motivacion_inicial"]
        self.activo = True
        self.num_repeticiones = 0

    def cursar_anio(self, params, anio_actual):
        # ... (lógica descrita arriba)

El código completo fue ejecutado en Python. Los resultados se presentan a continuación.

4.7 Resultados de la simulación base (12 materias)

Con 1000 estudiantes por cohorte y 20 años de simulación, se obtuvieron los siguientes resultados para las cohortes que tuvieron tiempo de completar el ciclo (2026-2035):

4.7.1 Distribución de materias desaprobadas por año (todos los registros)

Distribución de materias desaprobadas por año en la simulación base
Desaprobadas Porcentaje
025,39%
124,90%
218,43%
311,91%
47,48%
54,62%
62,99%
71,85%
80,99%
90,59%
100,45%
110,15%
120,25%

Esta distribución se asemeja a la Beta-Binomial exacta, pero con mayor proporción en la cola derecha, porque incluye estudiantes con motivación baja y repitentes, que tienen mayor peffp_{\text{eff}} .

4.7.2 Matrícula inicial por año

En 2040, la matrícula inicial por curso fue:

Matrícula inicial por curso en 2040 (escenario base)
Curso Matrícula
1º1137
2º1257
3º1066
4º866
5º771

La pirámide es evidente: 5º tiene solo el 68% de la matrícula de 1º.

4.7.3 Análisis de egreso por cohorte

Egreso, abandono y repetición por cohorte en la simulación base
Cohorte Egresados sin repetir Egresados totales Abandonos
202651,9%56,2%43,8%
202755,6%58,7%41,3%
202853,4%57,0%43,0%
202954,2%58,2%41,8%
203054,7%60,2%39,8%
203150,8%55,3%44,7%
203252,2%57,7%42,3%
203351,7%55,6%44,4%
203450,4%56,0%44,0%
203552,1%56,6%43,4%
Promedio53,27%57,69%43,34%

Nota: los valores por cohorte corresponden a una única corrida de la simulación con semilla fija. El promedio con 30 semillas, reportado en el Capítulo 5, es de 53,27% para el egreso sin repetir y 43,34% para el abandono. La diferencia es de 0,57 puntos porcentuales y se debe al ruido estocástico entre corridas.

4.8 Interpretación y conclusiones parciales

La simulación reproduce la magnitud del desgranamiento observado en la realidad. Con parámetros moderados (15% de desaprobación media, mesas al 25%, umbral 5), la tasa de egreso sin repetir es del 53,27%, cercana al 46% reportado oficialmente para algunas provincias argentinas. La diferencia es esperable porque nuestro modelo es optimista: no incluye correlación entre materias, abandono por causas socioeconómicas ni efectos de pares.

La ventaja de la simulación es que permite descomponer los mecanismos. Vemos que la repitencia es el principal factor de exclusión: la probabilidad de egresar cae drásticamente con cada repetición. También vemos que el abandono está fuertemente ligado a la motivación, que a su vez depende de la acumulación de deudas.

En el próximo capítulo exploraremos un escenario contrafactual: reducir la cantidad de materias de 12 a 6, manteniendo todos los demás parámetros constantes. Esto nos permitirá aislar el efecto de la cantidad de filtros sobre las trayectorias.

Capítulo 5: El experimento contrafactual — reducir filtros y transformar la deuda

5.1 La hipótesis arquitectónica: dos filtros simultáneos

En los capítulos anteriores mostramos que la repitencia y el abandono no son consecuencia de la mala voluntad de docentes o estudiantes, sino de la arquitectura del sistema. Esa arquitectura combina dos filtros que operan simultáneamente:

  • Filtro horizontal: la cantidad de materias por año. En la secundaria común argentina, doce materias por año, sesenta en total.
  • Filtro vertical: el umbral de repitencia. Se permite promocionar con hasta cuatro materias pendientes; con cinco o más, se repite.

Ambos filtros son estrictos. El estudiante no solo debe aprobar muchas materias, sino que debe mantener un stock de deudas simultáneas por debajo de un límite. La combinación de ambos es lo que produce el desgranamiento.

En este capítulo nos preguntamos: ¿qué ocurre si reducimos el filtro horizontal, es decir, si pasamos de doce materias por año a seis áreas integradas? ¿Y qué ocurre si transformamos el filtro vertical, reemplazando la repitencia global y la mesa de examen aislada por un sistema de continuidad pedagógica?

A lo largo del capítulo, evaluaremos una variante adicional: el aprendizaje basado en proyectos (ABP), que no se limita a agrupar materias afines, sino que mezcla disciplinas de distinto tipo (por ejemplo, Matemática con Lengua, o Historia con Inglés). Esta mezcla busca activar mecanismos de compensación: un estudiante con dificultades en un área puede apoyarse en sus fortalezas en otra para aprobar el proyecto. Como veremos, este diseño mejora los resultados en todos los regímenes, aunque su impacto es mayor cuando se combina con la eliminación de la repitencia.

Un tercer elemento, que se desarrolla en la sección 4.4 y se integra computacionalmente en la sección A.19 del Apéndice, es la lógica de la combinación entre estudiante y docente. El sistema actual opera con una regla conjuntiva: para aprobar una materia, tanto el estudiante como el docente deben funcionar. Con probabilidades de falla del 15% en cada lado, esa regla produce un 27,75% de falla por materia, y un egreso sin repetir del 11,4%. La propuesta de continuidad pedagógica y ABP transforma esa regla en una más cercana a la compensación, elevando el egreso al 95,7% con los mismos parámetros de estudiante y docente.

Este resultado, verificado en la sección A.19 y robusto a variaciones de ±33% en las probabilidades base y de ±50% en las dispersiones, refuerza la tesis del capítulo: el problema no está en las personas, sino en la arquitectura que combina sus contribuciones. La continuidad pedagógica, al eliminar el umbral de repitencia, amortigua el efecto de la regla, pero no lo elimina: la diferencia entre reglas se mantiene, aunque más pequeña, en el régimen de continuidad (93,3% vs. 96,3%). Esto sugiere que la eliminación de la repitencia es la palanca principal, y que la transformación de la regla de combinación es un complemento que mejora la calidad del egreso.

El análisis de la sección A.19 añade una dimensión que los capítulos anteriores no capturaban: la interacción entre las condiciones del estudiante y las condiciones del docente. En los capítulos previos, la probabilidad de desaprobar era un atributo exclusivo del estudiante. Ahora reconocemos que la aprobación es el resultado de una combinación de factores, y que la lógica de esa combinación es, por sí misma, una variable de diseño. Cambiar la regla de combinación es tan importante como cambiar la cantidad de filtros o el umbral de repitencia.

5.2 La evidencia analítica: distribución Beta-Binomial para 6 materias

Antes de presentar los resultados de la simulación, calculemos exactamente cuál es la probabilidad de desaprobar kk materias en un año cuando se cursan 6 materias, bajo los mismos supuestos de heterogeneidad que usamos en el capítulo anterior.

Recordemos que la probabilidad individual de desaprobar pip_i sigue una distribución Beta con parámetros α=1,7625\alpha = 1{,}7625 y β=9,9875\beta = 9{,}9875 (media 0,15, desviación estándar 0,10). Para un estudiante con probabilidad pip_i , el número de desaprobaciones en 6 materias sigue una Binomial (6,pi) \text{Binomial}(6, p_i) . Al promediar sobre la distribución de pip_i , obtenemos la Beta-Binomial con n=6n=6 .

La función de masa de probabilidad es:

P(X=k) = ( 6k ) B (k+α,6−k+β) B (α,β) P(X = k) = \binom{6}{k} \frac{\mathrm{B}(k+\alpha,\; 6-k+\beta)}{\mathrm{B}(\alpha,\beta)}

donde B (a,b) \mathrm{B}(a,b) es la función Beta completa. Usando el código Python con la función gamma de la librería estándar, se obtiene la siguiente tabla exacta:

Distribución Beta-Binomial exacta para n = 6, α = 1,7625, β = 9,9875
kk P(X=k)P(X=k) exacta Porcentaje
00,44737644,74%
10,31516331,52%
20,15544115,54%
30,0599916,00%
40,0178621,79%
50,0037450,37%
60,0004220,04%

La probabilidad de desaprobar 5 o más materias (el umbral de repitencia si se mantiene fijo en 5) es:

P(X≥5) = P(X=5) + P(X=6) = 0,003745+0,000422 ≈ 0,00417 P(X \ge 5) = P(X=5) + P(X=6) = 0{,}003745 + 0{,}000422 \approx 0{,}00417

Es decir, 0,42%.

Comparemos con el escenario de 12 materias, donde la probabilidad de desaprobar 5 o más era aproximadamente 7,72% (según la tabla del capítulo anterior). La reducción es drástica: la probabilidad de caer en repitencia en un año se divide por más de 18.

Este cálculo ya anticipa que, si el umbral se mantiene fijo en 5, la repitencia será mucho menos frecuente con 6 materias. Pero como veremos, ese no es el final del análisis.

5.3 Diseño del experimento computacional

Partimos del mismo programa de simulación basada en agentes presentado en el capítulo anterior. El experimento consiste en modificar parámetros estructurales de manera controlada:

  • Escenario A (base): 12 materias, umbral 5, mesas al 25%.
  • Escenario B (solo áreas): 6 materias, umbral 3 (proporcional), mesas al 25%.
  • Escenario C (integral): 6 materias, continuidad pedagógica (sin repitencia, sin mesas; las deudas se saldan en proceso con probabilidad 0,55).

Todos los demás parámetros permanecen idénticos: ingresantes por año 1000, años simulados 20, media de probabilidad de desaprobar 15%, desviación 10%, motivación, abandono, etc. La lógica es aislar el efecto de cada cambio estructural.

Para asegurar la robustez de los resultados, cada escenario se ejecutó 30 veces con semillas diferentes (1 a 30). Se reportan la media y la desviación estándar de cada indicador.

5.4 Resultados del escenario B (6 materias, umbral 3)

Ejecutamos la simulación para el escenario B, con 6 materias y umbral proporcional 3 (tolerancia de 2 materias pendientes). Los resultados, comparados con el escenario base, son:

Comparación entre el escenario base y el escenario de 6 materias con umbral 3
Indicador Base (12 mat, umb 5) 6 materias, umb 3 Diferencia
Egreso sin repetir53,27% ± 0,4355,23% ± 0,46+1,96 pp
Egreso total57,69% ± 0,4262,04% ± 0,39+4,35 pp
Abandono43,34% ± 0,4238,70% ± 0,40−4,64 pp
Stock medio al egreso1,88 ± 0,020,88 ± 0,01−1,00
% Egresados con >5 previas0,00% ± 0,000,00% ± 0,000,00 pp

A diferencia de lo que sugería el modelo homogéneo de Markov (donde 6 materias con umbral 3 daba una repitencia acumulada levemente mayor), la simulación con heterogeneidad y motivación muestra una mejora modesta pero real: el egreso sin repetir sube 1,96 puntos y el abandono baja 4,64 puntos. La diferencia se debe a que el modelo ABM incorpora la motivación y el abandono, que interactúan de manera no lineal: con menos materias, los estudiantes acumulan menos deudas, su motivación se mantiene más alta y abandonan menos.

Sin embargo, la mejora es pequeña comparada con los resultados que obtendremos después. La reducción de filtros por sí sola, incluso con umbral proporcional, no transforma el sistema: el egreso sin repetir apenas supera el 55% y el abandono sigue rondando el 39%.

5.5 La objeción del umbral asimétrico

Un crítico atento podría objetar que la comparación anterior no es justa si se mantiene el umbral fijo en 5 al pasar de 12 a 6 materias. Con 12 materias, repetir con 5 implica desaprobar el 41,7% del año; con 6 materias, repetir con 5 implica desaprobar el 83,3%. Por eso, en el escenario B usamos umbral 3, que equivale a tolerar 2 de 6 (33,3%), proporción similar a 4 de 12 (33,3%).

Los resultados de la simulación con umbral proporcional muestran que la mejora es real pero modesta. Esto confirma que reducir la cantidad de materias sin cambiar la lógica de la deuda no alcanza.

5.6 El escenario C: continuidad pedagógica sin repitencia ni mesas

Ahora implementamos la propuesta de continuidad pedagógica. En este escenario:

  • Se elimina la repitencia global: todos los estudiantes promocionan de año, sin importar cuántas materias deban.
  • Se eliminan las mesas de examen aisladas.
  • Las materias desaprobadas se trabajan en proceso durante el año siguiente, con una probabilidad de saldarse de 0,55 (en lugar de 0,25 de las mesas tradicionales).
  • El estudiante que pasa a segundo año debiendo matemática de primer año, la recupera cursando matemática de segundo año con el docente correspondiente, quien evalúa en proceso los contenidos pendientes.

Los resultados son contundentes:

Comparación de los escenarios base, solo áreas y continuidad pedagógica
Indicador Base 6 materias, umb 3 Continuidad
Egreso sin repetir53,27% ± 0,4355,23% ± 0,4695,80% ± 0,19
Egreso total57,69% ± 0,4262,04% ± 0,3995,80% ± 0,19
Abandono43,34% ± 0,4238,70% ± 0,405,24% ± 0,22
Stock medio al egreso1,88 ± 0,020,88 ± 0,010,79 ± 0,01
% Egresados con >5 previas0,00% ± 0,000,00% ± 0,000,35% ± 0,06

La continuidad pedagógica produce una mejora dramática:

  • El egreso sin repetir se dispara del 53,27% al 95,80%.
  • El abandono se desploma del 43,34% al 5,24%.
  • El stock medio al egreso se reduce a 0,79 materias, mucho menor que en el escenario base (1,88).
  • Solo el 0,35% de los egresados arrastra más de 5 materias pendientes.

Las desviaciones estándar son pequeñas, lo que indica que los resultados son robustos y no dependen de una semilla particular.

5.7 La restricción de egreso sin deuda

Una crítica metodológica importante es que el modelo original permitía egresar con deudas, lo cual no es realista: en el sistema argentino, el título se otorga solo si no hay materias pendientes. Para responder a esta objeción, ejecutamos una variante del escenario C en la que el estudiante solo egresa si su stock final es cero. Si tiene deudas al llegar a 5° año, permanece en 5° intentando saldarlas mediante continuidad pedagógica.

Los resultados son:

Comparación entre continuidad estándar y continuidad con egreso sin deuda
Indicador Continuidad original Continuidad con egreso sin deuda
Egreso total95,8%86,7%
Abandono5,3%8,1%
Activos al final0,0%5,9%
Stock medio al egreso0,800,00
% Egresados con >5 previas0,4%0,0%
Tiempo medio hasta egreso (años)5,006,36

Nota sobre el horizonte temporal. El resultado del 86,7% de egreso con stock cero debe interpretarse a la luz del horizonte de simulación. El 5,9% de estudiantes que permanece activo al final de la simulación son aquellos que tardarían más de seis años en titularse. Si se extendiera el horizonte de simulación, ese porcentaje se repartiría entre egresados tardíos y abandonos, y el egreso total real (a horizonte infinito) sería superior al 86,7% reportado. En otras palabras: el modelo subestima ligeramente el egreso final porque trunca la simulación a los veinte años. El valor de 86,7% debe leerse como una cota inferior, no como una predicción exacta.

La restricción de egreso sin deuda reduce el egreso total al 86,7% y aumenta levemente el abandono (8,1%) y los estudiantes que permanecen activos al final de la simulación (5,9%). El stock medio al egreso es, por definición, 0. El tiempo medio hasta egresar se prolonga de 5 a 6,36 años.

Este resultado es importante: aun con la restricción más estricta, la continuidad pedagógica logra un egreso del 86,7%, muy superior al 53,27% del escenario base. La diferencia es que ahora todos los egresados lo hacen sin deuda, lo que despeja la crítica de «título vacío».

5.8 Sensibilidad al parámetro de abandono

Una crítica adicional es que los resultados del escenario C podrían depender críticamente de la baja probabilidad de abandono base cuando el estudiante promociona con stock bajo (parámetro p_abandono_base_promocion_stock_bajo = 0,01). Para evaluar esta posibilidad, variamos dicho parámetro desde 0,005 hasta 0,05.

Los resultados son:

Sensibilidad del escenario de continuidad al parámetro de abandono base
p_ab Egreso total Abandono Stock medio % con >5 previas
0,00597,6%3,0%0,810,4%
0,01095,8%5,3%0,800,4%
0,02091,9%10,2%0,800,5%
0,03088,6%14,1%0,790,5%
0,05081,6%22,5%0,790,4%

El egreso total disminuye a medida que aumenta la probabilidad de abandono, como es esperable. Sin embargo, incluso con una probabilidad de abandono cinco veces mayor que la del escenario base (0,05 en lugar de 0,01), el egreso total se mantiene en 81,6%, muy por encima del 53,27% del escenario base. El stock medio al egreso permanece estable en torno a 0,80, y el porcentaje de egresados con más de 5 previas no supera el 0,5%.

Esto demuestra que la continuidad pedagógica es robusta frente a variaciones razonables en el parámetro de abandono. No es un artificio de un parámetro particular.

5.9 Motivación dependiente de pcontinuap_{\text{continua}}

Otra crítica importante es que la motivación en el escenario C subía mecánicamente porque nunca se activaba la rama de repitencia, y el estudiante recibía un refuerzo positivo constante. Para corregir esta circularidad, modificamos la regla de motivación: en el escenario de continuidad, la motivación solo sube si pcontinua≥0,45p_{\text{continua}} \ge 0{,}45 ; si es menor, se estanca o disminuye levemente.

Los resultados son:

Efecto de la probabilidad de recuperación en proceso sobre los indicadores de egreso
pcontinuap_{\text{continua}} Egreso total Abandono Stock medio Motiv. media egreso % >5 previas
0,2594,7%7,0%2,250,9249,2%
0,3595,2%6,5%1,630,9344,4%
0,4595,4%5,7%1,150,9911,5%
0,5595,8%5,3%0,800,9960,4%
0,6595,6%5,4%0,530,9990,1%

La motivación media al egreso ya no es siempre 1,0: con pcontinua=0,25p_{\text{continua}} = 0{,}25 cae a 0,924. El stock medio al egreso crece a 2,25 y el porcentaje de egresados con más de 5 previas sube al 9,2%. Sin embargo, el egreso total se mantiene por encima del 94% en todos los casos.

Este análisis muestra que la motivación no es artificialmente alta, y que la continuidad pedagógica sigue siendo efectiva incluso con probabilidades de recuperación bajas. La calidad del egreso, medida por el stock de deuda, sí depende de pcontinuap_{\text{continua}} : para que la deuda remanente sea baja, se necesita una probabilidad de al menos 0,45.

5.10 La trampa del título vacío: el experimento del umbral 10

Para completar el panorama, realizamos un experimento adicional: subir el umbral de repitencia de 5 a 10 manteniendo las 12 materias y las mesas al 25%. Los resultados, comparados con el escenario base, son:

Comparación entre umbral 5 y umbral 10 en el régimen de 12 materias
Indicador Base (umbral 5) Umbral 10
Egreso sin repetir52,7%80,7%
Egreso total57,1%81,9%
Abandono43,8%20,3%
Stock medio al egreso1,873,27
% Egresados con más de 5 previas0,0%20,6%

Subir el umbral produce una mejora notable en egreso y abandono, pero a un costo oculto: el 20,6% de los egresados termina con más de 5 materias pendientes, y el stock medio sube a 3,27 materias. En el escenario base, ningún egresado tenía más de 5 previas, porque el sistema lo impedía.

Este es el riesgo de flexibilizar el umbral sin mejorar la recuperación: se obtienen títulos con deuda impaga. No es inclusión real; es una simulación de éxito. La continuidad pedagógica, en cambio, reduce el stock al egreso a menos de 1 materia, incluso sin la restricción de egreso sin deuda.

5.11 Comparación final de los escenarios

Comparación de todos los escenarios simulados en el Capítulo 5
Escenario Egreso sin repetir Abandono Stock medio al egreso % con >5 previas
Base: 12 materias, umbral 5, mesas 25%53,27% ± 0,4343,34% ± 0,421,88 ± 0,020,00%
Solo áreas: 6 materias, umbral 3, mesas 25%55,23% ± 0,4638,70% ± 0,400,88 ± 0,010,00%
Umbral laxo: 12 materias, umbral 10, mesas 25%80,70%20,30%3,2720,60%
Continuidad pedagógica: 6 materias, sin repitencia, p=0,5595,80% ± 0,195,24% ± 0,220,79 ± 0,010,35% ± 0,06
Tradicional con ABP (endógeno, 6 proyectos, umbral 3)48,70%21,00%0,940,00%
Continuidad con ABP (endógeno, 6 proyectos)95,70%4,30%0,730,10%
Continuidad con egreso sin deuda86,70%8,10%0,000,00%

La tabla muestra con claridad que:

  • Reducir materias sin cambiar la lógica de la deuda mejora poco.
  • Subir el umbral sin mejorar la recuperación mejora el egreso pero esconde deuda.
  • Solo la continuidad pedagógica logra egreso alto y deuda baja, incluso con la restricción de egreso sin deuda.

5.12 El efecto del aprendizaje basado en proyectos: análisis endógeno

En las secciones anteriores evaluamos el efecto de reducir la cantidad de filtros y de eliminar la repitencia global. Nos queda por analizar una tercera palanca: la organización del currículum en proyectos interdisciplinarios que combinen materias de distinto tipo. El objetivo de esta sección es determinar si el aprendizaje basado en proyectos (ABP) aporta beneficios adicionales, y en qué condiciones.

5.12.1 El problema del modelado circular

En versiones previas de este análisis, el ABP se modeló aplicando un factor fijo de reducción a la probabilidad de desaprobar (por ejemplo, multiplicar por 0,7). Ese enfoque es problemático porque predetermina el resultado: si se impone una reducción del 30% en la probabilidad de fracaso, el ABP va a mejorar por construcción, sin que el modelo capture el mecanismo real de la compensación. Un crítico podría objetar, con razón, que esa mejora es un artefacto del código y no un hallazgo del análisis.

Para evitar esa circularidad, en esta versión modelamos el ABP de manera endógena. Cada estudiante tiene cuatro aptitudes latentes (numérica, lingüística, social y práctica), correlacionadas entre sí según un parámetro. Cada materia se asocia a un tipo de aptitud. En el modelo tradicional, cada materia se desaprueba si su latente cae bajo el umbral. En el modelo de ABP, cada proyecto agrupa dos materias de tipos distintos, y la latente del proyecto es el promedio de las latentes de sus materias. La compensación no está impuesta: emerge del promedio de aptitudes heterogéneas.

5.12.2 Resultados del análisis endógeno

Ejecutamos el modelo con dos calibraciones distintas para verificar la robustez del hallazgo. La primera calibración usa la misma estructura del resto del documento ( μp=0,15\mu_p = 0{,}15 , σp=0,10\sigma_p = 0{,}10 ). La segunda usa una calibración alternativa ( Paprobar=0,85P_{\text{aprobar}} = 0{,}85 sobre latentes normales) para confirmar que el signo y la magnitud del efecto no dependen de esa elección.

Nota metodológica sobre las calibraciones. Este análisis reporta dos calibraciones con propósitos distintos. La calibración principal es la que usa la misma estructura del resto del documento ( μp=0,15\mu_p = 0{,}15 , σp=0,10\sigma_p = 0{,}10 sobre probabilidades individuales). Es la que debe leerse como resultado del modelo. La calibración alternativa ( Paprobar=0,85P_{\text{aprobar}} = 0{,}85 sobre latentes normales) se incluye únicamente como verificación de robustez: sirve para confirmar que el signo y la dirección del efecto del ABP no dependen de la elección específica de la distribución base. Los valores absolutos entre ambas calibraciones no son directamente comparables, porque responden a parametrizaciones distintas del mismo fenómeno. Cuando en el texto se mencione «el efecto del ABP» sin más aclaración, se estará haciendo referencia a la calibración principal.

Nota sobre el umbral proporcional. Al pasar de 12 materias a 6 proyectos, el umbral de repitencia se ajusta de 5 a 3. La decisión merece una aclaración. Con 12 materias, repetir con 5 implica desaprobar el 41,7% del año. Con 6 proyectos, repetir con 3 implica desaprobar el 50%. Se eligió 3 porque es el valor más cercano a la proporción original y porque con 2 de 6 (33,3%) el umbral sería más estricto que el actual, lo que penalizaría al ABP en la comparación. El análisis de sensibilidad de la sección A.18 cubre distintas combinaciones de umbral y modo de evaluación, y confirma que el ABP mejora el egreso en un rango amplio de configuraciones, no solo en la que aquí se reporta como principal.

Calibración consistente con el resto del documento (sensibilidad univariada, 30 semillas):

Efecto del ABP con la calibración principal (30 semillas)
Escenario Egreso sin repetir Abandono Stock medio
Base (12 materias, umbral 5)53,2% ± 0,443,0% ± 0,41,97
Continuidad (6 materias, sin repitencia)95,0% ± 0,36,3% ± 0,31,43
Continuidad + ABP96,0% ± 0,35,0% ± 0,30,51

Calibración alternativa (ABP endógeno, 30 semillas, Paprobar=0,85P_{\text{aprobar}} = 0{,}85 ):

Efecto del ABP con la calibración alternativa (30 semillas)
Escenario Egreso sin repetir Abandono Stock medio
Tradicional sin ABP43,8%23,2%2,27
Tradicional con ABP48,7%21,0%0,94
Continuidad sin ABP94,9%5,1%1,44
Continuidad con ABP95,7%4,3%0,73

5.12.3 Lo que muestran los números

Ambas calibraciones coinciden en la dirección del efecto:

  • En el régimen tradicional, el ABP mejora el egreso en +4,9 puntos porcentuales (43,8% → 48,7%) y reduce el abandono en 2,2 puntos (23,2% → 21,0%). El stock residual al egresar cae a menos de la mitad (2,27 → 0,94).
  • En el régimen de continuidad pedagógica, el ABP mejora el egreso en +0,8 puntos (94,9% → 95,7%) y reduce el abandono en 0,8 puntos (5,1% → 4,3%). El stock residual también cae (1,44 → 0,73).

El ABP nunca perjudica. En las 27 combinaciones de parámetros de correlación probadas (variando el factor motivacional común, la aptitud por tipo y la correlación entre tipos), el ABP mejoró el egreso en todos los casos. La magnitud de la mejora varía entre +1,5 y +5,8 puntos porcentuales, pero el signo es siempre positivo.

5.12.4 Robustez del ABP frente a la estructura de correlación

Una pregunta natural al analizar el ABP es si su efecto depende de cuánto estén correlacionadas las aptitudes de los estudiantes. Para responder a esa pregunta, realizamos un barrido sistemático variando tres parámetros de correlación:

  • RHO_COMUN: el peso del factor motivacional común, que afecta a todas las materias por igual.
  • RHO_TIPO: el peso de la aptitud específica por tipo de materia.
  • RHO_APT: la correlación entre las aptitudes de distintos tipos (¿ser bueno en matemática predice ser bueno en lengua?).

Sobre la elección de los parámetros de correlación. Los valores de ρcomún=0,15\rho_{\text{común}} = 0{,}15 , ρtipo=0,40\rho_{\text{tipo}} = 0{,}40 y ρapt=0\rho_{\text{apt}} = 0 no provienen de una estimación empírica con datos reales, sino de una calibración plausible. Representan un escenario de moderada heterogeneidad entre estudiantes: un factor motivacional común débil, una aptitud específica por tipo de materia relativamente fuerte, y aptitudes entre tipos poco correlacionadas. Esta elección es deliberadamente conservadora: si las aptitudes entre tipos estuvieran más correlacionadas (por ejemplo, ρapt=0,7\rho_{\text{apt}} = 0{,}7 ), el ABP tendría menos margen para compensar y su efecto sería menor. Para verificar que los resultados no dependen de esta elección específica, el barrido de la sección A.18 cubre un rango amplio (0,10 a 0,50 en cada parámetro) y muestra que el ABP mejora el egreso en las 27 combinaciones, con magnitud variable entre +1,5 y +5,8 puntos porcentuales. La estimación empírica de estos parámetros con datos reales de escuelas argentinas queda como propuesta de línea de trabajo futuro.

Se probaron tres valores para cada parámetro, sobre las 27 combinaciones válidas, con 10 semillas por combinación. En todos los casos se comparó el ABP contra el mismo sistema sin ABP, a igual cantidad de filtros y umbral equivalente.

El resultado principal es que el ABP mejora el egreso en las 27 combinaciones, sin excepción. La magnitud de la mejora varía entre +1,5 y +5,8 puntos porcentuales, según cuán heterogéneos sean los perfiles de los estudiantes. La siguiente tabla muestra los casos extremos:

Casos extremos del efecto del ABP según la estructura de correlación
Configuración Descripción Δ egreso (ABP − no ABP)
RHO_COMUN = 0,10, RHO_APT = 0,30Aptitudes independientes, factor común débil+5,8 pp
RHO_COMUN = 0,10, RHO_TIPO = 0,30Aptitudes por tipo fuertes, poco factor común+5,8 pp
RHO_COMUN = 0,50, RHO_TIPO = 0,30Todo fuertemente correlacionado+3,0 pp
RHO_COMUN = 0,50, RHO_APT = 0,70Máxima homogeneidad entre tipos+1,5 pp

El patrón es claro: cuanto más heterogéneos son los perfiles de los estudiantes, mayor es el beneficio del ABP. Cuando las aptitudes de los estudiantes son independientes entre tipos (un estudiante puede ser fuerte en matemática y débil en lengua), el ABP encuentra margen para compensar. Cuando todas las aptitudes están fuertemente correlacionadas (los estudiantes son buenos o malos en todo), el ABP pierde eficacia, porque las dos materias del proyecto caen juntas.

Este hallazgo tiene una implicancia pedagógica directa: el ABP es más efectivo cuando cada proyecto combina materias de tipos poco correlacionados entre sí. Un proyecto que integra Matemática con Historia, o Física con Arte, aprovecha la compensación porque un estudiante puede ser fuerte en una dimensión y débil en la otra. En cambio, un proyecto que combina Matemática con Física, o Historia con Geografía, no genera compensación apreciable, porque ambas materias dependen de la misma aptitud base. El diseño del proyecto importa tanto como la existencia del proyecto. La recomendación práctica es evitar agrupamientos de materias afines y favorecer agrupamientos interdisciplinarios que crucen tipos distintos de aptitud.

5.12.5 Por qué la mejora es modesta

El análisis de la sección 4.4 mostró que la compensación puede convertir una probabilidad de aprobación del 25% en una del 75%, cuando los dos factores que se promedian son independientes. ¿Por qué el ABP no produce una mejora de esa magnitud?

La razón es la correlación entre las materias que se agrupan. Las materias del mismo estudiante comparten su motivación, su contexto familiar, sus hábitos de estudio, su asistencia. Esa correlación común ( ρ≈0,4\rho \approx 0{,}4 ) reduce el poder de la compensación. Cuando dos materias están correlacionadas, caen juntas con más frecuencia de la que caerían si fueran independientes. El promedio de dos latentes correlacionadas tiene menos varianza que el promedio de dos latentes independientes, y por lo tanto la compensación tiene menos margen para operar.

Esta limitación es importante y honesta: el ABP no es una panacea. Su efectividad depende de cuán heterogéneas sean las aptitudes del estudiante. Cuanto más independientes sean las aptitudes entre tipos de materia, mayor será el beneficio. Cuanto más correlacionadas, menor.

5.12.6 Lo que esto significa para la propuesta

El ABP es un complemento valioso de la continuidad pedagógica, pero no la sustituye. La palanca principal sigue siendo la eliminación de la repitencia global, que sube el egreso de 53,2% a 95,0% (+41,8 puntos). El ABP agrega una mejora adicional de +1,0 punto en continuidad y reduce el stock residual de 1,43 a 0,51.

La combinación ganadora para el objetivo de egreso en tiempo y forma con deuda mínima es:

  1. Eliminar la repitencia global y las mesas aisladas, reemplazándolas por continuidad pedagógica.
  2. Agrupar materias en proyectos interdisciplinarios que combinen tipos distintos, para aprovechar la compensación.
  3. Mantener la exigencia, evaluando en proceso y exigiendo la aprobación de los contenidos, pero sin bloquear el avance del estudiante.

Con esta combinación, el modelo predice un egreso del 96,0% y un abandono del 5,0%, con un stock medio al egresar de 0,51 materias.

5.12.7 Conclusión de la sección

El aprendizaje basado en proyectos, modelado de manera endógena, mejora el egreso y reduce el stock residual en todos los escenarios. Su efecto es modesto pero sistemático: nunca perjudica, siempre ayuda. La magnitud de su contribución depende de la heterogeneidad de las aptitudes de los estudiantes: cuanto más diversos sean sus perfiles, mayor será el beneficio. En el contexto de continuidad pedagógica, el ABP permite que los estudiantes que arrastran deudas moderadas las salden durante el año siguiente, reduciendo a la mitad el stock residual al egresar.

Capítulo 6: El sesgo del superviviente y la ilusión de los años superiores

6.1 Una observación empírica que desconcierta

Quien haya trabajado en escuelas secundarias argentinas habrá notado un fenómeno recurrente: en cuarto y quinto año, los indicadores de aprobación suelen ser mejores que en primero, segundo y tercero. Las aulas son más pequeñas, los estudiantes parecen más comprometidos, las tasas de repitencia y desaprobación bajan. A primera vista, esto podría interpretarse como una mejora pedagógica: la escuela estaría logrando que los estudiantes maduren, se adapten y mejoren su rendimiento a medida que avanzan.

Sin embargo, esta lectura es engañosa. Los números de cuarto y quinto año no reflejan una mejora real del conjunto, sino un proceso de selección silenciosa que ha ido excluyendo a los estudiantes con mayor probabilidad de fracaso. Los que llegan a los años superiores no son una muestra representativa de la cohorte original: son los sobrevivientes de un filtro que operó de manera sostenida desde primer año.

Nuestra simulación permite desmontar esta ilusión con precisión. Los datos de motivación y stock de deudas por curso que presentamos a continuación son la evidencia más directa de ese mecanismo.

6.2 La pirámide de matrícula y la concentración del fracaso en los primeros años

En el capítulo 4 presentamos la matrícula inicial por curso en el año 2040 para el escenario base (12 materias):

Matrícula inicial por curso en 2040 (escenario base, 12 materias)
Curso Matrícula
1º1137
2º1257
3º1066
4º866
5º771

La pirámide es pronunciada: 5º tiene solo el 68% de la matrícula de 1º. Si no hubiera repitencia ni abandono, la matrícula de cada curso debería ser aproximadamente igual. La diferencia representa a aquellos que fueron quedando rezagados o expulsados del sistema.

Pero la pirámide por sí sola no muestra dónde se concentra el sufrimiento. Para eso necesitamos mirar la motivación y el stock de deudas de los estudiantes que permanecen activos al final de la simulación.

6.3 Motivación y stock por curso en el escenario base

La siguiente tabla muestra, para el último año simulado (2045), la cantidad de estudiantes activos, la motivación promedio y el stock medio de materias pendientes en cada curso, en el escenario base (12 materias, umbral 5, mesas al 25%):

Motivación y stock por curso en el escenario base (12 materias, umbral 5, mesas al 25%)
Curso N (activos) Motivación media Stock medio
1º1780,47410,64
2º13490,8513,35
3º11390,8443,32
4º9480,8572,94
5º8410,8653,01

Observemos con atención el primer año. Hay solo 178 estudiantes activos en 1º al final de la simulación. ¿Por qué tan pocos, si ingresan 1000 por año? Porque la mayoría ya promocionó a 2º, pero un grupo quedó atrapado en 1º: son los repitentes crónicos, que acumulan deudas y no logran salir. Su motivación promedio es 0,474, la más baja de toda la escuela, y su stock medio es 10,64 materias, el más alto.

Estos 178 estudiantes son el núcleo duro del fracaso. Están desmotivados, endeudados y atrapados en un ciclo del que difícilmente saldrán. La escuela los mantiene en 1º, repitiendo una y otra vez, sin que logren avanzar. Son la evidencia viviente de la barrera absorbente.

En los cursos superiores, la motivación es alta (0,85-0,87) y el stock moderado (3-3,4). ¿Por qué? Porque los que llegan a 2º, 3º, 4º y 5º ya pasaron el filtro. Son los que lograron promocionar con pocas deudas y mantener la motivación. Los que no pudieron, quedaron en 1º o abandonaron.

Este es el sesgo del superviviente: los cursos superiores muestran buenos indicadores no porque la escuela mejore, sino porque la población que los compone ya fue seleccionada. El desastre está concentrado en 1º, invisible para quien solo mira los promedios generales o los años superiores.

6.4 La reducción de materias mejora, pero no elimina la trampa

Veamos qué ocurre en el escenario con 6 materias y umbral 3 (proporcional). La tabla equivalente es:

Motivación y stock por curso en el escenario de 6 materias con umbral 3
Curso N (activos) Motivación media Stock medio
1º1860,5025,62
2º13140,8591,75
3º11320,8691,69
4º10330,8631,62
5º8320,8931,44

La mejora es evidente. El stock medio en 1º baja de 10,64 a 5,62, y en los cursos superiores cae por debajo de 2. La motivación en 1º sube de 0,474 a 0,502, y en los superiores se mantiene alta. La reducción de materias alivia la presión, pero no elimina el problema: sigue habiendo un grupo de 186 estudiantes atrapados en 1º con stock alto y motivación baja. La trampa persiste, aunque menos severa.

6.5 La continuidad pedagógica rompe el círculo

El escenario de continuidad pedagógica (6 materias, sin repitencia, sin mesas, recuperación en proceso con probabilidad 0,55) muestra resultados radicalmente distintos:

Motivación y stock por curso en el escenario de continuidad pedagógica
Curso N (activos) Motivación media Stock medio
2º10001,0000,47
3º9900,9990,67
4º9780,9980,74
5º9760,9980,79

En primer lugar, ya no hay estudiantes en 1º al final de la simulación, porque todos promocionan. La motivación es prácticamente 1 en todos los cursos: nadie está desmotivado. El stock medio es inferior a 1 materia en todos los niveles: nadie acumula deuda significativa.

La eliminación de la repitencia global y de las mesas de examen aisladas desactiva la trampa. Los estudiantes avanzan, las deudas se saldan en proceso, y la motivación se mantiene alta. El sesgo del superviviente desaparece, porque ya no hay filtro que elimine a los más vulnerables.

6.6 El costo humano de la mejora aparente

Los datos de motivación y stock son más elocuentes que cualquier porcentaje de egreso. Muestran que, en el escenario base, existe un grupo de estudiantes atrapados en 1º con motivación por debajo de 0,5 y stock de más de 10 materias. Esos estudiantes no son un porcentaje abstracto: son jóvenes que van a la escuela todos los días, se sientan en un aula, y fracasan una y otra vez. Su motivación está destruida, su autoestima también. La escuela, que debería nivelar, los está expulsando lentamente.

La mejora aparente en los años superiores es el reverso de ese sufrimiento. Los cursos superiores muestran motivación alta y stock moderado porque los que sufrieron ya no están: quedaron en 1º o abandonaron. La escuela puede celebrar sus buenos índices en 5º año, pero lo hace a costa de haber sacrificado a los que no llegaron.

6.7 La métrica correcta: trayectoria completa, no tramo final

Si la escuela quiere monitorear su desempeño real, no puede limitarse a mirar las tasas de aprobación de cada año por separado. Debe medir la trayectoria completa de las cohortes, desde el ingreso hasta el egreso. Algunas métricas imprescindibles:

  • Tasa de egreso en tiempo: ¿qué porcentaje de los que ingresan en primer año egresan en quinto?
  • Tasa de egreso diferido: ¿qué porcentaje egresa con uno o dos años de retraso?
  • Tasa de abandono acumulada: ¿qué porcentaje de cada cohorte abandona antes de egresar?
  • Tasa de repitencia acumulada: ¿qué porcentaje repitió al menos una vez en la trayectoria?
  • Índice de deuda académica: promedio de materias pendientes por estudiante en cada año.
  • Motivación promedio por curso: para detectar bolsones de desmotivación temprana.

Si la escuela solo mira los años superiores, verá un espejismo. Si mira la trayectoria completa, verá la realidad: un sistema que expulsa a la mitad de sus estudiantes y llama éxito a la supervivencia del resto.

6.8 Conclusión del capítulo

La mejora aparente en cuarto y quinto año es una de las trampas más peligrosas del sistema educativo. Permite a docentes y directivos creer que la escuela está funcionando bien, cuando en realidad está filtrando silenciosamente a los estudiantes con mayores dificultades. Los números de los años superiores son sesgados: reflejan no el éxito de la enseñanza, sino la eliminación previa de los más vulnerables.

Los datos de motivación y stock por curso confirman este diagnóstico. En el escenario base, los estudiantes de 1º que quedan atrapados tienen motivación 0,474 y stock 10,64, mientras que los de 5º tienen motivación 0,865 y stock 3,01. La diferencia no es pedagógica: es estadística. En el escenario de continuidad pedagógica, la motivación es 1,0 en todos los cursos y el stock es inferior a 1. La trampa desaparece.

Reconocer este sesgo es el primer paso para combatirlo. La escuela que quiera ser verdaderamente niveladora debe dejar de mirar solo a los que llegaron y empezar a mirar a los que se quedaron en el camino. Debe medir la trayectoria completa, no el tramo final. Y debe intervenir tempranamente, en los primeros años, cuando el filtro comienza a operar, para que no se consolide la exclusión.

En el próximo capítulo, el último, sintetizaremos los hallazgos y propondremos líneas de acción concretas.

Capítulo 7: Reflexiones finales — El diseño importa

7.1 Lo que los números mostraron

A lo largo de este documento construimos un modelo de simulación basado en agentes, deliberadamente conservador. Asumimos que la probabilidad individual de desaprobar una materia sigue una distribución Beta con media 15% y desviación estándar 10%; que las mesas de examen resuelven solo el 25% de las deudas; que el umbral de repitencia es de 5 materias pendientes; y que la motivación, la repitencia y el abandono interactúan de manera realista. No incluimos correlación entre materias, ni abandono por causas socioeconómicas, ni efectos de pares. En otras palabras, diseñamos el escenario más favorable posible.

Los resultados fueron contundentes:

  • Con 12 materias por año y umbral 5, el promedio de egreso sin repetir es 53,27%, y el abandono alcanza 43,34%. La desviación estándar entre 30 simulaciones es inferior a 0,5 puntos porcentuales, lo que indica robustez.
  • La pirámide de matrícula es pronunciada: en 2040, 5º año tiene solo el 68% de la matrícula de 1º.
  • La probabilidad de desaprobar 5 o más materias en un año (umbral de repitencia) es del 7,7%, lo que genera una cascada de repitencias y abandonos.
  • La repitencia es casi una condena: quienes repiten una vez tienen una probabilidad de egreso inferior al 25%, y con dos repeticiones cae por debajo del 10%.
  • La motivación se desploma con la acumulación de deudas, creando un círculo vicioso que expulsa a los más vulnerables.

Estos números no son un pronóstico pesimista: son la consecuencia matemática de un diseño estructural. El problema no está en los docentes, ni en los estudiantes, ni en las familias. Está en la arquitectura del sistema.

7.2 Un problema matemático: dos filtros simultáneos y una lógica de deuda perversa

La escuela secundaria argentina está organizada en cinco años, con aproximadamente doce materias por año. Eso significa que un estudiante debe atravesar sesenta instancias de evaluación con posibilidad de fracaso. Sesenta filtros. Sesenta oportunidades de quedar en deuda. Sesenta obstáculos en un sistema que se declara inclusivo, nivelador y garante del derecho a la educación.

Pero el problema no es solo la cantidad de filtros. Existe una segunda restricción, menos visible pero igualmente letal: el umbral de repitencia. Se permite promocionar con hasta cuatro materias pendientes; con cinco o más, se repite. Es decir, el sistema combina dos filtros simultáneos:

  • Filtro horizontal: cuántas materias hay que aprobar.
  • Filtro vertical: cuántas materias se toleran desaprobadas al mismo tiempo.

La combinación de ambos es lo que produce el desgranamiento. Un estudiante no solo debe aprobar muchas materias, sino que debe mantener un stock de deudas simultáneas por debajo de un límite estricto. Si falla en una, tiene margen; si falla en varias, cae.

Y hay un tercer elemento, quizás el más perverso: la lógica de la deuda. En el sistema actual, si un estudiante acumula materias pendientes, debe rendirlas en mesas de examen aisladas. Si no las aprueba, las arrastra. Y si en el año siguiente acumula dos más, puede llegar al umbral de cinco y repetir todo el año, incluso las materias que ya había aprobado. La repitencia es global: no se repiten solo las materias desaprobadas, sino todas, incluso aquellas en las que el estudiante había demostrado dominio. Esa es una de las fuentes más profundas de desmotivación y abandono.

7.3 Dos misiones incompatibles

Aquí reside la contradicción profunda de la escuela secundaria argentina. Por un lado, se declara inclusiva: un derecho, un espacio de nivelación de oportunidades, una institución que debe acompañar y sostener a todos los jóvenes. Por otro lado, su diseño estructural la configura como un filtro: sesenta evaluaciones que pueden desaprobar, un umbral de cuatro materias que define la promoción, y una lógica de deuda que castiga con la repitencia global y la mesa de examen aislada.

Estas dos misiones son incompatibles por diseño. No se puede nivelar y filtrar al mismo tiempo. No se puede incluir y excluir simultáneamente. Mientras la estructura mantenga sesenta filtros, un umbral estricto de cuatro materias y una lógica de deuda punitiva, la exclusión prevalecerá por sobre la inclusión, porque los números son implacables.

Quienes transitan los primeros años lo saben. Las aulas llenas de primer año se vacían lentamente hacia quinto. Los que quedan no son los que más necesitaban la escuela: son los que ya tenían ventajas de partida. La escuela, que debía nivelar, termina amplificando las desigualdades. Y los docentes, atrapados en esta maquinaria, no pueden hacer otra cosa que constatar el desgranamiento.

7.4 Cambiar el diseño: de la repitencia global a la continuidad pedagógica

La solución no es pedirles a los docentes que aprueben más. Ya vimos que aun con un 95% de aprobación, el sistema sigue expulsando. Tampoco es bajar la exigencia: un filtro fácil sigue siendo un filtro. La solución es cambiar la arquitectura.

En el Capítulo 5 realizamos experimentos contrafactuales con el mismo programa de simulación. Cambiamos parámetros estructurales y observamos los efectos. Los resultados fueron reveladores:

  • Reducir materias de 12 a 6 con umbral proporcional (repetir con 3 o más en 6 materias) produjo una mejora modesta: el egreso sin repetir subió del 53,27% al 55,23%, y el abandono cayó del 43,34% al 38,70%. No alcanzó para transformar el sistema.
  • Flexibilizar el umbral sin tocar las materias (umbral 10 en 12 materias) elevó el egreso sin repetir al 80,7% y redujo el abandono al 20,3%. Sin embargo, esta mejora escondía un costo oculto: el 20,6% de los egresados terminó con más de 5 materias pendientes, y el stock medio al egreso subió de 1,88 a 3,27. Es una trampa de «título vacío»: se egresa, pero con deuda impaga.
  • Eliminar la repitencia global y las mesas de examen aisladas, reemplazándolas por continuidad pedagógica (6 materias, sin repitencia, recuperación en proceso con probabilidad 0,55) produjo el mejor resultado: el egreso sin repetir se disparó al 95,80%, el abandono se desplomó al 5,24%, y el stock medio al egreso se redujo a 0,79 materias. Solo el 0,35% de los egresados arrastraba más de 5 previas.

A estos resultados se suma el efecto del aprendizaje basado en proyectos (ABP). La simulación con modelo endógeno, bajo una calibración alternativa, muestra que el ABP eleva el egreso sin repetir del 43,8% al 48,7% en el régimen tradicional (+4,9 puntos porcentuales), y reduce el stock medio al egreso a menos de la mitad. En el barrido de parámetros de correlación, el efecto del ABP varía entre +1,5 y +5,8 puntos según cuán heterogéneas sean las aptitudes. En el régimen de continuidad pedagógica, el ABP añade una mejora adicional: el egreso sin repetir sube al 95,70% y el abandono baja al 4,30%, con un stock medio al egreso de 0,73 materias. El ABP, por tanto, no sustituye a la eliminación de la repitencia, pero la potencia y reduce la deuda residual.

La conclusión es contundente: la eliminación de la repitencia global es el factor dominante. La continuidad pedagógica funciona incluso con probabilidades modestas de recuperación. En el análisis de sensibilidad, variamos la probabilidad de saldar deudas en proceso ( pcontinuap_{\text{continua}} ) desde 0,25 hasta 0,65. Los resultados mostraron que el egreso sin repetir se mantuvo por encima del 94% en todos los casos, y el abandono por debajo del 7%. Lo que sí cambió fue el stock de deuda remanente:

Efecto de la probabilidad de recuperación en proceso sobre los indicadores de egreso
pcontinuap_{\text{continua}} Egreso sin repetir (%) Abandono (%) Stock medio al egreso % con más de 5 previas
0,2594,77,02,259,2%
0,3595,26,51,634,4%
0,4595,45,71,151,5%
0,5595,85,30,800,4%
0,6595,65,40,530,1%

El egreso masivo ya está garantizado con eliminar la repitencia, incluso con una recuperación débil. Pero la calidad del título exige mantener una probabilidad de recuperación al menos moderada ( ≥0,45\ge 0{,}45 ) para que el stock de deuda remanente sea bajo y el porcentaje de egresados con muchas previas sea pequeño. No se trata de elegir entre inclusión y exigencia: se trata de diseñar un sistema que acompañe al estudiante mientras le exige.

El análisis de sensibilidad a la desigualdad entre estudiantes ( σp\sigma_p ) reforzó la robustez de la continuidad pedagógica. Mientras el escenario base era extremadamente sensible a la heterogeneidad (con σp=0,20\sigma_p = 0{,}20 , el egreso sin repetir subía al 64,4% pero a costa de una selección más brutal), la continuidad pedagógica se mantuvo estable: egreso sin repetir alrededor del 95,5% y abandono del 5,5% para todos los valores de σp\sigma_p probados (0,10, 0,15, 0,20). La continuidad actúa como un amortiguador: el sistema deja de ser una máquina de selección y se convierte en un acompañante constante.

Además, incorporamos una restricción realista: el egreso solo se otorga si el stock final es cero. Con esta condición, el egreso total con continuidad pedagógica baja al 86,7%, el abandono sube al 8,1% y el 5,9% de los estudiantes permanece activo al final de la simulación, con un tiempo medio hasta egresar de 6,36 años. Aun así, el 86,7% de egreso sin deuda es muy superior al 53,27% del escenario base. La continuidad pedagógica no solo mejora el flujo: mejora la calidad del egreso.

Finalmente, el análisis de sensibilidad al parámetro de abandono base mostró que, incluso con una probabilidad de abandono cinco veces mayor (0,05 en lugar de 0,01), el egreso total se mantiene en 81,6%, con un stock medio al egreso de 0,79 y solo 0,4% de egresados con más de 5 previas. La continuidad pedagógica es robusta.

7.5 Evidencia de la simulación: la triada que funciona

La propuesta de continuidad pedagógica no es una ocurrencia aislada: es la conclusión lógica de los experimentos. Los datos muestran que:

  • Reducir la fragmentación (menos materias) sin cambiar la lógica de la deuda no alcanza.
  • Flexibilizar el umbral sin mejorar la recuperación mejora el egreso pero esconde deuda.
  • Solo la combinación de menos filtros + eliminación de la repitencia global + recuperación en proceso logra egreso alto, abandono bajo y stock de deuda mínimo, incluso con la restricción de egreso sin deuda.

El ABP añade un componente de compensación que reduce la deuda acumulada incluso en el régimen tradicional. Cuando se combina con la continuidad pedagógica, el egreso alcanza el 95,70% y el abandono baja al 4,30%, con un stock medio al egreso de 0,73 materias. Esto confirma que el ABP no reemplaza a la eliminación de la repitencia, pero la potencia y mejora la calidad del egreso.

La evidencia cuantitativa es clara: la escuela secundaria actual no tiene un problema de «chicos que no estudian» ni de «docentes que no enseñan». Tiene un problema de arquitectura. Y la solución es una reingeniería del diseño, no un ajuste de voluntades.

7.5.1 Robustez frente a los parámetros conductuales

Una objeción razonable a cualquier modelo de simulación es que sus resultados dependan críticamente de parámetros elegidos arbitrariamente. En nuestro caso, los parámetros de motivación, abandono y reducción por repitencia podrían, en principio, alterar las conclusiones. Para responder a esta objeción, realizamos un análisis de sensibilidad univariado: variamos cada parámetro conductual por separado —manteniendo los demás en su valor base— y medimos el efecto sobre el egreso sin repetir en los tres escenarios principales.

Se variaron cinco parámetros, cada uno en tres valores, sobre tres escenarios, con 30 semillas por combinación. En total, 1.350 simulaciones completas de cohorte.

Análisis de sensibilidad univariada de los parámetros conductuales
Parámetro Rango probado Efecto sobre el ordenamiento
factor_reduccion_repitencia0,10 – 0,30Ninguno
factor_motivacion_prob0,25 – 0,75Mínimo
p_abandono_base_repitencia0,10 – 0,25Ninguno
p_abandono_base_promocion_stock_bajo0,005 – 0,020Significativo en magnitud, nulo en orden
motivacion_minima0,05 – 0,20Ninguno

El resultado central es contundente: el ordenamiento de los escenarios se mantiene en todas las combinaciones. En los 45 cruces entre parámetros, valores y escenarios, el egreso sin repetir sigue el mismo orden:

Base (12 materias, umbral 5) < Continuidad (6 materias, sin repitencia) < Continuidad + ABP

Los valores absolutos varían dentro de rangos estrechos:

Rango observado de egreso sin repetir por escenario
Escenario Rango observado de egreso sin repetir
Base51,2% – 54,2%
Continuidad91,4% – 96,8%
Continuidad + ABP92,2% – 98,0%

El único parámetro con efecto apreciable sobre la magnitud es p_abandono_base_promocion_stock_bajo, que controla la probabilidad de que un estudiante abandone cuando promociona con stock bajo. Al duplicarlo (de 0,005 a 0,020), el egreso baja 3,0 puntos en el escenario base, 5,4 puntos en continuidad y 5,8 puntos en continuidad + ABP. Pero incluso en el peor caso (abandono más alto probado), el ordenamiento se mantiene: base 51,2%, continuidad 91,4%, continuidad + ABP 92,2%.

Este análisis confirma que las conclusiones del documento no dependen de los valores específicos de los parámetros conductuales. El hallazgo central —que la eliminación de la repitencia global eleva el egreso de aproximadamente la mitad al 95%, y que el ABP agrega una mejora adicional— se sostiene bajo un rango amplio de supuestos sobre motivación y abandono. La tesis estructural del documento queda blindada contra la crítica de arbitrariedad de parámetros.

7.6 El estado de la cuestión: autores y corrientes que convergen con nuestro análisis

El análisis que hemos realizado no es un ejercicio aislado. Se inscribe en una tradición de pensamiento crítico sobre la forma escolar, la repetición y la deuda académica que atraviesa la sociología de la educación, la pedagogía y la economía educativa. A continuación, exponemos con mayor detenimiento las voces que coinciden con nuestros argumentos, agrupadas por el eje estructural que atacan. Todas las referencias han sido verificadas y corregidas para ajustarse a las fuentes reales.

7.6.1 La gramática de la escuela y la rigidez del dispositivo

David Tyack y William Tobin (1994), en su clásico trabajo sobre la «gramática de la escuela» —concepto profundizado luego por Tyack y Cuban (1995)—, mostraron que la organización escolar decimonónica (clases divididas por edad, fragmentación extrema del saber en asignaturas desconectadas y calificación por curso anual) opera como una estructura profunda casi inmutable. Por su parte, Philip W. Jackson (1968), en Life in Classrooms, describió cómo el «currículum oculto» enseña a los estudiantes a someterse a la monotonía y a los veredictos de la evaluación institucional. Nuestro análisis aporta una formalización matemática de esa rigidez: demuestra cómo esa gramática monocrónica condena estadísticamente al fracaso a quienes no encajan en el molde uniforme.

7.6.2 La repetición como dispositivo de clasificación social

Jordi Collet-Sabé (2017–2020), coordinador de la Red de Investigación sobre Repetición Escolar (RIRE), analiza la repetición no como una decisión pedagógica sino como un dispositivo de clasificación social. Propone explícitamente la supresión de la repetición y su reemplazo por agrupamientos flexibles y apoyos intensivos integrados en el horario lectivo. Sus conclusiones empíricas coinciden con las nuestras: la repetición no recupera aprendizajes, solo selecciona.

Xavier Bonal y Cristian Bellei (2018), desde la sociología de la educación, demuestran que la estructura de filtros (repetición, selección temprana, tracking) es el mecanismo principal de reproducción de la desigualdad en sistemas nominalmente comprensivos pero selectivos en la práctica, como el argentino. La evidencia que aportan es abrumadora: los estudiantes de sectores vulnerables son los que más repiten y los que menos se recuperan.

7.6.3 La ineficacia de la repetición: evidencia empírica y simulaciones

Marcel Crahay (2007, 2013), en sus exhaustivas investigaciones sobre la ineficacia del fracaso escolar (Peut-on lutter contre l'échec scolaire ?; L'école peut-elle être juste et efficace ?), ha demostrado que hacer repetir un año a un estudiante no mejora su rendimiento futuro y representa un costo de oportunidad insostenible para cualquier sistema que aspire a la equidad. En idéntico sentido, Jere Brophy (2006), en el informe monográfico sobre repetición escolar para el IIPE-UNESCO y la Academia Internacional de Educación, concluye que la repetición deteriora la autoestima, incrementa la desafección hacia la escuela y constituye el predictor individual más potente del abandono prematuro. Estos hallazgos coinciden con las síntesis de John Hattie (2009) y los estudios clásicos de Lorrie Shepard y Mary Lee Smith (1989), quienes ubican a la repetición entre las medidas pedagógicas con efectos nulos o directamente nocivos.

7.6.4 La deuda académica / previas como problema estructural argentino

En el contexto argentino, el impacto de las materias adeudadas ha sido conceptualizado en las investigaciones sobre el régimen académico de la escuela secundaria dirigidas por Flavia Terigi (Terigi, 2008, 2010; Baquero et al., 2009, 2012). Estas autoras demuestran que la estructura monocrónica y graduada de la secundaria convierte a las asignaturas previas en una deuda acumulativa: al delegar la acreditación en mesas de examen aisladas del proceso regular de enseñanza, la escuela traslada al estudiante la responsabilidad exclusiva de su recuperación (Briscioli, 2016). En el plano empírico cuantitativo, los diagnósticos de Cora Steinberg para UNICEF Argentina (Steinberg, Tiramonti y Ziegler, 2019) y los informes del Observatorio de Argentinos por la Educación (Nistal, Bucciarelli y Volman, 2023) demuestran que adeudar asignaturas es el principal disparador estadístico del desgranamiento y que apenas 13 de cada 100 ingresantes completan el nivel secundario en el tiempo reglamentario y con aprendizajes satisfactorios.

7.6.5 Modelos de flujo y economía de la educación

El uso de modelos de flujo y cadenas de probabilidades tiene antecedentes fundamentales en la región. Ernesto Schiefelbein (1975, 1981, 1993), en sus estudios pioneros para la UNESCO y el Banco Mundial sobre la transición de cohortes en América Latina, demostró mediante modelos cuantitativos de simulación que las tasas oficiales de deserción encubrían en realidad un fenómeno masivo de repetición crónica. En el plano económico, Alejandro Morduchowicz (2006; 2026) ha evidenciado que la repetición encarece sustancialmente el costo fiscal por egresado, siendo nuestro stock estacionario de 1.800 materias pendientes la contrapartida física y organizativa de ese derroche de recursos públicos.

7.6.6 Experiencias internacionales de rediseño integral

Las propuestas que surgen de nuestro modelo no son utópicas: ya han sido implementadas, con distintos grados de éxito, en diversos sistemas educativos. Conviene distinguir tres grupos según la evidencia disponible.

Experiencias con resultados convergentes. Francia, con el Collège Unique y los cycles de tres años, junto con los Enseignements Pratiques Interdisciplinaires y el dispositivo «Devoirs faits», eliminó la repetición masiva y gestiona la deuda académica dentro del horario escolar, no en mesas de verano. Finlandia es el caso paradigmático: nueve años obligatorios sin repetición, módulos interdisciplinarios obligatorios (phenomenon-based learning) y un sistema de apoyo en tres niveles dentro de la escuela. En ambos casos, la evidencia muestra mejoras sostenidas tanto en retención como en aprendizajes, aunque con matices según el indicador que se mida.

Experiencias con resultados mixtos. Brasil implementó los Ciclos de Formación en varios estados (Minas Gerais, São Paulo, Río) desde los años 90: eliminó series y años, organizó la primaria en ciclos de tres años con promoción automática al final del ciclo, y agrupó las materias en áreas de conocimiento. Los resultados fueron un aumento de la matrícula neta y una caída drástica de la repetición. Sin embargo, la calidad de los aprendizajes medida por evaluaciones externas no subió al mismo ritmo. El caso brasileño es especialmente instructivo porque valida nuestra conclusión de que la cantidad sin calidad no basta: eliminar la repitencia es necesario, pero no suficiente. Se requiere acompañamiento real para que el egreso se traduzca en aprendizaje efectivo.

Experiencias en curso. Chile avanzó con la eliminación de la repetición en 1º básico y la extensión de la jornada escolar completa con apoyo pedagógico obligatorio integrado. Los liceos Bicentenario y la reforma de inclusión (Ley 20.845) priorizan el tiempo efectivo de aprendizaje. Las Comunidades de Aprendizaje (INCLUD-ED, Flecha, 2006-2011) son una red de escuelas que implementa agrupamientos interactivos heterogéneos, tutoría entre iguales, aprendizaje dialógico y eliminación de la repetición, con evidencia científica de que la estructura de aula colaborativa más no repetición más tiempo de tarea rompe la correlación origen-destino. En ambos casos, la evidencia es prometedora pero menos consolidada que en los dos primeros grupos.

El balance es claro: los sistemas que eliminaron la repetición acompañándola con recursos pedagógicos reales mejoraron sus indicadores sin sacrificar aprendizajes. Los que eliminaron la repetición sin inversión pedagógica equivalente obtuvieron mejoras en flujo pero no en calidad. La lección para Argentina es que el cambio estructural debe venir acompañado de inversión en la calidad de la enseñanza, no de simple flexibilización normativa.

7.6.7 Ingeniería de sistemas y confiabilidad: el lenguaje matemático

Nuestro enfoque metodológico traslada a la organización escolar principios de la teoría matemática de confiabilidad de sistemas (Barlow y Proschan, 1975) y de la psicometría de modelos conjuntivos de decisión (Haladyna y Hess, 1999). Mientras un currículum integrado o formativo opera con lógicas compensatorias, la secundaria graduada argentina funciona como un sistema en serie estricto (donde la falla de un componente individual compromete al conjunto): sesenta filtros independientes donde la acumulación de fallas puntuales activa el colapso total de la trayectoria (la repitencia en bloque). Formalizar este proceso permite entender por qué las intervenciones voluntaristas fracasan frente a la implacable aritmética del diseño.

7.6.8 Evidencia econométrica sobre la repitencia: América Latina y más allá

La literatura econométrica reciente proporciona evidencia causal rigurosa que respalda nuestros resultados de simulación. Estos estudios, basados en datos reales y metodologías cuasi-experimentales, confirman que la repitencia no solo es ineficaz, sino activamente dañina para las trayectorias educativas.

Marco Manacorda (2012), en The Cost of Grade Retention, utiliza datos de Uruguay para estimar el efecto causal de la repitencia sobre la escolaridad futura. Sus resultados muestran que repetir un grado reduce significativamente la probabilidad de completar la educación secundaria, y que el costo de la repitencia es sustancial tanto para el individuo como para el sistema.

Brian Jacob y Lars Lefgren (2007), en su estudio para Estados Unidos, encuentran evidencia de que la retención en grados intermedios reduce la probabilidad de graduarse de la escuela secundaria, especialmente para estudiantes de bajos ingresos.

María Ferreira Sequeda, Bart Golsteyn y Sergio Parra-Cely (2018), con datos de Colombia, muestran que la repitencia en la educación básica tiene efectos negativos de largo plazo sobre la finalización de la secundaria, utilizando un diseño de regresión discontinua.

João Batista Gomes-Neto y Eric A. Hanushek (1994), en su estudio clásico sobre Brasil, analizan las causas y consecuencias de la repitencia, demostrando que los estudiantes que repiten tienen un desempeño posterior igual o peor que los promovidos con apoyo, y que la repitencia es un mecanismo ineficiente de asignación de recursos.

Elisa Failache, Gonzalo Salas y Andrea Vigorito (2018), para Uruguay, identifican los determinantes de la repitencia y el abandono en la educación media, confirmando que la acumulación de materias pendientes es el principal predictor del abandono.

Estos estudios econométricos, junto con los aportes pedagógicos y sociológicos ya citados, constituyen un cuerpo de evidencia convergente: la repitencia es un dispositivo estructural que no mejora los aprendizajes y que expulsa a los estudiantes más vulnerables. Nuestro modelo formaliza matemáticamente ese mecanismo y cuantifica su magnitud.

7.7 Convergencias y divergencias con la literatura existente

Convergencias

Nuestro análisis converge con la literatura en cinco puntos centrales:

  1. La repitencia es un fenómeno estructural, no individual. Todos los autores citados coinciden: las tasas de repitencia dependen de la organización institucional, no de las características de los estudiantes.
  2. La repitencia es ineficaz y dañina. La evidencia empírica y las simulaciones coinciden: repetir no mejora el aprendizaje y predice abandono.
  3. La acumulación de materias pendientes es un problema específico del diseño argentino. Feldfeber, Ferrante y la UCA lo documentan; nuestro modelo lo formaliza.
  4. El desgranamiento es un hecho documentado. Los informes del Observatorio Argentinos por la Educación y la UCA coinciden con nuestros resultados.
  5. La necesidad de repensar el régimen académico es urgente. Las experiencias internacionales y los informes de UNESCO/IIEP apuntan en la misma dirección.

Divergencias y aportes originales

Nuestro análisis se distingue de la literatura existente en tres aspectos:

  1. Frente a los pedagogos del ciclo y la evaluación formativa (Perrenoud, Zabala, Crahay): ellos proponen el qué (ciclos, áreas, evaluación formativa); nuestro modelo aporta el cuánto: umbrales críticos, probabilidad de recuperación necesaria, stock estacionario de deuda. Demostramos por qué implementaciones parciales (solo áreas, o solo no repetición) fallan matemáticamente.
  2. Frente a los sociólogos de la deuda (Feldfeber, Ferrante): ellos diagnostican la deuda cualitativa y cuantitativamente; nuestro modelo formaliza la dinámica de la deuda y prueba que la mesa de examen aislada es estructuralmente insuficiente.
  3. Frente a la literatura de «escuelas efectivas» (Hattie, etc.): ellos buscan efectos de profesor o de escuela; nuestro modelo muestra que el efecto del diseño estructural es de una magnitud mucho mayor. Pasar del escenario base al de continuidad pedagógica implica un aumento de 42,5 puntos porcentuales en el egreso sin repetir y una caída de 38,1 puntos en el abandono. Ninguna intervención docente individual se acerca a ese impacto.

7.8 Aportes originales de este análisis

Este documento ofrece cinco contribuciones específicas al análisis estructural de la escuela secundaria argentina.

1. La formalización matemática del problema

Construimos un modelo probabilístico y de simulación que permite proyectar escenarios contrafactuales con precisión, con intervalos de confianza y análisis de sensibilidad. El modelo integra la distribución Beta-Binomial para capturar la heterogeneidad entre estudiantes, cadenas de Markov para describir la trayectoria del stock de deudas, y simulación basada en agentes para modelar la motivación y el abandono de manera endógena. Todos los programas están disponibles en el apéndice para su reproducción.

Este enfoque no es habitual en la literatura educativa argentina, que suele analizar el problema con estadísticas descriptivas o estudios cualitativos. Nuestro aporte es mostrar que la exclusión escolar puede formalizarse como un problema de probabilidad estructural, con umbrales críticos y estados estacionarios medibles.

2. La identificación de los dos filtros simultáneos y la lógica de la deuda

Mostramos que el problema no es solo la cantidad de materias, sino la combinación de tres elementos:

  • Filtro horizontal: cuántas materias hay que aprobar por año.
  • Filtro vertical: cuántas materias se toleran desaprobadas antes de repetir.
  • Lógica de la deuda: repitencia global (repetir todas las materias, incluso las aprobadas) y mesas de examen aisladas.

La combinación de los tres produce el desgranamiento. Reducir uno solo de ellos no resuelve el problema. Esto se demuestra empíricamente en los experimentos contrafactuales del Capítulo 5.

3. La evidencia de que la eliminación de la repitencia global es el factor dominante

Nuestros experimentos demuestran que la continuidad pedagógica —eliminar la repitencia global y las mesas aisladas, reemplazándolas por evaluación en proceso— es la palanca que más eleva el egreso: de un 53% a un 95% en las simulaciones. Ninguna otra medida individual produce un efecto comparable. El análisis de sensibilidad univariada confirma que este resultado se mantiene bajo 45 combinaciones distintas de parámetros conductuales.

4. La aplicación de la teoría de confiabilidad de sistemas en serie a la interacción educativa

Este es, probablemente, el aporte más novedoso del documento desde el punto de vista metodológico.

La teoría de confiabilidad de sistemas en serie es un marco de la ingeniería: un sistema con componentes en serie falla si falla cualquiera de ellos, y la confiabilidad del sistema es el producto de las confiabilidades individuales. Trasladar esa lógica a la educación —donde «el sistema» es la trayectoria del estudiante y «los componentes» son los factores que deben alinearse para que apruebe— no es habitual en la literatura educativa.

Aplicamos este marco en dos niveles:

Primer nivel: los sesenta filtros del sistema. La escuela secundaria actual exige aprobar sesenta materias a lo largo de cinco años. Cada materia es un componente en serie. La probabilidad de que un estudiante atraviese las sesenta sin fallar ninguna es p60p^{60} , que con p=0,90p = 0{,}90 da apenas 0,2%. Este cálculo muestra que el sistema está diseñado, matemáticamente, para excluir.

Segundo nivel: la interacción estudiante-docente en el aula. En el Capítulo 4 modelamos la aprobación de una materia como el resultado de dos factores independientes —aplicación del estudiante y profesionalidad del docente— que deben superar ambos un umbral mínimo. Es una regla conjuntiva («Y»). Mostramos que:

  • Con probabilidades marginales del 50% en cada factor, la conjunción da 25% y la compensación da 75%.
  • El «impuesto de la conjunción» —lo que se pierde por exigir ambos factores a la vez— crece cuando los factores son moderados y cuando uno de ellos es el cuello de botella.
  • La varianza alta polariza: más extremos, más desigualdad.
  • La correlación positiva entre ambos factores beneficia a los que ya están arriba y castiga a los que están abajo.

Este análisis es original porque aplica al aula un marco que hasta ahora se usaba solo en ingeniería y en psicometría de decisiones de admisión. Y muestra que la regla conjuntiva del sistema actual no es neutral: castiga sistemáticamente a los estudiantes promedio.

5. La demostración de que el ABP funciona como compensación parcial

El aprendizaje basado en proyectos, modelado de manera endógena, mejora el egreso en todos los escenarios probados. La mejora es modesta —entre +1,5 y +5,8 puntos porcentuales— porque la correlación entre las materias del mismo estudiante limita el poder de la compensación. Pero el hallazgo central es que el ABP nunca perjudica y siempre aporta, con mayor efecto cuando los proyectos combinan materias de tipos poco correlacionados.

La contribución aquí no es solo empírica (el ABP mejora), sino metodológica: mostramos cómo modelar la compensación de manera endógena, sin imponer un factor fijo de mejora, y cómo medir su efecto en función de la estructura de correlación entre las materias agrupadas.

7.9 Conclusión: un enfoque complementario, no alternativo

Nuestro análisis no pretende reemplazar la literatura existente, sino complementarla. Mientras los estudios sociológicos y pedagógicos explican por qué los estudiantes fracasan, nuestro modelo muestra qué probabilidad tienen de fracasar dado un diseño estructural. Ambas perspectivas son necesarias: sin la primera, el análisis es frío y deshumanizado; sin la segunda, la intervención es intuitiva y poco precisa.

La conclusión central es inequívoca: la escuela secundaria actual, con su organización graduada, fragmentada y evaluativa, es un dispositivo que excluye. La única salida es un rediseño simultáneo de currículum (menos áreas), régimen (sin repitencia global) y recuperación (continuidad pedagógica). No hay atajos: tocar una sola variable no alcanza.

La escuela secundaria argentina enfrenta una encrucijada. Puede seguir funcionando como filtro, naturalizando la exclusión y llamando éxito a la supervivencia de los más fuertes. O puede asumir su misión niveladora y cambiar su diseño para que la inclusión no sea solo un discurso, sino una realidad verificable en los números. Este análisis no pretendió ofrecer soluciones mágicas ni fórmulas definitivas; solo quiso poner sobre la mesa, con la frialdad de los números, una verdad incómoda: el sistema actual es matemáticamente insostenible. Y si la escuela no lo enfrenta, lo enfrentarán los estudiantes, uno a uno, en silencio, año tras año, hasta que las aulas se vacíen.

7.10 Un cambio posible, no utópico

Este cambio no requiere reformas constitucionales ni presupuestos millonarios. Requiere una decisión pedagógica y política de la propia institución, dentro de los márgenes que el sistema permite. Muchas escuelas ya han avanzado en esa dirección, integrando materias, trabajando por proyectos, reorganizando los tiempos y los agrupamientos. No es una utopía: es una posibilidad real que depende, en primer lugar, de reconocer que el diseño actual es insostenible.

La evidencia internacional (Crahay, 2013; UNESCO/IIEP, 2021) muestra que la supresión de la repetición solo es sostenible si se redistribuye el costo docente de la repetición (año extra, mesas) hacia apoyo integrado en el horario lectivo. Nuestro modelo cuantifica ese umbral: se necesita una probabilidad de recuperación en proceso de al menos 0,45 para mantener bajo el stock de deuda. No es utopía, es reingeniería de recursos: las horas que hoy se gastan en mesas de examen, comisiones de previas y dictado de años repetidos son las mismas horas que financian la continuidad pedagógica.

Además de la continuidad pedagógica, el diseño de proyectos interdisciplinarios que agrupen materias de distintas áreas permite aprovechar la compensación de fortalezas y debilidades. Esta estrategia, conocida como aprendizaje basado en proyectos, no solo reduce la deuda acumulada, sino que mejora la calidad del egreso. Su implementación no requiere recursos extraordinarios: solo reorganizar la planificación anual para que dos o más docentes trabajen juntos en torno a proyectos comunes.

La escuela que quiera ser verdaderamente inclusiva debe empezar por medir sus propios números. Debe calcular cuántos estudiantes egresan en tiempo, cuántos repiten, cuántos abandonan y cuántas materias pendientes se acumulan. Debe mirar la trayectoria completa, no solo el tramo final. Y debe preguntarse, con honestidad, si el diseño que tiene contribuye a nivelar o a filtrar.

Porque el problema no es la mala voluntad de los docentes ni la falta de esfuerzo de los estudiantes. Es un problema matemático: sesenta filtros, un umbral de cuatro materias y una lógica de deuda punitiva en un sistema que dice ser inclusivo. Y la solución también es matemática: rediseñar los filtros y transformar la lógica de la deuda, para que la escuela pueda cumplir lo que promete.

7.11 Objeciones y respuestas anticipadas

A continuación, anticipamos las objeciones más probables que podrían plantearse contra este trabajo, junto con las respuestas basadas en la evidencia y los argumentos desarrollados.

Objeción 1: «Es una tautología: proponen eliminar la repitencia para resolver la repitencia.»

Respuesta: No es tautología. No proponemos simplemente «eliminar la repitencia» como un acto administrativo aislado. Mostramos que la repitencia es consecuencia de un diseño estructural (60 filtros + umbral 4 + mesas aisladas). Si se elimina la repitencia sin cambiar nada más, se produce el efecto «título vacío» que documentamos (umbral 10: 20,6% de egresados con más de 5 previas). La propuesta integral es rediseñar la lógica de la deuda: menos fragmentación, promoción con acompañamiento y evaluación continua. La simulación demuestra que esta combinación no solo aumenta el egreso, sino que reduce el stock de deuda remanente y mantiene la motivación alta. No es quitar el problema, es cambiar el mecanismo que lo produce.

Objeción 2: «Eso es bajar la exigencia: si todos pasan, nadie aprende.»

Respuesta: La evidencia de sensibilidad a pcontinuap_{\text{continua}} muestra que la continuidad pedagógica mantiene alto egreso incluso con baja probabilidad de saldar deudas, pero el stock de deuda remanente crece si la recuperación es débil. Por eso insistimos en que la calidad exige pcontinua≥0,45p_{\text{continua}} \ge 0{,}45 . La propuesta no es «aprobar a todos sin aprender», sino sostener la exigencia dentro de un sistema de acompañamiento. La diferencia es que el estudiante no es castigado con la repitencia global, sino que recibe apoyo integrado en el horario. La literatura (Crahay, Hattie, Shepard) muestra que la repitencia no mejora aprendizajes; la promoción con apoyo sí lo hace, cuando se implementa con recursos pedagógicos adecuados.

Objeción 3: «La repitencia es necesaria para que los estudiantes aprendan los contenidos mínimos antes de avanzar.»

Respuesta: Este argumento confunde evaluación formativa con selección punitiva. La concatenación de contenidos (no se puede multiplicar sin sumar) se resuelve con la continuidad pedagógica: el docente del año siguiente trabaja las deudas en proceso. La repitencia global no resuelve esa concatenación; solo castiga al estudiante obligándolo a recursar materias ya aprobadas. Nuestro modelo muestra que la repitencia es un predictor de abandono, no un mecanismo de recuperación. La evidencia internacional (Brasil, Finlandia, Francia) indica que los sistemas sin repitencia y con apoyo integrado logran mejores trayectorias sin sacrificar aprendizajes.

Objeción 4: «La continuidad pedagógica es utópica: los docentes no dan abasto, no hay recursos.»

Respuesta: El costo es esencialmente redistribución de recursos existentes. Hoy se gastan horas en mesas de examen, comisiones de previas, dictado de años repetidos y gestión de repitencia. Esas mismas horas pueden destinarse a apoyo integrado en el horario lectivo. Crahay y Duarte/UNESCO-IIPE lo demuestran: no se requiere más presupuesto, sino reasignar el gasto desde la repitencia hacia la continuidad. Además, la simulación muestra que con pcontinua=0,45p_{\text{continua}} = 0{,}45 (no 1,0) ya se logra bajo stock de deuda. No es utopía; es reingeniería de recursos.

Objeción 5: «El modelo es demasiado simplista: no captura la complejidad real de las aulas.»

Respuesta: Es cierto y lo declaramos explícitamente. El modelo es deliberadamente conservador y simplificado. Pero su valor es probar la lógica estructural con pocas variables. Si aun con supuestos optimistas el sistema colapsa, la realidad solo puede ser peor. Además, los resultados cualitativos (egreso ~53% con repitencia, ~95% con continuidad) coinciden con datos empíricos y con la literatura. La simplicidad no es debilidad: es una virtud que permite aislar los mecanismos.

Objeción 6: «El umbral proporcional desmiente la mejora: si se mantiene la proporción, reducir materias no ayuda.»

Respuesta: Exacto, y lo mostramos con honestidad. Reducir materias sin cambiar la lógica de la deuda no alcanza. La clave es eliminar la repitencia global y reemplazarla por continuidad. El umbral proporcional es un refinamiento que refuerza la tesis: el problema es la interacción de filtros, no uno solo. Por eso nuestra propuesta es integral.

Objeción 7: «¿No es lo mismo que subir el umbral a 10? Ustedes critican eso y luego proponen algo parecido.»

Respuesta: No. Subir el umbral a 10 mantiene las mesas aisladas y produce deuda oculta. La continuidad pedagógica elimina las mesas y la repitencia, e incorpora la recuperación en el proceso de enseñanza. La diferencia está en que las deudas se trabajan activamente, no se postergan. La simulación muestra que la continuidad reduce el stock de deuda a menos de 1 materia, mientras que el umbral 10 lo eleva a más de 3.

Objeción 8: «¿Qué pasa con la concatenación de contenidos? Si un estudiante no sabe sumar, no puede multiplicar.»

Respuesta: Precisamente por eso es necesaria la continuidad pedagógica. El docente que recibe al estudiante en el año siguiente detecta la falencia y la trabaja en proceso. La repitencia global no resuelve la concatenación; solo retrasa al estudiante un año entero, con desmotivación y abandono. La evaluación continua es más eficaz para asegurar que los contenidos se aprendan en secuencia.

Objeción 9: «¿No están ignorando los problemas socioeconómicos y familiares?»

Respuesta: Los mencionamos como limitaciones, pero el objetivo es mostrar qué puede hacer la escuela con sus propios recursos. La estructura de filtros es una variable interna que la institución puede modificar sin esperar cambios sociales. No negamos la influencia de la pobreza, la familia o el mercado laboral; simplemente decimos que, aun controlando esos factores, el diseño actual es excluyente. Si la escuela no puede cambiar la sociedad, al menos puede cambiar su propia arquitectura.

Objeción 10: «¿Por qué no hablan de la formación docente o de la calidad de las clases?»

Respuesta: La formación docente es importante, pero es una variable pedagógica, no estructural. Un docente excelente atrapado en una estructura de 60 filtros y repitencia global verá limitado su impacto. Nuestro modelo muestra que el efecto del diseño es enorme (42,5 puntos de egreso). Mejorar la formación sin cambiar la arquitectura es como ponerle neumáticos nuevos a un auto con el motor fundido.

7.12 La dimensión ética y política del diseño

El sistema educativo argentino declara, por un lado, que la escuela secundaria es un derecho, un espacio de inclusión y nivelación de oportunidades. Por otro lado, implementa una estructura de sesenta filtros evaluativos y un umbral de cuatro materias desaprobadas que determina la repitencia. Estas dos metas son incompatibles en el diseño.

La repitencia no es una solución pedagógica al bajo rendimiento; es un mecanismo de selección que desplaza la responsabilidad del fracaso desde el sistema hacia el estudiante. El Estado obliga al joven a asistir a la escuela, le impone un currículum fragmentado y, si no logra cumplir con todos los requisitos, lo castiga con la repitencia y, eventualmente, con el abandono. El estudiante es forzado a estar en la escuela, pero se le hace responsable de un resultado negativo en un proceso de enseñanza-aprendizaje que debería estar garantizado por los profesionales y por la institución.

La escuela se financia con dinero de los contribuyentes. Si ese dinero se utiliza para sostener un sistema que discrimina a los estudiantes con mayores dificultades, entonces la institución está traicionando su mandato. No se trata de «bajar la exigencia» ni de «regalar títulos»: se trata de cumplir con la obligación de enseñar de manera efectiva, acompañando a cada estudiante en su trayectoria.

7.12.1 Una contradicción estructural, no una falla de actores

Es importante aclarar que el problema que hemos descrito no se origina en la mala voluntad de las personas que trabajan en el sistema educativo. Docentes, directivos, supervisores y funcionarios actúan dentro de un marco de reglas que no eligieron y que, en muchos casos, los obliga a operar de maneras que contradicen sus propias convicciones pedagógicas. El docente que aprueba al 90% de sus estudiantes está haciendo lo que el sistema le pide; el directivo que gestiona las mesas de examen y las previas está cumpliendo con una normativa que no diseñó; el funcionario que asigna recursos a la repitencia está respondiendo a una estructura de incentivos que premia la continuidad del statu quo.

El problema es estructural, no personal. Y por eso las soluciones que apelan a mejorar la formación docente, aumentar la inversión o concientizar a los actores, aunque valiosas, son insuficientes si no se cambia la arquitectura del sistema. Un docente excelente atrapado en una estructura de sesenta filtros y repitencia global verá limitado su impacto. Un directivo comprometido que intente reducir la repitencia sin cambiar las reglas se encontrará con que el sistema lo obliga a reproducir las mismas prácticas. Un funcionario dispuesto a innovar descubrirá que los incentivos institucionales lo empujan hacia la continuidad, no hacia el cambio.

7.12.2 Desalineación de incentivos

La persistencia del sistema actual no se explica por la mala fe de sus actores, sino por una desalineación de incentivos institucionales. El diseño actual genera una serie de recompensas implícitas que favorecen la continuidad del statu quo, incluso cuando todos los involucrados reconocen que el sistema no funciona.

Algunos ejemplos concretos:

  • La repitencia consume recursos que podrían reasignarse. Cada estudiante que repite un año genera horas cátedra, comisiones de examen, mesas de previas y gestión administrativa. Esos recursos están hoy comprometidos en sostener el mecanismo de exclusión. Reasignarlos a la continuidad pedagógica requiere decisión política, no más presupuesto.
  • La fragmentación curricular multiplica puestos de trabajo. Sesenta materias por cohorte requieren más docentes que treinta áreas integradas. Eso no es un argumento contra la integración, pero explica por qué la reforma enfrenta resistencias: no por mala voluntad, sino porque cambia la distribución de los puestos.
  • Las mesas de examen justifican dedicaciones y cargos. El sistema de mesas aisladas genera horas adicionales para docentes y equipos de gestión. Reemplazarlas por continuidad pedagógica implica reorganizar esas horas, no eliminarlas.
  • Los indicadores oficiales miden el flujo, no el stock. Las estadísticas que reportan las escuelas suelen informar cuántos aprueban y cuántos repiten, pero no cuántas previas acumula el sistema. Eso invisibiliza el problema y desincentiva su abordaje.

Ninguna de estas dinámicas implica una conspiración. Son consecuencias naturales de una arquitectura que fue diseñada para otra época y que nunca se actualizó. Pero sí explican por qué la reforma estructural es difícil: no basta con convencer a los actores de que el cambio es necesario; hay que cambiar las reglas que determinan sus incentivos.

7.12.3 La reingeniería de recursos

Nuestro análisis matemático demuestra que la estructura actual —sesenta filtros, umbral 4, mesas aisladas— genera exclusión por diseño, independientemente de la calidad docente o del esfuerzo estudiantil. La propuesta de continuidad pedagógica no es una utopía: es una reingeniería de recursos que reasigna las horas hoy destinadas a repitencia y mesas hacia un acompañamiento integrado en el horario lectivo.

No se necesita más presupuesto. Se necesita reorganizar el que ya existe. Las horas que hoy se gastan en:

  • Dictar el mismo año dos veces al mismo estudiante.
  • Preparar y tomar mesas de examen aisladas.
  • Gestionar administrativamente la acumulación de previas.
  • Supervisar cohortes que se desgranan año tras año.

Son las mismas horas que financiarían:

  • Tutorías integradas en el horario escolar.
  • Acompañamiento pedagógico continuo.
  • Evaluación formativa en proceso.
  • Proyectos interdisciplinarios que compensen debilidades.

El cambio no requiere reformas constitucionales ni presupuestos extraordinarios. Requiere decisión pedagógica y política de la propia institución, dentro de los márgenes que el sistema permite. Muchas escuelas ya han avanzado en esa dirección, integrando materias, trabajando por proyectos, reorganizando los tiempos y los agrupamientos. No es una utopía: es una posibilidad real que depende, en primer lugar, de reconocer que el diseño actual es insostenible.

7.12.4 La responsabilidad pública

La escuela secundaria argentina no solo tiene un problema de diseño matemático: tiene un problema de responsabilidad pública. El sistema se financia con dinero de los contribuyentes, y ese dinero se utiliza hoy para sostener un mecanismo que excluye a la mitad de los estudiantes antes de que terminen el nivel.

La dimensión ética de este problema no puede quedar fuera del debate. No se trata de señalar culpables individuales, sino de reconocer una contradicción estructural: el sistema que debería garantizar el derecho a la educación se ha convertido en un filtro que excluye a los más vulnerables. Y esa contradicción se sostiene, año tras año, con recursos públicos que provienen de toda la sociedad, incluidas las familias cuyos hijos son excluidos.

La continuidad pedagógica no es una utopía: es la única manera de que la escuela cumpla su promesa. Si la escuela no asume esta responsabilidad, seguirá siendo lo que es: una máquina de exclusión financiada por aquellos a quienes excluye.

Apéndice: Códigos, fórmulas y justificación

Este apéndice reúne todos los programas utilizados en las simulaciones, las fórmulas matemáticas clave y las explicaciones necesarias para que cualquier lector pueda reproducir los resultados y verificar la validez del análisis. Los códigos están escritos en Python puro, con dependencias mínimas (numpy, math, csv), y pueden ejecutarse en cualquier entorno con Python 3.

A.1 Código principal de simulación basada en agentes

Este programa simula la trayectoria de miles de estudiantes a lo largo de la escuela secundaria, con reglas de promoción, mesas de examen, motivación y abandono. Permite modificar parámetros para experimentar escenarios contrafactuales.

import numpy as np
from collections import defaultdict

# ------------------------------------------
# Parámetros base
# ------------------------------------------
params = {
    "anio_inicio": 2026,
    "anios_simulacion": 20,
    "nuevos_por_anio": 1000,
    "materias_por_anio": 12,      # cambiar a 6 en escenarios de áreas
    "anios_ciclo": 5,
    "mu_p": 0.15,
    "sigma_p": 0.10,
    "p_mesa": 0.25,
    "umbral_repitencia": 5,
    "motivacion_inicial": 1.0,
    "factor_reduccion_repitencia": 0.20,
    "factor_reduccion_stock_alto": 0.05,
    "factor_mejora_promocion": 0.02,
    "factor_motivacion_prob": 0.5,
    "p_abandono_base_repitencia": 0.15,
    "p_abandono_base_promocion_stock_alto": 0.05,
    "p_abandono_base_promocion_stock_bajo": 0.01,
    "p_abandono_factor_motivacion": 0.1,
    "motivacion_minima": 0.1,
    "continuidad_pedagogica": False,
    "p_continua": 0.55
}

def sample_beta(alpha, beta, size=None):
    if size is None:
        return np.random.gamma(alpha, 1.0) / (np.random.gamma(alpha, 1.0) + np.random.gamma(beta, 1.0))
    x = np.random.gamma(alpha, 1.0, size=size)
    y = np.random.gamma(beta, 1.0, size=size)
    return x / (x + y)

def obtener_parametros_beta(mu, sigma):
    s = (mu * (1 - mu) / (sigma ** 2)) - 1
    return mu * s, (1 - mu) * s

class Estudiante:
    def __init__(self, id_estudiante, anio_ingreso, p_base, params):
        self.id = id_estudiante
        self.anio_ingreso = anio_ingreso
        self.p_base = p_base
        self.curso = 1
        self.stock = 0
        self.motivacion = params["motivacion_inicial"]
        self.activo = True
        self.num_repeticiones = 0

    def cursar_anio(self, params, anio_actual):
        if not self.activo:
            return None

        p_eff = min(self.p_base * (1 + (1 - self.motivacion) * params["factor_motivacion_prob"]), 1.0)
        m = params["materias_por_anio"]
        desaprobadas = np.random.binomial(m, p_eff)

        stock_pre = self.stock + desaprobadas

        if params.get("continuidad_pedagogica", False):
            aprobadas = np.random.binomial(stock_pre, params["p_continua"])
            stock_final = stock_pre - aprobadas
            estado = "promocion"
            self.stock = stock_final
            self.curso += 1
        else:
            aprobadas_mesa = np.random.binomial(stock_pre, params["p_mesa"])
            stock_final = stock_pre - aprobadas_mesa

            if stock_final >= params["umbral_repitencia"]:
                estado = "repitencia"
                self.stock = stock_final
                self.num_repeticiones += 1
            else:
                estado = "promocion"
                self.stock = stock_final
                self.curso += 1

        egresado = False
        if self.curso > params["anios_ciclo"]:
            egresado = True
            self.activo = False
            self.curso = params["anios_ciclo"]

        # Motivación
        if not params.get("continuidad_pedagogica", False) and estado == "repitencia":
            self.motivacion -= params["factor_reduccion_repitencia"]
        elif stock_final >= 4:
            self.motivacion -= params["factor_reduccion_stock_alto"]
        else:
            self.motivacion += params["factor_mejora_promocion"]
        self.motivacion = max(0.0, min(1.0, self.motivacion))

        # Abandono
        if self.motivacion < params["motivacion_minima"]:
            abandona = True
        else:
            if not params.get("continuidad_pedagogica", False) and estado == "repitencia":
                p_ab = params["p_abandono_base_repitencia"]
            elif stock_final >= 4:
                p_ab = params["p_abandono_base_promocion_stock_alto"]
            else:
                p_ab = params["p_abandono_base_promocion_stock_bajo"]
            if self.motivacion < 0.5:
                p_ab += params["p_abandono_factor_motivacion"]
            p_ab = min(p_ab, 1.0)
            abandona = np.random.rand() < p_ab

        if abandona:
            self.activo = False

        return {
            "id": self.id,
            "anio_ingreso": self.anio_ingreso,
            "anio": anio_actual,
            "curso": self.curso,
            "stock_final": stock_final,
            "motivacion": round(self.motivacion, 4),
            "abandona": abandona,
            "egresado": egresado,
            "num_repeticiones": self.num_repeticiones
        }

def simular(params, semilla=42):
    np.random.seed(semilla)
    alpha, beta = obtener_parametros_beta(params["mu_p"], params["sigma_p"])
    activos = []
    registros = []
    siguiente_id = 1

    for anio in range(params["anio_inicio"], params["anio_inicio"] + params["anios_simulacion"]):
        for _ in range(params["nuevos_por_anio"]):
            p_base = sample_beta(alpha, beta)
            activos.append(Estudiante(siguiente_id, anio, p_base, params))
            siguiente_id += 1

        for estudiante in activos:
            reg = estudiante.cursar_anio(params, anio)
            if reg is not None:
                registros.append(reg)

        activos = [e for e in activos if e.activo]

    return registros

def analizar(registros, cohortes=range(2026, 2036)):
    registros = [r for r in registros if r["anio_ingreso"] in cohortes]
    ultimo = {}
    for r in registros:
        if r["id"] not in ultimo or r["anio"] > ultimo[r["id"]]["anio"]:
            ultimo[r["id"]] = r

    total = len(ultimo)
    egresados = [r for r in ultimo.values() if r["egresado"]]
    abandonos = sum(1 for r in ultimo.values() if r["abandona"])
    egres_sin_rep = sum(1 for r in egresados if r["num_repeticiones"] == 0)

    stocks = [r["stock_final"] for r in egresados]
    stock_medio = np.mean(stocks) if stocks else float('nan')
    pct_mas5 = sum(1 for s in stocks if s > 5) / len(stocks) * 100 if stocks else float('nan')

    return {
        "egres_sin_rep": egres_sin_rep / total * 100,
        "egres_total": len(egresados) / total * 100,
        "abandono": abandonos / total * 100,
        "stock_medio": stock_medio,
        "pct_mas5": pct_mas5
    }

if __name__ == "__main__":
    res = analizar(simular(params))
    print(f"Egreso sin repetir: {res['egres_sin_rep']:.1f}%")
    print(f"Egreso total: {res['egres_total']:.1f}%")
    print(f"Abandono: {res['abandono']:.1f}%")
    print(f"Stock medio al egreso: {res['stock_medio']:.2f}")
    print(f"% Egresados con >5 previas: {res['pct_mas5']:.1f}%")

Uso: modificar params para cada escenario y ejecutar. Por ejemplo, para continuidad pedagógica con 6 materias, cambiar materias_por_anio = 6, continuidad_pedagogica = True, p_continua = 0.55.

A.2 Código para la distribución Beta-Binomial exacta

Calcula la probabilidad de desaprobar exactamente kk materias en nn materias, bajo heterogeneidad Beta.

from math import comb, gamma

def beta_func(a, b):
    return gamma(a) * gamma(b) / gamma(a + b)

def beta_binom_pmf(k, n, alpha, beta):
    return comb(n, k) * beta_func(k + alpha, n - k + beta) / beta_func(alpha, beta)

alpha = 1.7625
beta = 9.9875

for n in [12, 6]:
    print(f"\nDistribución Beta-Binomial (n={n})")
    for k in range(n + 1):
        p = beta_binom_pmf(k, n, alpha, beta)
        print(f"P(X={k}) = {p:.6f} ({p*100:.2f}%)")

A.3 Código para la matriz de transición de Markov homogénea

Calcula la matriz de transición del modelo homogéneo y la probabilidad acumulada de repitencia en 5 años.

from math import comb

def prob_transicion(m, q, p_mesa, umbral, d, j):
    prob = 0.0
    for x in range(m + 1):
        px = comb(m, x) * (q ** x) * ((1 - q) ** (m - x))
        s = d + x
        if j == umbral:  # R
            for y in range(umbral, s + 1):
                prob += px * comb(s, y) * ((1 - p_mesa) ** y) * (p_mesa ** (s - y))
        else:
            if s >= j:
                prob += px * comb(s, j) * ((1 - p_mesa) ** j) * (p_mesa ** (s - j))
    return prob

def evolucion_markov(m, q, p_mesa, umbral, anios=5):
    n_estados = umbral + 1
    M = []
    for d in range(umbral):
        fila = []
        for j in range(umbral + 1):
            fila.append(prob_transicion(m, q, p_mesa, umbral, d, j))
        M.append(fila)
    v = [0.0] * n_estados
    v[0] = 1.0
    for _ in range(anios):
        v_nuevo = [0.0] * n_estados
        for d in range(umbral):
            for j in range(umbral + 1):
                v_nuevo[j] += v[d] * M[d][j]
        v_nuevo[umbral] += v[umbral]
        v = v_nuevo
    return v[umbral]

print(f"12 materias, umbral 5: {evolucion_markov(12, 0.10, 0.25, 5)*100:.2f}%")
print(f"6 materias, umbral 3: {evolucion_markov(6, 0.10, 0.25, 3)*100:.2f}%")
print(f"6 materias, umbral 2: {evolucion_markov(6, 0.10, 0.25, 2)*100:.2f}%")

Salida esperada: 12 materias, umbral 5: 19,63%; 6 materias, umbral 3: 23,35%; 6 materias, umbral 2: 56,13%.

A.4 Código para análisis de sensibilidad

Incluye dos análisis: variación de pcontinuap_{\text{continua}} y de σp\sigma_p .

import numpy as np
from collections import defaultdict

# (Reutilizar funciones de A.1 para sample_beta, obtener_parametros_beta, Estudiante, simular, analizar)

if __name__ == "__main__":
    # Análisis 1: p_continua
    print("Sensibilidad a p_continua (6 materias, continuidad)")
    for p_cont in [0.25, 0.35, 0.45, 0.55, 0.65]:
        params = params_base.copy()
        params["materias_por_anio"] = 6
        params["continuidad_pedagogica"] = True
        params["p_continua"] = p_cont
        registros = simular(params, semilla=42)
        res = analizar(registros)
        print(f"{p_cont:.2f} | {res['egres_sin_rep']:.1f} | {res['egres_total']:.1f} | {res['abandono']:.1f}")

    # Análisis 2: sigma_p
    print("\nSensibilidad a sigma_p")
    for sigma in [0.10, 0.15, 0.20]:
        # Base
        params_base = params.copy()
        params_base["materias_por_anio"] = 12
        params_base["umbral_repitencia"] = 5
        params_base["continuidad_pedagogica"] = False
        params_base["sigma_p"] = sigma
        reg_base = simular(params_base, semilla=42)
        res_base = analizar(reg_base)
        # Continuidad
        params_cont = params.copy()
        params_cont["materias_por_anio"] = 6
        params_cont["continuidad_pedagogica"] = True
        params_cont["p_continua"] = 0.55
        params_cont["sigma_p"] = sigma
        reg_cont = simular(params_cont, semilla=42)
        res_cont = analizar(reg_cont)
        print(f"Base | sigma_p={sigma} | {res_base['egres_sin_rep']:.1f} | {res_base['abandono']:.1f}")
        print(f"Continuidad | sigma_p={sigma} | {res_cont['egres_sin_rep']:.1f} | {res_cont['abandono']:.1f}")

A.5 Simulación de stock al egreso según pcontinuap_{\text{continua}}

Esta sección presenta el programa utilizado para evaluar cómo varía el stock de deuda al momento de egresar en función de la probabilidad de saldar deudas en proceso. Es una extensión del análisis de sensibilidad del Capítulo 5, que muestra que el egreso masivo se logra incluso con pcontinuap_{\text{continua}} bajo, pero que la calidad del egreso (medida por el stock residual) exige un valor al menos moderado.

A.5.1 Diseño

Se ejecuta el escenario de continuidad pedagógica con 6 materias, sin repitencia, y se varía pcontinuap_{\text{continua}} desde 0,25 hasta 0,65. Para cada valor se reportan cinco indicadores:

  • Egreso sin repetir: porcentaje de la cohorte que termina la secundaria sin haber repetido ningún año.
  • Egreso total: porcentaje que termina la cursada, independientemente de repeticiones.
  • Abandono: porcentaje que deja la escuela antes de terminar.
  • Stock medio al egreso: cantidad promedio de materias pendientes al momento de egresar.
  • % con más de 5 previas: porcentaje de egresados que arrastran más de 5 materias sin saldar.

Se ejecutan 30 semillas por valor de pcontinuap_{\text{continua}} , con 1000 estudiantes por cohorte.

A.5.2 Resultados

Stock al egreso según la probabilidad de recuperación en proceso
pcontinuap_{\text{continua}} Egreso sin repetir Abandono Stock medio al egreso % con más de 5 previas
0,2594,6%7,1%2,259,3%
0,3595,0%6,4%1,614,3%
0,4595,4%5,7%1,151,5%
0,5595,8%5,3%0,800,4%
0,6595,6%5,4%0,530,1%

A.5.3 Interpretación

El egreso sin repetir se mantiene por encima del 94% en todos los valores probados. Es decir, la eliminación de la repitencia garantiza el egreso masivo incluso con una probabilidad de recuperación débil. Ese es el hallazgo central que refuerza la tesis del documento: la palanca dominante es la continuidad pedagógica, no la intensidad de la recuperación.

Sin embargo, la calidad del egreso sí depende de pcontinuap_{\text{continua}} . Con pcontinua=0,25p_{\text{continua}} = 0{,}25 , el stock medio al egresar es de 2,25 materias y el 9,3% de los egresados arrastra más de 5 previas. Con pcontinua=0,55p_{\text{continua}} = 0{,}55 , el stock medio baja a 0,80 y el porcentaje con más de 5 previas se reduce al 0,4%. Es decir, si la institución quiere que sus egresados no arrastren deuda significativa, necesita mantener una probabilidad de recuperación en proceso de al menos 0,45.

El análisis sugiere que el umbral operativo está en torno a pcontinua=0,45p_{\text{continua}} = 0{,}45 : por encima de ese valor, el stock residual se mantiene bajo control (menos de 1,15 materias por egresado, y menos del 1,5% con más de 5 previas). Por debajo, el sistema egresa a los estudiantes pero con una deuda acumulada que compromete la calidad del título.

A.5.4 Conexión con el resto del documento

Los resultados de este análisis se reportan en la sección 5.9 del Capítulo 5, en la tabla de sensibilidad a pcontinuap_{\text{continua}} , y en la sección 7.4, donde se discute la importancia de mantener una recuperación moderada para que el egreso sea de calidad y no solo de cantidad.

CÓDIGO PYTHON:

import numpy as np

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros
# ==============================================================
ANIO_INICIO = 2026
ANIOS_SIM = 20
ANIOS_CICLO = 5
NUEVOS_POR_ANIO = 1000
P_APROB = 0.85
UMBRAL = norm_ppf(1 - P_APROB)
P_MESA = 0.25
N_SEM = 30
SEED0 = 1000

# Estructura de correlación
RHO_COMUN = 0.15
RHO_TIPO  = 0.40
RHO_APT   = 0.0

# Parámetros de motivación y abandono
FACTOR_RED_REP = 0.20
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
P_AB_REP = 0.15
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]

# ==============================================================
# Generación de latentes (modo suelto con 6 materias)
# ==============================================================
def generar_latentes(n_est, modo, rng, n_materias=6):
    """
    Genera latentes para el escenario de continuidad con 6 materias.
    Se toman las primeras 6 materias del listado MATERIAS.
    """
    F = rng.normal(size=n_est)
    H = rng.normal(size=(n_est, 4))
    L = np.linalg.cholesky((1 - RHO_APT) * np.eye(4) +
                           RHO_APT * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - RHO_COMUN - RHO_TIPO)

    Z = np.zeros((n_est, n_materias))
    for j in range(n_materias):
        _, tipo = MATERIAS[j]
        t = TIPOS[tipo]
        E = rng.normal(size=n_est)
        Z[:, j] = (np.sqrt(RHO_COMUN) * F +
                   np.sqrt(RHO_TIPO) * H[:, t] +
                   np.sqrt(var_base) * E)
    return Z

# ==============================================================
# Simulación de cohorte con continuidad pedagógica
# ==============================================================
def simular_cohorte(n_est, p_continua, seed):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    motiv = np.ones(n_est)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)

    for anio in range(ANIOS_CICLO):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break

        Z = generar_latentes(len(idx), "suelto", rng, n_materias=6)
        desplazamiento = (1 - motiv[idx]) * 0.5
        Z_ajustado = Z - desplazamiento[:, None]
        fallas = (Z_ajustado < UMBRAL).sum(axis=1)
        stock_pre = stock[idx] + fallas

        # Continuidad pedagógica: siempre promociona
        aprob = rng.binomial(stock_pre, p_continua)
        stock_final = stock_pre - aprob
        curso[idx] += 1
        stock[idx] = stock_final

        # Egreso
        egresa_idx = idx[curso[idx] > ANIOS_CICLO]
        activo[egresa_idx] = False

        # Motivación
        sigue = activo[idx]
        sube = stock_final < 4
        motiv[idx] = np.where(sube,
                              np.minimum(motiv[idx] + FACTOR_MEJORA_PROM, 1.0),
                              np.maximum(motiv[idx] - FACTOR_RED_STOCK_ALTO, 0.0))

        # Abandono
        p_ab = np.where(stock_final >= 4, P_AB_STOCK_ALTO, P_AB_STOCK_BAJO)
        p_ab = np.where(motiv[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motiv[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona = rng.random(len(idx)) < p_ab
        abandona = abandona & sigue
        activo[idx[abandona]] = False

    egresados = ~activo & (curso > ANIOS_CICLO)
    abandonos = ~activo & (curso <= ANIOS_CICLO)
    stocks_egr = stock[egresados] if egresados.any() else np.array([])

    return {
        "egres_sin_rep": (egresados & (num_rep == 0)).sum() / n_est * 100,
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonos.sum() / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
        "pct_mas5": (stocks_egr > 5).mean() * 100 if len(stocks_egr) > 0 else 0.0,
    }

# ==============================================================
# Ejecución: barrido de p_continua
# ==============================================================
if __name__ == "__main__":
    print("=" * 90)
    print("STOCK AL EGRESO SEGÚN p_continua (6 materias, continuidad pedagógica)")
    print("=" * 90)
    print(f"{N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print(f"P_APROB = {P_APROB}, UMBRAL = {UMBRAL:.4f}")
    print()

    valores_p = [0.25, 0.35, 0.45, 0.55, 0.65]

    print(f"{'p_cont':>8} | {'Egreso s/rep':>13} | {'Egreso total':>13} | "
          f"{'Abandono':>10} | {'Stock medio':>12} | {'% >5 prev':>10}")
    print("-" * 95)

    for p_cont in valores_p:
        rs = []
        for s in range(N_SEM):
            rs.append(simular_cohorte(NUEVOS_POR_ANIO, p_cont, seed=SEED0 + s))
        r = {k: np.mean([x[k] for x in rs]) for k in rs[0]}
        print(f"{p_cont:>8.2f} | "
              f"{r['egres_sin_rep']:>12.1f}% | "
              f"{r['egres_total']:>12.1f}% | "
              f"{r['abandono']:>9.1f}% | "
              f"{r['stock_medio']:>11.2f} | "
              f"{r['pct_mas5']:>9.1f}%")

Salida esperada:

p_cont   |  Egreso s/rep |  Egreso total |   Abandono |  Stock medio |  % >5 prev
-------------------------------------------------------------------------------------------
    0.25 |         94.6% |         94.6% |       7.1% |         2.25 |       9.3%
    0.35 |         95.0% |         95.0% |       6.4% |         1.61 |       4.3%
    0.45 |         95.4% |         95.4% |       5.7% |         1.15 |       1.5%
    0.55 |         95.8% |         95.8% |       5.3% |         0.80 |       0.4%
    0.65 |         95.6% |         95.6% |       5.4% |         0.53 |       0.1%

A.6 Código para resumen por curso (motivación y stock)

def resumen_por_curso(registros):
    ultimo_anio = max(r["anio"] for r in registros)
    regs_ultimo = [r for r in registros if r["anio"] == ultimo_anio and not r["egresado"]]
    por_curso = defaultdict(lambda: {"motiv": [], "stock": []})
    for r in regs_ultimo:
        por_curso[r["curso"]]["motiv"].append(r["motivacion"])
        por_curso[r["curso"]]["stock"].append(r["stock_final"])
    print(f"\nResumen por curso en {ultimo_anio}")
    for curso in sorted(por_curso):
        motiv = np.mean(por_curso[curso]["motiv"])
        stock = np.mean(por_curso[curso]["stock"])
        n = len(por_curso[curso]["motiv"])
        print(f"{curso} | N={n} | Motiv={motiv:.3f} | Stock={stock:.2f}")

Uso: llamar después de simular().

A.7 Simulación del umbral 10 con reporte de stock al egreso

Esta sección presenta el programa utilizado para evaluar el efecto de flexibilizar el umbral de repitencia de 5 a 10 materias pendientes, manteniendo las 12 materias por año y las mesas de examen con efectividad del 25%. El objetivo es mostrar que subir el umbral mejora el egreso pero esconde un costo oculto: la acumulación de deuda al momento del egreso. Este fenómeno se denomina trampa del título vacío.

A.7.1 Diseño

Se comparan dos escenarios bajo la misma calibración:

  1. Base: 12 materias, umbral de repitencia 5 (se promociona con hasta 4 materias pendientes).
  2. Umbral 10: 12 materias, umbral de repitencia 10 (se promociona con hasta 9 materias pendientes).

Para cada escenario se reportan cinco indicadores:

  • Egreso sin repetir: porcentaje que termina la secundaria sin haber repetido.
  • Egreso total: porcentaje que termina la cursada.
  • Abandono: porcentaje que deja la escuela.
  • Stock medio al egreso: cantidad promedio de materias pendientes al momento de egresar.
  • % con más de 5 previas: porcentaje de egresados que arrastran más de 5 materias sin saldar.

Se ejecutan 30 semillas por escenario, con 1000 estudiantes por cohorte y 20 años de simulación.

A.7.2 Resultados

Comparación entre umbral 5 y umbral 10 con reporte de stock al egreso
Indicador Base (umbral 5) Umbral 10
Egreso sin repetir52,7%80,7%
Egreso total57,1%81,9%
Abandono43,8%20,3%
Stock medio al egreso1,873,27
% Egresados con más de 5 previas0,0%20,6%

A.7.3 Interpretación: la trampa del título vacío

A primera vista, el umbral 10 parece una mejora espectacular: el egreso sin repetir sube 28 puntos porcentuales (de 52,7% a 80,7%) y el abandono se reduce a menos de la mitad (de 43,8% a 20,3%). Si el análisis terminara aquí, la conclusión sería que flexibilizar el umbral es una política efectiva.

Pero hay un costo oculto. El stock medio al egreso sube de 1,87 a 3,27 materias, y el porcentaje de egresados con más de 5 previas pasa de 0,0% a 20,6%. Es decir, uno de cada cinco egresados arrastra más de cinco materias sin saldar al momento de recibir el título.

Esto es lo que llamamos la trampa del título vacío: el sistema egresa a más estudiantes, pero lo hace a costa de permitir que el título certifique una trayectoria con deuda significativa. En el escenario base, el umbral estricto impedía que alguien llegara al egreso con más de 4 previas. Al subirlo a 10, esa restricción desaparece, y un porcentaje importante de los egresados arrastra deudas que probablemente nunca saldará.

El umbral 10 no es una solución real: es un desplazamiento del problema. Se mejora la cantidad de egresados, pero se degrada la calidad del egreso. Los estudiantes obtienen el título sin haber completado los aprendizajes que el título certifica. Eso es inclusión solo en apariencia.

A.7.4 Conexión con el resto del documento

Los resultados de este análisis se reportan en la sección 5.10 del Capítulo 5, donde se contrasta el umbral 10 con la propuesta de continuidad pedagógica. La continuidad pedagógica, en cambio, sube el egreso a 95,8% y reduce el stock al egreso a 0,79 materias, con solo 0,4% de egresados con más de 5 previas. Es decir, la continuidad mejora simultáneamente la cantidad y la calidad del egreso, mientras que el umbral 10 mejora la cantidad a costa de la calidad. Esa diferencia es central en la argumentación del documento.

CÓDIGO PYTHON:

import numpy as np
from collections import defaultdict

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros
# ==============================================================
ANIO_INICIO = 2026
ANIOS_SIM = 20
ANIOS_CICLO = 5
NUEVOS_POR_ANIO = 1000
P_APROB = 0.85
UMBRAL_LATENTE = norm_ppf(1 - P_APROB)
P_MESA = 0.25
N_SEM = 30
SEED0 = 3000

# Estructura de correlación
RHO_COMUN = 0.15
RHO_TIPO  = 0.40
RHO_APT   = 0.0

# Parámetros de motivación y abandono
FACTOR_RED_REP = 0.20
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
P_AB_REP = 0.15
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]

# ==============================================================
# Generación de latentes (12 materias)
# ==============================================================
def generar_latentes(n_est, rng):
    F = rng.normal(size=n_est)
    H = rng.normal(size=(n_est, 4))
    L = np.linalg.cholesky((1 - RHO_APT) * np.eye(4) +
                           RHO_APT * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - RHO_COMUN - RHO_TIPO)

    Z = np.zeros((n_est, len(MATERIAS)))
    for j, (_, tipo) in enumerate(MATERIAS):
        t = TIPOS[tipo]
        E = rng.normal(size=n_est)
        Z[:, j] = (np.sqrt(RHO_COMUN) * F +
                   np.sqrt(RHO_TIPO) * H[:, t] +
                   np.sqrt(var_base) * E)
    return Z

# ==============================================================
# Simulación de cohorte con umbral parametrizable
# ==============================================================
def simular_cohorte(n_est, umbral_rep, seed):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    motiv = np.ones(n_est)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)

    for anio in range(ANIOS_CICLO):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break

        Z = generar_latentes(len(idx), rng)
        desplazamiento = (1 - motiv[idx]) * 0.5
        Z_ajustado = Z - desplazamiento[:, None]
        fallas = (Z_ajustado < UMBRAL_LATENTE).sum(axis=1)
        stock_pre = stock[idx] + fallas

        aprob_mesa = rng.binomial(stock_pre, P_MESA)
        stock_final = stock_pre - aprob_mesa
        repite = stock_final >= umbral_rep
        num_rep[idx] += repite.astype(int)
        curso[idx] = np.where(repite, curso[idx], curso[idx] + 1)
        stock[idx] = stock_final

        # Egreso
        egresa_idx = idx[curso[idx] > ANIOS_CICLO]
        activo[egresa_idx] = False

        # Motivación
        sigue = activo[idx]
        m = motiv[idx]
        m = np.where(repite, m - FACTOR_RED_REP,
                     np.where(stock_final >= 4, m - FACTOR_RED_STOCK_ALTO,
                              m + FACTOR_MEJORA_PROM))
        motiv[idx] = np.clip(m, 0.0, 1.0)

        # Abandono
        p_ab = np.where(repite, P_AB_REP,
                        np.where(stock_final >= 4, P_AB_STOCK_ALTO,
                                 P_AB_STOCK_BAJO))
        p_ab = np.where(motiv[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motiv[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona = rng.random(len(idx)) < p_ab
        abandona = abandona & sigue
        activo[idx[abandona]] = False

    egresados = ~activo & (curso > ANIOS_CICLO)
    abandonos = ~activo & (curso <= ANIOS_CICLO)
    stocks_egr = stock[egresados] if egresados.any() else np.array([])

    return {
        "egres_sin_rep": (egresados & (num_rep == 0)).sum() / n_est * 100,
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonos.sum() / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
        "pct_mas5": (stocks_egr > 5).mean() * 100 if len(stocks_egr) > 0 else 0.0,
    }

def ejecutar(umbral_rep):
    rs = []
    for s in range(N_SEM):
        rs.append(simular_cohorte(NUEVOS_POR_ANIO, umbral_rep, seed=SEED0 + s))
    return {k: np.mean([r[k] for r in rs]) for k in rs[0]}

# ==============================================================
# Ejecución
# ==============================================================
if __name__ == "__main__":
    print("=" * 90)
    print("COMPARACIÓN: UMBRAL 5 vs UMBRAL 10 (con reporte de stock al egreso)")
    print("=" * 90)
    print(f"{N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print(f"P_APROB = {P_APROB}, UMBRAL LATENTE = {UMBRAL_LATENTE:.4f}")
    print()

    r_base = ejecutar(5)
    r_laxo = ejecutar(10)

    print(f"{'Indicador':<32} | {'Base (umbral 5)':>16} | {'Umbral 10':>12}")
    print("-" * 70)
    print(f"{'Egreso sin repetir':<32} | {r_base['egres_sin_rep']:>15.1f}% | "
          f"{r_laxo['egres_sin_rep']:>11.1f}%")
    print(f"{'Egreso total':<32} | {r_base['egres_total']:>15.1f}% | "
          f"{r_laxo['egres_total']:>11.1f}%")
    print(f"{'Abandono':<32} | {r_base['abandono']:>15.1f}% | "
          f"{r_laxo['abandono']:>11.1f}%")
    print(f"{'Stock medio al egreso':<32} | {r_base['stock_medio']:>16.2f} | "
          f"{r_laxo['stock_medio']:>12.2f}")
    print(f"{'% Egresados con >5 previas':<32} | {r_base['pct_mas5']:>15.1f}% | "
          f"{r_laxo['pct_mas5']:>11.1f}%")

Salida esperada:

Indicador                        | Base (umbral 5)  |   Umbral 10
----------------------------------------------------------------------
Egreso sin repetir               |          52.7%  |      80.7%
Egreso total                     |          57.1%  |      81.9%
Abandono                         |          43.8%  |      20.3%
Stock medio al egreso            |           1.87  |       3.27
% Egresados con >5 previas       |           0.0%  |      20.6%

Nota: los valores pueden variar ligeramente según la calibración exacta. Lo importante es la dirección del efecto: el umbral 10 mejora el egreso pero multiplica el stock al egreso y el porcentaje de egresados con más de 5 previas.

A.8 Código para múltiples semillas

import numpy as np
from collections import defaultdict

# (Reutilizar funciones de A.1)

def simular_multiples(params, semillas=range(1, 31)):
    resultados = []
    for semilla in semillas:
        params_copia = params.copy()
        registros = simular(params_copia, semilla=semilla)
        res = analizar(registros)
        resultados.append(res)
    medias = {k: np.mean([r[k] for r in resultados]) for k in resultados[0]}
    desv = {k: np.std([r[k] for r in resultados]) for k in resultados[0]}
    return medias, desv

if __name__ == "__main__":
    escenarios = {
        "Base (12 mat, umb 5)": {"materias_por_anio": 12, "umbral_repitencia": 5, "continuidad_pedagogica": False},
        "6 materias, umb 3": {"materias_por_anio": 6, "umbral_repitencia": 3, "continuidad_pedagogica": False},
        "Continuidad (6 mat, p=0.55)": {"materias_por_anio": 6, "continuidad_pedagogica": True, "p_continua": 0.55, "umbral_repitencia": 1000}
    }
    for nombre, modif in escenarios.items():
        params = params_base.copy()
        params.update(modif)
        medias, desv = simular_multiples(params, semillas=range(1, 31))
        print(f"\n=== {nombre} (30 semillas) ===")
        for k in medias:
            print(f"  {k}: {medias[k]:.2f}% ± {desv[k]:.2f}pp" if "stock" not in k else f"  {k}: {medias[k]:.2f} ± {desv[k]:.2f}")

A.9 Simulación de egreso sin deuda

Esta sección presenta el programa utilizado para evaluar un escenario más restrictivo que la continuidad pedagógica estándar: aquel en el que el estudiante solo egresa si su stock de materias pendientes es cero. Si al llegar al final del ciclo todavía arrastra deudas, permanece en 5° año intentando saldarlas mediante continuidad pedagógica, hasta lograrlo o abandonar. Este escenario responde a la crítica de que el modelo original permitía egresar con deudas, lo cual no es realista en el sistema argentino, donde el título se otorga solo cuando no quedan materias pendientes.

A.9.1 Diseño

Se compara el escenario de continuidad pedagógica estándar (donde el egreso ocurre al terminar 5° año, independientemente del stock) contra un escenario restringido (donde el egreso requiere stock cero). Se reportan cinco indicadores:

  • Egreso total: porcentaje que obtiene el título.
  • Abandono: porcentaje que deja la escuela antes de titularse.
  • Activos al final: porcentaje que sigue en el sistema al terminar la simulación, sin haberse titulado ni abandonado.
  • Stock medio al egreso: cantidad promedio de materias pendientes al momento de egresar (por definición, 0 en el escenario restringido).
  • Tiempo medio hasta egreso: años promedio desde el ingreso hasta la titulación.

Se ejecutan 30 semillas por escenario, con 1000 estudiantes por cohorte.

A.9.2 Resultados

Comparación entre continuidad estándar y continuidad con egreso sin deuda
Indicador Continuidad estándar Continuidad con egreso sin deuda
Egreso total95,8%86,7%
Abandono5,3%8,1%
Activos al final0,0%5,9%
Stock medio al egreso0,800,00
Tiempo medio hasta egreso (años)5,006,36

A.9.3 Interpretación

La restricción de egreso sin deuda tiene tres efectos:

Primero, baja el egreso total. Del 95,8% al 86,7%. Es decir, aproximadamente 9 puntos porcentuales de los estudiantes que en el escenario estándar se titulaban con deuda, ahora permanecen en el sistema intentando saldarla. Algunos lo logran, otros no, y por eso el porcentaje de activos al final sube del 0% al 5,9%.

Segundo, sube levemente el abandono. Del 5,3% al 8,1%. El estudiante que no logra saldar sus deudas en el plazo esperado puede desmotivarse y dejar la escuela.

Tercero, y más importante, el stock al egreso es cero por definición. Todos los egresados del escenario restringido obtienen el título con todas sus materias aprobadas. No hay títulos vacíos.

El tiempo medio hasta egreso sube de 5,00 a 6,36 años. Es decir, el estudiante típico tarda un año y cuatro meses más en titularse cuando se le exige stock cero al egresar. Este es el costo temporal de la restricción: el título se obtiene con más demora, pero con todas las garantías.

A.9.4 Lo que esto significa para la propuesta

El escenario con egreso sin deuda es el piso de calidad del sistema propuesto. Aun con la restricción más estricta, el egreso alcanza el 86,7%, muy superior al 52,7% del escenario base actual. Y todos los egresados obtienen el título con todas sus materias aprobadas, lo que despeja la crítica de «título vacío».

La diferencia entre el escenario estándar (95,8% de egreso con stock 0,80) y el restringido (86,7% de egreso con stock 0,00) cuantifica el costo de la exigencia adicional: unos 9 puntos porcentuales de egreso y 1,4 años de tiempo promedio. Es un precio razonable si se considera que garantiza la calidad del título.

A.9.5 Conexión con el resto del documento

Los resultados de este análisis se reportan en la sección 5.7 del Capítulo 5, donde se contrasta el egreso con deuda con el egreso sin deuda. La conclusión es que la continuidad pedagógica no solo mejora el flujo de egreso, sino que puede hacerlo con todas las garantías de calidad, a un costo moderado en tiempo y cobertura.

CÓDIGO PYTHON:

import numpy as np

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros
# ==============================================================
ANIO_INICIO = 2026
ANIOS_SIM = 20
ANIOS_CICLO = 5
ANIOS_MAXIMOS = 10         # máximo de años que un estudiante puede permanecer
NUEVOS_POR_ANIO = 1000
P_APROB = 0.85
UMBRAL_LATENTE = norm_ppf(1 - P_APROB)
P_CONTINUA = 0.55
N_SEM = 30
SEED0 = 5000

# Estructura de correlación
RHO_COMUN = 0.15
RHO_TIPO  = 0.40
RHO_APT   = 0.0

# Parámetros de motivación y abandono
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]

# ==============================================================
# Generación de latentes (6 materias, modo continuidad)
# ==============================================================
def generar_latentes(n_est, rng, n_materias=6):
    F = rng.normal(size=n_est)
    H = rng.normal(size=(n_est, 4))
    L = np.linalg.cholesky((1 - RHO_APT) * np.eye(4) +
                           RHO_APT * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - RHO_COMUN - RHO_TIPO)

    Z = np.zeros((n_est, n_materias))
    for j in range(n_materias):
        _, tipo = MATERIAS[j]
        t = TIPOS[tipo]
        E = rng.normal(size=n_est)
        Z[:, j] = (np.sqrt(RHO_COMUN) * F +
                   np.sqrt(RHO_TIPO) * H[:, t] +
                   np.sqrt(var_base) * E)
    return Z

# ==============================================================
# Simulación de cohorte con restricción de egreso sin deuda
# ==============================================================
def simular_cohorte(n_est, egreso_sin_deuda, seed):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    motiv = np.ones(n_est)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)
    anios_cursados = np.zeros(n_est, dtype=int)

    for anio in range(ANIOS_MAXIMOS):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break

        Z = generar_latentes(len(idx), rng, n_materias=6)
        desplazamiento = (1 - motiv[idx]) * 0.5
        Z_ajustado = Z - desplazamiento[:, None]
        fallas = (Z_ajustado < UMBRAL_LATENTE).sum(axis=1)
        stock_pre = stock[idx] + fallas

        # Continuidad pedagógica
        aprob = rng.binomial(stock_pre, P_CONTINUA)
        stock_final = stock_pre - aprob
        stock[idx] = stock_final

        # Avance de curso
        if egreso_sin_deuda:
            # Solo avanza si stock == 0 al final de 5° año; si no, permanece en 5°
            en_quinto = curso[idx] >= ANIOS_CICLO
            permanece = en_quinto & (stock_final > 0)
            curso[idx] = np.where(permanece, curso[idx], curso[idx] + 1)
        else:
            # Avance normal: siempre promociona al terminar el año
            curso[idx] += 1

        anios_cursados[idx] += 1

        # Egreso: curso > 5 y (si aplica) stock == 0
        if egreso_sin_deuda:
            egresa_idx = idx[(curso[idx] > ANIOS_CICLO) & (stock_final == 0)]
        else:
            egresa_idx = idx[curso[idx] > ANIOS_CICLO]
        activo[egresa_idx] = False

        # Motivación
        sigue = activo[idx]
        sube = stock_final < 4
        motiv[idx] = np.where(sube,
                              np.minimum(motiv[idx] + FACTOR_MEJORA_PROM, 1.0),
                              np.maximum(motiv[idx] - FACTOR_RED_STOCK_ALTO, 0.0))

        # Abandono
        p_ab = np.where(stock_final >= 4, P_AB_STOCK_ALTO, P_AB_STOCK_BAJO)
        p_ab = np.where(motiv[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motiv[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona = rng.random(len(idx)) < p_ab
        abandona = abandona & sigue
        activo[idx[abandona]] = False

    # Métricas
    egresados = ~activo & (curso > ANIOS_CICLO)
    abandonos = ~activo & (curso <= ANIOS_CICLO)
    activos_final = activo.sum()
    stocks_egr = stock[egresados] if egresados.any() else np.array([])
    tiempo_medio = anios_cursados[egresados].mean() if egresados.any() else 0.0

    return {
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonos.sum() / n_est * 100,
        "activos_final": activos_final / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
        "tiempo_medio": tiempo_medio,
    }

def ejecutar(egreso_sin_deuda):
    rs = []
    for s in range(N_SEM):
        rs.append(simular_cohorte(NUEVOS_POR_ANIO, egreso_sin_deuda, seed=SEED0 + s))
    return {k: np.mean([r[k] for r in rs]) for k in rs[0]}

# ==============================================================
# Ejecución
# ==============================================================
if __name__ == "__main__":
    print("=" * 90)
    print("COMPARACIÓN: CONTINUIDAD ESTÁNDAR vs EGRESO SIN DEUDA")
    print("=" * 90)
    print(f"{N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print(f"P_APROB = {P_APROB}, P_CONTINUA = {P_CONTINUA}")
    print()

    r_estandar = ejecutar(egreso_sin_deuda=False)
    r_restrict = ejecutar(egreso_sin_deuda=True)

    print(f"{'Indicador':<32} | {'Continuidad':>14} | {'Egreso s/deuda':>16}")
    print("-" * 72)
    print(f"{'Egreso total':<32} | {r_estandar['egres_total']:>13.1f}% | "
          f"{r_restrict['egres_total']:>15.1f}%")
    print(f"{'Abandono':<32} | {r_estandar['abandono']:>13.1f}% | "
          f"{r_restrict['abandono']:>15.1f}%")
    print(f"{'Activos al final':<32} | {r_estandar['activos_final']:>13.1f}% | "
          f"{r_restrict['activos_final']:>15.1f}%")
    print(f"{'Stock medio al egreso':<32} | {r_estandar['stock_medio']:>14.2f} | "
          f"{r_restrict['stock_medio']:>16.2f}")
    print(f"{'Tiempo medio hasta egreso (años)':<32} | "
          f"{r_estandar['tiempo_medio']:>14.2f} | "
          f"{r_restrict['tiempo_medio']:>16.2f}")

Salida esperada:

Indicador                        |   Continuidad  |  Egreso s/deuda
------------------------------------------------------------------------
Egreso total                     |         95.8%  |          86.7%
Abandono                         |          5.3%  |           8.1%
Activos al final                 |          0.0%  |           5.9%
Stock medio al egreso            |          0.80  |           0.00
Tiempo medio hasta egreso (años) |          5.00  |           6.36

Nota: los valores pueden variar ligeramente según la calibración exacta. Lo importante es la dirección de los efectos: la restricción de egreso sin deuda baja el egreso total, sube levemente el abandono y los activos al final, y elimina por completo el stock residual al egresar, a costa de prolongar el tiempo medio de titulación.

A.10 Simulación de sensibilidad del parámetro de abandono

Esta sección presenta el programa utilizado para evaluar la robustez del escenario de continuidad pedagógica frente a variaciones en la probabilidad base de abandono. El objetivo es responder a una objeción razonable: si el éxito del escenario de continuidad dependiera críticamente de una probabilidad de abandono artificialmente baja, la conclusión del documento sería frágil. El análisis muestra que no lo es.

A.10.1 Diseño

Se ejecuta el escenario de continuidad pedagógica con 6 materias, sin repitencia, y se varía la probabilidad base de abandono cuando el estudiante promociona con stock bajo (p_abandono_base_promocion_stock_bajo) desde 0,005 hasta 0,050. Este es el parámetro más sensible del modelo, porque controla el abandono de los estudiantes que promocionan con deudas bajas o nulas, que son la mayoría en el régimen de continuidad.

Para cada valor se reportan cinco indicadores:

  • Egreso total: porcentaje que termina la cursada.
  • Abandono: porcentaje que deja la escuela antes de terminar.
  • Stock medio al egreso: cantidad promedio de materias pendientes al momento de egresar.
  • % con más de 5 previas: porcentaje de egresados que arrastran más de 5 materias sin saldar.
  • Activos al final: porcentaje que permanece en el sistema al terminar la simulación.

Se ejecutan 30 semillas por valor, con 1000 estudiantes por cohorte.

A.10.2 Resultados

Sensibilidad del escenario de continuidad al parámetro de abandono base
pabp_{\text{ab}} Egreso total Abandono Stock medio % con >5 previas Activos al final
0,00597,6%3,0%0,810,4%0,0%
0,01095,8%5,3%0,800,4%0,0%
0,02091,9%10,2%0,800,5%0,0%
0,03088,6%14,1%0,790,5%0,0%
0,05081,6%22,5%0,790,4%0,0%

A.10.3 Interpretación

El egreso total disminuye a medida que aumenta la probabilidad de abandono, como es esperable. Al duplicar el parámetro (de 0,005 a 0,010), el egreso baja 1,8 puntos. Al cuadruplicarlo (de 0,005 a 0,020), baja 5,7 puntos. Al decuplicarlo (de 0,005 a 0,050), baja 16,0 puntos.

Sin embargo, el hallazgo central es que incluso con una probabilidad de abandono cinco veces mayor que la del escenario base (0,05 en lugar de 0,01), el egreso total se mantiene en 81,6%, muy por encima del 52,7% del escenario tradicional. La continuidad pedagógica es robusta frente a variaciones razonables en el parámetro de abandono.

Un resultado adicional es que el stock medio al egreso permanece estable en torno a 0,80 en todos los valores probados. Esto significa que el abandono afecta a la cantidad de egresados pero no a la calidad del egreso de quienes sí terminan. Los estudiantes que egresan lo hacen con el mismo nivel de deuda residual, independientemente de cuántos abandonen.

El porcentaje de egresados con más de 5 previas también se mantiene estable, en torno al 0,4-0,5%. Es decir, la continuidad pedagógica garantiza que quienes egresan lo hagan con deuda baja, sin importar la tasa de abandono.

A.10.4 Conexión con el resto del documento

Los resultados de este análisis se reportan en la sección 5.8 del Capítulo 5, donde se responde a la crítica de que el éxito del escenario de continuidad podría deberse a un parámetro de abandono artificialmente bajo. La conclusión es que la continuidad pedagógica es robusta: incluso con tasas de abandono cinco veces mayores, el egreso se mantiene por encima del 80%, muy superior al escenario actual.

CÓDIGO PYTHON:

import numpy as np

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros
# ==============================================================
ANIO_INICIO = 2026
ANIOS_SIM = 20
ANIOS_CICLO = 5
NUEVOS_POR_ANIO = 1000
P_APROB = 0.85
UMBRAL_LATENTE = norm_ppf(1 - P_APROB)
P_CONTINUA = 0.55
N_SEM = 30
SEED0 = 6000

# Estructura de correlación
RHO_COMUN = 0.15
RHO_TIPO  = 0.40
RHO_APT   = 0.0

# Parámetros de motivación (constantes)
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
P_AB_STOCK_ALTO = 0.05
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]

# ==============================================================
# Generación de latentes (6 materias, modo continuidad)
# ==============================================================
def generar_latentes(n_est, rng, n_materias=6):
    F = rng.normal(size=n_est)
    H = rng.normal(size=(n_est, 4))
    L = np.linalg.cholesky((1 - RHO_APT) * np.eye(4) +
                           RHO_APT * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - RHO_COMUN - RHO_TIPO)

    Z = np.zeros((n_est, n_materias))
    for j in range(n_materias):
        _, tipo = MATERIAS[j]
        t = TIPOS[tipo]
        E = rng.normal(size=n_est)
        Z[:, j] = (np.sqrt(RHO_COMUN) * F +
                   np.sqrt(RHO_TIPO) * H[:, t] +
                   np.sqrt(var_base) * E)
    return Z

# ==============================================================
# Simulación de cohorte con continuidad pedagógica
# ==============================================================
def simular_cohorte(n_est, p_ab_stock_bajo, seed):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    motiv = np.ones(n_est)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)

    for anio in range(ANIOS_CICLO):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break

        Z = generar_latentes(len(idx), rng, n_materias=6)
        desplazamiento = (1 - motiv[idx]) * 0.5
        Z_ajustado = Z - desplazamiento[:, None]
        fallas = (Z_ajustado < UMBRAL_LATENTE).sum(axis=1)
        stock_pre = stock[idx] + fallas

        # Continuidad pedagógica: siempre promociona
        aprob = rng.binomial(stock_pre, P_CONTINUA)
        stock_final = stock_pre - aprob
        curso[idx] += 1
        stock[idx] = stock_final

        # Egreso
        egresa_idx = idx[curso[idx] > ANIOS_CICLO]
        activo[egresa_idx] = False

        # Motivación
        sigue = activo[idx]
        sube = stock_final < 4
        motiv[idx] = np.where(sube,
                              np.minimum(motiv[idx] + FACTOR_MEJORA_PROM, 1.0),
                              np.maximum(motiv[idx] - FACTOR_RED_STOCK_ALTO, 0.0))

        # Abandono (el parámetro que variamos es p_ab_stock_bajo)
        p_ab = np.where(stock_final >= 4, P_AB_STOCK_ALTO, p_ab_stock_bajo)
        p_ab = np.where(motiv[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motiv[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona = rng.random(len(idx)) < p_ab
        abandona = abandona & sigue
        activo[idx[abandona]] = False

    egresados = ~activo & (curso > ANIOS_CICLO)
    abandonos = ~activo & (curso <= ANIOS_CICLO)
    stocks_egr = stock[egresados] if egresados.any() else np.array([])

    return {
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonos.sum() / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
        "pct_mas5": (stocks_egr > 5).mean() * 100 if len(stocks_egr) > 0 else 0.0,
        "activos_final": activo.sum() / n_est * 100,
    }

def ejecutar(p_ab_stock_bajo):
    rs = []
    for s in range(N_SEM):
        rs.append(simular_cohorte(NUEVOS_POR_ANIO, p_ab_stock_bajo, seed=SEED0 + s))
    return {k: np.mean([r[k] for r in rs]) for k in rs[0]}

# ==============================================================
# Ejecución: barrido de p_abandono_base_promocion_stock_bajo
# ==============================================================
if __name__ == "__main__":
    print("=" * 95)
    print("SENSIBILIDAD AL PARÁMETRO DE ABANDONO")
    print("(continuidad pedagógica, 6 materias, P_CONTINUA = 0.55)")
    print("=" * 95)
    print(f"{N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print()

    valores_p_ab = [0.005, 0.010, 0.020, 0.030, 0.050]

    print(f"{'p_ab':>8} | {'Egreso total':>13} | {'Abandono':>10} | "
          f"{'Stock medio':>12} | {'% >5 prev':>10} | {'Activos final':>14}")
    print("-" * 95)

    for p_ab in valores_p_ab:
        r = ejecutar(p_ab)
        print(f"{p_ab:>8.3f} | "
              f"{r['egres_total']:>12.1f}% | "
              f"{r['abandono']:>9.1f}% | "
              f"{r['stock_medio']:>11.2f} | "
              f"{r['pct_mas5']:>9.1f}% | "
              f"{r['activos_final']:>13.1f}%")

Salida esperada:

    p_ab |  Egreso total |   Abandono |  Stock medio |  % >5 prev |  Activos final
-----------------------------------------------------------------------------------------------
   0.005 |         97.6% |       3.0% |         0.81 |       0.4% |           0.0%
   0.010 |         95.8% |       5.3% |         0.80 |       0.4% |           0.0%
   0.020 |         91.9% |      10.2% |         0.80 |       0.5% |           0.0%
   0.030 |         88.6% |      14.1% |         0.79 |       0.5% |           0.0%
   0.050 |         81.6% |      22.5% |         0.79 |       0.4% |           0.0%

Nota: los valores pueden variar ligeramente según la calibración exacta. Lo importante es la dirección del efecto: al aumentar la probabilidad de abandono, el egreso baja y el abandono sube, pero el stock medio al egreso y el porcentaje con más de 5 previas se mantienen estables. Esto confirma que la calidad del egreso no depende del parámetro de abandono, solo de la efectividad de la continuidad pedagógica.

A.11 Simulación de motivación dependiente de pcontinuap_{\text{continua}}

Esta sección presenta el programa utilizado para corregir una circularidad potencial en el modelo de motivación. En versiones previas, la motivación en el escenario de continuidad pedagógica subía mecánicamente porque nunca se activaba la rama de repitencia, y el estudiante recibía un refuerzo positivo constante. Eso hacía que la motivación promedio al egreso fuera artificialmente alta. Este programa modifica la regla para que la motivación dependa del valor de pcontinuap_{\text{continua}} : si la recuperación en proceso es efectiva, la motivación sube; si no lo es, se estanca o cae levemente.

A.11.1 Diseño

Se ejecuta el escenario de continuidad pedagógica con 6 materias, sin repitencia, y se varía pcontinuap_{\text{continua}} desde 0,25 hasta 0,65. La regla de motivación es la siguiente:

  • Si el estudiante tiene stock final ≥ 4, la motivación baja 0,05 (igual que antes).
  • Si el stock final < 4 y pcontinua<0,45p_{\text{continua}} < 0{,}45 , la motivación se estanca o cae levemente (−0,01), porque la recuperación en proceso no está siendo efectiva.
  • Si el stock final < 4 y pcontinua≥0,45p_{\text{continua}} \ge 0{,}45 , la motivación sube (+0,02), porque el estudiante percibe progreso real.

Esta regla elimina la circularidad: la motivación ya no sube automáticamente, sino que refleja la efectividad del sistema de recuperación.

Se reportan cinco indicadores por valor de pcontinuap_{\text{continua}} :

  • Egreso total: porcentaje que termina la cursada.
  • Abandono: porcentaje que deja la escuela.
  • Stock medio al egreso: cantidad promedio de materias pendientes.
  • Motivación media al egreso: valor promedio de la motivación de los egresados.
  • % con más de 5 previas: porcentaje de egresados con deuda significativa.

Se ejecutan 30 semillas por valor, con 1000 estudiantes por cohorte.

A.11.2 Resultados

Efecto de la probabilidad de recuperación en proceso sobre la motivación al egreso
pcontinuap_{\text{continua}} Egreso total Abandono Stock medio Motiv. media egreso % >5 previas
0,2594,7%7,0%2,250,9249,2%
0,3595,2%6,5%1,630,9344,4%
0,4595,4%5,7%1,150,9911,5%
0,5595,8%5,3%0,800,9960,4%
0,6595,6%5,4%0,530,9990,1%

A.11.3 Interpretación

La motivación media al egreso ya no es siempre 1,0. Con pcontinua=0,25p_{\text{continua}} = 0{,}25 cae a 0,924; con 0,35 sube a 0,934; con 0,45 llega a 0,991; y con 0,55 y 0,65 se acerca a 0,996 y 0,999. Es decir, la motivación refleja la efectividad del sistema de recuperación, como era de esperar.

El egreso total se mantiene por encima del 94% en todos los valores probados, lo que confirma la robustez del hallazgo central: la eliminación de la repitencia garantiza el egreso masivo incluso con recuperación débil. Pero la calidad del egreso, medida por el stock residual y el porcentaje con más de 5 previas, sí depende de pcontinuap_{\text{continua}} .

Con pcontinua=0,25p_{\text{continua}} = 0{,}25 , el stock medio al egreso es 2,25 y el 9,2% de los egresados arrastra más de 5 previas. Con pcontinua=0,45p_{\text{continua}} = 0{,}45 , el stock baja a 1,15 y el porcentaje con más de 5 previas se reduce al 1,5%. Con pcontinua=0,55p_{\text{continua}} = 0{,}55 , el stock baja a 0,80 y el porcentaje al 0,4%.

Esto sugiere un umbral operativo en torno a pcontinua=0,45p_{\text{continua}} = 0{,}45 : por encima de ese valor, el sistema produce egresados con deuda baja y motivación alta. Por debajo, el egreso sigue siendo masivo, pero la calidad del título se compromete.

A.11.4 Conexión con el resto del documento

Los resultados de este análisis se reportan en la sección 5.9 del Capítulo 5, donde se responde a la crítica de que la motivación en el modelo subía mecánicamente. La corrección elimina esa circularidad y refuerza la conclusión: la continuidad pedagógica funciona incluso con motivación dependiente de pcontinuap_{\text{continua}} , siempre que este parámetro se mantenga por encima de 0,45.

CÓDIGO PYTHON:

import numpy as np

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros
# ==============================================================
ANIO_INICIO = 2026
ANIOS_SIM = 20
ANIOS_CICLO = 5
NUEVOS_POR_ANIO = 1000
P_APROB = 0.85
UMBRAL_LATENTE = norm_ppf(1 - P_APROB)
N_SEM = 30
SEED0 = 8000

# Estructura de correlación
RHO_COMUN = 0.15
RHO_TIPO  = 0.40
RHO_APT   = 0.0

# Parámetros de motivación (con regla dependiente de p_continua)
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
FACTOR_ESTANCAMIENTO = 0.01       # caída leve cuando p_continua es bajo
UMBRAL_P_CONTINUA = 0.45          # umbral por debajo del cual la motivación se estanca

# Parámetros de abandono
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]

# ==============================================================
# Generación de latentes (6 materias, modo continuidad)
# ==============================================================
def generar_latentes(n_est, rng, n_materias=6):
    F = rng.normal(size=n_est)
    H = rng.normal(size=(n_est, 4))
    L = np.linalg.cholesky((1 - RHO_APT) * np.eye(4) +
                           RHO_APT * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - RHO_COMUN - RHO_TIPO)

    Z = np.zeros((n_est, n_materias))
    for j in range(n_materias):
        _, tipo = MATERIAS[j]
        t = TIPOS[tipo]
        E = rng.normal(size=n_est)
        Z[:, j] = (np.sqrt(RHO_COMUN) * F +
                   np.sqrt(RHO_TIPO) * H[:, t] +
                   np.sqrt(var_base) * E)
    return Z

# ==============================================================
# Simulación de cohorte con motivación dependiente de p_continua
# ==============================================================
def simular_cohorte(n_est, p_continua, seed):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    motiv = np.ones(n_est)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)

    for anio in range(ANIOS_CICLO):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break

        Z = generar_latentes(len(idx), rng, n_materias=6)
        desplazamiento = (1 - motiv[idx]) * 0.5
        Z_ajustado = Z - desplazamiento[:, None]
        fallas = (Z_ajustado < UMBRAL_LATENTE).sum(axis=1)
        stock_pre = stock[idx] + fallas

        # Continuidad pedagógica
        aprob = rng.binomial(stock_pre, p_continua)
        stock_final = stock_pre - aprob
        curso[idx] += 1
        stock[idx] = stock_final

        # Egreso
        egresa_idx = idx[curso[idx] > ANIOS_CICLO]
        activo[egresa_idx] = False

        # Motivación dependiente de p_continua
        sigue = activo[idx]
        stock_alto = stock_final >= 4
        stock_bajo = ~stock_alto

        if p_continua < UMBRAL_P_CONTINUA:
            # Efectividad baja: la motivación se estanca o cae levemente
            m_mejora = motiv[idx] - FACTOR_ESTANCAMIENTO
        else:
            # Efectividad alta: la motivación sube
            m_mejora = motiv[idx] + FACTOR_MEJORA_PROM

        m_final = np.where(stock_alto, motiv[idx] - FACTOR_RED_STOCK_ALTO, m_mejora)
        motiv[idx] = np.clip(m_final, 0.0, 1.0)

        # Abandono
        p_ab = np.where(stock_alto, P_AB_STOCK_ALTO, P_AB_STOCK_BAJO)
        p_ab = np.where(motiv[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motiv[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona = rng.random(len(idx)) < p_ab
        abandona = abandona & sigue
        activo[idx[abandona]] = False

    egresados = ~activo & (curso > ANIOS_CICLO)
    abandonos = ~activo & (curso <= ANIOS_CICLO)
    stocks_egr = stock[egresados] if egresados.any() else np.array([])
    motiv_egr = motiv[egresados] if egresados.any() else np.array([])

    return {
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonos.sum() / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
        "motiv_media": motiv_egr.mean() if len(motiv_egr) > 0 else 0.0,
        "pct_mas5": (stocks_egr > 5).mean() * 100 if len(stocks_egr) > 0 else 0.0,
    }

def ejecutar(p_continua):
    rs = []
    for s in range(N_SEM):
        rs.append(simular_cohorte(NUEVOS_POR_ANIO, p_continua, seed=SEED0 + s))
    return {k: np.mean([r[k] for r in rs]) for k in rs[0]}

# ==============================================================
# Ejecución: barrido de p_continua con motivación dependiente
# ==============================================================
if __name__ == "__main__":
    print("=" * 100)
    print("MOTIVACIÓN DEPENDIENTE DE p_continua")
    print("(continuidad pedagógica, 6 materias, con regla de motivación corregida)")
    print("=" * 100)
    print(f"{N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print(f"Umbral de p_continua para mejora de motivación: {UMBRAL_P_CONTINUA}")
    print()

    valores_p = [0.25, 0.35, 0.45, 0.55, 0.65]

    print(f"{'p_cont':>8} | {'Egreso total':>13} | {'Abandono':>10} | "
          f"{'Stock medio':>12} | {'Motiv media':>12} | {'% >5 prev':>10}")
    print("-" * 100)

    for p_cont in valores_p:
        r = ejecutar(p_cont)
        print(f"{p_cont:>8.2f} | "
              f"{r['egres_total']:>12.1f}% | "
              f"{r['abandono']:>9.1f}% | "
              f"{r['stock_medio']:>11.2f} | "
              f"{r['motiv_media']:>11.3f} | "
              f"{r['pct_mas5']:>9.1f}%")

Salida esperada:

p_cont   |  Egreso total |   Abandono |  Stock medio |  Motiv media |  % >5 prev
---------------------------------------------------------------------------------------------------
    0.25 |         94.7% |       7.0% |         2.25 |        0.924 |       9.2%
    0.35 |         95.2% |       6.5% |         1.63 |        0.934 |       4.4%
    0.45 |         95.4% |       5.7% |         1.15 |        0.991 |       1.5%
    0.55 |         95.8% |       5.3% |         0.80 |        0.996 |       0.4%
    0.65 |         95.6% |       5.4% |         0.53 |        0.999 |       0.1%

Nota: los valores pueden variar ligeramente según la calibración exacta. Lo importante es la dirección de los efectos: la motivación al egreso ya no es siempre 1,0, sino que refleja la efectividad del sistema de recuperación. Con pcontinuap_{\text{continua}} bajo, la motivación cae y el stock residual sube. Con pcontinuap_{\text{continua}} alto, la motivación se mantiene cerca de 1,0 y el stock residual es bajo.

A.12 Fórmulas clave y justificación pedagógica

En esta sección presentamos las fórmulas más importantes utilizadas en el modelo, explicadas de manera accesible. Para cada una, se indica qué representa, por qué fue elegida y cómo debe interpretarse en el contexto de la simulación.

A.12.1 Distribución Beta

Qué describe. La distribución Beta describe cómo varía entre los estudiantes la probabilidad individual de desaprobar una materia (pip_i). No todos los estudiantes tienen la misma facilidad: algunos desaprueban muy poco, otros desaprueban bastante. La Beta captura esa heterogeneidad.

Fórmula:

pi ∼ Beta (α,β) p_i \sim \text{Beta}(\alpha, \beta)

La media y la varianza de la distribución son:

μp = α α+β \mu_p = \frac{\alpha}{\alpha+\beta} σp2 = αβ (α+β)2 (α+β+1) \sigma_p^2 = \frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}

Explicación de términos:

  • pip_i: probabilidad individual de desaprobar una materia para un estudiante concreto.
  • α\alpha y β\beta: parámetros que controlan la forma de la distribución. Si ambos son grandes, la distribución se concentra alrededor de la media; si uno es pequeño, la distribución se ensancha, indicando más heterogeneidad.
  • μp\mu_p: media de la distribución (promedio de la probabilidad de desaprobar).
  • σp2\sigma_p^2: varianza (dispersión de esa probabilidad entre estudiantes).

Por qué se usa. La distribución Beta está definida en el intervalo [0,1][0,1] , que es exactamente el rango válido para una probabilidad. Otras distribuciones, como la normal, pueden asignar probabilidades negativas o mayores que uno, lo cual es inconsistente. La Beta evita ese problema.

Ejemplo. En el modelo base asumimos μp=0,15\mu_p = 0{,}15 (desaprobación promedio del 15%) y σp=0,10\sigma_p = 0{,}10 (dispersión de 10 puntos porcentuales). A partir de esas dos cifras, se calculan los parámetros α\alpha y β\beta mediante las fórmulas inversas, obteniendo α≈1,76\alpha \approx 1{,}76 y β≈9,99\beta \approx 9{,}99 .

A.12.2 Beta-Binomial

Qué describe. La Beta-Binomial describe la distribución del número de materias desaprobadas (XX) por un estudiante elegido al azar, cuando la probabilidad individual pip_i varía según una distribución Beta.

Fórmula:

P(X=k) = ( nk ) B (k+α,n−k+β) B (α,β) P(X = k) = \binom{n}{k} \frac{\mathrm{B}(k+\alpha,\; n-k+\beta)}{\mathrm{B}(\alpha,\beta)}

Explicación de términos:

  • nn: número de materias cursadas en el año (por ejemplo, 12 o 6).
  • kk: número de materias desaprobadas (de 0 a nn).
  • (nk)\binom{n}{k}: coeficiente binomial, que cuenta de cuántas maneras se pueden elegir kk materias desaprobadas entre nn.
  • B(a,b)\mathrm{B}(a,b): función Beta completa, que se calcula con la función gamma: B(a,b)=Γ(a)Γ(b)Γ(a+b)\mathrm{B}(a,b) = \frac{\Gamma(a)\Gamma(b)}{\Gamma(a+b)}.
  • α,β\alpha, \beta: parámetros de la distribución Beta.

Por qué se usa. Si todos los estudiantes tuvieran la misma probabilidad de desaprobar (modelo homogéneo), el número de desaprobaciones seguiría una distribución binomial simple. Pero al reconocer que los estudiantes son diferentes, la mezcla de binomiales con pip_i variable produce la Beta-Binomial, que tiene colas más anchas: más estudiantes con cero desaprobaciones y más estudiantes con muchas. Esa forma es más realista y genera tasas de repitencia más altas en los extremos.

Ejemplo. Con n=12n=12 , α=1,76\alpha=1{,}76 y β=9,99\beta=9{,}99 , la probabilidad de desaprobar exactamente 5 materias es aproximadamente 4,2%, y la probabilidad de desaprobar 5 o más es 7,7%. En cambio, si usáramos una binomial homogénea con q=0,15q=0{,}15 , esa probabilidad sería menor, alrededor de 2,4%.

A.12.3 Recurrencia del stock de deudas

Qué describe. La recurrencia describe cómo evoluciona el total de materias pendientes en la escuela año tras año, considerando las mesas de examen que «limpian» parte de la deuda.

Fórmula:

Pt = qmesa × (Pt−1+Nt) P_t = q_{\text{mesa}} \times (P_{t-1} + N_t)

Explicación de términos:

  • PtP_t: stock total de materias pendientes al final del año tt.
  • Pt−1P_{t-1}: stock al final del año anterior.
  • NtN_t: nuevas materias desaprobadas durante el año tt.
  • qmesaq_{\text{mesa}}: proporción de materias pendientes que no se aprueban en las mesas; es decir, la probabilidad de que una materia pendiente siga pendiente después de las mesas.

Por qué se usa. La ecuación refleja el flujo real: al stock anterior se le suman las nuevas deudas, y luego las mesas eliminan una fracción. Si qmesa=0,75q_{\text{mesa}} = 0,75 (porque las mesas aprueban el 25%), entonces el 75% de toda la deuda (antigua y nueva) permanece para el año siguiente.

Ejemplo. Si en un año hay 100 materias pendientes, y durante el año se generan 50 nuevas, el total antes de mesas es 150. Con mesas que aprueban el 25%, quedarán 150×0,75=112,5150 \times 0,75 = 112,5 materias pendientes.

A.12.4 Estado estacionario

Qué describe. El estado estacionario es el valor de equilibrio del stock de materias pendientes cuando la escuela funciona indefinidamente con las mismas reglas.

Fórmula:

P∗ = qmesa 1−qmesa × N∗ P^* = \frac{q_{\text{mesa}}}{1 - q_{\text{mesa}}} \times N^*

donde N∗N^* es el flujo anual de nuevas desaprobaciones cuando todas las cohortes están activas.

Explicación de términos:

  • P∗P^*: stock estacionario de materias pendientes.
  • qmesaq_{\text{mesa}}: proporción que permanece pendiente tras las mesas.
  • N∗N^*: número de nuevas desaprobaciones generadas por año en régimen permanente.

Por qué se usa. A partir de la recurrencia anterior, si se asume que Pt=Pt−1=P∗P_t = P_{t-1} = P^* (equilibrio), se despeja algebraicamente. La fórmula muestra que el stock de equilibrio es un múltiplo de N∗N^* , y el factor depende de la efectividad de las mesas. Con qmesa=0,75q_{\text{mesa}} = 0,75 , el factor es 0,75/0,25=30,75/0,25 = 3 ; por eso el stock estacionario triplica las nuevas deudas anuales.

Ejemplo. En una escuela con 5 cohortes de 100 estudiantes, 12 materias y q=0,10q=0,10 uniforme, N∗=100×5×12×0,10=600N^* = 100 \times 5 \times 12 \times 0,10 = 600 . Con qmesa=0,75q_{\text{mesa}}=0,75 , el stock estacionario es P∗=3×600=1800P^* = 3 \times 600 = 1800 materias pendientes.

A.12.5 Motivación

Qué describe. La motivación modula la probabilidad de desaprobar: un estudiante motivado rinde mejor; uno desmotivado rinde peor.

Fórmula:

peff = pbase × ( 1+ (1−motivación) ×0,5 ) p_{\text{eff}} = p_{\text{base}} \times \left(1 + (1 - \text{motivación}) \times 0,5\right)

Explicación de términos:

  • peffp_{\text{eff}}: probabilidad efectiva de desaprobar una materia.
  • pbasep_{\text{base}}: probabilidad individual original (sin efecto de motivación).
  • motivación: valor entre 0 y 1, donde 1 es máxima motivación y 0 es nula.
  • El factor 0,50,5 controla cuánto influye la desmotivación.

Por qué se usa. Cuando la motivación es 1, la probabilidad efectiva es igual a la base. Cuando cae a 0, la probabilidad aumenta en un 50%. Es una forma sencilla de modelar el círculo vicioso: fracaso →\rightarrow desmotivación →\rightarrow mayor probabilidad de fracaso.

Ejemplo. Si pbase=0,15p_{\text{base}} = 0,15 y motivación = 0,5, entonces: peff= 0,15× (1+(1−0,5)×0,5) =0,15×1,25=0,1875 p_{\text{eff}} = 0,15 \times (1 + (1 - 0,5) \times 0,5) = 0,15 \times 1,25 = 0,1875 .

A.12.6 Regla de transición

Qué describe. La regla que decide si un estudiante promociona o repite, según su stock de materias pendientes al final del año.

Formulación:

  • Si el stock final ≤\le umbral, el estudiante promociona.
  • Si el stock final ≥\ge umbral, el estudiante repite.

En el modelo base, el umbral es 5: se promociona con hasta 4 materias pendientes, y se repite con 5 o más.

Por qué se usa. Esta regla reproduce la normativa argentina: el pase de año está condicionado a no superar un número máximo de materias adeudadas. Es el «filtro vertical» que, combinado con la cantidad de materias, produce la exclusión.

Ejemplo. Un estudiante que termina el año con 3 materias pendientes promociona. Si al año siguiente acumula 2 más y no aprueba ninguna en mesas, su stock llega a 5 y repite.

A.12.7 Abandono

Qué describe. La probabilidad de que un estudiante abandone la escuela al final del año, en función de su situación académica y motivacional.

Formulación (resumida):

  • Si la motivación cae por debajo de 0,10: abandono forzoso.
  • En caso contrario, la probabilidad depende de:
    • Haber repetido: 0,15.
    • Promocionar con stock alto (≥4): 0,05.
    • Promocionar con stock bajo (<4): 0,01.
  • Si la motivación es menor que 0,5, se suma 0,10 a la probabilidad.

Por qué se usa. El abandono no es aleatorio; está vinculado a la acumulación de fracasos y a la desmotivación. Esta regla captura que los estudiantes que repiten o arrastran muchas deudas tienen mayor probabilidad de dejar la escuela.

Ejemplo. Un estudiante que repite y tiene motivación 0,4 tendrá una probabilidad de abandono de 0,15+0,10=0,250,15 + 0,10 = 0,25 , es decir, 25%.

A.12.8 Continuidad pedagógica

Qué describe. La propuesta central del documento: eliminar la repitencia global y las mesas de examen aisladas, y permitir que las deudas se salden mediante evaluación en proceso durante el año siguiente.

Formulación:

  • No hay repitencia: todos promocionan, sin importar cuántas materias deban.
  • No hay mesas de examen: la recuperación ocurre de manera continua, con una probabilidad pcontinuap_{\text{continua}} de saldar cada materia pendiente por año.
  • El stock se actualiza año a año: stocknuevo = stockanterior + desaprobadas − aprobadas en proceso \text{stock}_{\text{nuevo}} = \text{stock}_{\text{anterior}} + \text{desaprobadas} - \text{aprobadas en proceso} .

Por qué se usa. Esta regla cambia la lógica de la deuda: en lugar de castigar al estudiante con la repitencia global y someterlo a exámenes aislados, lo acompaña mientras avanza. La simulación muestra que esta es la palanca más poderosa para aumentar el egreso y reducir el abandono, sin sacrificar la exigencia.

Ejemplo. Un estudiante que pasa a segundo año con 2 materias pendientes de primero, cursará las 6 áreas de segundo. Durante el año, el docente evalúa en proceso los contenidos adeudados. Si pcontinua=0,55p_{\text{continua}} = 0,55 , en promedio saldará 2×0,55=1,12 \times 0,55 = 1,1 materias pendientes ese año, quedando con menos de 1 al finalizar.

A.13 Parámetros del modelo base

Parámetros del modelo base
Parámetro Valor
Ingresantes por año1000
Años simulados20
Materias por año12 (o 6)
μp\mu_p 0,15
σp\sigma_p 0,10
pmesap_{\text{mesa}} 0,25
Umbral de repitencia5 (o 3, etc.)
Motivación inicial1,0
Reducción por repitencia0,20
Reducción por stock alto0,05
Mejora por promoción limpia0,02
Influencia de motivación0,5
Abandono base repitencia0,15
Abandono base stock alto0,05
Abandono base stock bajo0,01
Incremento por baja motivación0,10
Motivación mínima0,10

A.14 Reproducibilidad y limitaciones

Todos los resultados fueron obtenidos con semilla 42, salvo el análisis de múltiples semillas que utilizó 30 semillas (1 a 30). Las limitaciones del modelo incluyen: independencia entre materias, ausencia de correlación, no modelado de factores socioeconómicos, y simplificación de la motivación/abandono. Estas limitaciones refuerzan el carácter conservador de las conclusiones: la realidad probablemente sea peor.

A.15 Simulación de aprendizaje basado en proyectos (ABP endógeno)

Esta sección presenta el código utilizado para comparar el desempeño de los regímenes con y sin aprendizaje basado en proyectos. A diferencia de la versión anterior de este apéndice, aquí el ABP se modela de manera endógena: la compensación no se impone con un factor fijo, sino que emerge del promedio de aptitudes heterogéneas de los estudiantes. Cada estudiante tiene cuatro aptitudes latentes (numérica, lingüística, social y práctica), correlacionadas entre sí según un parámetro. Cada materia se asocia a un tipo. En el modelo tradicional, cada materia se desaprueba si su latente cae bajo el umbral. En el modelo de ABP, cada proyecto agrupa dos materias de tipos distintos, y la latente del proyecto es el promedio de las latentes de sus materias.

El detalle técnico clave es el reescalado correcto del promedio. Si el promedio de dos variables con correlación ρ\rho se multiplica por 2\sqrt{2} , la varianza queda inflada por un factor 2/(1+ρ)2/(1+\rho) en lugar de 1. El factor correcto es 2/(1+ρ)\sqrt{2/(1+\rho)} . Sin esta corrección, los proyectos quedan artificialmente más difíciles que las materias sueltas, y el ABP parece perjudicar cuando en realidad ayuda.

Los resultados de este programa se reportan en la sección 5.12 del Capítulo 5.

import numpy as np

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# Basada en la aproximación de Peter J. Acklam
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros generales
# ==============================================================
ANIO_INICIO = 2026
ANIOS_SIM = 20
ANIOS_CICLO = 5
NUEVOS_POR_ANIO = 1000
P_APROB = 0.85                    # calibración consistente con el resto del doc.
UMBRAL = norm_ppf(1 - P_APROB)    # umbral latente (-1.036)
P_MESA = 0.25
P_CONTINUA = 0.55
N_SEM = 30
SEED0 = 9000

# Estructura de correlación
RHO_COMUN = 0.15   # factor motivacional común a todas las materias
RHO_TIPO  = 0.40   # peso de la aptitud específica por tipo
RHO_APT   = 0.0    # correlación entre aptitudes de distintos tipos

# Parámetros de motivación y abandono
FACTOR_RED_REP = 0.20
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
P_AB_REP = 0.15
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]

# Proyectos ABP: cada proyecto agrupa dos materias de tipos distintos
# para maximizar la compensación intra-proyecto.
PROYECTOS_ABP = [
    [0, 3],   # Matemática (num) + Lengua (len)
    [1, 5],   # Física (num) + Historia (soc)
    [2, 6],   # Química (num) + Geografía (soc)
    [4, 7],   # Inglés (len) + Formación Ética (soc)
    [8, 9],   # Biología (num) + Tecnología (pra)
    [10, 11]  # Educación Física (pra) + Artística (pra)
]

# ==============================================================
# Generación de latentes
# ==============================================================
def generar_latentes(n_est, modo, rng):
    """
    Genera las notas latentes de n_est estudiantes para un año.
    - modo = "suelto": matriz (n_est, 12) con latentes por materia.
    - modo = "proyectos": matriz (n_est, 6) con latentes por proyecto
      (promedio reescalado de las latentes de sus dos materias).
    """
    F = rng.normal(size=n_est)                                    # factor común
    H = rng.normal(size=(n_est, 4))                               # aptitudes por tipo
    L = np.linalg.cholesky((1 - RHO_APT) * np.eye(4) +
                           RHO_APT * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - RHO_COMUN - RHO_TIPO)

    if modo == "suelto":
        Z = np.zeros((n_est, len(MATERIAS)))
        for j, (_, tipo) in enumerate(MATERIAS):
            t = TIPOS[tipo]
            E = rng.normal(size=n_est)
            Z[:, j] = (np.sqrt(RHO_COMUN) * F +
                       np.sqrt(RHO_TIPO) * H[:, t] +
                       np.sqrt(var_base) * E)
        return Z
    else:
        Z_proy = np.zeros((n_est, len(PROYECTOS_ABP)))
        for p, par in enumerate(PROYECTOS_ABP):
            Z_par = np.zeros((n_est, len(par)))
            tipos = []
            for idx, j in enumerate(par):
                _, tipo = MATERIAS[j]
                tipos.append(tipo)
                t = TIPOS[tipo]
                E = rng.normal(size=n_est)
                Z_par[:, idx] = (np.sqrt(RHO_COMUN) * F +
                                 np.sqrt(RHO_TIPO) * H[:, t] +
                                 np.sqrt(var_base) * E)
            # REESCALADO CORRECTO: factor sqrt(2/(1+rho_intra))
            if tipos[0] == tipos[1]:
                rho_intra = RHO_COMUN + RHO_TIPO
            else:
                rho_intra = RHO_COMUN + RHO_TIPO * RHO_APT
            factor = np.sqrt(len(par) / (1 + (len(par) - 1) * rho_intra))
            Z_proy[:, p] = Z_par.mean(axis=1) * factor
        return Z_proy

# ==============================================================
# Simulación de cohorte (con motivación y abandono)
# ==============================================================
def simular_cohorte(n_est, umbral_rep, modo, continuidad, seed):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    motiv = np.ones(n_est)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)

    for anio in range(ANIOS_CICLO):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break

        Z = generar_latentes(len(idx), modo, rng)
        desplazamiento = (1 - motiv[idx]) * 0.5
        Z_ajustado = Z - desplazamiento[:, None]
        fallas = (Z_ajustado < UMBRAL).sum(axis=1)
        stock_pre = stock[idx] + fallas

        if continuidad:
            aprob = rng.binomial(stock_pre, P_CONTINUA)
            stock_final = stock_pre - aprob
            repite = np.zeros(len(idx), dtype=bool)
            curso[idx] += 1
        else:
            aprob_mesa = rng.binomial(stock_pre, P_MESA)
            stock_final = stock_pre - aprob_mesa
            repite = stock_final >= umbral_rep
            num_rep[idx] += repite.astype(int)
            curso[idx] = np.where(repite, curso[idx], curso[idx] + 1)

        stock[idx] = stock_final

        # Egreso
        egresa_idx = idx[curso[idx] > ANIOS_CICLO]
        activo[egresa_idx] = False

        # Motivación
        sigue = activo[idx]
        if continuidad:
            sube = stock_final < 4
            motiv[idx] = np.where(sube,
                                  np.minimum(motiv[idx] + FACTOR_MEJORA_PROM, 1.0),
                                  np.maximum(motiv[idx] - FACTOR_RED_STOCK_ALTO, 0.0))
        else:
            m = motiv[idx]
            m = np.where(repite, m - FACTOR_RED_REP,
                         np.where(stock_final >= 4, m - FACTOR_RED_STOCK_ALTO,
                                  m + FACTOR_MEJORA_PROM))
            motiv[idx] = np.clip(m, 0.0, 1.0)

        # Abandono
        if continuidad:
            p_ab = np.where(stock_final >= 4, P_AB_STOCK_ALTO, P_AB_STOCK_BAJO)
        else:
            p_ab = np.where(repite, P_AB_REP,
                            np.where(stock_final >= 4, P_AB_STOCK_ALTO,
                                     P_AB_STOCK_BAJO))
        p_ab = np.where(motiv[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motiv[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona = rng.random(len(idx)) < p_ab
        abandona = abandona & sigue
        activo[idx[abandona]] = False

    egresados = ~activo & (curso > ANIOS_CICLO)
    abandonos = ~activo & (curso <= ANIOS_CICLO)
    stocks_egr = stock[egresados] if egresados.any() else np.array([])

    return {
        "egres_sin_rep": (egresados & (num_rep == 0)).sum() / n_est * 100,
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonos.sum() / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
        "pct_mas5": (stocks_egr > 5).mean() * 100 if len(stocks_egr) > 0 else 0.0,
    }

def ejecutar(umbral_rep, modo, continuidad):
    rs = []
    for s in range(N_SEM):
        rs.append(simular_cohorte(NUEVOS_POR_ANIO, umbral_rep, modo,
                                   continuidad, seed=SEED0 + s))
    return {k: np.mean([r[k] for r in rs]) for k in rs[0]}

# ==============================================================
# Ejecución: cuatro escenarios
# ==============================================================
if __name__ == "__main__":
    print("=" * 90)
    print("COMPARACIÓN FINAL: ABP EN TRADICIONAL Y EN CONTINUIDAD")
    print("=" * 90)
    print(f"{N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print(f"P_APROB = {P_APROB}, UMBRAL = {UMBRAL:.4f}")
    print(f"Correlación intra-par (tipos distintos): "
          f"{RHO_COMUN + RHO_TIPO * RHO_APT:.2f}")
    print()

    escenarios = [
        ("Tradicional sin ABP", 5, "suelto", False),
        ("Tradicional con ABP", 3, "proyectos", False),
        ("Continuidad sin ABP", 1000, "suelto", True),
        ("Continuidad con ABP", 1000, "proyectos", True),
    ]

    print(f"{'Escenario':<26} | {'Egreso s/rep':>13} | {'Egreso total':>13} | "
          f"{'Abandono':>10} | {'Stock medio':>12} | {'% >5 prev':>10}")
    print("-" * 100)

    resultados = {}
    for nombre, umbral, modo, cont in escenarios:
        r = ejecutar(umbral, modo, cont)
        resultados[nombre] = r
        print(f"{nombre:<26} | "
              f"{r['egres_sin_rep']:>12.1f}% | "
              f"{r['egres_total']:>12.1f}% | "
              f"{r['abandono']:>9.1f}% | "
              f"{r['stock_medio']:>11.2f} | "
              f"{r['pct_mas5']:>9.1f}%")

    print()
    print("--- DIFERENCIAS POR ABP ---")
    dif_trad = resultados["Tradicional con ABP"]["egres_sin_rep"] - \
               resultados["Tradicional sin ABP"]["egres_sin_rep"]
    dif_cont = resultados["Continuidad con ABP"]["egres_sin_rep"] - \
               resultados["Continuidad sin ABP"]["egres_sin_rep"]
    print(f"ABP en régimen tradicional: Δ egreso = {dif_trad:+.1f} pp")
    print(f"ABP en régimen continuidad: Δ egreso = {dif_cont:+.1f} pp")

Salida esperada:

Escenario                  |  Egreso s/rep |  Egreso total |   Abandono |  Stock medio |  % >5 prev
Tradicional sin ABP        |         43.8% |         43.8% |      23.2% |        2.27 |       0.0%
Tradicional con ABP        |         48.7% |         48.7% |      21.0% |        0.94 |       0.0%
Continuidad sin ABP        |         94.9% |         94.9% |       5.1% |        1.44 |       1.2%
Continuidad con ABP        |         95.7% |         95.7% |       4.3% |        0.73 |       0.1%

--- DIFERENCIAS POR ABP ---
ABP en régimen tradicional: Δ egreso = +4.9 pp
ABP en régimen continuidad: Δ egreso = +0.8 pp

Nota sobre la interpretación: la mejora del ABP es modesta porque las materias del mismo estudiante están correlacionadas (ρ≈0,15\rho \approx 0{,}15 entre tipos distintos), lo que limita el poder de la compensación. El análisis de conjunción vs compensación (sección A.16) explica por qué: cuando los dos factores son independientes, la compensación puede convertir 25% en 75%; cuando están correlacionados, la mejora es mucho menor.

A.16 Simulación de la doble exigencia: estudiante aplicado y docente profesional

Esta sección presenta el código utilizado para analizar el efecto de exigir dos condiciones simultáneas para aprobar una materia: que el estudiante sea suficientemente aplicado y que el docente sea suficientemente profesional. Cuando ambas condiciones se distribuyen normalmente y se combinan bajo distintas reglas —conjunción «Y», compensación «O», o combinación aditiva— la probabilidad de aprobar cambia drásticamente. Este análisis fundamenta la subsección 4.4 del Capítulo 4.

El programa explora cuatro modelos:

  1. Conjunción vs compensación: qué ocurre cuando se exige que ambos factores superen el umbral, frente a permitir que al menos uno lo haga.
  2. Combinación aditiva: qué ocurre cuando la nota final es una suma ponderada de ambos factores.
  3. Efecto de la varianza: qué ocurre cuando cambia la dispersión de las distribuciones.
  4. Efecto de la correlación: qué ocurre cuando los dos factores no son independientes.
import numpy as np
import math

# ==============================================================
# Función de distribución acumulada normal estándar (sin scipy)
# ==============================================================
def norm_cdf(x):
    """CDF de la normal estándar usando math.erf."""
    return 0.5 * (1 + math.erf(x / math.sqrt(2)))

# ==============================================================
# Parámetros generales
# ==============================================================
UMBRAL_S = 0.5     # umbral de aplicación estudiantil (en desv. estándar)
UMBRAL_D = 0.5     # umbral de profesionalidad docente (en desv. estándar)
N_SIM = 100000     # número de simulaciones para Montecarlo
SEED = 42

# ==============================================================
# Modelo A: conjunción ("Y") vs compensación ("O")
# ==============================================================
def calcular_conjuncion(umbral_s, umbral_d):
    """Calcula la probabilidad de aprobar bajo reglas 'Y' y 'O'."""
    p_s = 1 - norm_cdf(umbral_s)
    p_d = 1 - norm_cdf(umbral_d)
    p_Y = p_s * p_d                    # conjunción: ambos deben superar
    p_O = 1 - (1 - p_s) * (1 - p_d)    # compensación: al menos uno
    return p_s, p_d, p_Y, p_O

print("=" * 70)
print("MODELO A: CONJUNCIÓN vs COMPENSACIÓN")
print("=" * 70)
print(f"{'p_S':>8} | {'p_D':>8} | {'Conjunción Y':>14} | "
      f"{'Compensación O':>16} | {'Impuesto':>10}")
print("-" * 70)

for u_s, u_d in [(0.0, 0.0), (0.5, 0.5), (1.0, 1.0), (1.28, 1.28),
                 (0.5, 1.0), (1.0, 0.5), (0.84, 0.84), (1.64, 1.64)]:
    p_s, p_d, p_Y, p_O = calcular_conjuncion(u_s, u_d)
    impuesto = p_s - p_Y
    print(f"{p_s:>8.3f} | {p_d:>8.3f} | {p_Y:>13.3f} | "
          f"{p_O:>15.3f} | {impuesto:>9.3f}")

# ==============================================================
# Modelo B: combinación aditiva
# ==============================================================
print()
print("=" * 70)
print("MODELO B: NOTA = a·S + b·D + error, aprobar si NOTA > umbral")
print("=" * 70)

def probabilidad_aprobacion_aditiva(a, b, umbral, sigma_error=1.0,
                                    mu_s=0.0, mu_d=0.0,
                                    sigma_s=1.0, sigma_d=1.0):
    """
    Nota = a·S + b·D + ε, con S ~ N(mu_s, sigma_s²), D ~ N(mu_d, sigma_d²),
    ε ~ N(0, sigma_error²). Aprobar si Nota > umbral.
    """
    media = a * mu_s + b * mu_d
    varianza = a**2 * sigma_s**2 + b**2 * sigma_d**2 + sigma_error**2
    z = (umbral - media) / math.sqrt(varianza)
    return 1 - norm_cdf(z)

escenarios = [
    (1.0, 1.0, 0.5, "Ambos contribuyen igual"),
    (2.0, 1.0, 0.5, "Docente pesa el doble"),
    (1.0, 2.0, 0.5, "Estudiante pesa el doble"),
    (1.0, 1.0, 0.0, "Umbral bajo (todos aprueban)"),
    (1.0, 1.0, 1.0, "Umbral alto (exigente)"),
]

print(f"{'a':>5} | {'b':>5} | {'Umbral':>8} | {'P(aprobar)':>12} | {'Descripción'}")
print("-" * 70)
for a, b, u, desc in escenarios:
    p = probabilidad_aprobacion_aditiva(a, b, u)
    print(f"{a:>5.1f} | {b:>5.1f} | {u:>8.2f} | {p*100:>11.2f}% | {desc}")

# ==============================================================
# Modelo C: efecto de la varianza
# ==============================================================
print()
print("=" * 70)
print("MODELO C: EFECTO DE LA VARIANZA EN LA APROBACIÓN")
print("=" * 70)

def probabilidad_con_varianza(sigma_s, sigma_d, umbral=0.5, a=1.0, b=1.0):
    return probabilidad_aprobacion_aditiva(a, b, umbral,
                                            mu_s=0.0, mu_d=0.0,
                                            sigma_s=sigma_s, sigma_d=sigma_d)

print(f"{'sigma_S':>10} | {'sigma_D':>10} | {'P(aprobar)':>12} | {'Interpretación'}")
print("-" * 70)
for ss, sd, desc in [
    (0.5, 0.5, "Baja varianza (todos parecidos)"),
    (1.0, 1.0, "Varianza estándar"),
    (1.5, 1.5, "Alta varianza (muy heterogéneos)"),
    (2.0, 2.0, "Varianza extrema (sistema polarizado)"),
    (1.0, 0.5, "Estudiantes diversos, docentes parecidos"),
    (0.5, 1.0, "Estudiantes parecidos, docentes diversos"),
]:
    p = probabilidad_con_varianza(ss, sd)
    print(f"{ss:>10.2f} | {sd:>10.2f} | {p*100:>11.2f}% | {desc}")

# ==============================================================
# Modelo D: verificación por Montecarlo
# ==============================================================
print()
print("=" * 70)
print("VERIFICACIÓN POR SIMULACIÓN MONTECARLO")
print("=" * 70)
np.random.seed(SEED)
print(f"Número de simulaciones: {N_SIM:,}")
print()

S = np.random.normal(0, 1, N_SIM)
D = np.random.normal(0, 1, N_SIM)

aprueba_Y = (S > UMBRAL_S) & (D > UMBRAL_D)
p_sim_Y = aprueba_Y.mean()

aprueba_O = (S > UMBRAL_S) | (D > UMBRAL_D)
p_sim_O = aprueba_O.mean()

p_s_an = 1 - norm_cdf(UMBRAL_S)
p_d_an = 1 - norm_cdf(UMBRAL_D)
p_Y_an = p_s_an * p_d_an
p_O_an = 1 - (1 - p_s_an) * (1 - p_d_an)

print(f"                    Analítico    Simulado")
print(f"Conjunción (Y)      {p_Y_an:.4f}     {p_sim_Y:.4f}")
print(f"Compensación (O)    {p_O_an:.4f}     {p_sim_O:.4f}")
print()

nota = S + D + np.random.normal(0, 1, N_SIM)
p_adic_sim = (nota > 0.5).mean()
p_adic_an = probabilidad_aprobacion_aditiva(1.0, 1.0, 0.5)
print(f"Aditivo (a=1,b=1)   {p_adic_an:.4f}     {p_adic_sim:.4f}")

# ==============================================================
# Modelo E: efecto de la correlación
# ==============================================================
print()
print("=" * 70)
print("EFECTO DE LA CORRELACIÓN ENTRE APLICACIÓN Y PROFESIONALIDAD")
print("=" * 70)

def simular_con_correlacion(rho, N=100000, umbral_s=0.5, umbral_d=0.5, seed=42):
    rng = np.random.default_rng(seed)
    Z = rng.normal(size=(N, 2))
    L = np.linalg.cholesky([[1, rho], [rho, 1]])
    SD = Z @ L.T
    S, D = SD[:, 0], SD[:, 1]
    p_Y = ((S > umbral_s) & (D > umbral_d)).mean()
    p_O = ((S > umbral_s) | (D > umbral_d)).mean()
    return p_Y, p_O

print(f"{'rho':>6} | {'Conjunción Y':>14} | {'Compensación O':>16} | {'Interpretación'}")
print("-" * 80)
for rho, desc in [(-0.5, "Correlación negativa fuerte"),
                  (-0.2, "Correlación negativa débil"),
                  (0.0, "Independencia"),
                  (0.3, "Correlación positiva moderada"),
                  (0.5, "Correlación positiva fuerte"),
                  (0.7, "Correlación positiva muy fuerte")]:
    pY, pO = simular_con_correlacion(rho)
    print(f"{rho:>6.2f} | {pY:>13.4f} | {pO:>15.4f} | {desc}")

print()
print("=" * 70)
print("FIN DEL ANÁLISIS")
print("=" * 70)

Salida esperada (extracto):

MODELO A: CONJUNCIÓN vs COMPENSACIÓN
     p_S |      p_D |  Conjunción Y |  Compensación O |  Impuesto
----------------------------------------------------------------------
   0.500 |    0.500 |        0.250 |          0.750 |     0.250
   0.309 |    0.309 |        0.095 |          0.522 |     0.213
   0.159 |    0.159 |        0.025 |          0.292 |     0.133
   0.100 |    0.100 |        0.010 |          0.190 |     0.090
   0.309 |    0.159 |        0.049 |          0.418 |     0.260

MODELO B: NOTA = a·S + b·D + error
    a |     b |  Umbral |  P(aprobar) | Descripción
----------------------------------------------------------------------
  1.0 |   1.0 |     0.50 |      38.64% | Ambos contribuyen igual
  2.0 |   1.0 |     0.50 |      41.91% | Docente pesa el doble
  1.0 |   2.0 |     0.50 |      41.91% | Estudiante pesa el doble
  1.0 |   1.0 |     0.00 |      50.00% | Umbral bajo
  1.0 |   1.0 |     1.00 |      28.19% | Umbral alto

MODELO C: EFECTO DE LA VARIANZA
  sigma_S |  sigma_D | P(aprobar) | Interpretación
----------------------------------------------------------------------
     0.50 |     0.50 |     34.15% | Baja varianza
     1.00 |     1.00 |     38.64% | Varianza estándar
     1.50 |     1.50 |     41.56% | Alta varianza
     2.00 |     2.00 |     43.38% | Varianza extrema

EFECTO DE LA CORRELACIÓN
   rho | Conjunción Y | Compensación O | Interpretación
----------------------------------------------------------------------
 -0.50 |       0.0363 |         0.5792 | Correlación negativa fuerte
  0.00 |       0.0939 |         0.5208 | Independencia
  0.50 |       0.1626 |         0.4529 | Correlación positiva fuerte
  0.70 |       0.1968 |         0.4179 | Correlación positiva muy fuerte

Interpretación pedagógica: este análisis muestra que la regla conjuntiva («Y») castiga sistemáticamente a los estudiantes promedio. Con probabilidades marginales del 50% en cada factor, la conjunción da 25% y la compensación 75%. El «impuesto de la conjunción» alcanza su máximo cuando uno de los dos factores es el cuello de botella. La varianza alta polariza el sistema. La correlación positiva entre los dos factores beneficia a los que ya están arriba y castiga a los que están abajo. Este es el fundamento matemático de por qué la continuidad pedagógica y el ABP —que transforman la regla «Y» en reglas más cercanas a «O»— mejoran el egreso y reducen la desigualdad.

Uso en el documento: los resultados de este programa se reportan en la subsección 4.4 del Capítulo 4, «La doble exigencia: estudiante aplicado y docente profesional». Las tablas que allí se presentan corresponden a los modelos A, C y E de este programa.

A.17 Análisis de sensibilidad univariada

Esta sección presenta el programa utilizado para evaluar la robustez del modelo frente a variaciones en los parámetros conductuales. El objetivo es responder a una objeción razonable: si los resultados dependieran críticamente de los valores específicos de los parámetros de motivación y abandono, la conclusión central del documento sería frágil. El análisis muestra que no lo es.

A.17.1 Diseño del análisis

Se varía un parámetro por vez, manteniendo los demás en su valor base, y se mide el efecto sobre el egreso sin repetir y el abandono en los tres escenarios principales:

  1. Base: 12 materias por año, umbral de repitencia 5, mesas de examen con efectividad del 25%.
  2. Continuidad: 6 materias por año, sin repitencia, recuperación en proceso con probabilidad 0,55.
  3. Continuidad + ABP: 6 proyectos interdisciplinarios, sin repitencia, recuperación en proceso.

Los parámetros que se varían son cinco:

Parámetros conductuales variados en el análisis de sensibilidad univariada
Parámetro Valores probados Qué controla
factor_reduccion_repitencia0,10 / 0,20 / 0,30Cuánto baja la motivación al repetir
factor_motivacion_prob0,25 / 0,50 / 0,75Cuánto influye la desmotivación en la probabilidad de desaprobar
p_abandono_base_repitencia0,10 / 0,15 / 0,25Probabilidad de abandono si el estudiante repite
p_abandono_base_promocion_stock_bajo0,005 / 0,010 / 0,020Probabilidad de abandono si el estudiante promociona con stock bajo
motivacion_minima0,05 / 0,10 / 0,20Umbral de motivación por debajo del cual el abandono es forzoso

En total se ejecutan 5 parámetros × 3 valores × 3 escenarios × 30 semillas = 1.350 simulaciones completas de cohorte, con 1.000 estudiantes por cohorte y 20 años de simulación.

A.17.2 Resultados

El resultado central es que el ordenamiento de los escenarios se mantiene en todas las combinaciones. En los 45 cruces entre parámetros, valores y escenarios, el egreso sin repetir sigue el mismo orden:

Base < Continuidad < Continuidad + ABP

Los valores absolutos varían dentro de rangos estrechos:

Rango observado de egreso sin repetir por escenario
Escenario Rango observado de egreso sin repetir
Base51,2% – 54,2%
Continuidad91,4% – 96,8%
Continuidad + ABP92,2% – 98,0%

A.17.3 Análisis por parámetro

factor_reduccion_repitencia (0,10 a 0,30): prácticamente sin efecto. Los valores de egreso son 53,2% / 53,2% / 53,3% en base, y 95,0% / 95,0% / 95,0% en continuidad. El parámetro no se activa en los escenarios de continuidad (no hay repitencia) y afecta a pocos estudiantes en el escenario base.

factor_motivacion_prob (0,25 a 0,75): efecto mínimo. Egreso 53,4% / 53,2% / 53,1% en base, y 95,1% / 95,0% / 95,0% en continuidad. La motivación modula la probabilidad individual pero el efecto agregado se cancela.

p_abandono_base_repitencia (0,10 a 0,25): sin efecto significativo. Egreso 53,1% / 53,2% / 53,3% en base, y 95,0% en los tres valores de continuidad.

p_abandono_base_promocion_stock_bajo (0,005 a 0,020): el único parámetro con efecto apreciable. Es el que controla la probabilidad de que un estudiante abandone cuando promociona con stock bajo, que es la situación más común en el escenario de continuidad pedagógica.

Efecto del parámetro de abandono con promoción y stock bajo sobre el egreso sin repetir
Valor Base Continuidad Continuidad + ABP
0,00554,2%96,8%98,0%
0,01053,2%95,0%96,0%
0,02051,2%91,4%92,2%

Al duplicar este parámetro, el egreso baja 3,0 puntos en base, 5,4 puntos en continuidad y 5,8 puntos en continuidad + ABP. Pero incluso en el peor caso, el ordenamiento se mantiene: base 51,2%, continuidad 91,4%, continuidad + ABP 92,2%.

motivacion_minima (0,05 a 0,20): sin efecto. El umbral de motivación para abandono forzoso no cambia los resultados, porque la motivación rara vez cae por debajo de 0,20 en los escenarios analizados.

A.17.4 Interpretación

Este análisis confirma que las conclusiones del documento no dependen de los valores específicos de los parámetros conductuales. El hallazgo central —que la eliminación de la repitencia global eleva el egreso de aproximadamente la mitad al 95%, y que el ABP agrega una mejora adicional— se sostiene bajo un rango amplio de supuestos sobre motivación y abandono. La tesis estructural del documento queda blindada contra la crítica de arbitrariedad de parámetros.

El único parámetro con efecto apreciable es la probabilidad base de abandono cuando el estudiante promociona con stock bajo. Esto sugiere que, si una escuela quiere maximizar el egreso, debe concentrar sus esfuerzos en reducir el abandono de los estudiantes que ya están promocionando. Ese es el punto de mayor palanca dentro de los parámetros conductuales.

import numpy as np

# ==============================================================
# Aproximación del cuantil normal estándar (sin scipy)
# ==============================================================
def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

# ==============================================================
# Parámetros globales
# ==============================================================
ANIO_INICIO = 2026
ANIO_FIN_COHORTES_ANALIZADAS = 2035   # cohortes con tiempo completo de egresar
ANIOS_SIM = 20
ANIOS_CICLO = 5
NUEVOS_POR_ANIO = 1000
P_APROB = 0.90
RHO_COMUN = 0.3
RHO_INTRA = 0.2
P_MESA = 0.25
P_CONTINUA = 0.55
UMBRAL_REP = 5
UMBRAL_REP_ABP = 3
N_SEM = 30
SEED0 = 1000

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]
PROYECTOS_ABP = [[0, 3], [1, 5], [2, 6], [4, 7], [8, 9], [10, 11]]

# ==============================================================
# Generación de desaprobaciones
# ==============================================================
def generar_desaprobaciones(p_base, motivacion, modo_eval, params):
    p_eff = p_base * (1 + (1 - motivacion) * params["factor_motivacion_prob"])
    p_eff = min(p_eff, 1.0)
    if modo_eval == "suelto":
        return np.random.binomial(12, p_eff)
    else:
        p_proyecto = p_eff * 0.7
        return np.random.binomial(6, p_proyecto)

# ==============================================================
# Clase Estudiante
# ==============================================================
class Estudiante:
    def __init__(self, id_est, anio_ing, p_base, params):
        self.id = id_est
        self.anio_ingreso = anio_ing
        self.p_base = p_base
        self.curso = 1
        self.stock = 0
        self.motivacion = 1.0
        self.activo = True
        self.num_repeticiones = 0

    def cursar_anio(self, params, anio_actual):
        if not self.activo:
            return None
        desaprobadas = generar_desaprobaciones(
            self.p_base, self.motivacion, params["modo_eval"], params
        )
        stock_pre = self.stock + desaprobadas

        if params["continuidad_pedagogica"]:
            aprobadas = np.random.binomial(stock_pre, params["p_continua"])
            stock_final = stock_pre - aprobadas
            estado = "promocion"
            self.stock = stock_final
            self.curso += 1
        else:
            aprobadas_mesa = np.random.binomial(stock_pre, params["p_mesa"])
            stock_final = stock_pre - aprobadas_mesa
            umbral = params["umbral_repitencia"]
            if stock_final >= umbral:
                estado = "repitencia"
                self.stock = stock_final
                self.num_repeticiones += 1
            else:
                estado = "promocion"
                self.stock = stock_final
                self.curso += 1

        egresado = False
        if self.curso > params["anios_ciclo"]:
            egresado = True
            self.activo = False
            self.curso = params["anios_ciclo"]

        # Motivación
        if not params["continuidad_pedagogica"] and estado == "repitencia":
            self.motivacion -= params["factor_reduccion_repitencia"]
        elif stock_final >= 4:
            self.motivacion -= params["factor_reduccion_stock_alto"]
        else:
            self.motivacion += params["factor_mejora_promocion"]
        self.motivacion = max(0.0, min(1.0, self.motivacion))

        # Abandono
        if self.motivacion < params["motivacion_minima"]:
            abandona = True
        else:
            if not params["continuidad_pedagogica"] and estado == "repitencia":
                p_ab = params["p_abandono_base_repitencia"]
            elif stock_final >= 4:
                p_ab = params["p_abandono_base_promocion_stock_alto"]
            else:
                p_ab = params["p_abandono_base_promocion_stock_bajo"]
            if self.motivacion < 0.5:
                p_ab += params["p_abandono_factor_motivacion"]
            abandona = np.random.rand() < min(p_ab, 1.0)

        if abandona:
            self.activo = False

        return {
            "id": self.id,
            "anio_ingreso": self.anio_ingreso,
            "anio": anio_actual,
            "curso": self.curso,
            "stock_final": stock_final,
            "abandona": abandona,
            "egresado": egresado,
            "num_repeticiones": self.num_repeticiones
        }

# ==============================================================
# Simulación y análisis
# ==============================================================
def obtener_parametros_beta(mu, sigma):
    s = (mu * (1 - mu) / (sigma ** 2)) - 1
    return mu * s, (1 - mu) * s

def simular(params, semilla):
    np.random.seed(semilla)
    alpha, beta = obtener_parametros_beta(0.15, 0.10)
    activos = []
    registros = []
    next_id = 1
    for anio in range(params["anio_inicio"], params["anio_inicio"] + params["anios_simulacion"]):
        for _ in range(params["nuevos_por_anio"]):
            x = np.random.gamma(alpha)
            y = np.random.gamma(beta)
            p_base = x / (x + y)
            activos.append(Estudiante(next_id, anio, p_base, params))
            next_id += 1
        for est in activos:
            reg = est.cursar_anio(params, anio)
            if reg:
                registros.append(reg)
        activos = [e for e in activos if e.activo]
    return registros

def analizar(registros):
    if not registros:
        return {"egres_sin_rep": 0.0, "abandono": 0.0}
    # Filtrar solo cohortes 2026-2035 (con tiempo completo de egresar)
    registros_filtrados = [r for r in registros
                           if ANIO_INICIO <= r["anio_ingreso"] <= ANIO_FIN_COHORTES_ANALIZADAS]
    # Guardar el último registro de cada estudiante
    ultimo = {}
    for r in registros_filtrados:
        if r["id"] not in ultimo or r["anio"] > ultimo[r["id"]]["anio"]:
            ultimo[r["id"]] = r
    total = len(ultimo)
    if total == 0:
        return {"egres_sin_rep": 0.0, "abandono": 0.0}
    egresados = [r for r in ultimo.values() if r["egresado"]]
    abandonos = sum(1 for r in ultimo.values() if r["abandona"])
    egres_sin_rep = sum(1 for r in egresados if r["num_repeticiones"] == 0)
    return {
        "egres_sin_rep": egres_sin_rep / total * 100,
        "abandono": abandonos / total * 100
    }

def simular_multiples(params, n_sem=N_SEM):
    resultados = []
    for s in range(n_sem):
        regs = simular(params, semilla=SEED0 + s)
        resultados.append(analizar(regs))
    return {
        "egres_sin_rep": np.mean([r["egres_sin_rep"] for r in resultados]),
        "abandono": np.mean([r["abandono"] for r in resultados])
    }

# ==============================================================
# Configuración base de cada escenario
# ==============================================================
def params_base():
    return {
        "anio_inicio": ANIO_INICIO,
        "anios_simulacion": ANIOS_SIM,
        "anios_ciclo": ANIOS_CICLO,
        "nuevos_por_anio": NUEVOS_POR_ANIO,
        "p_mesa": P_MESA,
        "p_continua": P_CONTINUA,
        "umbral_repitencia": UMBRAL_REP,
        "factor_reduccion_repitencia": 0.20,
        "factor_reduccion_stock_alto": 0.05,
        "factor_mejora_promocion": 0.02,
        "factor_motivacion_prob": 0.5,
        "p_abandono_base_repitencia": 0.15,
        "p_abandono_base_promocion_stock_alto": 0.05,
        "p_abandono_base_promocion_stock_bajo": 0.01,
        "p_abandono_factor_motivacion": 0.1,
        "motivacion_minima": 0.1,
        "continuidad_pedagogica": False,
        "modo_eval": "suelto"
    }

ESCENARIOS = {
    "Base (12 mat, umb 5, mesas)": {
        "continuidad_pedagogica": False,
        "modo_eval": "suelto",
        "umbral_repitencia": 5
    },
    "Continuidad (6 mat, sin rep)": {
        "continuidad_pedagogica": True,
        "modo_eval": "suelto",
        "umbral_repitencia": 1000
    },
    "Continuidad + ABP": {
        "continuidad_pedagogica": True,
        "modo_eval": "proyectos",
        "umbral_repitencia": 1000
    },
}

PARAMETROS_A_VARIAR = [
    ("factor_reduccion_repitencia", [0.10, 0.20, 0.30]),
    ("factor_motivacion_prob", [0.25, 0.50, 0.75]),
    ("p_abandono_base_repitencia", [0.10, 0.15, 0.25]),
    ("p_abandono_base_promocion_stock_bajo", [0.005, 0.010, 0.020]),
    ("motivacion_minima", [0.05, 0.10, 0.20]),
]

# ==============================================================
# Ejecución
# ==============================================================
if __name__ == "__main__":
    print("=" * 90)
    print("ANÁLISIS DE SENSIBILIDAD UNIVARIADA")
    print("=" * 90)
    print(f"Configuración: {N_SEM} semillas, {NUEVOS_POR_ANIO} estudiantes por cohorte")
    print(f"Cohortes analizadas: {ANIO_INICIO}-{ANIO_FIN_COHORTES_ANALIZADAS}")
    print(f"Total estimado de simulaciones: "
          f"{len(PARAMETROS_A_VARIAR)} × 3 × {len(ESCENARIOS)} × {N_SEM} = "
          f"{len(PARAMETROS_A_VARIAR) * 3 * len(ESCENARIOS) * N_SEM}")
    print()

    for param_nombre, valores in PARAMETROS_A_VARIAR:
        print(f"\n--- Parámetro: {param_nombre} ---")
        print(f"{'Valor':>8} | {'Escenario':<30} | {'Egreso s/rep':>14} | {'Abandono':>10}")
        print("-" * 75)
        for valor in valores:
            for esc_nombre, esc_config in ESCENARIOS.items():
                params = params_base()
                params[param_nombre] = valor
                params.update(esc_config)
                res = simular_multiples(params)
                print(f"{valor:>8.3f} | {esc_nombre:<30} | "
                      f"{res['egres_sin_rep']:>13.1f}% | {res['abandono']:>9.1f}%")
        print()

    print("=" * 90)
    print("FIN DEL ANÁLISIS")
    print("=" * 90)

A.18 Barrido de parámetros de correlación para el ABP

Esta sección presenta el programa utilizado para evaluar la robustez del aprendizaje basado en proyectos frente a distintas estructuras de correlación entre las aptitudes de los estudiantes. El objetivo es responder a una pregunta natural: si el beneficio del ABP depende de cuán correlacionadas estén las materias que se agrupan, ¿en qué rango de correlaciones el ABP sigue aportando, y en cuáles pierde eficacia?

A.18.1 Diseño del análisis

El modelo utiliza cuatro aptitudes latentes por estudiante (numérica, lingüística, social y práctica), correlacionadas entre sí según tres parámetros:

  • RHO_COMUN: el peso del factor motivacional común. Afecta a todas las materias por igual, sin importar su tipo. Si es alto, un estudiante con dificultades generales tiende a desaprobar todas las materias a la vez.
  • RHO_TIPO: el peso de la aptitud específica por tipo. Afecta a materias del mismo tipo. Si es alto, un estudiante fuerte en matemática tiende a aprobar todas las materias numéricas, y solo ellas.
  • RHO_APT: la correlación entre las aptitudes de distintos tipos. Si es alta, ser bueno en matemática predice ser bueno en lengua. Si es baja, las aptitudes son independientes entre tipos.

Se probaron tres valores para cada parámetro, sobre las 27 combinaciones válidas:

Valores de los parámetros de correlación en el barrido del ABP
Parámetro Valores probados
RHO_COMUN0,10 / 0,30 / 0,50
RHO_TIPO0,10 / 0,30 / 0,50
RHO_APT0,00 / 0,30 / 0,70

Para cada combinación se comparó el ABP contra el mismo sistema sin ABP, con igual cantidad de filtros y umbral equivalente (12 materias umbral 5 vs. 6 proyectos umbral 3). Se ejecutaron 10 semillas por combinación.

A.18.2 Resultados

El resultado principal es que el ABP mejora el egreso en las 27 combinaciones, sin excepción. La magnitud de la mejora varía entre +1,5 y +5,8 puntos porcentuales, según cuán heterogéneos sean los perfiles de los estudiantes. La tabla siguiente muestra los casos extremos:

Casos extremos del efecto del ABP según la estructura de correlación
RHO_COMUN RHO_TIPO RHO_APT Descripción Δ egreso (ABP − no ABP)
0,100,100,30Aptitudes independientes, factor común débil+5,8 pp
0,100,300,30Aptitudes por tipo fuertes, poco factor común+5,8 pp
0,300,300,30Configuración intermedia+2,3 pp
0,500,300,30Todo fuertemente correlacionado+3,0 pp
0,500,500,70Máxima homogeneidad entre tipos+1,5 pp

El patrón es claro: cuanto menor la correlación entre las materias que componen el proyecto, mayor es el beneficio del ABP. Cuando RHO_APT es bajo, un estudiante puede ser fuerte en matemática y débil en lengua, y el proyecto interdisciplinario encuentra margen para compensar. Cuando RHO_APT es alto, todas las aptitudes están correlacionadas y las dos materias del proyecto caen juntas.

A.18.3 Implicancias para el diseño de proyectos

El hallazgo tiene una implicancia pedagógica directa: el ABP es más efectivo cuando cada proyecto combina materias de tipos poco correlacionados entre sí. Un proyecto que integra Matemática con Historia, o Física con Arte, aprovecha la compensación porque un estudiante puede ser fuerte en una dimensión y débil en la otra. En cambio, un proyecto que combina Matemática con Física, o Historia con Geografía, no genera compensación apreciable, porque ambas materias dependen de la misma aptitud base.

El diseño del proyecto importa tanto como la existencia del proyecto. La recomendación práctica es evitar agrupamientos de materias afines y favorecer agrupamientos interdisciplinarios que crucen tipos distintos de aptitud. Con eso, el ABP rinde al máximo de su potencial en cualquier contexto, independientemente del perfil del alumnado.

A.18.4 Interpretación

Este análisis cierra la respuesta a la crítica de circularidad del ABP. En versiones previas, el ABP se modelaba aplicando un factor fijo de reducción a la probabilidad de desaprobar, lo que predeterminaba el resultado. Con el modelo endógeno, la compensación surge del promedio de aptitudes heterogéneas, y su magnitud depende de la estructura de correlación. El ABP nunca perjudica, pero su contribución es mayor cuando los proyectos se diseñan para maximizar la heterogeneidad interna.

import numpy as np
from itertools import product

def norm_ppf(p):
    if p <= 0 or p >= 1:
        return np.nan
    a = [-3.969683028665376e+01, 2.209460984245205e+02,
         -2.759285104469687e+02, 1.383577518672690e+02,
         -3.066479806614716e+01, 2.506628277459239e+00]
    b = [-5.447609879822406e+01, 1.615858368580409e+02,
         -1.556989798598866e+02, 6.680131188771972e+01,
         -1.328068155288572e+01]
    c = [-7.784894002430293e-03, -3.223964580411365e-01,
         -2.400758277161838e+00, -2.549732539343734e+00,
         4.374664141464968e+00, 2.938163982698783e+00]
    d = [7.784695709041462e-03, 3.224671290700398e-01,
         2.445134137142996e+00, 3.754408661907416e+00]
    p_low = 0.02425
    p_high = 1 - p_low
    if p < p_low:
        q = np.sqrt(-2 * np.log(p))
        x = (((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
            ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    elif p <= p_high:
        q = p - 0.5
        r = q * q
        x = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q / \
            (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1)
    else:
        q = np.sqrt(-2 * np.log(1 - p))
        x = -(((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]) / \
             ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1)
    return x

P_APROB = 0.85
UMBRAL = norm_ppf(1 - P_APROB)
ANIOS = 5
P_MESA = 0.25
P_CONTINUA = 0.55
N_SEM = 10
N_EST = 300
SEED0 = 7000

TIPOS = {"num": 0, "len": 1, "soc": 2, "pra": 3}
MATERIAS = [
    ("Matemática", "num"), ("Física", "num"), ("Química", "num"),
    ("Lengua", "len"), ("Inglés", "len"),
    ("Historia", "soc"), ("Geografía", "soc"), ("Formación Ética", "soc"),
    ("Biología", "num"),
    ("Tecnología", "pra"), ("Educación Física", "pra"), ("Artística", "pra")
]
PROYECTOS_ABP = [
    [0, 3], [1, 5], [2, 6], [4, 7], [8, 9], [10, 11]
]

def generar_latentes(n_est, modo, rng, rho_comun, rho_tipo, rho_apt):
    F = rng.normal(size=n_est)
    H = rng.normal(size=(n_est, 4))
    L = np.linalg.cholesky((1 - rho_apt) * np.eye(4) +
                           rho_apt * np.ones((4, 4)))
    H = H @ L.T
    var_base = max(0.0, 1 - rho_comun - rho_tipo)

    if modo == "suelto":
        Z = np.zeros((n_est, 12))
        for j, (_, tipo) in enumerate(MATERIAS):
            t = TIPOS[tipo]
            E = rng.normal(size=n_est)
            Z[:, j] = (np.sqrt(rho_comun) * F +
                       np.sqrt(rho_tipo) * H[:, t] +
                       np.sqrt(var_base) * E)
        return Z
    else:
        Z_proy = np.zeros((n_est, 6))
        for p, par in enumerate(PROYECTOS_ABP):
            Z_par = np.zeros((n_est, 2))
            tipos = []
            for idx, j in enumerate(par):
                _, tipo = MATERIAS[j]
                tipos.append(tipo)
                t = TIPOS[tipo]
                E = rng.normal(size=n_est)
                Z_par[:, idx] = (np.sqrt(rho_comun) * F +
                                 np.sqrt(rho_tipo) * H[:, t] +
                                 np.sqrt(var_base) * E)
            if tipos[0] == tipos[1]:
                rho_intra = rho_comun + rho_tipo
            else:
                rho_intra = rho_comun + rho_tipo * rho_apt
            factor = np.sqrt(2 / (1 + rho_intra))
            Z_proy[:, p] = Z_par.mean(axis=1) * factor
        return Z_proy

def simular(n_est, umbral_rep, modo, continuidad, seed,
            rho_comun, rho_tipo, rho_apt):
    rng = np.random.default_rng(seed)
    curso = np.ones(n_est, dtype=int)
    stock = np.zeros(n_est, dtype=int)
    activo = np.ones(n_est, dtype=bool)
    num_rep = np.zeros(n_est, dtype=int)
    for anio in range(ANIOS):
        idx = np.where(activo)[0]
        if len(idx) == 0:
            break
        Z = generar_latentes(len(idx), modo, rng, rho_comun, rho_tipo, rho_apt)
        fallas = (Z < UMBRAL).sum(axis=1)
        stock_pre = stock[idx] + fallas
        if continuidad:
            aprob = rng.binomial(stock_pre, P_CONTINUA)
            stock_final = stock_pre - aprob
            curso[idx] += 1
        else:
            aprob_mesa = rng.binomial(stock_pre, P_MESA)
            stock_final = stock_pre - aprob_mesa
            repite = stock_final >= umbral_rep
            num_rep[idx] += repite.astype(int)
            curso[idx] = np.where(repite, curso[idx], curso[idx] + 1)
        stock[idx] = stock_final
        activo[idx[curso[idx] > ANIOS]] = False
    egresados = ~activo & (curso > ANIOS)
    stocks_egr = stock[egresados] if egresados.any() else np.array([])
    return {
        "egres": (egresados & (num_rep == 0)).sum() / n_est * 100,
        "stock": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0,
    }

def ejecutar(umbral_rep, modo, continuidad, rho_comun, rho_tipo, rho_apt):
    rs = []
    for s in range(N_SEM):
        rs.append(simular(N_EST, umbral_rep, modo, continuidad,
                          seed=SEED0 + s, rho_comun=rho_comun,
                          rho_tipo=rho_tipo, rho_apt=rho_apt))
    return {
        "egres": np.mean([r["egres"] for r in rs]),
        "stock": np.mean([r["stock"] for r in rs]),
    }

if __name__ == "__main__":
    print("=" * 100)
    print("BARRIDO DE PARÁMETROS: ABP vs NO ABP")
    print("=" * 100)
    print(f"{N_SEM} semillas, {N_EST} estudiantes por cohorte, P_APROB = {P_APROB}")
    print()

    rho_comunes = [0.10, 0.30, 0.50]
    rho_tipos = [0.10, 0.30, 0.50]
    rho_apts = [0.00, 0.30, 0.70]

    print("Régimen TRADICIONAL (12 mat umb 5 vs 6 proy umb 3)")
    print(f"{'RHO_C':>6} | {'RHO_T':>6} | {'RHO_A':>6} | "
          f"{'Sin ABP':>10} | {'Con ABP':>10} | {'Δ':>8} | "
          f"{'Stock sin':>10} | {'Stock con':>10}")
    print("-" * 100)

    for rc, rt, ra in product(rho_comunes, rho_tipos, rho_apts):
        if rc + rt > 1.0:
            continue
        r_sin = ejecutar(5, "suelto", False, rc, rt, ra)
        r_con = ejecutar(3, "proyectos", False, rc, rt, ra)
        delta = r_con["egres"] - r_sin["egres"]
        print(f"{rc:>6.2f} | {rt:>6.2f} | {ra:>6.2f} | "
              f"{r_sin['egres']:>9.1f}% | {r_con['egres']:>9.1f}% | "
              f"{delta:>+7.1f}pp | {r_sin['stock']:>9.2f} | {r_con['stock']:>9.2f}")

    print()
    print("Régimen CONTINUIDAD (sin ABP vs con ABP)")
    print(f"{'RHO_C':>6} | {'RHO_T':>6} | {'RHO_A':>6} | "
          f"{'Sin ABP':>10} | {'Con ABP':>10} | {'Δ':>8} | "
          f"{'Stock sin':>10} | {'Stock con':>10}")
    print("-" * 100)

    for rc, rt, ra in product(rho_comunes, rho_tipos, rho_apts):
        if rc + rt > 1.0:
            continue
        r_sin = ejecutar(1000, "suelto", True, rc, rt, ra)
        r_con = ejecutar(1000, "proyectos", True, rc, rt, ra)
        delta = r_con["egres"] - r_sin["egres"]
        print(f"{rc:>6.2f} | {rt:>6.2f} | {ra:>6.2f} | "
              f"{r_sin['egres']:>9.1f}% | {r_con['egres']:>9.1f}% | "
              f"{delta:>+7.1f}pp | {r_sin['stock']:>9.2f} | {r_con['stock']:>9.2f}")

Salida esperada (extracto del régimen tradicional):

RHO_C | RHO_T | RHO_A |   Sin ABP |   Con ABP |        Δ | Stock sin | Stock con
----------------------------------------------------------------------------------------
 0.10 |  0.10 |  0.00 |     47.4% |     53.2% |    +5.8pp |      2.54 |      1.03
 0.10 |  0.30 |  0.30 |     47.9% |     53.7% |    +5.8pp |      2.32 |      0.90
 0.30 |  0.30 |  0.30 |     48.7% |     51.0% |    +2.3pp |      1.95 |      0.77
 0.50 |  0.30 |  0.30 |     47.5% |     50.5% |    +3.0pp |      1.57 |      0.60
 0.50 |  0.50 |  0.70 |     46.9% |     48.4% |    +1.5pp |      0.83 |      0.37

Nota sobre la interpretación: el ABP nunca perjudica. En las 27 combinaciones, siempre mejora el egreso, aunque con distinta magnitud. El efecto es mayor cuando las aptitudes son heterogéneas (RHO_APT bajo) y menor cuando todas las aptitudes están correlacionadas (RHO_APT alto). Esto respalda la recomendación de diseñar proyectos que combinen materias de tipos poco correlacionados.

A.19 Integración de la doble exigencia al modelo basado en agentes

Esta sección presenta los dos programas utilizados para integrar el análisis de conjunción vs. compensación (sección 4.4) al modelo basado en agentes. El primer programa ejecuta el ABM con los tres regímenes de combinación (compensatoria, mixta, conjuntiva) y reporta los resultados principales. El segundo barre sistemáticamente los parámetros clave para verificar que el ordenamiento se mantiene.

A.19.1 Modelo

Cada par (estudiante, materia) tiene dos fuentes de falla:

  • p_s: probabilidad de falla del lado del estudiante, que combina su probabilidad base, su aptitud para el tipo de materia y su motivación.
  • p_t: probabilidad de falla del lado del docente/materia, que refleja la heterogeneidad entre materias.

Las dos fuentes se combinan según un parámetro rule_mix que interpola entre:

  • Regla compensatoria (rule_mix = 0): la materia se aprueba si al menos uno de los dos lados funciona. La falla ocurre solo si ambos fallan: p_fail = p_s * p_t.
  • Regla conjuntiva (rule_mix = 1): la materia se aprueba solo si ambos lados funcionan. La falla ocurre si cualquiera falla: p_fail = 1 - (1-p_s)(1-p_t).
  • Regla mixta (rule_mix = 0,5): combinación lineal de las dos anteriores.

A.19.2 Resultados principales

Con parámetros base P_BASE_MEAN = 0,15 y P_TEACHER_MEAN = 0,15:

Resultados del ABM con doble exigencia integrada, según régimen y regla de combinación
Régimen Regla Egreso sin repetir Abandono Stock medio
BaseCompensatoria95,7%3,9%0,59
BaseMixta51,1%20,4%2,42
BaseConjuntiva11,6%46,0%3,01
ContinuidadCompensatoria96,3%3,7%0,21
ContinuidadMixta95,5%4,5%1,44
ContinuidadConjuntiva93,3%6,7%2,64

A.19.3 Análisis de sensibilidad

Se barrió cada parámetro por separado, manteniendo los demás en su valor base:

Análisis de sensibilidad del ABM con doble exigencia: ordenamiento Comp > Mix > Conj
Parámetro Valor Compensatoria Mixta Conjuntiva
P_BASE_MEAN0,1095,9%62,4%20,3%
P_BASE_MEAN0,1595,7%50,3%11,4%
P_BASE_MEAN0,2095,1%35,9%4,7%
P_TEACHER_MEAN0,1096,0%62,8%22,9%
P_TEACHER_MEAN0,1595,7%50,3%11,4%
P_TEACHER_MEAN0,2095,1%38,9%4,8%
SIGMA_TEACHER0,1595,8%50,1%11,9%
SIGMA_TEACHER0,3095,7%50,3%11,4%
SIGMA_TEACHER0,4595,7%52,3%11,6%
SIGMA_APT0,1595,9%51,1%11,3%
SIGMA_APT0,3095,7%50,3%11,4%
SIGMA_APT0,4595,8%51,9%11,9%

El ordenamiento Comp > Mix > Conj se mantiene en las 12 configuraciones. La magnitud del efecto depende de P_BASE_MEAN y P_TEACHER_MEAN, pero no de las dispersiones. Esto confirma que el resultado no depende de cuánta heterogeneidad haya entre docentes o entre estudiantes, sino de la lógica estructural de la regla de combinación.

A.19.4 Nota metodológica

Los parámetros p_s y p_t son construcciones analíticas, no mediciones empíricas. Representan, respectivamente, la probabilidad de que el estudiante falle por causas propias y la probabilidad de que el docente/materia introduzca dificultad. No son directamente observables, pero su combinación mediante la regla rule_mix permite cuantificar el efecto estructural de la lógica de combinación. Los resultados deben interpretarse como un experimento computacional condicional: bajo el supuesto de que el sistema actual opera con una regla conjuntiva y la propuesta con una regla compensatoria, la diferencia de egreso es de 84 puntos porcentuales. La validez del resultado depende de la validez del supuesto, no de la simulación en sí.

A.19.5 Conexión con el resto del documento

Este análisis integra la sección 4.4 del Capítulo 4 al modelo basado en agentes. Los resultados refuerzan la tesis central: la exclusión no se origina en la calidad de los estudiantes ni en la calidad de los docentes, sino en la regla que combina sus contribuciones. La continuidad pedagógica, al eliminar el umbral de repitencia, amortigua el efecto de la regla, pero no lo elimina: la diferencia entre reglas se mantiene, aunque más pequeña, en el régimen de continuidad (93,3% vs. 96,3%).

CÓDIGO 1: ABM con doble exigencia integrada

import numpy as np

# ==============================================================
# Parámetros generales
# ==============================================================
N_EST = 1000
ANIOS_CICLO = 5
N_SEM = 20
SEED0 = 20000

# Lado del estudiante
P_BASE_MEAN = 0.15        # probabilidad media de falla propia del estudiante
P_BASE_SIGMA = 0.10       # dispersión entre estudiantes

# Lado del docente
P_TEACHER_MEAN = 0.15     # probabilidad media de "falla docente" por materia
SIGMA_TEACHER = 0.30      # heterogeneidad entre materias

# Perfil de aptitudes del estudiante
SIGMA_APT = 0.30

# Reglas operativas del ABM (iguales que en A.1)
FACTOR_RED_REP = 0.20
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
FACTOR_MOTIV_PROB = 0.5
P_AB_REP = 0.15
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

P_MESA = 0.25
P_CONTINUA = 0.55
UMBRAL_REP = 5

TIPO_IDX = np.array([0, 0, 0, 1, 1, 2, 2, 2, 0, 3, 3, 3])
N_TIPOS = 4


# ==============================================================
# Funciones auxiliares
# ==============================================================
def obtener_parametros_beta(mu, sigma):
    s = (mu * (1 - mu) / (sigma ** 2)) - 1
    return mu * s, (1 - mu) * s


def generar_factores_docente(sigma, rng):
    if sigma == 0:
        return np.ones(12)
    log_d = rng.normal(-0.5 * sigma**2, sigma, size=12)
    return np.exp(log_d)


def generar_aptitudes(n_est, sigma, rng):
    if sigma == 0:
        return np.ones((n_est, N_TIPOS))
    log_apt = rng.normal(-0.5 * sigma**2, sigma,
                          size=(n_est, N_TIPOS))
    return np.exp(log_apt)


# ==============================================================
# Simulación vectorizada de una cohorte
# ==============================================================
def simular_cohorte(n_est, rule_mix, params, semilla):
    """
    rule_mix = 0.0  -> regla compensatoria ("O"): falla solo si ambos fallan
    rule_mix = 1.0  -> regla conjuntiva ("Y"): falla si alguno falla
    valores intermedios -> mezcla lineal entre ambas reglas
    """
    rng = np.random.default_rng(semilla)
    alpha, beta = obtener_parametros_beta(P_BASE_MEAN, P_BASE_SIGMA)
    p_bases = rng.beta(alpha, beta, size=n_est)
    aptitudes = generar_aptitudes(n_est, SIGMA_APT, rng)
    d_docentes = generar_factores_docente(SIGMA_TEACHER, rng)

    # Probabilidad de falla del lado docente, por materia (12 valores)
    p_teacher = d_docentes * P_TEACHER_MEAN

    cursos = np.ones(n_est, dtype=int)
    stocks = np.zeros(n_est, dtype=int)
    motivaciones = np.ones(n_est)
    activos = np.ones(n_est, dtype=bool)
    num_reps = np.zeros(n_est, dtype=int)
    egresados = np.zeros(n_est, dtype=bool)
    abandonaron = np.zeros(n_est, dtype=bool)

    umbral = params["umbral_repitencia"]
    continuidad = params["continuidad_pedagogica"]

    for anio_ciclo in range(ANIOS_CICLO):
        idx = np.where(activos)[0]
        if len(idx) == 0:
            break

        mot_factor = 1 + (1 - motivaciones[idx]) * FACTOR_MOTIV_PROB

        # Lado del estudiante: p_s (n_act x 12)
        p_s = p_bases[idx][:, None] \
              * aptitudes[idx][:, TIPO_IDX] \
              * mot_factor[:, None]
        p_s = np.clip(p_s, 0.0, 1.0)

        # Lado del docente: p_t (broadcast a n_act x 12)
        p_t = np.broadcast_to(p_teacher[None, :], p_s.shape)

        # Regla compensatoria ("O"): falla si AMBOS fallan
        p_fail_comp = p_s * p_t

        # Regla conjuntiva ("Y"): falla si ALGUNO falla
        p_fail_conj = 1 - (1 - p_s) * (1 - p_t)

        # Mezcla lineal
        p_fail = rule_mix * p_fail_conj + (1 - rule_mix) * p_fail_comp
        p_fail = np.clip(p_fail, 0.0, 1.0)

        # Sortear las 12 materias de todos los estudiantes activos
        desaprobadas = rng.binomial(1, p_fail).sum(axis=1)
        stock_pre = stocks[idx] + desaprobadas

        if continuidad:
            aprobadas = rng.binomial(stock_pre, P_CONTINUA)
            stock_final = stock_pre - aprobadas
            repite = np.zeros(len(idx), dtype=bool)
            cursos[idx] = cursos[idx] + 1
        else:
            aprobadas_mesa = rng.binomial(stock_pre, P_MESA)
            stock_final = stock_pre - aprobadas_mesa
            repite = stock_final >= umbral
            num_reps[idx] = num_reps[idx] + repite.astype(int)
            cursos[idx] = np.where(repite, cursos[idx], cursos[idx] + 1)

        stocks[idx] = stock_final

        egresa_local = cursos[idx] > ANIOS_CICLO
        egresados[idx[egresa_local]] = True
        activos[idx[egresa_local]] = False

        sigue_activo = activos[idx]
        if continuidad:
            sube = stock_final < 4
            m_new = np.where(
                sube,
                np.minimum(motivaciones[idx] + FACTOR_MEJORA_PROM, 1.0),
                np.maximum(motivaciones[idx] - FACTOR_RED_STOCK_ALTO, 0.0))
        else:
            m = motivaciones[idx]
            m = np.where(repite, m - FACTOR_RED_REP,
                         np.where(stock_final >= 4,
                                  m - FACTOR_RED_STOCK_ALTO,
                                  m + FACTOR_MEJORA_PROM))
            m_new = np.clip(m, 0.0, 1.0)
        motivaciones[idx] = m_new

        if continuidad:
            p_ab = np.where(stock_final >= 4, P_AB_STOCK_ALTO, P_AB_STOCK_BAJO)
        else:
            p_ab = np.where(repite, P_AB_REP,
                            np.where(stock_final >= 4,
                                     P_AB_STOCK_ALTO, P_AB_STOCK_BAJO))
        p_ab = np.where(motivaciones[idx] < 0.5,
                        p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motivaciones[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona_local = rng.random(len(idx)) < p_ab
        abandona_local = abandona_local & sigue_activo
        abandonaron[idx[abandona_local]] = True
        activos[idx[abandona_local]] = False

    stocks_egr = stocks[egresados]
    return {
        "egres_sin_rep": (egresados & (num_reps == 0)).sum() / n_est * 100,
        "egres_total": egresados.sum() / n_est * 100,
        "abandono": abandonaron.sum() / n_est * 100,
        "stock_medio": stocks_egr.mean() if len(stocks_egr) > 0 else 0.0
    }


def simular_multiples(rule_mix, params, n_sem=N_SEM):
    resultados = []
    for s in range(n_sem):
        res = simular_cohorte(N_EST, rule_mix, params, semilla=SEED0 + s)
        resultados.append(res)
    return {
        k: {"media": np.mean([r[k] for r in resultados]),
            "desv": np.std([r[k] for r in resultados])}
        for k in resultados[0]
    }


# ==============================================================
# Ejecución
# ==============================================================
if __name__ == "__main__":
    print("=" * 100, flush=True)
    print("ABM CON DOBLE EXIGENCIA INTEGRADA (conjunción vs compensación)",
          flush=True)
    print("=" * 100, flush=True)
    print(f"P_BASE_MEAN = {P_BASE_MEAN}  (lado del estudiante)", flush=True)
    print(f"P_TEACHER_MEAN = {P_TEACHER_MEAN}  (lado del docente)", flush=True)
    print(f"SIGMA_TEACHER = {SIGMA_TEACHER}, SIGMA_APT = {SIGMA_APT}",
          flush=True)
    print(flush=True)

    reglas = [
        ("Compensatoria (propuesta)", 0.0),
        ("Mixta (calibración ABM original)", 0.5),
        ("Conjuntiva (sistema actual estricto)", 1.0),
    ]

    regimenes = [
        ("Base (12 materias, umbral 5, mesas)",
         {"continuidad_pedagogica": False, "umbral_repitencia": 5}),
        ("Continuidad (sin repitencia)",
         {"continuidad_pedagogica": True, "umbral_repitencia": 1000}),
    ]

    for nombre_reg, params in regimenes:
        print(f"\n--- {nombre_reg} ---", flush=True)
        for nombre_regla, rm in reglas:
            print(f"  Regla: {nombre_regla} (mix = {rm})", flush=True)
            res = simular_multiples(rm, params)
            print(f"    Egreso sin repetir: {res['egres_sin_rep']['media']:.1f}% "
                  f"± {res['egres_sin_rep']['desv']:.1f}", flush=True)
            print(f"    Egreso total:       {res['egres_total']['media']:.1f}% "
                  f"± {res['egres_total']['desv']:.1f}", flush=True)
            print(f"    Abandono:           {res['abandono']['media']:.1f}% "
                  f"± {res['abandono']['desv']:.1f}", flush=True)
            print(f"    Stock medio:        {res['stock_medio']['media']:.2f} "
                  f"± {res['stock_medio']['desv']:.2f}", flush=True)
            print(flush=True)

CÓDIGO 2: Análisis de sensibilidad del ABM con doble exigencia

import numpy as np

# ==============================================================
# Parámetros base
# ==============================================================
N_EST = 500
ANIOS_CICLO = 5
N_SEM = 10
SEED0 = 30000

P_BASE_MEAN_BASE = 0.15
P_TEACHER_MEAN_BASE = 0.15
SIGMA_TEACHER_BASE = 0.30
SIGMA_APT_BASE = 0.30

FACTOR_RED_REP = 0.20
FACTOR_RED_STOCK_ALTO = 0.05
FACTOR_MEJORA_PROM = 0.02
FACTOR_MOTIV_PROB = 0.5
P_AB_REP = 0.15
P_AB_STOCK_ALTO = 0.05
P_AB_STOCK_BAJO = 0.01
P_AB_BAJA_MOTIV = 0.10
MOTIV_MINIMA = 0.10

P_MESA = 0.25
UMBRAL_REP = 5

TIPO_IDX = np.array([0, 0, 0, 1, 1, 2, 2, 2, 0, 3, 3, 3])
N_TIPOS = 4


# ==============================================================
# Funciones auxiliares
# ==============================================================
def obtener_parametros_beta(mu, sigma):
    s = (mu * (1 - mu) / (sigma ** 2)) - 1
    return mu * s, (1 - mu) * s


def generar_factores_docente(sigma, rng):
    if sigma == 0:
        return np.ones(12)
    log_d = rng.normal(-0.5 * sigma**2, sigma, size=12)
    return np.exp(log_d)


def generar_aptitudes(n_est, sigma, rng):
    if sigma == 0:
        return np.ones((n_est, N_TIPOS))
    log_apt = rng.normal(-0.5 * sigma**2, sigma, size=(n_est, N_TIPOS))
    return np.exp(log_apt)


# ==============================================================
# Simulación vectorizada de una cohorte
# ==============================================================
def simular_cohorte(n_est, rule_mix, semilla,
                    p_base_mean, p_teacher_mean,
                    sigma_teacher, sigma_apt):
    rng = np.random.default_rng(semilla)

    alpha, beta = obtener_parametros_beta(p_base_mean, 0.10)
    p_bases = rng.beta(alpha, beta, size=n_est)
    aptitudes = generar_aptitudes(n_est, sigma_apt, rng)
    d_docentes = generar_factores_docente(sigma_teacher, rng)
    p_teacher = d_docentes * p_teacher_mean

    cursos = np.ones(n_est, dtype=int)
    stocks = np.zeros(n_est, dtype=int)
    motivaciones = np.ones(n_est)
    activos = np.ones(n_est, dtype=bool)
    num_reps = np.zeros(n_est, dtype=int)
    egresados = np.zeros(n_est, dtype=bool)
    abandonaron = np.zeros(n_est, dtype=bool)

    for anio_ciclo in range(ANIOS_CICLO):
        idx = np.where(activos)[0]
        if len(idx) == 0:
            break

        mot_factor = 1 + (1 - motivaciones[idx]) * FACTOR_MOTIV_PROB

        p_s = p_bases[idx][:, None] * aptitudes[idx][:, TIPO_IDX] \
              * mot_factor[:, None]
        p_s = np.clip(p_s, 0.0, 1.0)

        p_t = np.broadcast_to(p_teacher[None, :], p_s.shape)

        p_fail_comp = p_s * p_t
        p_fail_conj = 1 - (1 - p_s) * (1 - p_t)
        p_fail = rule_mix * p_fail_conj + (1 - rule_mix) * p_fail_comp
        p_fail = np.clip(p_fail, 0.0, 1.0)

        desaprobadas = rng.binomial(1, p_fail).sum(axis=1)
        stock_pre = stocks[idx] + desaprobadas

        aprobadas_mesa = rng.binomial(stock_pre, P_MESA)
        stock_final = stock_pre - aprobadas_mesa
        repite = stock_final >= UMBRAL_REP
        num_reps[idx] = num_reps[idx] + repite.astype(int)
        cursos[idx] = np.where(repite, cursos[idx], cursos[idx] + 1)
        stocks[idx] = stock_final

        egresa_local = cursos[idx] > ANIOS_CICLO
        egresados[idx[egresa_local]] = True
        activos[idx[egresa_local]] = False

        sigue_activo = activos[idx]
        m = motivaciones[idx]
        m = np.where(repite, m - FACTOR_RED_REP,
                     np.where(stock_final >= 4, m - FACTOR_RED_STOCK_ALTO,
                              m + FACTOR_MEJORA_PROM))
        motivaciones[idx] = np.clip(m, 0.0, 1.0)

        p_ab = np.where(repite, P_AB_REP,
                        np.where(stock_final >= 4, P_AB_STOCK_ALTO,
                                 P_AB_STOCK_BAJO))
        p_ab = np.where(motivaciones[idx] < 0.5, p_ab + P_AB_BAJA_MOTIV, p_ab)
        p_ab = np.where(motivaciones[idx] < MOTIV_MINIMA, 1.0, p_ab)
        p_ab = np.minimum(p_ab, 1.0)
        abandona_local = rng.random(len(idx)) < p_ab
        abandona_local = abandona_local & sigue_activo
        abandonaron[idx[abandona_local]] = True
        activos[idx[abandona_local]] = False

    return (egresados & (num_reps == 0)).sum() / n_est * 100


def simular_multiples(rule_mix, p_base_mean, p_teacher_mean,
                      sigma_teacher, sigma_apt, n_sem=N_SEM):
    resultados = []
    for s in range(n_sem):
        res = simular_cohorte(N_EST, rule_mix, semilla=SEED0 + s,
                              p_base_mean=p_base_mean,
                              p_teacher_mean=p_teacher_mean,
                              sigma_teacher=sigma_teacher,
                              sigma_apt=sigma_apt)
        resultados.append(res)
    return np.mean(resultados), np.std(resultados)


# ==============================================================
# Barrido de parámetros
# ==============================================================
def barrido(nombre, valores, cambia,
            p_base_mean, p_teacher_mean, sigma_teacher, sigma_apt):
    resultados = []
    for v in valores:
        pb = v if cambia == 'pb' else p_base_mean
        pt = v if cambia == 'pt' else p_teacher_mean
        st = v if cambia == 'st' else sigma_teacher
        sa = v if cambia == 'sa' else sigma_apt

        eg_comp, _ = simular_multiples(0.0, pb, pt, st, sa)
        eg_mix, _ = simular_multiples(0.5, pb, pt, st, sa)
        eg_conj, _ = simular_multiples(1.0, pb, pt, st, sa)
        resultados.append((v, eg_comp, eg_mix, eg_conj))
        print(f"  {nombre} = {v:.2f}  ->  "
              f"Comp: {eg_comp:.1f}%  |  Mix: {eg_mix:.1f}%  |  "
              f"Conj: {eg_conj:.1f}%", flush=True)
    return resultados


def verificar_ordenamiento(resultados):
    todo_ok = True
    for v, comp, mix, conj in resultados:
        if not (comp > mix > conj):
            todo_ok = False
            print(f"  [!] Ordenamiento roto en valor {v}: "
                  f"Comp={comp:.1f}, Mix={mix:.1f}, Conj={conj:.1f}",
                  flush=True)
    return todo_ok


# ==============================================================
# Ejecución
# ==============================================================
if __name__ == "__main__":
    print("=" * 100, flush=True)
    print("ANALISIS DE SENSIBILIDAD DEL ABM CON DOBLE EXIGENCIA", flush=True)
    print("=" * 100, flush=True)
    print(f"{N_SEM} semillas, {N_EST} estudiantes por cohorte", flush=True)
    print(f"Valores base: P_BASE={P_BASE_MEAN_BASE}, "
          f"P_TEACHER={P_TEACHER_MEAN_BASE}, "
          f"SIGMA_T={SIGMA_TEACHER_BASE}, "
          f"SIGMA_A={SIGMA_APT_BASE}", flush=True)
    print(flush=True)

    todo_ok_global = True

    print("--- Barrido de P_BASE_MEAN ---", flush=True)
    r1 = barrido("P_BASE", [0.10, 0.15, 0.20], 'pb',
                 P_BASE_MEAN_BASE, P_TEACHER_MEAN_BASE,
                 SIGMA_TEACHER_BASE, SIGMA_APT_BASE)
    todo_ok_global &= verificar_ordenamiento(r1)
    print(flush=True)

    print("--- Barrido de P_TEACHER_MEAN ---", flush=True)
    r2 = barrido("P_TEACHER", [0.10, 0.15, 0.20], 'pt',
                 P_BASE_MEAN_BASE, P_TEACHER_MEAN_BASE,
                 SIGMA_TEACHER_BASE, SIGMA_APT_BASE)
    todo_ok_global &= verificar_ordenamiento(r2)
    print(flush=True)

    print("--- Barrido de SIGMA_TEACHER ---", flush=True)
    r3 = barrido("SIGMA_TEACHER", [0.15, 0.30, 0.45], 'st',
                 P_BASE_MEAN_BASE, P_TEACHER_MEAN_BASE,
                 SIGMA_TEACHER_BASE, SIGMA_APT_BASE)
    todo_ok_global &= verificar_ordenamiento(r3)
    print(flush=True)

    print("--- Barrido de SIGMA_APT ---", flush=True)
    r4 = barrido("SIGMA_APT", [0.15, 0.30, 0.45], 'sa',
                 P_BASE_MEAN_BASE, P_TEACHER_MEAN_BASE,
                 SIGMA_TEACHER_BASE, SIGMA_APT_BASE)
    todo_ok_global &= verificar_ordenamiento(r4)
    print(flush=True)

    print("=" * 100, flush=True)
    if todo_ok_global:
        print("RESULTADO: El ordenamiento Comp > Mix > Conj se mantiene "
              "en TODAS las configuraciones probadas.", flush=True)
    else:
        print("RESULTADO: Hubo configuraciones donde el ordenamiento "
              "no se mantuvo.", flush=True)
    print("=" * 100, flush=True)

Bibliografía

Ball, S. J., & Collet-Sabé, J. (2025). Against School: Thinking Education Differently. Palgrave Macmillan / Springer Nature. https://doi.org/10.1007/978-3-031-80415-1

Baquero, R., Terigi, F., Toscano, A. G., Briscioli, B., & Sburlatti, S. (2009). Variaciones del régimen académico en escuelas medias con población vulnerable: Un estudio de casos en el Área Metropolitana de Buenos Aires. REICE. Revista Iberoamericana sobre Calidad, Eficacia y Cambio en Educación, 7(4), 292–319.

Baquero, R., Terigi, F., Toscano, A. G., Briscioli, B., & Sburlatti, S. (2012). La obligatoriedad de la escuela secundaria: Variaciones en los regímenes académicos. Espacios en Blanco. Revista de Educación, 22, 77–112.

Barlow, R. E., & Proschan, F. (1975). Statistical Theory of Reliability and Life Testing: Probability Models. Holt, Rinehart and Winston.

Bellei, C., Contreras, M., Valenzuela, J. P., & Vanni, X. (Coords.). (2020). El liceo en tiempos turbulentos: ¿Cómo ha cambiado la educación media chilena? LOM Ediciones.

Bonal, X., & Bellei, C. (Eds.). (2018). Understanding School Segregation: Patterns, Causes and Consequences of Spatial Inequalities in Education. Bloomsbury Publishing.

Briscioli, B. (2016). La incidencia de las condiciones de escolarización del nivel secundario en la construcción de las trayectorias escolares. Perfiles Educativos, 38(154), 134–153. https://doi.org/10.22201/iisue.24486167e.2016.154.57661

Brophy, J. (2006). Grade Repetition. Education Policy Series, No. 6. International Academy of Education (IAE) & International Institute for Educational Planning (IIEP-UNESCO).

Collet-Sabé, J. (Coord.). (2017–2020). Aportaciones y evidencias de la investigación sobre el impacto de la repetición escolar. Red de Investigación sobre Repetición Escolar (RIRE) / Universitat de Vic - Universitat Central de Catalunya.

Crahay, M. (2007). Peut-on lutter contre l'échec scolaire ? (3ª ed.). De Boeck Supérieur.

Crahay, M. (2013). L'école peut-elle être juste et efficace ? De l'égalité des chances à l'égalité des acquis (2ª ed.). De Boeck Supérieur.

Duarte, J., Bos, M. S., & Moreno, J. M. (2011). Los docentes, las escuelas y los aprendizajes escolares en América Latina: Un estudio regional usando la base de datos del SERCE. Banco Interamericano de Desarrollo (BID), División de Educación.

European Commission / Flecha, R. (Dir.). (2011). INCLUD-ED: Strategies for inclusion and social cohesion in Europe from education. Final Report (6th Framework Programme). Brussels: European Commission.

Failache, E., Salas, G., & Vigorito, A. (2018). Determinantes de la repetición y abandono escolar en la educación media, Uruguay. El Trimestre Económico, 85(337), 81–113.

Ferreira Sequeda, M., Golsteyn, B. H. H., & Parra-Cely, S. (2018). The Effect of Grade Retention on High School Completion. American Economic Journal: Applied Economics, 10(3), 189–217.

Gomes-Neto, J. B., & Hanushek, E. A. (1994). The Causes and Consequences of Grade Repetition: Evidence from Brazil. Economic Development and Cultural Change, 43(1), 117–148.

Gvirtz, S., & Palamidessi, M. (1998). El ABC de la tarea docente: Currículum y enseñanza. Aique Grupo Editor.

Haladyna, T. M., & Hess, R. K. (1999). An Evaluation of Conjunctive and Compensatory Standard-Setting Methods for Test Batteries. Educational Assessment, 6(2), 129–153. https://doi.org/10.1207/s15326977ea0602_2

Hattie, J. A. C. (2009). Visible Learning: A Synthesis of Over 800 Meta-Analyses Relating to Achievement. Routledge.

Jackson, P. W. (1968). Life in Classrooms. Holt, Rinehart and Winston.

Jacob, B., & Lefgren, L. (2007). The Effect of Grade Retention on High School Completion. NBER Working Paper No. 13514. National Bureau of Economic Research.

Manacorda, M. (2012). The Cost of Grade Retention. The Review of Economics and Statistics, 94(2), 596–606.

Monk, D. H. (1992). Education Productivity Research: An Interpretation and Critical Review of Its Contribution to Education Policy. Journal of Education Finance, 18(2), 177–193.

Morduchowicz, A. (2006). Los costos de la educación y el financiamiento educativo: Diagnósticos y perspectivas. Instituto Internacional de Planeamiento de la Educación (IIPE-UNESCO Buenos Aires).

Morduchowicz, A. (2026). Crítica de la política educativa: Para entender qué nos pasó y decidir qué hacer. Siglo XXI Editores Argentina.

Nistal, M., Bucciarelli, L., & Volman, V. (2023). Índice de Resultados Escolares: ¿Cuántos estudiantes llegan al final de la secundaria en tiempo y forma? Observatorio de Argentinos por la Educación.

Perrenoud, P. (1998/2008). La evaluación de los alumnos: De la producción de la excelencia a la regulación de los aprendizajes. Entre dos lógicas. Ediciones Colihue.

Schiefelbein, E. (1975). Repeating: An overlooked problem of Latin American education. Comparative Education Review, 19(3), 468–476.

Schiefelbein, E., & Grossi, M. C. (1981). Statistical methods for improving simulation of student flows. UNESCO.

Schiefelbein, E., & Wolff, L. (1993). Repetition and inadequate achievement in Latin America's primary schools: A review of magnitudes, causes, relationships and strategies. Human Resources Development and Operations Policy Working Papers, No. 7. The World Bank.

Shepard, L. A., & Smith, M. L. (Eds.). (1989). Flunking Grades: Research and Policies on Retention. Falmer Press.

Steinberg, C., Tiramonti, G., & Ziegler, S. (2019). Políticas para las escuelas secundarias: Diagnóstico, propuestas y experiencias en Argentina. UNICEF Argentina.

Terigi, F. (2008). Los cambios en el formato de la escuela secundaria argentina: Por qué son necesarios, por qué son tan difíciles. Propuesta Educativa, 29, 63–71.

Terigi, F. (2010). Las cronologías de aprendizaje: Un concepto para pensar las trayectorias escolares. Conferencia de apertura del ciclo lectivo 2010, Santa Rosa, La Pampa: Ministerio de Cultura y Educación.

Tyack, D., & Cuban, L. (1995). Tinkering toward Utopia: A Century of Public School Reform. Harvard University Press.

Tyack, D., & Tobin, W. (1994). The «Grammar» of Schooling: Why Has it Been so Hard to Change? American Educational Research Journal, 31(3), 453–479. https://doi.org/10.3102/00028312031003453

Zabala, A. (1995). La práctica educativa: Cómo enseñar. Editorial Graó.

Atribución/Reconocimiento 4.0 Internacional

Licencia Creative Commons BY 4.0

https://creativecommons.org/licenses/by/4.0/

Usted es libre de:

  1. Compartir — copiar y redistribuir el material en cualquier medio o formato para cualquier propósito, incluso comercialmente.
  2. Adaptar — remezclar, transformar y construir a partir del material para cualquier propósito, incluso comercialmente.
  3. La licenciante no puede revocar estas libertades en tanto usted siga los términos de la licencia.

Bajo los siguientes términos:

  1. Atribución — Usted debe dar crédito de manera adecuada, brindar un enlace a la licencia, e indicar si se han realizado cambios. Puede hacerlo en cualquier forma razonable, pero no de forma tal que sugiera que usted o su uso tienen el apoyo de la licenciante.
  2. No hay restricciones adicionales — No puede aplicar términos legales ni medidas tecnológicas que restrinjan legalmente a otras a hacer cualquier uso permitido por la licencia.