0. Librerías

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

1. Leer

variables <- read.csv("C:/Users/dellh/Downloads/GlobalWeatherRepository.csv")

2. Depuración y Selección de Variables

DEFRA <- variables$air_quality_gb.defra.index
# Eliminar NA
DEFRA <- na.omit(DEFRA)
Tabla_DEFRA <- table(DEFRA)

3. Frecuencia

ni_DEFRA <- as.vector(Tabla_DEFRA) 
hi_DEFRA <- round((ni_DEFRA / sum(ni_DEFRA)) * 100, 2)

TDF_DEFRA_Base <- data.frame(
  DEFRA = names(Tabla_DEFRA),
  ni = ni_DEFRA,
  hi = hi_DEFRA
)
sumatoria_DEFRA <- data.frame(
  DEFRA = "TOTAL", 
  ni = sum(ni_DEFRA), 
  hi = 100
)
TDF_DEFRA_Suma <- rbind(TDF_DEFRA_Base, sumatoria_DEFRA)

colnames(TDF_DEFRA_Suma) <- c("DEFRA", "Frecuencia Absoluta (ni)", "Frecuencia Relativa (hi %)")

kable(TDF_DEFRA_Suma, 
      align = "c",
      caption = "Tabla N°1:Distribución de frecuencia del índice de calidad                     de aire según escala (AQI DEFRA) 
                  del año 2024 hasta 2026") |> 
  kable_styling(full_width = TRUE, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive")) |> 
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") |> 
  row_spec(nrow(TDF_DEFRA_Suma), bold = TRUE, background = "#EAEDED") |> 
  footnote(general = "Fuente: Global Weather Repository,(https://www.kaggle.com/datasets/nelgiriyewithana/global-weather-repository)",
           general_title = "Nota:Elaborado Grupo N°2 ",
           footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla N°1:Distribución de frecuencia del índice de calidad de aire según escala (AQI DEFRA) del año 2024 hasta 2026
DEFRA Frecuencia Absoluta (ni) Frecuencia Relativa (hi %)
1 62139 43.85
2 37906 26.75
3 17121 12.08
4 4842 3.42
5 3688 2.60
6 2824 1.99
7 1739 1.23
8 1792 1.26
9 1455 1.03
10 8197 5.78
TOTAL 141703 100.00
Nota:Elaborado Grupo N°2 Fuente: Global Weather Repository,(https://www.kaggle.com/datasets/nelgiriyewithana/global-weather-repository)

4. Tabla Simplificada

# Convertir a numérico
DEFRA <- as.numeric(DEFRA)
DEFRA_Categoria <- cut(
  DEFRA,
  breaks = c(0, 3, 6, 9, 10),
  labels = c("Bajo", "Moderado", "Alto", "Muy Alto"),
  include.lowest = TRUE
)

Tabla_DEFRA <- table(DEFRA_Categoria)

ni_DEFRA <- as.vector(Tabla_DEFRA)

hi_DEFRA <- round((ni_DEFRA / sum(ni_DEFRA)) * 100, 2)

TDF_DEFRA_Base <- data.frame(
  Categoria = names(Tabla_DEFRA),
  ni = ni_DEFRA,
  hi = hi_DEFRA
)

sumatoria_DEFRA <- data.frame(
  Categoria = "TOTAL",
  ni = sum(ni_DEFRA),
  hi = 100
)

TDF_DEFRA_Suma <- rbind(TDF_DEFRA_Base, sumatoria_DEFRA)

colnames(TDF_DEFRA_Suma) <- c(
  "Clasificación DEFRA",
  "Frecuencia Absoluta (ni)",
  "Frecuencia Relativa (hi %)"
)

kable(
  TDF_DEFRA_Suma,
  align = "c",
  caption = "Tabla N°2: Resumen de niveles de calidad del aire (Escala DEFRA)                en período 2024-2026"
) %>%
  kable_styling(
    full_width = TRUE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  row_spec(nrow(TDF_DEFRA_Suma), bold = TRUE, background = "#EAEDED") %>%
  footnote(
    general = "Fuente: Global Weather Repository (Kaggle) y UK-AIR DEFRA: https://uk-air.defra.gov.uk/",
    general_title = "Nota:Grupo N°2 ",
    footnote_as_chunk = TRUE,
    title_format = c("italic", "bold")
  )
Tabla N°2: Resumen de niveles de calidad del aire (Escala DEFRA) en período 2024-2026
Clasificación DEFRA Frecuencia Absoluta (ni) Frecuencia Relativa (hi %)
Bajo 117166 82.68
Moderado 11354 8.01
Alto 4986 3.52
Muy Alto 8197 5.78
TOTAL 141703 100.00
Nota:Grupo N°2 Fuente: Global Weather Repository (Kaggle) y UK-AIR DEFRA: https://uk-air.defra.gov.uk/

5. Gráfica de distribución de frecuencia

5.1 Diagrama de barra (ni)AQI

# Frecuencias por categoría

Tabla_DEFRA <- table(DEFRA_Categoria)

datos_grafica <- data.frame(
  Categoria = names(Tabla_DEFRA),
  Frecuencia = as.vector(Tabla_DEFRA)
)

# Orden correcto de las categorías
datos_grafica$Categoria <- factor(
  datos_grafica$Categoria,
  levels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)

ggplot(datos_grafica,
       aes(x = Categoria,
           y = Frecuencia,
           fill = Categoria)) +
  
  geom_col(width = 0.6, color = "black") +
  
  geom_text(
    aes(label = Frecuencia),
    vjust = -0.5,
    fontface = "bold",
    size = 4
  ) +
  
  scale_fill_manual(
    values = c(
      "Bajo" = "green",
      "Moderado" = "yellow",
      "Alto" = "orange",
      "Muy Alto" = "red"
    )
  ) +
  
  labs(
    title = "Clasificación del Índice AQI según escala DEFRA 
            el año 2024 al 2026",
    x = "Categorías DEFRA",
    y = "Frecuencia Absoluta (ni)"
  ) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

5.2. Distribución de frecuencia (ni)con relación al todo

# Frecuencias por categoría
Tabla_DEFRA <- table(DEFRA_Categoria)

# Frecuencia absoluta
ni_DEFRA <- as.vector(Tabla_DEFRA)

# Tamaño muestral
N <- sum(ni_DEFRA)

# Datos para la gráfica
datos_grafica <- data.frame(
  Categoria = names(Tabla_DEFRA),
  ni = ni_DEFRA
)

# Orden correcto de categorías
datos_grafica$Categoria <- factor(
  datos_grafica$Categoria,
  levels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)

# Diagrama de barras global
ggplot(datos_grafica,
       aes(x = Categoria,
           y = ni,
           fill = Categoria)) +
  
  geom_col(width = 0.6, color = "black") +
  
  geom_text(
    aes(label = ni),
    vjust = -0.5,
    fontface = "bold",
    size = 4
  ) +
  
  scale_fill_manual(
    values = c(
      "Bajo" = "green",
      "Moderado" = "yellow",
      "Alto" = "orange",
      "Muy Alto" = "red"
    )
  ) +
  
  scale_y_continuous(
    limits = c(0, N),
    breaks = seq(0, N, by = 20000)
  ) +
  
  labs(
    title = "Frecuencia de niveles de calidad de aire según escala 
              DEFRA  desde 2024 hasta 2026",
    subtitle = paste("Tamaño muestral N =", N),
    x = "Categorías DEFRA",
    y = "Frecuencia Absoluta (ni)"
  ) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

5.3. Distribución de frecuencia (hi) original

N <- sum(ni_DEFRA)

datos_grafica <- data.frame(
  Categoria = names(Tabla_DEFRA),
  ni = ni_DEFRA
)

# Frecuencia relativa porcentual
datos_grafica$hi <- round((datos_grafica$ni / N) * 100, 2)

# Orden correcto
datos_grafica$Categoria <- factor(
  datos_grafica$Categoria,
  levels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)

ggplot(datos_grafica,
       aes(x = Categoria,
           y = hi,
           fill = Categoria)) +
  
  geom_col(width = 0.6, color = "black") +
  
  geom_text(
    aes(label = paste0(hi, "%")),
    vjust = -0.5,
    fontface = "bold",
    size = 4
  ) +
  
  scale_fill_manual(
    values = c(
      "Bajo" = "green",
      "Moderado" = "yellow",
      "Alto" = "orange",
      "Muy Alto" = "red"
    )
  ) +
  
  labs(
    title = "Distribución de frecuencia del Índice AQI según 
                  escala DEFRA desde el año 2024 hasta 2026",
    subtitle = paste("Tamaño de muestra (N) =", N),
    x = "Categorías DEFRA",
    y = "Frecuencia Relativa (%)"
  ) +
  
  ylim(0, max(datos_grafica$hi) + 5) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

5.4 Distribución DEFRA (hi)

datos_hi <- data.frame(
  Categoria = names(Tabla_DEFRA),
  hi = hi_DEFRA
)

datos_hi$Categoria <- factor(
  datos_hi$Categoria,
  levels = c("Bajo", "Moderado", "Alto", "Muy Alto")
)

ggplot(datos_hi,
       aes(x = Categoria,
           y = hi,
           fill = Categoria)) +
  
  geom_col(width = 0.6, color = "black") +
  
  geom_text(
    aes(label = paste0(hi, "%")),
    vjust = -0.5,
    fontface = "bold",
    size = 4
  ) +
  
  scale_fill_manual(
    values = c(
      "Bajo" = "green",
      "Moderado" = "yellow",
      "Alto" = "orange",
      "Muy Alto" = "red"
    )
  ) +
  
  scale_y_continuous(
    limits = c(0, 100),
    breaks = seq(0, 100, by = 10)
  ) +
  
  labs(
    title = "Distribución de frecuencia relativa
          (hi) del Índice AQI según  escala DEFRA desde
    2024 hasta 2026",
    subtitle = paste("Tamaño muestral N =", N),
    x = "Categorías DEFRA",
    y = "Frecuencia Relativa (%)"
  ) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

5.5. Diagrama Circular

# Estructura ampliar margen
par(mar = c(4,4,4,8))

Tabla_DEFRA <- table(DEFRA_Categoria)

porcentaje <- round(prop.table(Tabla_DEFRA) * 100, 2)

#Crea el gráfico
pie(
  Tabla_DEFRA,
  labels = paste0(porcentaje, "%"),
  col = c("green", "yellow", "orange", "red"),
  main ="Gráfica N°2:Distribución porcentual AQI DEFRA 
         del año 2024 al 2026",
  border = "black",
  radius = 0.9
)
# Agregar Leyenda

legend("topright",
  inset = c(-0.30,0),
  legend = c("Bajo", "Moderado", "Alto", "Muy Alto"),
  fill = c("green", "yellow", "orange", "red"),
  title = "Categorías",
  xpd =TRUE
)

6. Indicadores de frecuencia

# 1. Asegurar la variable categórica ordinal creada en la Sección 4
DEFRA_Cat <- factor(
  DEFRA_Categoria,
  levels = c("Bajo", "Moderado", "Alto", "Muy Alto"),
  ordered = TRUE
)

# 2. Obtener Moda y Mediana categórica
tabla_cat <- table(DEFRA_Cat)
moda_defra <- names(tabla_cat)[which.max(tabla_cat)]
mediana_defra <- levels(DEFRA_Cat)[round(median(as.numeric(DEFRA_Cat), na.rm = TRUE))]

# 3. Tabla Horizontal de Indicadores (Estilo exacto de la foto, fondo Verde Menta)
Indicadores_DEFRA <- data.frame(
  Variable = "DEFRA (AQI)",
  Rango = "Bajo a Muy Alto",
  Media = "-",
  Mediana = mediana_defra,
  Moda = moda_defra,
  Varianza = "-",
  Desv_Est = "-",
  CV = "-",
  Asimetria = "-",
  Curtosis = "-",
  N_Atipicos = "No presenta",
  check.names = FALSE
)

kable(Indicadores_DEFRA, align = "c",
      caption = "Tabla N°3: Indicadores estadísticos del índice de calidad del aire (AQI) según la escala DEFRA en el Global Weather Repository desde el 2024 hasta el 2026") |>
  kable_styling(full_width = TRUE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) |>
  row_spec(0, bold = TRUE, color = "black", background = "#D4EFDF") |>
  footnote(general = "Al ser una variable cualitativa ordinal agrupada en categorías, los parámetros cuantitativos de distancia (Media, Varianza, Asimetría, etc.) no aplican. Elaborado por Grupo N°2.",
           general_title = "Nota: ",
           footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla N°3: Indicadores estadísticos del índice de calidad del aire (AQI) según la escala DEFRA en el Global Weather Repository desde el 2024 hasta el 2026
Variable Rango Media Mediana Moda Varianza Desv_Est CV Asimetria Curtosis N_Atipicos
DEFRA (AQI) Bajo a Muy Alto
Bajo Bajo
No presenta
Nota: Al ser una variable cualitativa ordinal agrupada en categorías, los parámetros cuantitativos de distancia (Media, Varianza, Asimetría, etc.) no aplican. Elaborado por Grupo N°2.

7. Conclusiones

Mediante el análisis del índice de calidad del aire DEFRA demuestra que el aire se mantiene limpia la mayor parte del tiempo, concentrando su valor más frecuente (Moda) y su centro (Mediana) en la categoría Bajo. Este resultado es muy beneficioso para la salud y el medio ambiente, ya que confirma que las personas respiran aire seguro y sin contaminación.