Los datos del gobierno se actualizan mensual o trimestralmente. Nada es tiempo real. No hace falta servidor de aplicación. El flujo:
/etl).CVE_ENT, cálculo de métricas derivadas.Cuando los datasets crezcan a la decena de MB, DuckDB-WASM tomará el relevo del JSON: SQL real sobre Parquet remoto, dentro del navegador, con HTTP range requests. La capa de queries (lib/queries.ts) está diseñada para que el cambio sea transparente al resto de la app.
Costo de hosting: cercano a cero. Sin base de datos viva, sin backups, sin migraciones rotas.
Cada fuente identifica los estados de forma distinta — INEGI usa códigos de dos dígitos (01-32), SESNSP usa nombres con variaciones (“México” vs “Estado de México” vs “Edo. Mex.”), SHCP usa numeración propia. Reducimos todo a la clave canónica del INEGI CVE_ENT antes de cualquier cruce.
Toda métrica delictiva se reporta también por 100,000 habitantes. La población base proviene del Censo INEGI 2020 con proyección anual de CONAPO 2020-2070. Sin esta normalización, cualquier comparación entre estados es engañosa.
Para cada dependencia/estado tomamos los montos contractuales, extraemos el primer dígito significativo, y comparamos la distribución observada con la esperada por Benford:
P(d) = log₁₀(1 + 1/d) MAD = (1/9) · Σ |observado(d) − esperado(d)|
Umbrales de interpretación de Nigrini para el primer dígito:
No conformidad ≠ fraude.Es señal estadística para escalar la revisión. Cuando un dataset es muy chico (<300 obs.), tiene rango limitado, o usa identificadores asignados, Benford no aplica y lo decimos.
Dos thresholds distintos operan sobre las dependencias: ≥30 contratos para entrar al ranking (filtro de relevancia) y ≥300 contratos para que el cálculo de Benford sea estadísticamente válido. Las dependencias entre 30 y 300 aparecen en la tabla pero su MAD se marca como n/d.
El score combina dos componentes ponderados y se re-escala al máximo nacional para que el universo (~200 dependencias federales con ≥30 contratos) ocupe todo el rango 0-100:
raw = adj_directa_pct × 0.6 + benford_mad × 1500 score = (raw / max_nacional) × 100
Cuando dos dependencias empatan, desempata el MAD descendente — criterio forense (mayor desviación Benford pesa más). Es un indicador, no un veredicto. La metodología completa está en el repositorio público.