INTRODUCCIÓN

La Auditoría Superior de la Federación (ASF) es el órgano técnico especializado de la Cámara de Diputados, dotado de autonomía técnica y de gestión, se encarga de fiscalizar el uso de los recursos públicos federales en los tres Poderes de la Unión; los órganos constitucionales autónomos; los estados y municipios; y en general cualquier entidad, persona física o moral, pública o privada que haya captado, recaudado, administrado, manejado o ejercido recursos públicos federales. El resultado final de la labor de la ASF son los Informes Individuales de Auditoría y el Informe General Ejecutivo del Resultado de la Fiscalización Superior de la Cuenta Pública.

Conforme al marco de normas profesionales de auditoría emitido por la Organización Internacional de las Entidades Fiscalizadoras Superiores (INTOSAI, por sus siglas en inglés), existen tres modalidades de auditoría: cumplimiento, financiera y desempeño.

Con base en los alcances y conceptos de dichos tipos de auditoría, en la práctica, la ASF contempla dos tipos de revisiones: de cumplimiento financiero y de desempeño. A continuación, se describen estas dos categorías, así como los enfoques que se derivan de las mismas.

I. AUDITORÍA DE CUMPLIMIENTO FINANCIERO

Se revisa que la recaudación, captación, administración, ejercicio y aplicación de recursos aprobados por el Congreso se lleven a cabo de acuerdo con la normativa correspondiente, y que su manejo y registro financiero haya sido correcto.

Bajo esta categoría se incluyen las siguientes cinco modalidades:

  1. Auditoría de inversiones físicas: su materia de análisis son los procesos de adquisición, el desarrollo de las obras públicas, la justificación de las inversiones, el cumplimiento de los estándares de calidad previstos, la razonabilidad de los montos invertidos, así como la conclusión de las obras en tiempo y forma.

  2. Auditoría forense: consiste en la aplicación de una metodología de fiscalización que conlleva la revisión rigurosa y pormenorizada de procesos, hechos y evidencias, con el propósito de documentar la existencia de un presunto acto irregular.

  3. Auditoría a las tecnologías de la información y comunicaciones: se revisan las adquisiciones, administración, aprovechamiento de sistemas e infraestructuras, calidad de los datos y la seguridad de la información de las entidades públicas.

  4. Auditoría a los sistemas de control interno: se evalúan las políticas, procesos y actividades que aseguran el cumplimiento de los objetivos institucionales.

  5. Auditoría al gasto federalizado: consiste en la fiscalización del ejercicio presupuestario y el cumplimiento de metas y objetivos de los fondos y programas financiados con recursos federales transferidos a estados y municipios, para renglones como educación, salud, creación de infraestructura básica, abatimiento de la pobreza y seguridad pública. De la misma forma, bajo este rubro se revisan las participaciones federales.

II. Auditoría de desempeño

Las auditorías de desempeño son definidas por la ASF, con base en lo establecido por la Organización Internacional de Entidades Fiscalizadoras Superiores (INTOSAI, por sus siglas en inglés), como una revisión objetiva y confiable que permite conocer si las políticas públicas operan bajo los principios de eficacia, eficiencia y economía.

Las auditorías de desempeño otorgan información, análisis y perspectivas sobre el quehacer gubernamental para minimizar los costos de los recursos empleados; obtener el máximo de los insumos disponibles; lograr los resultados previstos, y verificar el impacto social y económico para la ciudadanía.

a. Evaluaciones de políticas públicas

Las evaluaciones de políticas públicas implican una valoración objetiva del impacto de los programas, proyectos, políticas y acciones gubernamentales, en el contexto de las metas establecidas en la normativa aplicable y en los documentos de planeación nacional y sectoriales.

De acuerdo con la INTOSAI, el objetivo de las evaluaciones de políticas públicas es examinar la solidez, consistencia, eficiencia y eficacia de las políticas públicas para identificar, bajo criterios objetivos y confiables, las razones de su éxito o fracaso; sus fortalezas y debilidades, así como los aspectos susceptibles de mejora que contribuyan al logro de los fines propuestos en beneficio de la sociedad.

Las evaluaciones de políticas públicas abarcan los resultados del quehacer gubernamental, pero amplían tanto los alcances temporales como los administrativos, toda vez que no se ciñen a una Cuenta Pública determinada.

LA ASF Y EL SNA

