0.- Librerias

library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
library(ggplot2)
library(moments)

1.- leer datos

setwd("C:/Users/CESAR/Downloads/proyecto x")
variables <- read_csv("GlobalweatherRepository.csv", show_col_types = TRUE)

2.- Depuración y selección de la variable

Depuración

variables <- na.omit(variables)

Selección

NO_2 <- variables$air_quality_Nitrogen_dioxide
n_total <- length(NO_2)

3.- Frecuancias

Tabla 1 aplicando sturges

Max y min

valor_min <- min(NO_2, na.rm = TRUE)
valor_max <- max(NO_2, na.rm = TRUE)
rango <- valor_max - valor_min

Regla de Sturges

K_sturges <- floor(1 + 3.322 * log10(n_total))
A_sturges <- rango / K_sturges

Intervalos

Li1 <- seq(valor_min,
           valor_max - A_sturges,
           by = A_sturges)
Ls1 <- Li1 + A_sturges

Bucle para las columnas de la tabla

ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      NO_2 >= Li1[i] &
        NO_2 <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      NO_2 >= Li1[i] &
        NO_2 < Ls1[i],
      na.rm = TRUE
    )
  }
}
hi1 <- (ni1 / sum(ni1)) * 100

Acumuladas

Ni_asc1 <- cumsum(ni1)
Hi_asc1 <- cumsum(hi1)

Ni_dsc1 <- rev(cumsum(rev(ni1)))
Hi_dsc1 <- rev(cumsum(rev(hi1)))

# Marca de clase
MC1 <- (Li1 + Ls1) / 2

Tabla simplificada

Li1 <- seq(0, 400, by = 50)
Ls1 <- seq(50, 450, by = 50)

# 3.2 Bucle para el conteo de frecuencias absolutas (ni1)
ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      NO_2 >= Li1[i] & NO_2 <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      NO_2 >= Li1[i] & NO_2 < Ls1[i],
      na.rm = TRUE
    )
  }
}

# Frecuencia relativa (Porcentaje)
hi1 <- (ni1 / sum(ni1)) * 100

# Acumuladas
Ni_asc1 <- cumsum(ni1)
Hi_asc1 <- cumsum(hi1)

Ni_dsc1 <- rev(cumsum(rev(ni1)))
Hi_dsc1 <- rev(cumsum(rev(hi1)))

# Marca de clase
MC1 <- (Li1 + Ls1) / 2

4.- Tablas de frecuencia

Tabla 1

n_total <- length(NO_2)
valor_min <- min(NO_2, na.rm = TRUE)
valor_max <- max(NO_2, na.rm = TRUE)
rango <- valor_max - valor_min

K_sturges <- floor(1 + 3.322 * log10(n_total))
A_sturges <- rango / K_sturges

Li1 <- seq(valor_min,
           valor_max - A_sturges,
           by = A_sturges)

Ls1 <- Li1 + A_sturges
ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      NO_2 >= Li1[i] &
        NO_2 <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      NO_2 >= Li1[i] &
        NO_2 < Ls1[i],
      na.rm = TRUE
    )
  }
}
hi1 <- (ni1 / sum(ni1)) * 100

Ni_asc1 <- cumsum(ni1)
Hi_asc1 <- cumsum(hi1)
Ni_dsc1 <- rev(cumsum(rev(ni1)))
Hi_dsc1 <- rev(cumsum(rev(hi1)))
MC1 <- (Li1 + Ls1) / 2

Tabla_Sturges <- data.frame(
  Lim_inf = round(Li1, 2),
  Lim_sup = round(Ls1, 2),
  MC = round(MC1, 2),
  ni = ni1,
  hi = round(hi1, 2),
  Ni_asc = Ni_asc1,
  Hi_asc = round(Hi_asc1, 2),
  Ni_dsc = Ni_dsc1,
  Hi_dsc = round(Hi_dsc1, 2)
)
Tabla_Sturges2 <- Tabla_Sturges
Tabla_Sturges2[] <- lapply(Tabla_Sturges2, as.character)

