Contratos públicos y bloques políticos

Exploración, patrones de contratación y clasificación supervisada

Autores/as

María José Gómez González

Paula Reinah Aponte

Karen Cervantes Fernandez

Luis Ramón Mercado Toledo

Fecha de publicación

12 de junio de 2026

Respuesta central. Los patrones de gasto, proveedor y temporalidad sí permiten distinguir bloques políticos en los contratos analizados. El mejor modelo fue XGBoost, con ROC-AUC multiclase de 0.998, accuracy de 0.978 y kappa de 0.954 en prueba. La lectura sustantiva no es que el modelo “pruebe corrupción”, sino que ayuda a priorizar señales de riesgo: concentración de proveedores, diferencias en tipos de contrato y estacionalidad del gasto.

NotaDeclaración de uso de inteligencia artificial

Este reporte y su código fueron elaborados con apoyo de herramientas de inteligencia artificial generativa para estructurar el pipeline, documentar bloques de código, revisar consistencia metodológica y mejorar la redacción técnica. Las decisiones analíticas, la selección de variables, la interpretación sustantiva y la validación de resultados fueron realizadas por las personas autoras del proyecto y deben revisarse críticamente por la persona autora del proyecto. No se usaron datos externos a los dos CSV proporcionados.

1 Resumen ejecutivo

15,736
filas en contratos.csv
15,118
filas modelables en contratos_montos.csv
$11,042,048,106
monto total observado
2019–2025
periodo cubierto
0.998
ROC-AUC en prueba
XGBoost
modelo ganador

El análisis usa contratos_montos.csv como base de modelado porque contiene la variable partido estandarizada. Esa variable solo se usa para crear el bloque político y después se excluye de los predictores para evitar fuga de información. También se excluyen explícitamente tema y area.

La clasificación final se define así:

  • Oficialista: Morena.
  • Oposición tradicional: PAN, PRI y PRD.
  • Fuerzas locales: MC, PT y PVEM.

2 Exploración general de los datos

El universo completo tiene 15,736 registros. Para modelado se usa el subconjunto con partido estandarizado: 15,118 registros. La pérdida de filas es metodológicamente aceptable porque permite entrenar una variable objetivo consistente.

Lectura: contratos_montos.csv conserva suficientes observaciones para modelar y tiene una ventaja clave sobre el dataset completo: la etiqueta de partido ya está estandarizada. Por eso fluye mejor para una clasificación supervisada reproducible.

3 Patrones de contratación

3.1 Partidos y bloques

La distribución por partido está concentrada en PVEM y MC, mientras que Morena representa el bloque oficialista bajo la definición solicitada. Como existe desbalance, el pipeline de modelado usa validación estratificada y SMOTE durante el preprocesamiento.

Tip

Ningún bloque político tiene menos de 50 observaciones; por eso no fue necesario fusionar clases en una categoría Otro.

3.2 Montos y tipos de contrato

Los montos son altamente asimétricos: la mayoría de contratos son pequeños o medianos, pero unos pocos contratos grandes elevan el promedio. Por esa razón, las lecturas sustantivas combinan monto total, promedio y mediana.

3.3 Proveedores y temporalidad

La dimensión de proveedores es central porque el modelo no solo aprende montos, sino relaciones recurrentes: cuántos contratos acumula un proveedor, cuánto concentra por año y qué tan repetida es la relación con un bloque.

Lectura: los patrones de proveedores recurrentes y la estacionalidad por trimestre son útiles para priorizar auditorías. Si un bloque concentra muchos contratos en pocos proveedores o en el cierre del ejercicio, conviene revisar expedientes, procedimientos de contratación y justificaciones presupuestales.

4 Pipeline de clasificación supervisada

El pipeline se entrenó con tidymodels. La variable objetivo fue bloque_politico, construida únicamente desde partido y después separada de los predictores. El procesamiento eliminó identificadores, variables de fuga, varianza casi nula y colinealidad alta. Las variables categóricas se trataron con step_other() y step_dummy(), las numéricas se imputaron y normalizaron cuando correspondía, y el desbalance se manejó con SMOTE dentro del recipe.

Modelos comparados:

  • Regresión logística multinomial como línea base.
  • Random Forest con tuning de mtry, trees y min_n.
  • XGBoost con tuning de learn_rate, tree_depth, min_n y loss_reduction.
  • Regularización multinomial con glmnet, ajustando penalty y mixture.

5 Evaluación del modelo ganador

El modelo ganador se ajustó con last_fit() sobre la partición de prueba. La métrica principal es ROC-AUC multiclase por el desbalance entre bloques; accuracy y kappa se reportan como métricas secundarias.

6 Interpretabilidad

Las variables más importantes apuntan a una combinación de señales: año, alcance, tipo de contratación, estructura temporal y comportamiento agregado de proveedores. Esto sugiere que la clasificación no depende de una sola columna obvia, sino de patrones acumulados de gasto y relación contractual.

7 Hallazgos sustantivos

Concentración relacional. Cuando un bloque tiene muchos contratos por proveedor, el modelo mejora su capacidad predictiva porque la red de contratación se vuelve reconocible. Esto es una señal de riesgo para auditoría, no una prueba de irregularidad.

Estacionalidad presupuestal. Las diferencias por trimestre y cierre de ejercicio pueden reflejar rutinas administrativas distintas. Cuando el gasto se concentra al final del año, conviene revisar si responde a planeación normal o a ejercicio acelerado de recursos.

Mezcla tipo-monto. La combinación entre tipo de contrato y monto separa bloques con compras pequeñas recurrentes de bloques con menos contratos pero montos más altos. Esa diferencia puede ser útil para focalizar revisión documental.

8 Limitaciones

  • El modelo es predictivo, no causal.
  • Las variables de proveedor describen patrones observados, no relaciones jurídicas probadas.
  • El universo modelado es menor que el dataset completo porque requiere partido estandarizado.
  • No se usaron datos externos, por lo que no se validan beneficiarios finales, sanciones, militancia ni redes empresariales.
  • tema y area se excluyeron por decisión metodológica para evitar señales textuales demasiado cercanas a la clasificación administrativa.

9 Publicación en RPubs

Este archivo está preparado para publicarse como una sola página en RPubs. Esa es la diferencia frente a publicar los notebooks separados: RPubs no sube automáticamente todo el sitio Quarto multipágina, por eso antes no aparecían la exploración general ni el análisis de contratos_montos.csv.

Para generar el HTML:

Ver código
Sys.setenv(
  QUARTO_PATH = "/Applications/RStudio.app/Contents/Resources/app/quarto/bin/quarto"
)

quarto::quarto_render("notebooks/04_reporte_final_rpubs.qmd")

Para subirlo desde RStudio/R:

Ver código
library(rsconnect)

rsconnect::rpubsUpload(
  title = "Contratos públicos y bloques políticos",
  contentFile = normalizePath("docs/notebooks/04_reporte_final_rpubs.html"),
  originalDoc = normalizePath("notebooks/04_reporte_final_rpubs.qmd")
)