El Sistema Nacional Anticorrupción (SNA) tiene como objetivos esenciales la prevención, detección y combate a la corrupción (Gutiérrez Salazar (2017)). La ASF participa en el SNA como uno de los órganismos integrantes del Comité Coordinador. Al Comité Coordinador le corresponde (Secretariado Ejecutivo del Sistema Nacional Anticorrupción (2021)):

  • Establecer mecanismos de coordinación con los Sistemas Locales Anticorrupción;
  • Diseñar y promover políticas integrales en materia de fiscalización y control de recursos públicos, de prevención, control y disuasión de faltas administrativas y hechos de corrupción, en especial sobre las causas que los generan;
  • Determinar los mecanismos de suministro, intercambio, sistematización y actualización de la información que sobre estas materias generen las instituciones competentes de todos los órdenes de gobierno;
  • Establecer bases y principios para la efectiva coordinación de las autoridades de todos los órdenes de gobierno en materia de fiscalización y control de recursos públicos;
  • Elaborar un informe anual que contenga los avances y resultado del ejercicio de sus funciones y de la aplicación de políticas y programas en la materia;
  • Establecer la Plataforma Digital Nacional, y
  • Emitir recomendaciones no vinculantes a las autoridades respectivas dirigidas al fortalecimiento institucional para la prevención de faltas administrativas y hechos de corrupción, así como para mejorar el desempeño del control interno.

Es claro entonces el rol central que las tareas de fiscalización (entendida como la supervisión o inspección) de los recursos públicos juega un rol central en el SNA. En lo que toca a los recursos públicos federales, claramente la entidad más relevante en este rol es la ASF.

LAS OBSERVACIONES DE LA ASF COMO POTENCIAL INDICADOR DE RIESGO DE CORRUPCIÓN

Es claro que no toda falla o desviación en el ejercicio de los recursos públicos estará ligada necesariamente a un acto de corrupción; es muy probable, por otro lado, que algunas de estas desviaciones sí lo estén. Sin embargo, un argumento más general que se puede emplear es que es razonable asumir que, ante una mayor presencia de desviaciones, se percibe como mayor el riesgo de corrupción en una determinada unidad de análisis (una determinada instutición gubernamental, por ejemplo).

DATOS

Los datos son obtenidos de la página de la Auditoría Superior de la Federación: asfdatos.

# El insumo 2020 no tiene los mismos encabezados que los otros años. Se 
# corrigieron manualmente.
# 
datos.2020 <- read.xlsx(xlsxFile = 'asf_2020.xlsx', check.names = FALSE)

datos.2020 <- 
  data.frame(
    datos.2020[, 1:13]
    , Auditorías = 1
    , datos.2020[, 14:17]
    , check.names = FALSE
    )


datos.2019 <- read.xlsx(xlsxFile = 'asf_2019.xlsx')

datos.2018 <- read.xlsx(xlsxFile = 'asf_2018.xlsx')

datos.2017 <- read.xlsx(xlsxFile = 'datos_asf_2017_completo.xlsx')

datos.2016 <- read.xlsx(xlsxFile = 'asf_2016.xlsx')

datos.2015 <- read.xlsx(xlsxFile = 'asf_2015.xlsx')

datos.2014 <- read.xlsx(xlsxFile = 'asf_2014.xlsx')

datos.2013 <- read.xlsx(xlsxFile = 'asf_2013.xlsx')

datos <- 
  rbind(
    datos.2020[!is.na(datos.2020$Año.Cuenta.Pública),]
    , datos.2019[!is.na(datos.2019$Año.Cuenta.Pública),] 
    , datos.2018[!is.na(datos.2018$Año.Cuenta.Pública),] 
    , datos.2017[!is.na(datos.2017$Año.Cuenta.Pública),] 
    , datos.2016[!is.na(datos.2016$Año.Cuenta.Pública),] 
    , datos.2015[!is.na(datos.2015$Año.Cuenta.Pública),] 
    , datos.2014[!is.na(datos.2014$Año.Cuenta.Pública),] 
    , datos.2013[!is.na(datos.2013$Año.Cuenta.Pública),]
    )

POR AÑO

# Calcula el número de auditorías por año.
# 
datos.7 <- 
  with(
    unique(datos[, c('Año.Cuenta.Pública', 'Número')]),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(unique(datos[, c('Año.Cuenta.Pública', 'Número')])))),
      by = list(Año.Cuenta.Pública = Año.Cuenta.Pública),
      FUN = sum))

# Calcula el número de observaciones por año.
# 
datos.8 <- 
  with(
    datos,
    aggregate(
      x = list(Observaciones = rep(x = 1, nrow(datos))),
      by = list(Año.Cuenta.Pública = Año.Cuenta.Pública),
      FUN = sum))

