← Volver a Calidad del Aire ERNO
Documento técnico · Control de calidad de datos

Memoria de cálculo

Registro completo de criterios, umbrales y decisiones aplicadas al procesar los datos de la estación ERNO (RUOA), para que cualquier persona con formación en estadística de calidad del aire o monitoreo atmosférico pueda auditar, reproducir o cuestionar cada resultado mostrado en el visor público.

91,742horas registradas (nivel horario)
5,548,409minutos registrados (auditoría forense)
2014-11-01 a 2025-10-02cobertura temporal
2026-09-17última generación de este documento

1. Fuente y arquitectura de datos

Los datos provienen de la estación ERNO (campus de la Universidad de Sonora, Hermosillo, Sonora; 29.0814° N, 110.9706° O, 154 msnm), operada por el Instituto de Geología de la UNAM como parte de la Red Universitaria de Observatorios Atmosféricos (RUOA). Se descargan los archivos CSV mensuales que la RUOA publica para esta estación, tanto a nivel horario como a nivel por minuto, sin ninguna modificación de los valores reportados por el equipo — el parser (RUOAParser.php) solo mapea columnas por nombre de encabezado y convierte tipos, nunca altera un valor ni una bandera.

Se mantienen dos tablas independientes:

TablaGranularidadUso
erno_calidad_aire_horario1 fila/horaTodas las gráficas, promedios, NowCast y el índice AIRE Y SALUD de esta página.
erno_calidad_aire_minuto1 fila/minutoSolo para auditoría forense (sección 4) — nunca alimenta directamente ninguna gráfica ni promedio.

Cada lectura trae un valor numérico y una bandera de calidad propia de la RUOA: OK (confiable), BDL (bajo el límite de detección), OR (fuera de rango del instrumento) u OS (equipo fuera de servicio). Ninguna bandera se reinterpreta ni se sustituye por cero o por la mitad del límite de detección — un dato sin bandera OK simplemente no entra al promedio en modo Limpio.

2. Modo Limpio vs. Modo Bruto

Bruto: valor tal cual, sin filtrar por bandera. Es literalmente lo que reportó el dataloguer de la estación, incluyendo lecturas que la propia RUOA marcó como no confiables.

Limpio: CASE WHEN bandera = 'OK' THEN valor ELSE NULL END, y adicionalmente NULL si la hora está en la lista de excepciones manuales (sección 4-5). Es el modo por default del visor público y el único que alimenta el índice AIRE Y SALUD / NowCast.

La expresión SQL exacta vive en agregados.php::erno_valor_expr() y se reutiliza sin variación en absolutamente todos los cálculos de la página (series, boxplot descontinuado, calendario, correlación, NowCast) — no hay una versión distinta del filtro para cada gráfica.

3. Umbral mínimo de completitud para agregados mensuales (n ≥ 72 horas)

Un promedio calculado sobre muy pocas horas no representa el periodo que dice representar. Caso documentado: el promedio de PM2.5 de agosto 2019 salía de 3 horas de 744 posibles (0.4% del mes) — esas 3 horas resultaron ser reales (ver sección 5), pero el problema de fondo — un puñado de datos disfrazado de promedio mensual — se repite en más de 60 meses distintos a lo largo del histórico, sobre todo en SO2 (completitud general ≈15%).

Regla aplicada (ERNO_HORAS_MINIMAS_CONFIABLE = 72, en agregados.php): cualquier mes con menos de 72 horas válidas (≈3 días) se trata como NULL — igual que un mes sin ningún dato — en vez de mostrar un promedio numéricamente "sólido" que no lo es. Esto se aplica de forma idéntica a la serie mensual, el mapa de calor mes×año, el promedio por mes-calendario, y en consecuencia a los "datos curiosos" (año/mes con más contaminación) que se derivan de esos mismos números.

Adicionalmente, un año necesita al menos 3 meses confiables (no solo 1) para poder competir por "año con más/menos contaminación" — evita la misma trampa estadística a escala anual (ver index.php::MESES_MINIMOS_PARA_COMPARAR_ANIOS).

4. Detección de fallas de equipo no capturadas por la bandera RUOA

La bandera OK de la RUOA certifica que un valor está dentro del rango operativo esperado del instrumento — no certifica que la trayectoria del valor sea físicamente plausible. Un sensor puede fallar de forma que produzca números individualmente "razonables" pero que, vistos minuto a minuto, muestran un patrón que el aire real nunca produce (valor clavado en el mismo número por muchos minutos seguidos, seguido de una rampa perfectamente lineal; o un canal saturado reportando cientos o miles de unidades fuera de cualquier física atmosférica posible). Esta sección documenta cómo se detectan esos casos.

4.1 Gases (O3, SO2, NO2, NO, CO): techo físico absoluto

Hermosillo no tiene ninguna fuente conocida que explique cruzar los siguientes techos — no hay una crisis histórica de ozono como la Ciudad de México de los años 90, no hay fundidoras de SO2 junto a la estación, etc. Por lo tanto, toda hora OK que cruce el techo se excluye del modo Limpio, sin necesidad de evidencia adicional:

ContaminanteTecho (excluye si se supera)Horas excluidas
Ozono (O₃)150 ppb55
Dióxido de Azufre (SO₂)50 ppb26
Dióxido de Nitrógeno (NO₂)100 ppb22
Óxido de Nitrógeno (NO)200 ppb320
Monóxido de Carbono (CO)15 ppm3
Nota sobre NO en 2021: 279 de las 320 horas excluidas de NO caen en un solo año (2021, principalmente junio-octubre). No son picos aislados: la mediana de NO de 2021 (11.42 ppb) ya está muy por encima de la de cualquier otro año (4-5 ppb) incluso por debajo del techo de exclusión, lo que sugiere una deriva de calibración sostenida gran parte del año, no solo picos puntuales. Esta página solo excluye lo que cruza el techo físico; el resto del año 2021 para NO se deja tal cual, con esta advertencia explícita para quien lo use.

4.2 Partículas (PM10, PM2.5): evidencia de falla en el detalle por minuto

Hermosillo sí tiene tormentas de polvo reales (documentadas hasta ~490 µg/m³ de PM10 en esta misma base de datos) y puede recibir humo de incendios forestales cercanos, así que un valor horario alto no es, de entrada, sospechoso. Para PM10 y PM2.5 candidatos (PM10 > 300 µg/m³ u PM25 > 150 µg/m³ en una hora OK) se revisan los 5,548,409 registros por minuto de esa hora contra cuatro criterios; basta con que se cumpla uno para excluir la hora:

#CriterioUmbral exactoJustificación
aValor negativo del propio canalcualquier minuto < 0 en esa horaUna concentración negativa es físicamente imposible bajo cualquier circunstancia.
bSalto imposible entre minutosPM10: >200 µg/m³/min · PM25: >150 µg/m³/minLa difusión atmosférica no permite ese cambio en 60 segundos; sí es típico de un instrumento recalibrando o reiniciando.
cFalla generalizada del equipo≥50% de los minutos con mayoría de los otros 6 canales en OR/OSCuando casi todos los canales caen a la vez, es la estación completa fallando, no un evento atmosférico selectivo.
dCanal "hermano" (PM10↔PM2.5) en magnitud extrema<-50 o >600 en ≥25% de los minutos de la horaPM10 y PM2.5 comparten equipo físico; que uno reporte una magnitud imposible mientras el otro "sube" es evidencia fuerte de falla cruzada, incluso sin saltos grandes en el propio canal candidato.

El criterio (d) se agregó en una segunda ronda de auditoría, después de encontrar que el criterio (b)+(c) por sí solos no detectaban fallas que suben de forma gradual (no de un salto) mientras solo un canal hermano (no la mayoría de los 6) se rompe. Casos que sustentan este criterio:

Control de falsos positivos: un valor alto en el canal hermano por sí solo no basta para excluir. Ejemplo verificado y conservado: 2022-06-23, PM10 sube y baja de 20 a 445 µg/m³ de forma perfectamente suave, con su propia bandera en OK todo el tiempo — un patrón consistente con una tormenta de polvo real. La bandera PM2.5 (su hermano) mostraba valores negativos moderados (~-24) en la misma ventana, pero de magnitud demasiado pequeña para cruzar el umbral (d); se interpretó como una falla menor y aislada del sensor PM2.5, no evidencia contra el PM10 candidato.

5. Registro completo de horas excluidas (modo Limpio)

Total: 487 horas excluidas de 91,742 horas en la base (0.531%). Esta lista se lee en vivo de excepciones_calidad.php — nunca es una copia fija, así que siempre coincide exactamente con lo que hace el sitio en este momento.