fila_total <- data.frame(
  Lim_inf = "TOTAL",
  Lim_sup = "",
  MC = "",
  ni = as.character(sum(ni1)),
  hi = as.character(round(sum(hi1), 2)),
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)
Tabla_Sturges2 <- rbind(Tabla_Sturges2, fila_total)
kable(
  Tabla_Sturges2,
  align = "c",
  caption = "Tabla N.1: Distribución de frecuencias de temperatura en Fahrenheit de los registros meteorológicos en capotales del mundo mediante la regla de Sturges, período 2024-2026"
) |> 
  kableExtra::kable_styling(
    full_width = TRUE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  ) |> 
  kableExtra::row_spec(
    0,
    bold = TRUE,
    color = "white",
    background = "#2C3E50"
  ) |> 
  kableExtra::row_spec(
    nrow(Tabla_Sturges2),
    bold = TRUE,
    background = "#EAEDED"
  ) |> 
  footnote(
    general = "Elaborado por Grupo 2.\nFuente: Global Weather Repository.",
    general_title = "Nota: ",
    footnote_as_chunk = TRUE,
    title_format = c("italic", "bold")
  )
Tabla N.1: Distribución de frecuencias de temperatura en Fahrenheit de los registros meteorológicos en capotales del mundo mediante la regla de Sturges, período 2024-2026
Lim_inf Lim_sup MC ni hi Ni_asc Hi_asc Ni_dsc Hi_dsc
0 23.76 11.88 115461 81.48 115461 81.48 141703 100
23.76 47.52 35.64 14618 10.32 130079 91.8 26242 18.52
47.52 71.28 59.4 6163 4.35 136242 96.15 11624 8.2
71.28 95.04 83.16 2898 2.05 139140 98.19 5461 3.85
95.04 118.81 106.92 1401 0.99 140541 99.18 2563 1.81
118.81 142.57 130.69 615 0.43 141156 99.61 1162 0.82
142.57 166.33 154.45 295 0.21 141451 99.82 547 0.39
166.33 190.09 178.21 150 0.11 141601 99.93 252 0.18
190.09 213.85 201.97 59 0.04 141660 99.97 102 0.07
213.85 237.61 225.73 22 0.02 141682 99.99 43 0.03
237.61 261.37 249.49 13 0.01 141695 99.99 21 0.01
261.37 285.13 273.25 3 0 141698 100 8 0.01
285.13 308.89 297.01 2 0 141700 100 5 0
308.89 332.66 320.78 0 0 141700 100 3 0
332.66 356.42 344.54 1 0 141701 100 3 0
356.42 380.18 368.3 1 0 141702 100 2 0
380.18 403.94 392.06 0 0 141702 100 1 0
403.94 427.7 415.82 1 0 141703 100 1 0
TOTAL 141703 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

tabla simplificada

Li1 <- seq(0, 400, by = 50)
Ls1 <- seq(50, 450, by = 50)
ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      NO_2 >= Li1[i] & NO_2 <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      NO_2 >= Li1[i] & NO_2 < Ls1[i],
      na.rm = TRUE
    )
  }
}
hi1 <- (ni1 / sum(ni1)) * 100
Ni_asc1 <- cumsum(ni1)
Hi_asc1 <- cumsum(hi1)

Ni_dsc1 <- rev(cumsum(rev(ni1)))
Hi_dsc1 <- rev(cumsum(rev(hi1)))

MC1 <- (Li1 + Ls1) / 2
Tabla_Sturges <- data.frame(
  Lim_inf = round(Li1, 2),
  Lim_sup = round(Ls1, 2),
  MC = round(MC1, 2),
  ni = ni1,
  hi = round(hi1, 2),
  Ni_asc = Ni_asc1,
  Hi_asc = round(Hi_asc1, 2),
  Ni_dsc = Ni_dsc1,
  Hi_dsc = round(Hi_dsc1, 2)
)