# Calcula el número de observaciones por auditoría por año.
# 
datos.9 <- 
  merge(
    x = datos.7,
    y = datos.8,
    by.x = 'Año.Cuenta.Pública',
    by.y = 'Año.Cuenta.Pública',
    all = TRUE)

datos.9$Obs_x_Audit <- datos.9$Observaciones / datos.9$Auditorias

datos.9 <- datos.9[order(datos.9$Año.Cuenta.Pública, decreasing = TRUE),]

datatable(
  data = datos.9,
  colnames = c("Año", 
               "Número de Auditorías", 
               "Número de Observaciones", 
               "Observaciones por Auditoría"),
  rownames = FALSE) %>% 
  formatCurrency(
    columns  = c(2:3),
    currency = "",
    interval = 3,
    digits = 0,
    mark = ',',
    dec.mark = '.') %>% 
  formatCurrency(
    columns  = 4,
    currency = "",
    interval = 3,
    digits = 2,
    mark = ',',
    dec.mark = '.')
ggplot(data = datos.9, mapping = aes(x = Año.Cuenta.Pública, y = Auditorias)) +
  geom_line() +
  xlab(label = 'Año') +
  ylab(label = 'Número de auditorías') +
  labs(title = 'Número de auditorías por año') +
  theme_minimal()

ggplot(data = datos.9, mapping = aes(x = Año.Cuenta.Pública, y = Observaciones)) +
  geom_line() +
  xlab(label = 'Año') +
  ylab(label = 'Número de observaciones') +
  labs(title = 'Número de observaciones por año') +
  theme_minimal()

ggplot(data = datos.9, mapping = aes(x = Año.Cuenta.Pública, y = Obs_x_Audit)) +
  geom_line() +
  geom_hline(yintercept = mean(datos.9$Obs_x_Audit), colour = 'red') +
  xlab(label = 'Año') +
  ylab(label = 'Número de observaciones por auditoría') +
  labs(title = 'Número de observaciones por auditoría por año') +
  theme_minimal()

POR AÑO Y GRUPO FUNCIONAL

# Calcula el número de auditorías por año y grupo.
# 
datos.13 <- 
  with(
    unique(datos[, c('Año.Cuenta.Pública', 'Grupo.Funcional', 'Número')]),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(
            unique(
              datos[, c('Año.Cuenta.Pública', 'Grupo.Funcional', 'Número')])))),
      by = 
        list(
          Año.Cuenta.Pública = Año.Cuenta.Pública, 
          Grupo.Funcional = Grupo.Funcional),
      FUN = sum))

# Calcula el número de observaciones por año y grupo.
# 
datos.14 <- 
  with(
    datos,
    aggregate(
      x = list(Observaciones = rep(x = 1, nrow(datos))),
      by = 
        list(
          Año.Cuenta.Pública = Año.Cuenta.Pública, 
          Grupo.Funcional = Grupo.Funcional),
      FUN = sum))

# Calcula el número de observaciones por auditoría por año y grupo.
# 
datos.15 <- 
  merge(
    x = datos.13,
    y = datos.14,
    by.x = c('Año.Cuenta.Pública', 'Grupo.Funcional'),
    by.y = c('Año.Cuenta.Pública', 'Grupo.Funcional'),
    all = TRUE)

datos.15$Obs_x_Audit <- datos.15$Observaciones / datos.15$Auditorias

# Número de auditorías por año y por grupo funcional
#
datos.15.1 <- 
  dcast(
    data = datos.15, 
    formula = Grupo.Funcional ~ Año.Cuenta.Pública, 
    value.var = 'Auditorias')

# Observaciones por año y por grupo funcional
#
datos.15.2 <- 
  dcast(
    data = datos.15, 
    formula = Grupo.Funcional ~ Año.Cuenta.Pública, 
    value.var = 'Observaciones')

# Observaciones por auditoría por año y por grupo funcional
#
datos.15.3 <- 
  dcast(
    data = datos.15, 
    formula = Grupo.Funcional ~ Año.Cuenta.Pública, 
    value.var = 'Obs_x_Audit')
datatable(
  data = datos.15.1,
  
  colnames = c("Grupo Funcional" = 'Grupo.Funcional'),
  rownames = FALSE,
  caption = 'Auditorías por año y grupo funcional.') %>% 
  formatRound(
    columns  = 2:ncol(datos.15.1),
    digits = 0)
datatable(
  data = datos.15.2,
  
  colnames = c("Grupo Funcional" = 'Grupo.Funcional'),
  rownames = FALSE,
  caption = 'Observaciones por año y grupo funcional.') %>% 
  formatRound(
    columns  = 2:ncol(datos.15.2),
    digits = 0)