Ozono (O₃) — 55 horas excluidas (2014: 2, 2018: 17, 2019: 9, 2021: 1, 2022: 5, 2023: 19, 2024: 2)
2014-11-11 12:00:00
2014-11-11 15:00:00
2018-03-08 17:00:00
2018-03-08 18:00:00
2018-03-08 19:00:00
2018-03-08 20:00:00
2018-03-08 21:00:00
2018-03-08 22:00:00
2018-03-08 23:00:00
2018-03-09 00:00:00
2018-03-09 01:00:00
2018-03-09 02:00:00
2018-03-09 03:00:00
2018-03-09 04:00:00
2018-03-09 05:00:00
2018-03-09 06:00:00
2018-03-09 07:00:00
2018-03-09 08:00:00
2018-03-09 09:00:00
2019-08-28 19:00:00
2019-08-28 20:00:00
2019-08-28 21:00:00
2019-08-28 22:00:00
2019-08-28 23:00:00
2019-08-29 00:00:00
2019-08-29 01:00:00
2019-08-29 02:00:00
2019-08-29 09:00:00
2021-06-07 14:00:00
2022-01-15 16:00:00
2022-06-09 14:00:00
2022-06-09 15:00:00
2022-06-09 16:00:00
2022-10-14 16:00:00
2023-04-05 15:00:00
2023-06-08 12:00:00
2023-06-08 13:00:00
2023-06-08 14:00:00
2023-06-08 15:00:00
2023-06-08 16:00:00
2023-06-08 17:00:00
2023-06-08 18:00:00
2023-06-08 19:00:00
2023-06-08 20:00:00
2023-06-08 21:00:00
2023-06-08 22:00:00
2023-06-08 23:00:00
2023-06-09 00:00:00
2023-06-09 01:00:00
2023-06-09 02:00:00
2023-08-11 08:00:00
2023-08-11 11:00:00
2023-08-11 12:00:00
2024-03-01 14:00:00
2024-03-01 15:00:00
Dióxido de Azufre (SO₂) — 26 horas excluidas (2014: 2, 2015: 5, 2017: 1, 2018: 1, 2019: 3, 2021: 2, 2022: 2, 2023: 3, 2024: 5, 2025: 2)
2014-11-25 08:00:00
2014-11-25 09:00:00
2015-03-26 09:00:00
2015-03-26 10:00:00
2015-04-21 12:00:00
2015-07-30 12:00:00
2015-09-08 11:00:00
2017-05-18 10:00:00
2018-03-09 10:00:00
2019-08-29 10:00:00
2019-08-29 11:00:00
2019-08-29 12:00:00
2021-06-07 12:00:00
2021-06-07 13:00:00
2022-06-09 12:00:00
2022-06-09 13:00:00
2023-04-05 14:00:00
2023-06-08 11:00:00
2023-08-11 10:00:00
2024-03-01 13:00:00
2024-04-16 08:00:00
2024-06-21 14:00:00
2024-10-04 14:00:00
2024-10-15 11:00:00
2025-02-27 16:00:00
2025-07-17 13:00:00
Dióxido de Nitrógeno (NO₂) — 22 horas excluidas (2014: 4, 2022: 18)
2014-11-11 10:00:00
2014-11-11 12:00:00
2014-11-11 13:00:00
2014-11-11 14:00:00
2022-02-05 10:00:00
2022-10-10 09:00:00
2022-10-11 09:00:00
2022-10-11 15:00:00
2022-10-11 19:00:00
2022-10-11 21:00:00
2022-10-11 22:00:00
2022-10-12 03:00:00
2022-10-12 07:00:00
2022-10-12 08:00:00
2022-10-12 10:00:00
2022-10-12 12:00:00
2022-10-12 14:00:00
2022-10-12 20:00:00
2022-10-12 21:00:00
2022-10-13 06:00:00
2022-10-13 08:00:00
2022-10-14 15:00:00
Óxido de Nitrógeno (NO) — 320 horas excluidas (2014: 18, 2015: 14, 2016: 8, 2021: 279, 2022: 1)
2014-11-10 20:00:00
2014-11-11 14:00:00
2014-11-12 17:00:00
2014-11-12 19:00:00
2014-11-13 12:00:00
2014-11-28 18:00:00
2014-12-02 19:00:00
2014-12-11 19:00:00
2014-12-11 20:00:00
2014-12-29 18:00:00
2014-12-29 19:00:00
2014-12-29 20:00:00
2014-12-30 18:00:00
2014-12-30 19:00:00
2014-12-30 20:00:00
2014-12-30 21:00:00
2014-12-30 22:00:00
2014-12-30 23:00:00
2015-01-17 20:00:00
2015-01-17 21:00:00
2015-02-26 13:00:00
2015-03-31 11:00:00
2015-11-13 18:00:00
2015-11-24 19:00:00
2015-12-01 07:00:00
2015-12-01 08:00:00
2015-12-02 07:00:00
2015-12-02 19:00:00
2015-12-02 20:00:00
2015-12-04 18:00:00
2015-12-04 19:00:00
2015-12-04 20:00:00
2016-01-18 18:00:00
2016-01-18 19:00:00
2016-01-18 20:00:00
2016-01-18 21:00:00
2016-02-17 19:00:00
2016-02-17 20:00:00
2016-02-17 21:00:00
2016-02-17 22:00:00
2021-06-07 16:00:00
2021-06-26 19:00:00
2021-07-06 11:00:00
2021-07-26 07:00:00
2021-07-26 08:00:00
2021-07-26 09:00:00
2021-07-26 10:00:00
2021-07-26 11:00:00
2021-07-26 12:00:00
2021-07-27 05:00:00
2021-07-27 06:00:00
2021-07-27 07:00:00
2021-07-27 08:00:00
2021-07-27 09:00:00
2021-07-27 10:00:00
2021-07-27 11:00:00
2021-07-27 12:00:00
2021-07-27 13:00:00
2021-07-27 14:00:00
2021-07-27 16:00:00
2021-07-27 19:00:00
2021-07-27 20:00:00
2021-07-28 03:00:00
2021-07-28 04:00:00
2021-07-28 05:00:00
2021-07-28 06:00:00
2021-07-28 07:00:00
2021-07-28 08:00:00
2021-07-28 09:00:00
2021-07-28 10:00:00
2021-07-28 11:00:00
2021-07-28 14:00:00
2021-07-29 07:00:00
2021-07-29 08:00:00
2021-07-29 11:00:00
2021-07-29 12:00:00
2021-07-29 13:00:00
2021-07-30 03:00:00
2021-07-30 05:00:00
2021-07-30 06:00:00
2021-07-30 07:00:00
2021-07-30 08:00:00
2021-07-30 11:00:00
2021-07-30 12:00:00
2021-07-30 14:00:00
2021-07-30 15:00:00
2021-07-30 16:00:00
2021-07-30 17:00:00
2021-07-30 18:00:00
2021-07-30 19:00:00
2021-07-30 20:00:00
2021-07-30 21:00:00
2021-07-30 22:00:00
2021-07-30 23:00:00
2021-07-31 00:00:00
2021-07-31 04:00:00
2021-07-31 05:00:00
2021-07-31 06:00:00
2021-07-31 07:00:00
2021-07-31 08:00:00
2021-07-31 09:00:00
2021-07-31 10:00:00
2021-07-31 11:00:00
2021-07-31 12:00:00
2021-07-31 13:00:00
2021-07-31 14:00:00
2021-07-31 15:00:00
2021-07-31 16:00:00
2021-07-31 17:00:00
2021-07-31 18:00:00
2021-07-31 19:00:00
2021-07-31 23:00:00
2021-08-01 00:00:00
2021-08-01 01:00:00
2021-08-01 02:00:00
2021-08-01 03:00:00
2021-08-01 04:00:00
2021-08-01 05:00:00
2021-08-01 06:00:00
2021-08-01 07:00:00
2021-08-01 13:00:00
2021-08-01 14:00:00
2021-08-01 15:00:00
2021-08-01 16:00:00
2021-08-01 17:00:00
2021-08-01 18:00:00
2021-08-01 19:00:00
2021-08-01 20:00:00
2021-08-01 21:00:00
2021-08-01 22:00:00
2021-08-01 23:00:00
2021-08-02 00:00:00
2021-08-02 01:00:00
2021-08-02 03:00:00
2021-08-02 04:00:00
2021-08-02 14:00:00
2021-08-02 15:00:00
2021-08-02 16:00:00
2021-08-02 17:00:00
2021-08-02 18:00:00
2021-08-02 19:00:00
2021-08-02 20:00:00
2021-08-02 21:00:00
2021-08-02 22:00:00
2021-08-02 23:00:00
2021-08-03 00:00:00
2021-08-03 01:00:00
2021-08-03 14:00:00
2021-08-03 15:00:00
2021-08-03 16:00:00
2021-08-03 17:00:00
2021-08-03 18:00:00
2021-08-03 19:00:00
2021-08-03 20:00:00
2021-08-03 21:00:00
2021-08-03 22:00:00
2021-08-04 04:00:00
2021-08-04 05:00:00
2021-08-04 21:00:00
2021-08-05 01:00:00
2021-08-05 18:00:00
2021-08-05 19:00:00
2021-08-05 20:00:00
2021-08-06 20:00:00
2021-08-06 21:00:00
2021-08-06 22:00:00
2021-08-07 00:00:00
2021-08-07 01:00:00
2021-08-08 04:00:00
2021-08-09 02:00:00
2021-08-09 12:00:00
2021-08-09 13:00:00
2021-08-14 13:00:00
2021-08-14 15:00:00
2021-08-14 16:00:00
2021-08-14 17:00:00
2021-08-14 18:00:00
2021-08-14 19:00:00
2021-08-14 20:00:00
2021-08-14 21:00:00
2021-08-14 22:00:00
2021-08-14 23:00:00
2021-08-15 12:00:00
2021-08-15 13:00:00
2021-08-15 23:00:00
2021-08-16 00:00:00
2021-08-16 01:00:00
2021-08-16 02:00:00
2021-08-16 04:00:00
2021-08-16 05:00:00
2021-08-16 12:00:00
2021-08-16 13:00:00
2021-08-16 14:00:00
2021-08-16 15:00:00
2021-08-19 17:00:00
2021-08-19 18:00:00
2021-08-20 16:00:00
2021-08-22 02:00:00
2021-08-22 03:00:00
2021-08-22 18:00:00
2021-08-22 19:00:00
2021-08-22 20:00:00
2021-08-22 21:00:00
2021-08-23 10:00:00
2021-08-24 10:00:00
2021-08-24 21:00:00
2021-08-24 22:00:00
2021-08-24 23:00:00
2021-08-25 04:00:00
2021-08-28 08:00:00
2021-08-28 09:00:00
2021-08-28 10:00:00
2021-08-28 11:00:00
2021-08-29 04:00:00
2021-08-29 06:00:00
2021-08-29 07:00:00
2021-09-01 23:00:00
2021-09-02 04:00:00
2021-09-14 11:00:00
2021-09-14 12:00:00
2021-09-14 15:00:00
2021-09-15 02:00:00
2021-09-15 03:00:00
2021-09-15 04:00:00
2021-09-16 01:00:00
2021-09-16 02:00:00
2021-09-21 19:00:00
2021-09-25 17:00:00
2021-09-26 20:00:00
2021-09-27 10:00:00
2021-09-28 02:00:00
2021-09-28 03:00:00
2021-09-29 01:00:00
2021-09-29 02:00:00
2021-09-29 03:00:00
2021-09-29 05:00:00
2021-09-29 06:00:00
2021-09-29 07:00:00
2021-09-29 09:00:00
2021-09-29 10:00:00
2021-09-29 11:00:00
2021-09-29 12:00:00
2021-09-29 14:00:00
2021-09-29 15:00:00
2021-09-29 20:00:00
2021-09-29 21:00:00
2021-09-29 22:00:00
2021-09-29 23:00:00
2021-09-30 02:00:00
2021-09-30 06:00:00
2021-09-30 20:00:00
2021-10-01 03:00:00
2021-10-01 04:00:00
2021-10-01 05:00:00
2021-10-01 06:00:00
2021-10-01 09:00:00
2021-10-01 10:00:00
2021-10-01 22:00:00
2021-10-01 23:00:00
2021-10-02 00:00:00
2021-10-02 01:00:00
2021-10-02 02:00:00
2021-10-02 03:00:00
2021-10-02 04:00:00
2021-10-02 05:00:00
2021-10-05 07:00:00
2021-10-05 08:00:00
2021-10-05 22:00:00
2021-10-05 23:00:00
2021-10-06 09:00:00
2021-10-06 10:00:00
2021-10-06 16:00:00
2021-10-06 17:00:00
2021-10-06 18:00:00
2021-10-07 13:00:00
2021-10-07 14:00:00
2021-10-07 15:00:00
2021-10-08 00:00:00
2021-10-08 01:00:00
2021-10-08 11:00:00
2021-10-08 14:00:00
2021-10-08 15:00:00
2021-10-08 16:00:00
2021-10-08 17:00:00
2021-10-08 23:00:00
2021-10-09 00:00:00
2021-10-09 05:00:00
2021-10-09 06:00:00
2021-10-09 07:00:00
2021-10-09 08:00:00
2021-10-09 09:00:00
2021-10-09 10:00:00
2021-10-09 11:00:00
2021-10-09 12:00:00
2021-10-09 13:00:00
2021-10-09 14:00:00
2021-10-09 15:00:00
2021-10-09 16:00:00
2021-10-09 17:00:00
2021-10-09 18:00:00
2021-10-09 19:00:00
2021-10-09 20:00:00
2021-10-10 00:00:00
2021-10-10 01:00:00
2021-10-10 02:00:00
2021-10-10 06:00:00
2021-10-10 07:00:00
2021-10-10 08:00:00
2021-10-10 09:00:00
2021-10-10 10:00:00
2021-10-10 11:00:00
2021-10-10 12:00:00
2021-10-10 13:00:00
2021-10-10 14:00:00
2021-10-10 15:00:00
2021-10-10 16:00:00
2021-10-10 17:00:00
2021-10-10 18:00:00
2021-10-10 19:00:00
2022-02-05 17:00:00
Monóxido de Carbono (CO) — 3 horas excluidas (2015: 1, 2024: 2)
2015-01-22 15:00:00
2024-10-04 16:00:00
2024-10-04 17:00:00
Partículas PM10 — 27 horas excluidas (2015: 9, 2017: 4, 2018: 1, 2019: 1, 2020: 6, 2021: 3, 2023: 2, 2025: 1)
2015-06-01 11:00:00
2015-06-01 17:00:00
2015-07-02 04:00:00
2015-07-04 23:00:00
2015-07-05 21:00:00
2015-07-10 03:00:00
2015-07-18 20:00:00
2015-07-20 03:00:00
2015-07-23 04:00:00
2017-06-25 20:00:00
2017-07-02 20:00:00
2017-07-07 18:00:00
2017-11-08 00:00:00
2018-12-15 20:00:00
2019-12-13 20:00:00
2020-01-03 19:00:00
2020-01-13 19:00:00
2020-01-15 18:00:00
2020-01-15 19:00:00
2020-05-29 18:00:00
2020-08-16 18:00:00
2021-02-09 08:00:00
2021-04-29 05:00:00
2021-05-10 04:00:00
2023-07-03 18:00:00
2023-07-03 19:00:00
2025-03-03 14:00:00
Partículas PM2.5 — 34 horas excluidas (2015: 12, 2017: 1, 2019: 11, 2022: 5, 2024: 3, 2025: 2)
2015-07-02 00:00:00
2015-07-02 01:00:00
2015-07-02 02:00:00
2015-07-06 07:00:00
2015-07-09 05:00:00
2015-07-10 03:00:00
2015-07-16 06:00:00
2015-07-18 20:00:00
2015-07-18 23:00:00
2015-07-20 06:00:00
2015-07-21 19:00:00
2015-07-22 05:00:00
2017-08-14 14:00:00
2019-08-27 13:00:00
2019-08-27 14:00:00
2019-08-27 16:00:00
2019-08-27 17:00:00
2019-08-28 11:00:00
2019-08-28 12:00:00
2019-08-28 15:00:00
2019-08-28 16:00:00
2019-08-28 17:00:00
2019-08-28 18:00:00
2019-08-28 19:00:00
2022-02-09 10:00:00
2022-02-09 11:00:00
2022-05-04 07:00:00
2022-06-07 15:00:00
2022-06-08 10:00:00
2024-10-01 14:00:00
2024-10-04 18:00:00
2024-10-04 19:00:00
2025-02-10 08:00:00
2025-03-03 18:00:00