if (tail(Tabla_Sturges$Hi_asc, 1) != 100.00) {
  Tabla_Sturges$Hi_asc[nrow(Tabla_Sturges)] <- 100.00
}


Tabla_Sturges2 <- Tabla_Sturges
Tabla_Sturges2[] <- lapply(Tabla_Sturges2, as.character)

fila_total <- data.frame(
  Lim_inf = "TOTAL",
  Lim_sup = "",
  MC = "",
  ni = as.character(sum(ni1)),
  hi = as.character(round(sum(hi1), 2)),
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)
Tabla_Sturges2 <- rbind(Tabla_Sturges2, fila_total)
kable(
  Tabla_Sturges2,
  align = "c",
  caption = "Tabla N2: Distribución de frecuencias de NO2 optimizada con rangos de 50 en 50 (0 a 450), período 2024-2026"
) |> 
  kableExtra::kable_styling(
    full_width = TRUE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  ) |> 
  kableExtra::row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") |> 
  kableExtra::row_spec(nrow(Tabla_Sturges2), bold = TRUE, background = "#EAEDED") |> 
  footnote(
    general = "Elaborado por Grupo 2.\nFuente: Global Weather Repository.",
    general_title = "Nota: ",
    footnote_as_chunk = TRUE,
    title_format = c("italic", "bold")
  )
Tabla N2: Distribución de frecuencias de NO2 optimizada con rangos de 50 en 50 (0 a 450), período 2024-2026
Lim_inf Lim_sup MC ni hi Ni_asc Hi_asc Ni_dsc Hi_dsc
0 50 25 130939 92.4 130939 92.4 141703 100
50 100 75 8579 6.05 139518 98.46 10764 7.6
100 150 125 1746 1.23 141264 99.69 2185 1.54
150 200 175 369 0.26 141633 99.95 439 0.31
200 250 225 54 0.04 141687 99.99 70 0.05
250 300 275 13 0.01 141700 100 16 0.01
300 350 325 0 0 141700 100 3 0
350 400 375 2 0 141702 100 3 0
400 450 425 1 0 141703 100 1 0
TOTAL 141703 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

5.- Gráficos

5.1.- Histograma ni

cortes_hist <- c(Li1, Ls1[length(Ls1)])
par(mar = c(5, 6, 4, 2) + 0.1, mgp = c(3.8, 1, 0))