datatable(
  data = datos.15.3,
  
  colnames = c("Grupo Funcional" = 'Grupo.Funcional'),
  rownames = FALSE,
  caption = 'Observaciones por auditoría por año y grupo funcional.') %>% 
  formatRound(
    columns  = 2:ncol(datos.15.3),
    digits = 0)

POR ENTIDAD FEDERATIVA

# Calcula el número de auditorías por por entidad federativa.
# 
datos.1 <- 
  with(
    unique(datos[,c('Entidad.Federativa','Número')]),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(unique(datos[,c('Entidad.Federativa','Número')])))),
      by = list(Entidad.Federativa = Entidad.Federativa),
      FUN = sum))

# Calcula el número de observaciones por entidad federativa.
# 
datos.2 <- 
  with(
    datos,
    aggregate(
      x = list(Observaciones = rep(x = 1, nrow(datos))),
      by = list(Entidad.Federativa = Entidad.Federativa),
      FUN = sum))

# Calcula el número de observaciones por auditoría por entidad federativa.
# 
datos.3 <- 
  merge(
    x = datos.1,
    y = datos.2,
    by.x = 'Entidad.Federativa',
    by.y = 'Entidad.Federativa',
    all = TRUE)

datos.3$Obs_x_Audit <- datos.3$Observaciones / datos.3$Auditorias

datatable(
  data = datos.3,
  
  colnames = c("Entidad Federativa", 
               "Número de Auditorías", 
               "Número de Observaciones", 
               "Observaciones por Auditoría"),
  rownames = FALSE) %>% 
  formatCurrency(
    columns  = c(2:3),
    currency = "",
    interval = 3,
    digits = 0,
    mark = ',',
    dec.mark = '.') %>% 
  formatCurrency(
    columns  = 4,
    currency = "",
    interval = 3,
    digits = 2,
    mark = ',',
    dec.mark = '.')

POR GRUPO FUNCIONAL

# Calcula el número de auditorías por grupo.
# 
datos.10 <- 
  with(
    unique(datos[,c('Grupo.Funcional', 'Número')]),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(unique(datos[,c('Grupo.Funcional', 'Número')])))),
      by = list(Grupo.Funcional = Grupo.Funcional),
      FUN = sum))

# Calcula el número de observaciones por Grupo.Funcional.
# 
datos.11 <- 
  with(
    datos,
    aggregate(
      x = list(Observaciones = rep(x = 1, nrow(datos))),
      by = list(Grupo.Funcional = Grupo.Funcional),
      FUN = sum))

# Calcula el número de observaciones por auditoría por Grupo.Funcional.
# 
datos.12 <- 
  merge(
    x = datos.10,
    y = datos.11,
    by.x = 'Grupo.Funcional',
    by.y = 'Grupo.Funcional',
    all = TRUE)

datos.12$Obs_x_Audit <- datos.12$Observaciones / datos.12$Auditorias

datatable(
  data = datos.12,
  colnames = c("Grupo Funcional", 
               "Número de Auditorías", 
               "Número de Observaciones", 
               "Observaciones por Auditoría"),
  rownames = FALSE) %>% 
  formatCurrency(
    columns  = c(2:3),
    currency = "",
    interval = 3,
    digits = 0,
    mark = ',',
    dec.mark = '.') %>% 
  formatCurrency(
    columns  = 4,
    currency = "",
    interval = 3,
    digits = 2,
    mark = ',',
    dec.mark = '.')

POR SECTOR

# Calcula el número de auditorías por sector.
# 
datos.4 <- 
  with(
    unique(datos[,c('Sector', 'Número')]),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(unique(datos[,c('Sector', 'Número')])))),
      by = list(Sector = Sector),
      FUN = sum))

# Calcula el número de observaciones por Sector.
# 
datos.5 <- 
  with(
    datos,
    aggregate(
      x = list(Observaciones = rep(x = 1, nrow(datos))),
      by = list(Sector = Sector),
      FUN = sum))

# Calcula el número de observaciones por auditoría por Sector.
# 
datos.6 <- 
  merge(
    x = datos.4,
    y = datos.5,
    by.x = 'Sector',
    by.y = 'Sector',
    all = TRUE)

datos.6$Obs_x_Audit <- datos.6$Observaciones / datos.6$Auditorias