6. Fórmula NowCast y su validación numérica

Implementada exactamente como la define el numeral 5.2.5.3 y el Anexo A de la NOM-172-SEMARNAT-2023 (DOF 25/01/2024) — el método que en Estados Unidos se conoce como NowCast (EPA-OAQPS). Solo se calcula para PM10 y PM2.5, que es para lo que la norma lo define; O3/NO2/SO2 usan promedio de una hora y CO un promedio móvil de 8 horas (Tabla 3 de la NOM), no NowCast.

C̄ = [ Σi=112 Ci·Wi-1 / Σi=112 Wi-1 ] × FA

Donde i=1 es la hora más reciente y i=12 la más antigua de la ventana; W = max(0.5, w) con w = 1 - (Cmax - Cmin)/Cmax calculado sobre las horas válidas de la ventana; y FA (factor de ajuste) = 0.694 para PM2.5, 0.714 para PM10 — un factor que la primera implementación de esta página omitió por error (ver bitácora, sección 9) y que se corrigió tras revisar el PDF oficial de la norma proporcionado para esta auditoría.

Requisito de completitud (único que exige la norma): datos para al menos 2 de las 3 horas más recientes de la ventana de 12. No se exige un mínimo de 8 de 12 horas — ese requisito pertenece a la versión original de EPA y se quitó de esta implementación al no encontrarse en el texto de la NOM-172-SEMARNAT-2023.