hist(
  NO_2,
  breaks = cortes_hist,
  col = "#2C3E50",            
  border = "white",             
  main = "Gráfico N°1 :Histograma de Frecuencias de NO_2 para el análisis
  meteorológico en capitales del mundo",
  sub = "Periodo: Mayo 2024 - Mayo 2026",
  xlab = "Concentración de Dióxido de Nitrógeno - NO2 (µg/m³)",
  ylab = "Frecuencia Absoluta (ni)", 
  axes = FALSE,                
  xlim = c(0, 450),             
  font.main = 2,
  col.main = "#2C3E50"
)
axis(
  side = 1, 
  at = cortes_hist, 
  labels = round(cortes_hist, 1), 
  las = 1,                      
  font = 2,                      
  col = "#2C3E50",
  cex.axis = 0.75               
)
axis(
  side = 2, 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

par(mar = c(5, 4, 4, 2) + 0.1, mgp = c(3, 1, 0))

5.2.- Histograma hi

cortes_hist <- c(Li1, Ls1[length(Ls1)])
mi_hist_hi <- hist(NO_2, breaks = cortes_hist, plot = FALSE)
mi_hist_hi$counts <- hi1

par(mar = c(5, 6, 4, 2) + 0.1, mgp = c(3.8, 1, 0))
plot(
  mi_hist_hi,
  col = "#2C3E50",              
  border = "white",             
  main = "Gráfico N°2: Histograma de Frecuencias Relativas de NO2",
  sub = "Periodo: Mayo 2024 - Mayo 2026",
  xlab = "Concentración de Dióxido de Nitrógeno - NO2 (µg/m³)",
  ylab = "Frecuencia Relativa - hi (%)", 
  axes = FALSE,                 
  xlim = c(0, 450),             
  ylim = c(0, max(hi1) * 1.1),  
  font.main = 2,
  col.main = "#2C3E50"
)
axis(
  side = 1, 
  at = cortes_hist, 
  labels = round(cortes_hist, 1), 
  las = 1,                      
  font = 2,                     
  col = "#2C3E50",
  cex.axis = 0.75              
)
axis(
  side = 2, 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

par(mar = c(5, 4, 4, 2) + 0.1, mgp = c(3, 1, 0))

5.3.- Poligono cerrado

cortes_hist <- c(Li1, Ls1[length(Ls1)])
eje_X_poligono <- c(Li1[1], MC1, Ls1[length(Ls1)])
eje_Y_poligono <- c(0, hi1, 0)

mi_hist_hi <- hist(NO_2, breaks = cortes_hist, plot = FALSE)
mi_hist_hi$counts <- hi1

par(mar = c(5, 6, 4, 2) + 0.1, mgp = c(3.8, 1, 0))

plot(
  mi_hist_hi,
  col = "#2C3E50",              
  border = "white",             
  main = "Gráfico N°3: Histograma y Polígono de Frecuencias Relativas
  de NO2",
  sub = "Periodo: Mayo 2024 - Mayo 2026",
  xlab = "Concentración de Dióxido de Nitrógeno - NO2 (µg/m³)",
  ylab = "Frecuencia Relativa - hi (%)",
  axes = FALSE,                 
  xlim = c(0, 450),             
  ylim = c(0, max(hi1) * 1.15), 
  font.main = 2,
  col.main = "#2C3E50"
)
lines(
  eje_X_poligono, 
  eje_Y_poligono, 
  col = "#E74C3C",              
  lwd = 3,                      
  type = "l"                    
)
axis(
  side = 1, 
  at = cortes_hist, 
  labels = round(cortes_hist, 1), 
  las = 1,                      
  font = 2,                    
  col = "#2C3E50",
  cex.axis = 0.75              
)
axis(
  side = 2, 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

par(mar = c(5, 4, 4, 2) + 0.1, mgp = c(3, 1, 0))

5.4.- Ojivas ni asd y des

eje_X_ojivas <- c(Li1, Ls1[length(Ls1)])
eje_Y_asc <- c(0, Ni_asc1)
eje_Y_dsc <- c(Ni_dsc1, 0)
par(mar = c(5, 6, 4, 2) + 0.1, mgp = c(4.2, 1, 0))
plot(
  eje_X_ojivas, eje_Y_asc,
  type = "n",             
  main = "Gráfico N°4: Ojivas de Frecuencias Absolutas Acumuladas de NO2
  Periodo: Mayo 2024 - Mayo 2026",
  sub = "Análisis de tendencias acumuladas ascendente (Ni) y descendente (Ni')",
  xlab = "Concentración de Dióxido de Nitrógeno - NO2 (µg/m³)",
  ylab = "Frecuencia Absoluta Acumulada (Ni)",
  axes = FALSE,               
  xlim = c(0, 450),        
  ylim = c(0, max(Ni_asc1) * 1.05), 
  font.main = 2,
  col.main = "#2C3E50"
)
grid(nx = NULL, ny = NULL, col = "#EAECEE", lty = "dotted")
lines(
  eje_X_ojivas, 
  eje_Y_asc, 
  col = "#2C3E50",              
  lwd = 3, 
  type = "l"                    
)
lines(
  eje_X_ojivas, 
  eje_Y_dsc, 
  col = "#E74C3C",              
  lwd = 3, 
  type = "l"
)
legend(
  "right",                      
  legend = c("Ojiva Ascendente (Ni)", "Ojiva Descendente (Ni')"),
  col = c("#2C3E50", "#E74C3C"),
  lwd = 3,
  bty = "n",                    
  text.font = 2,
  cex = 0.85
)
axis(
  side = 1, 
  at = eje_X_ojivas, 
  labels = round(eje_X_ojivas, 1), 
  las = 1,                      
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.75               
)
axis(
  side = 2, 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

par(mar = c(5, 4, 4, 2) + 0.1, mgp = c(3, 1, 0))

5.5.- Ojivas Hi asd y des

eje_X_ojivas_hi <- c(Li1, Ls1[length(Ls1)])
eje_Y_hi_asc <- c(0, Hi_asc1)
eje_Y_hi_dsc <- c(Hi_dsc1, 0)

par(mar = c(5, 6, 4, 2) + 0.1, mgp = c(3.8, 1, 0))
plot(
  eje_X_ojivas_hi, eje_Y_hi_asc,
  type = "n",                
  main = "Gráfico N°5: Ojivas de Frecuencias Relativas Acumuladas de NO2",
  sub = "Análisis porcentual acumulado ascendente (Hi) y descendente (Hi')",
  xlab = "Concentración de Dióxido de Nitrógeno - NO2 (µg/m³)",
  ylab = "Frecuencia Relativa Acumulada - Hi (%)", 
  axes = FALSE,                 
  xlim = c(0, 450),             
  ylim = c(0, 105),             
  font.main = 2,
  col.main = "#2C3E50"
)
grid(nx = NULL, ny = NULL, col = "#EAECEE", lty = "dotted")
lines(
  eje_X_ojivas_hi, 
  eje_Y_hi_asc, 
  col = "#2C3E50",              
  lwd = 3, 
  type = "l"                    
)
lines(
  eje_X_ojivas_hi, 
  eje_Y_hi_dsc, 
  col = "#E74C3C",              
  lwd = 3, 
  type = "l"
)

legend(
  "right",                      
  legend = c("Ojiva Ascendente (Hi %)", "Ojiva Descendente (Hi' %)"),
  col = c("#2C3E50", "#E74C3C"),
  lwd = 3,
  bty = "n",                   
  text.font = 2,
  cex = 0.85
)
axis(
  side = 1, 
  at = eje_X_ojivas_hi, 
  labels = round(eje_X_ojivas_hi, 1), 
  las = 1,                      
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.75               
)
axis(
  side = 2, 
  at = seq(0, 100, by = 10),
  labels = paste0(seq(0, 100, by = 10), "%"), 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

par(mar = c(5, 4, 4, 2) + 0.1, mgp = c(3, 1, 0))

5.6.- Diagrama de caja y bigotes

par(mar = c(5, 6, 4, 2) + 0.1, mgp = c(3, 1, 0))
boxplot(
  NO_2,
  horizontal = TRUE,            
  col = "#2C3E50",            
  border = "#1A252F",           
  lwd = 2,                      
  main = "Gráfico N°6: Diagrama de Caja de las Concentraciones de NO2",
  sub = "Periodo: Mayo 2024 - Mayo 2026",
  xlab = "Concentración de NO2 (µg/m³)", 
  ylab = "",                    
  axes = FALSE,                 
  ylim = c(0, 50),              
  pch = 21,                     
  bg = "#E74C3C",               
  col.main = "#2C3E50",
  font.main = 2
)
axis(
  side = 1, 
  at = seq(0, 50, by = 5), 
  labels = seq(0, 50, by = 5), 
  las = 1,                      
  font = 2,                   
  col = "#2C3E50",
  cex.axis = 0.75               
)

axis(
  side = 2, 
  at = 1, 
  labels = "Registros NO2", 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

6.- Indicadores de frecuencia

Tendencia central

media <- mean(NO_2, na.rm = TRUE)
mediana <- median(NO_2, na.rm = TRUE)

ni_num <- as.numeric(ni1)
max_ni <- max(ni_num)

moda <- as.numeric(MC1[ni_num == max_ni])

Dispersión

varianza <- var(NO_2, na.rm = TRUE)
desv_est <- sd(NO_2, na.rm = TRUE)
cv <- (desv_est / media) * 100

Forma

asimetria <- skewness(NO_2, na.rm = TRUE)
curtosis <- kurtosis(NO_2, na.rm = TRUE)

Valores atípicos

# ------------------------------------------------------------------------------
Q1 <- quantile(NO_2, 0.25, na.rm = TRUE)
Q3 <- quantile(NO_2, 0.75, na.rm = TRUE)
RIC <- Q3 - Q1

lim_inf <- Q1 - 1.5 * RIC
lim_sup <- Q3 + 1.5 * RIC

atipicos <- NO_2[NO_2 < lim_inf | NO_2 > lim_sup]
n_atipicos <- length(atipicos)

intervalo_atipicos <- paste0(
  "[", 
  round(lim_inf, 2), 
  " ; ", 
  round(lim_sup, 2), 
  "]"
)

# Rango
rango_texto <- paste0(
  "[", 
  round(min(NO_2, na.rm = TRUE), 2), 
  " ; ", 
  round(max(NO_2, na.rm = TRUE), 2), 
  "]"
)

Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable = "Concentración NO2",
  Rango = rango_texto,
  X = round(media, 2),
  Mediana = round(mediana, 2),
  Moda = round(moda, 2),
  Varianza = round(varianza, 2),
  Desv_Est = round(desv_est, 2),
  CV = round(cv, 2),
  Asimetria = round(asimetria, 2),
  Curtosis = round(curtosis, 2),
  N_Atipicos = n_atipicos
)
kable(
  tabla_indicadores,
  align = "c",
  caption = "Indicadores estadísticos descriptivos de la variable Concentración de NO2 en registros meteorológicos mundiales, período 2024-2026"
) |> 
  kable_styling(
    full_width = FALSE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  ) |> 
  row_spec(
    0,
    bold = TRUE,
    color = "white",
    background = "#2C3E50"  
  )
Indicadores estadísticos descriptivos de la variable Concentración de NO2 en registros meteorológicos mundiales, período 2024-2026
Variable Rango X Mediana Moda Varianza Desv_Est CV Asimetria Curtosis N_Atipicos
Concentración NO2 [0 ; 427.7] 14.85 5.74 25 547.31 23.39 157.59 3.21 17.61 14648

7.- Conclusiones

El comportamiento de la concentración de \(\text{NO}_2\) en microgramos por metro cúbico (\(\mu\text{g/m}^3\)) fluctúa entre \(0.00\ \mu\text{g/m}^3\) y \(427.70\ \mu\text{g/m}^3\), y sus valores giran en torno a la mediana de \(5.74\ \mu\text{g/m}^3\), debido a la presencia de \(14648\) valores atípicos que influyen notablemente en la media aritmética de \(14.85\ \mu\text{g/m}^3\). Presenta una desviación estándar de \(23.39\ \mu\text{g/m}^3\) y un coeficiente de variación de \(157.59\%\), por lo que constituye un conjunto de datos altamente heterogéneo. La distribución muestra una concentración extremadamente alta de los datos alrededor de la moda (curtosis fuertemente leptocúrtica de \(17.61\)) y una mayor acumulación de observaciones en los valores bajos de concentración, con una cola extendida hacia los valores altos que genera una asimetría positiva de \(3.21\). Por todo lo anterior, el comportamiento de la contaminación por \(\text{NO}_2\) mundial durante el período 2024–2026 se caracteriza por una predominancia de concentraciones muy bajas y seguras la mayor parte del tiempo, aunque existen registros extremos y críticos de contaminación que generan una dispersión y variabilidad descomunal en los datos analizados.