datatable(
  data = datos.6,
  
  colnames = c("Sector", 
               "Número de Auditorías", 
               "Número de Observaciones", 
               "Observaciones por Auditoría"),
  rownames = FALSE) %>% 
  formatCurrency(
    columns  = c(2:3),
    currency = "",
    interval = 3,
    digits = 0,
    mark = ',',
    dec.mark = '.') %>% 
  formatCurrency(
    columns  = 4,
    currency = "",
    interval = 3,
    digits = 2,
    mark = ',',
    dec.mark = '.')
write.table(
  x = unique(datos[, c('Sector', 'Ente.Fiscalizado', 'Entidad.Federativa')]),
  file = 'entes_fiscalizados_no_encontrados.txt',
  sep = '|',
  row.names = FALSE)

POR ENTE FISCALIZADO

# Calcula el número de auditorías por ente.
# 
datos.10 <- 
  with(
    unique(datos[, c('Ente.Fiscalizado', 'Año.Cuenta.Pública', 'Número')]),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(
            unique(
              datos[
                , c('Ente.Fiscalizado', 'Año.Cuenta.Pública', 'Número')])))),
      by = list(Ente.Fiscalizado = Ente.Fiscalizado),
      FUN = sum))

# Calcula el número de observaciones por ente.
# 
datos.11 <- 
  with(
    datos,
    aggregate(
      x = list(Observaciones = rep(x = 1, nrow(datos))),
      by = list(Ente.Fiscalizado = Ente.Fiscalizado),
      FUN = sum))

# Calcula el número de observaciones por auditoría por año.
# 
datos.12 <- 
  merge(
    x = datos.10,
    y = datos.11,
    by.x = 'Ente.Fiscalizado',
    by.y = 'Ente.Fiscalizado',
    all = TRUE)

datos.12$Obs_x_Audit <- datos.12$Observaciones / datos.12$Auditorias

datatable(
  data = datos.12,
  colnames = c("Ente Fiscalizado", 
               "Número de Auditorías", 
               "Número de Observaciones", 
               "Observaciones por Auditoría"),
  rownames = FALSE) %>% 
  formatCurrency(
    columns  = c(2:3),
    currency = "",
    interval = 3,
    digits = 0,
    mark = ',',
    dec.mark = '.') %>% 
  formatCurrency(
    columns  = 4,
    currency = "",
    interval = 3,
    digits = 2,
    mark = ',',
    dec.mark = '.')

POR TIPO DE AUDITORÍA

La siguiente tabla muestra el número de auditorías históricamente realizadas (entre 2013 y 2020) por tipo de auditoría.

POR ENTE AQUIEN SE DIRIGE LA ACCIÓN

# Calcula el número de auditorías por ente.
# 
temp <- 
  with(
    unique(
      datos[
        , c('Ente.a.quien.se.dirige.la.Acción', 'Año.Cuenta.Pública', 'Número')
        ]
      ),
    aggregate(
      x = list(
        Auditorias = rep(
          x = 1, 
          nrow(
            unique(
              datos[
                , c(
                  'Ente.a.quien.se.dirige.la.Acción'
                  , 'Año.Cuenta.Pública'
                  , 'Número'
                  )
                ]
              )
            )
          )
        ),
      by = list(Ente = Ente.a.quien.se.dirige.la.Acción),
      FUN = sum
      )
    )

datatable(
  data = temp[order(temp[, 2], decreasing = TRUE), ]
  , colnames = 
    c(
      "Ente"
      , "Número de Auditorías"
      ) 
  , rownames = FALSE
  ) %>% 
  formatRound(columns  = 2, digits = 0)

PENDIENTES

  • Totales

  • Agregar universo y muestra a las métricas

  • Comparar con datos de corrupción ENCIG y con criminalidad SESNSP.

  • Por grupo y año como % del total

    • Diagnosticar cambios relevantes.

REFERENCIAS

Gutiérrez Salazar, Miguel Ángel. 2017. “La Auditoría Superior de La Federación y La Conformación Del Sistema Nacional Anticorrupción.” Revista Mexicana de Derecho Constitucional, no. 37.
R Core Team. 2020. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Secretariado Ejecutivo del Sistema Nacional Anticorrupción. 2021. “El Comité Coordinador.” Secretaría Ejecutiva del Sistema Nacional Anticorrupción. June 3, 2021. https://www.gob.mx/sesna/articulos/comite-coordinador-del-sna.
Wickham, Hadley. 2007. “Reshaping Data with the reshape Package.” Journal of Statistical Software 21 (12): 1–20. http://www.jstatsoft.org/v21/i12/.
———. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
Xie, Yihui, Joe Cheng, and Xianying Tan. 2020. DT: A Wrapper of the JavaScript Library ’DataTables’. https://CRAN.R-project.org/package=DT.