Categoría diaria: se asigna con el NowCast máximo del día, no un promedio. Corrección (revisión técnica interna): una versión anterior de este documento atribuía este criterio a la Tabla 3 de la norma ("Máximo de los promedios... registrados en el día") — esa frase existe en la Tabla 3, pero aplica a CO/O3/NO2/ SO2, no a partículas. La fila de PM10/PM2.5 en esa misma tabla especifica "Promedio de 24 horas" como reporte diario oficial, y el numeral 5.3 de la norma es explícito: "el nivel de riesgo a la salud... con respecto a PM10 y PM2.5 está referido al promedio de 24 horas, el promedio móvil ponderado de 12 horas [NowCast] es una aproximación a éste y al final del día pueden no empatar exactamente... se usa con un carácter preventivo para informar de manera oportuna". Es decir: el NowCast máximo diario que usa este visor es un indicador preventivo y complementario propio de ASGA (refleja el peor momento del día, útil para decisiones de salud en tiempo real), no una transcripción del estadístico oficial de 24 horas que la norma usa para el reporte diario formal de partículas — ambos son legítimos, pero no son el mismo número y no deben confundirse.

Validación contra el ejemplo oficial (Anexo A.1 del PDF)

Con las 12 concentraciones de PM2.5 del ejemplo oficial (50, 80, 75, 90, 82, 53, 64, 74, 21, 10, 16, 13 µg/m³, de la hora más antigua a la más reciente): rango = 90-10 = 80, w = 1-80/90 = 0.11 ≤ 0.5 → W = 0.5. Suma ponderada = 34.8193, suma de pesos = 1.9995 → promedio = 17.4139. Con FA = 0.694: 17.4139 × 0.694 = 12.09 → redondea a 12 µg/m³, idéntico al resultado publicado en el Anexo A del PDF oficial. Esta implementación reproduce ese resultado exacto (ver agregados.php::erno_calcular_nowcast()).

7. Bandas oficiales del índice AIRE Y SALUD

Tablas 4-9 de la NOM-172-SEMARNAT-2023. Los contaminantes en ppm de la norma (O3, NO2, SO2) se muestran aquí convertidos a ppb (×1000) para coincidir con las unidades que usa el resto de esta página; CO y las partículas ya usan las mismas unidades en ambos lados. PM10/PM2.5 usan la columna de la norma vigente "a partir de enero de 2026". El NO no tiene banda propia — la norma solo clasifica NO2 entre los óxidos de nitrógeno.

CategoríaColor oficial (RGB)O3 (ppb, 1h)NO2 (ppb, 1h)SO2 (ppb, 1h)CO (ppm, 8h móvil)PM10 (µg/m³, NowCast)PM2.5 (µg/m³, NowCast)
Buena#00E400<58<53<35<5.00<45<15
Aceptable#FFFF0058-9053-10635-755.00-9.0045-5015-25
Mala#FF7E0090-135106-16075-1859.00-12.0050-13225-79
Muy mala#FF0000135-175160-213185-30412.00-16.00132-21379-130
Extremadamente mala#8F3F97>175>213>304>16.00>213>130

8. Metodología estadística de cada gráfica del visor público

Todas las visualizaciones de index.php se construyen a partir de las mismas reglas descritas en las secciones 1-7 (mismo filtro de modo, mismo umbral de completitud, mismas exclusiones). Esta sección documenta la operación estadística exacta detrás de cada una, para que se pueda distinguir qué tipo de estadístico se está observando en cada caso.

8.1 Serie mensual (promedio mensual)

Media aritmética simple de las concentraciones horarias válidas, agrupadas por mes calendario (año-mes). Un mes solo se grafica si tiene al menos 72 horas válidas (sección 3); si no, el punto queda vacío, sin interpolación. Es una media no ponderada por hora del día ni por día de la semana: si dentro de un mes el equipo solo registró horas de la tarde, el promedio de ese mes reflejaría únicamente esas horas. Esta sensibilidad al patrón de muestreo horario dentro del mes es precisamente la limitación que NowCast (sección 6) está diseñado para mitigar en el caso de partículas, al ponderar por recencia dentro de una ventana fija de 12 horas en vez de promediar de forma indiscriminada un mes completo.

8.2 Ciclo diurno (promedio por hora del día)

Se agrupan todas las horas válidas del periodo seleccionado por su hora del día (0 a 23), sin importar en qué fecha ocurrieron, y se calcula la media aritmética de cada grupo. Es un ciclo diurno compuesto (composite diurnal cycle), técnica estándar en climatología atmosférica para aislar el patrón intradiario promedio — asociado a fuentes con ciclo solar o antropogénico bien establecido, como la fotoquímica del ozono (que requiere radiación solar) o el tráfico vehicular en horas pico — separándolo de la variabilidad día a día. No se aplica el umbral de 72 horas a cada hora individual porque, para periodos largos (p. ej. el histórico completo), cada punto agrupa del orden de miles de observaciones; para periodos cortos (un mes específico) el tamaño de muestra detrás de cada hora puede ser bajo, y queda disponible como horas_validas en la respuesta de la API para quien necesite auditarlo.

8.3 Promedio por día de la semana

Misma operación que 8.2, agrupando por día de la semana en vez de por hora. Permite explorar si existe un patrón asociado a la actividad semanal (menor tránsito vehicular los fines de semana, por ejemplo), análogo al weekend effect documentado en la literatura de calidad del aire para ozono y óxidos de nitrógeno en zonas urbanas (Blanchard & Tanenbaum, 2003; Marr & Harley, 2002). Esta página únicamente reporta la media observada por día de la semana en Hermosillo; no se afirma ni se descarta que el mecanismo químico descrito en esa literatura aplique aquí sin un análisis dedicado adicional.

8.4 Mapa de calor mes × año

Es la misma serie mensual de 8.1, reproyectada en una cuadrícula año (fila) × mes (columna). La escala de color es secuencial y se normaliza de forma lineal entre 0 y el valor máximo observado dentro del periodo actualmente seleccionado — no es una escala fija entre contaminantes ni entre periodos. En consecuencia, el color de una celda solo es comparable contra otras celdas de la misma vista; para comparar magnitudes entre contaminantes o periodos distintos debe usarse el valor numérico mostrado, no el color.

8.5 "Datos curiosos" (año, mes, día y hora con más contaminación)

Año con más/menos: media aritmética de los promedios mensuales confiables de ese año (no de las horas individuales); un año requiere al menos 3 meses confiables para entrar a la comparación (sección 3), evitando que un año con cobertura mínima domine el extremo por tener, casualmente, un mes con concentraciones altas.

Mes del año más recurrente: el mes calendario (enero a diciembre) con la media aritmética más alta, calculada sobre todas las horas válidas de ese mes calendario a través de todos los años del histórico — un ciclo estacional compuesto (composite seasonal cycle), análogo a 8.2 pero con agrupación mensual en vez de horaria.

Día de la semana y hora del día: el valor máximo de las series 8.3 y 8.2, respectivamente.

8.6 NowCast diario, desglose mensual y "días por categoría"

Ver sección 6 para la fórmula. El desglose "días por categoría, mes a mes" es un conteo de frecuencias: para cada día del periodo se calcula su NowCast máximo (sección 6), se clasifica según las bandas de la sección 7, y se tabula cuántos días de cada categoría hay por mes calendario — un histograma categórico apilado, no una medida de tendencia central.

9. Patrones y tendencias (correlación con clima)

Esta sección cruza el histórico de ERNO (modo limpio) con datos reales de precipitación y temperatura de la estación climatológica CONAGUA-SMN 26066 "Palo Verde" (Hermosillo, 29.08°N -110.90°O), públicos y sin registro en smn.conagua.gob.mx, guardados en la tabla clima_diario. Cobertura utilizada: 2016-2025 (2012-2015 no está disponible en esa estación).

PatrónCómo se calcula
Temporada de lluvias vs. secaPromedio de PM10/PM2.5 en jul-sep (monzón de Sonora) contra el resto del año, ambos en modo limpio. Prueba t de Welch sobre promedios diarios.
El día que lluevePromedio diario de PM10/PM2.5 en fechas con ≥5mm de lluvia registrada ese día vs. fechas con 0mm. Prueba t de Welch sobre promedios diarios.
Calor y ozonoCorrelación de Pearson entre temperatura máxima diaria y O3 promedio diario.
Fechas festivasPromedio de PM10/PM2.5 en Año Nuevo (31 dic/1 ene), Independencia (15-16 sep) y Navidad (24-25 dic) contra el promedio del resto del mismo mes (mismos años) — no contra el promedio general del año. Prueba t de Welch sobre promedios diarios. Ver desglose completo abajo.

La significancia estadística se calcula contra el valor crítico real de la distribución t de Student según los grados de libertad de cada prueba (función asga_t_critico() en includes/estadistica_asga.php, vía la función beta incompleta regularizada) — no una aproximación normal fija. Una versión anterior de este archivo usaba |t|>1.96 fijo, descrito entonces (incorrectamente) como "más conservador" que el valor exacto; una revisión técnica interna encontró que es al revés: el valor crítico real de Student siempre es mayor a 1.96 para n finito (2.78 en df=4, 2.26 en df=9, converge a 1.96 solo cuando n→∞), así que el umbral fijo era más permisivo de lo que su propio comentario afirmaba, y podía marcar como "significativo" algún resultado de muestra chica que no lo era — ver el caso concreto en la sección 9.2. Un punto de rigor adicional: la prueba t se calcula siempre sobre promedios diarios, nunca sobre horas individuales sueltas. Las 24 lecturas de un mismo día están fuertemente autocorrelacionadas (si a las 8am hay polvo, es muy probable que a las 9am también) — tratar cada hora como una observación independiente infla artificialmente el tamaño de muestra "n" y puede marcar como "significativo" algo que en realidad no lo es. Esta corrección se aplicó tras una revisión: la primera versión de "Fechas festivas" comparaba horas contra el promedio general del año y usaba n en cientos de horas, lo que sobrestimaba la significancia de varias diferencias. Estos son patrones agregados sobre el histórico completo, no pronósticos ni relaciones de causalidad comprobada: correlación no implica causa, y una sola estación meteorológica no captura microclimas dentro de Hermosillo.

Dos confusores adicionales, señalados en una revisión técnica interna: (1) "Temporada de lluvias vs. seca" atribuye la caída de PM10 al lavado por lluvia, pero el grupo "seca" agrupa invierno (inversión térmica, ver 9.2) y primavera — temporada de quema de rastrojo/gavilla post-cosecha en el Valle del Yaqui y la Costa de Hermosillo, una fuente de PM10/PM2.5 documentada y sancionada en la región — sin distinguir entre ambas causas de por qué "seca" sale más contaminada. (2) "Calor y ozono" correlaciona temperatura máxima diaria contra el promedio de O3 de 24 horas; la norma evalúa O3 oficialmente por promedio de 1 hora (Tabla 6) y el pico fotoquímico que responde al calor es vespertino, así que promediar el día completo diluye la señal — es posible que la correlación real (contra el máximo horario diario) sea más fuerte que el r=0.226 aquí mostrado.

9.1 El día que llueve: por qué el PM2.5 casi no cambia

El hallazgo de esta comparación es que PM10 baja de forma significativa en días de lluvia (−30.9%) pero PM2.5 no (+4.4%, no significativo, n=44 días de lluvia vs. 1,611 secos). Esto no es solo "ruido estadístico" — es consistente con investigación específica sobre el origen de las PM2.5 en Hermosillo. La Dra. Diana Meza-Figueroa (Departamento de Geología, Universidad de Sonora) documenta que buena parte del PM2.5 de la ciudad no es polvo mineral suelto (el que domina el PM10 y que la lluvia sí arrastra con eficacia), sino compuestos de otro origen: "compuestos provenientes de material de pintura en vehículos, catalizadores de los carros" y "plaguicidas —con polvos muy finos— de los campos agrícolas de la Costa de Hermosillo" que el viento transporta hacia la ciudad (UNISON, Vinculación y Extensión, UNISON, Dirección de Comunicación). Además, señala que "hay una incidencia de partículas PM2.5 todo el año en Hermosillo" — es decir, un componente crónico y no puramente estacional/superficial. Fuentes de combustión vehicular y polvo agrícola transportado por viento desde fuera de la ciudad no se comportan como el polvo local resuspendido por tráfico y viento: no dependen tanto de si llovió anoche en Hermosillo, así que no sorprende que la lluvia local no las reduzca con la misma eficacia que al PM10. Un hallazgo independiente y reciente de la Universidad de Sonora (Domínguez Hurtado, Cirett Galán y Torres Peralta, 2025, EPISTEMUS 19(38), DOI: 10.36790/epistemus.v19i38.410) usando una red de sensores distinta (REMAH) en la zona noroeste de Hermosillo, encuentra que "las concentraciones más elevadas de [PM2.5] ocurren predominantemente durante las estaciones de otoño e invierno" — consistente con nuestro propio hallazgo de que el aire se limpia en temporada de lluvias (jul-sep) pero de forma más marcada en PM10 que en PM2.5, y con el confusor de inversión térmica invernal descrito en la sección 9.2.

9.2 Fechas festivas: desglose y fuentes

Año Nuevo, Navidad e Independencia se seleccionaron por su tradición de pirotecnia/fogatas en México, pero el resultado real de los datos es más matizado que "las fechas festivas contaminan más" — por eso se documenta aquí con el detalle completo en vez de solo la conclusión en la página pública.

FechaContaminantePromedio fecha vs. resto del mesDiferencia¿Significativo?
Año NuevoPM2.516.9 vs. 16.1 µg/m³ (n=15 días)+5.0%No
Año NuevoPM1039.1 vs. 48.7 µg/m³ (n=20 días)−19.7% (baja)
NavidadPM2.522.5 vs. 16.9 µg/m³ (n=10 días)+33.1%No*
NavidadPM1044.9 vs. 51.1 µg/m³ (n=18 días)−12.1%No
IndependenciaPM2.510.5 vs. 10.6 µg/m³ (n=10 días)−0.9%No
IndependenciaPM1028.0 vs. 27.2 µg/m³ (n=18 días)+2.9%No

* Navidad/PM2.5 pasaba esta prueba en una versión anterior de este documento, que usaba un valor crítico fijo de |t|>1.96 para decidir significancia. Una revisión técnica interna encontró que ese umbral fijo es válido solo cuando n→∞ — para n=10 (Navidad) el valor crítico real de Student es ≈2.24, no 1.96, y el estadístico observado (t≈2.07) queda por debajo de ese valor real. estadistica_asga.php ahora calcula el valor crítico exacto según los grados de libertad de cada prueba en vez de una aproximación fija — ver el detalle en la introducción de esta sección 9.

Con esa corrección, ningún resultado de PM2.5 en fecha festiva pasa la prueba estadística — ni siquiera el +33.1% de Navidad, que sigue siendo el más grande numéricamente pero no alcanza el umbral con solo 10 días de muestra repartidos en ~12 años. Esto no significa que la pirotecnia no tenga efecto en Hermosillo: la Comisión Ambiental de la Megalópolis (CAMe) atribuye explícitamente los picos de PM2.5 de fin de año en el Valle de México a "pirotecnia, quema de materiales y combustibles" (gob.mx/comisionambiental) — un mecanismo real y documentado, aunque esa cifra es de otra cuenca (Valle de México, no Hermosillo). Significa que, con la muestra disponible aquí, esta base de datos específica no tiene poder estadístico suficiente para confirmarlo por sí sola; con más años de datos ese mismo patrón podría, en principio, volverse significativo.

El único resultado que sí es estadísticamente sólido en esta comparación es que Año Nuevo tiene PM10 más bajo (−19.7%, significativo, n=20 días) — lo contrario de lo que predeciría un aumento de movilidad/tráfico: hay menos polvo grueso resuspendido, consistente con menos actividad vial y de construcción en día festivo. Esto es evidencia en contra de que la movilidad/mayor gente en la calle sea el motor principal de cualquier posible aumento de PM2.5 en estas fechas: si hubiera más autos circulando esperaríamos también más PM10, no menos.

Confusor climático — inversión térmica invernal. Año Nuevo y Navidad caen en la temporada fría y seca de Sonora (temperatura mínima nocturna promedio ≈6°C en la estación 26066, contra ≈22°C en septiembre). En cuencas desérticas, las noches despejadas y frías de invierno favorecen la inversión térmica — una capa de aire cálido que actúa como tapa e impide que el aire frío y denso cerca del suelo se mezcle verticalmente, concentrando los contaminantes cerca de la superficie independientemente de cuánto se queme esa noche. Este fenómeno está documentado para Hermosillo en específico en invierno (El Imparcial, feb. 2022) y es un mecanismo atmosférico general bien descrito en la literatura (Copernicus/CAMS, Utah State University). No se cuenta con datos de viento ni presión en clima_diario para calcular directamente la fuerza de la inversión de cada noche — la temperatura mínima y el rango térmico diario (diferencia entre máxima y mínima, otro proxy estándar de cielo despejado/aire calmo) son los únicos indicadores disponibles, y se reportan en la tabla de arriba como contexto, no como prueba cuantitativa de inversión. Esta es la razón por la que el grupo de control de cada fecha festiva es el resto del mismo mes (mismo régimen climático/ estacional) y no el promedio del año completo: así la diferencia medida ya excluye el efecto de temporada y aísla lo que es propio de ese día específico.

Independencia (15-16 sep) no muestra cambios en ningún contaminante, lo cual es consistente con caer en pleno monzón de Sonora — atmósfera húmeda e inestable, sin inversión térmica, mejor dispersión — y con no tener en Hermosillo una tradición de fogatas/pirotecnia doméstica comparable a Año Nuevo o Navidad.

En resumen: los datos no permiten separar por completo pirotecnia, movilidad e inversión térmica como causas — ninguna base de datos de PM agregado sola lo permite. Con la prueba estadística correcta aplicada consistentemente, ningún aumento de PM2.5 en fecha festiva es estadísticamente significativo con la muestra disponible (10 a 20 días por fecha) — Navidad (+33.1%) es el más grande numéricamente pero no pasa el umbral. Lo único sólido es que PM10 baja en Año Nuevo, consistente con menos tráfico/construcción ese día. El patrón general (temporada fría/seca con niveles más altos, monzón con niveles más bajos) sigue siendo coherente con inversión térmica como factor de fondo en las fechas de invierno — pero esta sección ya no afirma un efecto adicional de combustión confirmado encima de eso.

10. Limitaciones conocidas

11. Bitácora de auditoría

FechaCambio
2026-08-03Auditoría inicial: umbral de completitud n≥72h; exclusión de gases por techo físico (O3/SO2/NO2/NO/CO); exclusión de partículas por criterios (a)-(c); caso PM2.5 agosto 2019 investigado a mano.
2026-08-03NowCast implementado (primera versión, sin factor de ajuste).
2026-08-03Corrección contra NOM-172-SEMARNAT-2023 (PDF oficial proporcionado): se agrega el factor de ajuste (FA=0.694/0.714, faltante) y se corrige el requisito de completitud (2 de 3 horas recientes, no 8 de 12). Bandas de categorización reemplazadas por las 5 oficiales (Tablas 4-9 de la norma) con colores RGB exactos (Tabla 11).
2026-08-03Segunda ronda de auditoría de partículas: se agrega el criterio (d) — canal hermano PM10↔PM2.5 en magnitud extrema — tras encontrar una inversión estadística (más días "Extremadamente mala" que "Muy mala") tras el máximo de NowCast de 5 días. Confirmados 2024-10-04, 2015-07-02 y 2022-02-09 como fallas de equipo adicionales.
2026-08-03Visor de datos crudos (tabla de solo lectura, sin descarga) y esta memoria de cálculo agregados.
2026-08-04Se agrega la sección 8 (metodología estadística de cada gráfica del visor público). Verificado a mano el caso restante de PM10 2015-07-23 (PM2.5 llegó a 1,549 µg/m³ marcado "Fuera de rango" en la misma ventana, confirma la exclusión). Corregido el desbordamiento horizontal de las tablas de este documento en pantallas angostas.
2026-08-06Se agrega la sección 9 (Patrones y Tendencias): correlación con clima real de la estación CONAGUA-SMN 26066. Hallazgo: PM2.5 sube +99.9% en Año Nuevo y +78.2% en Navidad (pirotecnia); PM10 baja 38.8% en temporada de lluvias (lavado atmosférico); correlación temperatura-ozono r=0.226, débil pero significativa.
2026-08-04Corrección metodológica de "Fechas festivas": se detectó pseudoreplicación (la prueba t corría sobre horas individuales autocorrelacionadas en vez de promedios diarios independientes, inflando la significancia) y un grupo de control mal definido (promedio del año completo en vez del resto del mismo mes, que mezclaba el efecto de temporada con el de la fecha). Recalculado con promedios diarios y control same-month: el hallazgo real que sobrevive la prueba estadística es solo PM2.5 +33.1% en Navidad; Año Nuevo (+5.0%, n=15 días) e Independencia no son estadísticamente significativos. Se agrega la sección 9.2 con el desglose completo, la cita de CAMe (gob.mx/comisionambiental) para el mecanismo de pirotecnia, y el confusor de inversión térmica invernal (El Imparcial 2022; Copernicus/CAMS; USU) usando temperatura mínima y rango térmico como proxy, dado que no hay datos de viento/presión disponibles.
2026-08-04Se agrega la sección 9.1: explicación mecanística de por qué PM2.5 no baja con la lluvia como PM10, citando investigación específica de Hermosillo de la Dra. Diana Meza-Figueroa (UNISON, Depto. de Geología) sobre el origen del PM2.5 local (pintura vehicular, catalizadores, agroquímicos de la Costa de Hermosillo transportados por viento, exposición crónica todo el año) y un hallazgo independiente de estacionalidad otoño-invierno publicado en EPISTEMUS 19(38) 2025 (Domínguez Hurtado, Cirett Galán y Torres Peralta, DOI 10.36790/epistemus.v19i38.410).
2026-08-06Corrección estadística en includes/estadistica_asga.php: reemplazado el umbral fijo |t|>1.96 (descrito antes, por error, como "más conservador") por el valor crítico real de Student según grados de libertad, calculado con la función beta incompleta regularizada (Lanczos + fracción continua, sin dependencias externas). Efecto directo en esta página: el caso PM2.5/Navidad (t≈2.07, df≈9.58, crítico real≈2.24) deja de ser significativo — se corrigieron la tabla y la narrativa de la sección 9.2 y el resumen ejecutivo de la tarjeta pública en consecuencia. Ningún otro resultado del sitio cambió de signo (los casos con n grande, como lluvia_seca o temp-ozono, son robustos a esta corrección por tener grados de libertad altos donde el valor crítico converge a ~1.96 de todas formas).
2026-08-05Revisión técnica interna de la sección 9 (Patrones y Tendencias): corregida la cita normativa de "Categoría diaria" en la sección 6 — la frase de la Tabla 3 citada ahí aplica a CO/O3/NO2/SO2, no a PM10/PM2.5 (que la norma reporta oficialmente por promedio de 24h); se reetiqueta el NowCast-máximo diario como indicador preventivo complementario propio de ASGA, no como transcripción de la norma. Se documentan además dos confusores no mencionados antes: quema agrícola estacional (Valle del Yaqui/Costa de Hermosillo) como causa adicional posible de la comparación lluvias-vs-seca, y el uso de promedio diario de O3 (en vez del máximo horario oficial) en la correlación calor-ozono, que puede estar subestimando esa correlación.