UNIVERSIDAD CENTRAL DEL ECUADOR

# UNIVERSIDAD CENTRAL DEL ECUADOR
# CALIDAD DEL AIRE PM2.5

# -----------------------------------
# CARGA DE LIBRERÍAS
# -----------------------------------

library(knitr)
library(kableExtra)

# -----------------------------------
# IMPORTAR BASE DE DATOS
# -----------------------------------

datos <- read.csv(
  "~/Estadistica/Proyecto 2026/Datos utilizados/city_day (1).csv",
  stringsAsFactors = FALSE
)

# -----------------------------------
# REVISAR NOMBRES DE COLUMNAS
# -----------------------------------

names(datos)
##  [1] "City"                 "State"                "StationName"         
##  [4] "Zona"                 "Longitud"             "Latitud"             
##  [7] "Date"                 "PM2.5"                "PM10"                
## [10] "NO"                   "NO2"                  "NOx"                 
## [13] "NH3"                  "CO"                   "SO2"                 
## [16] "O3"                   "Benzene"              "Toluene"             
## [19] "Xylene"               "AQI"                  "AQI_Bucket"          
## [22] "Número.de.habitantes"
# -----------------------------------
# EXTRAER COLUMNA PM2.5
# -----------------------------------

PM2.5 <- datos$PM2.5

# Mostrar primeros datos
head(PM2.5)
## [1] "-" "-" "-" "-" "-" "-"
# -----------------------------------
# LIMPIAR DATOS PM2.5
# -----------------------------------

# Eliminar espacios
datos$PM2.5 <- trimws(datos$PM2.5)

# Reemplazar vacíos por NA
datos$PM2.5[datos$PM2.5 == ""] <- NA

# Convertir a numérico
datos$PM2.5 <- as.numeric(datos$PM2.5)
## Warning: NAs introducidos por coerción
# Resumen estadístico
summary(datos$PM2.5)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.04   28.82   48.57   67.45   80.59  949.99    4598
# -----------------------------------
# FUNCIÓN PARA CALCULAR AQI
# -----------------------------------

calcular_aqi <- function(C){
  
  # Verificar datos vacíos
  if(is.na(C)){
    return(NA)
  }
  
  # AQI Buena
  if(C <= 12){
    
    BPlo <- 0
    BPhi <- 12
    
    Ilo <- 0
    Ihi <- 50
    
    # AQI Moderada
  } else if(C <= 35.4){
    
    BPlo <- 12.1
    BPhi <- 35.4
    
    Ilo <- 51
    Ihi <- 100
    
    # AQI Dañina para sensibles
  } else if(C <= 55.4){
    
    BPlo <- 35.5
    BPhi <- 55.4
    
    Ilo <- 101
    Ihi <- 150
    
    # AQI Dañina
  } else if(C <= 150.4){
    
    BPlo <- 55.5
    BPhi <- 150.4
    
    Ilo <- 151
    Ihi <- 200
    
    # AQI Muy dañina
  } else if(C <= 250.4){
    
    BPlo <- 150.5
    BPhi <- 250.4
    
    Ilo <- 201
    Ihi <- 300
    
    # AQI Peligrosa
  } else if(C <= 350.4){
    
    BPlo <- 250.5
    BPhi <- 350.4
    
    Ilo <- 301
    Ihi <- 400
    
    # AQI Extremadamente peligrosa
  } else {
    
    BPlo <- 350.5
    BPhi <- 500.4
    
    Ilo <- 401
    Ihi <- 500
  }
  
  # Fórmula general AQI
  
  AQI <- ((Ihi - Ilo)/(BPhi - BPlo)) * (C - BPlo) + Ilo
  
  # Retornar AQI redondeado
  
  return(round(AQI))
}

# -----------------------------------
# APLICAR FUNCIÓN AQI
# -----------------------------------

datos$AQI_calculado <- sapply(datos$PM2.5, calcular_aqi)



# -----------------------------------
# CLASIFICAR CALIDAD DEL AIRE
# -----------------------------------

datos$Calidad_Aire <- cut(
  
  datos$AQI_calculado,
  
  breaks = c(0,50,100,150,200,300,400,500),
  
  labels = c(
    "Buena",
    "Moderada",
    "Dañina Sensibles",
    "Dañina",
    "Muy Dañina",
    "Peligrosa",
    "Extremadamente Peligrosa"
  )
)



# -----------------------------------
# ELIMINAR FILAS VACÍAS
# -----------------------------------

datos_validos <- na.omit(
  datos[, c("PM2.5", "AQI_calculado", "Calidad_Aire")]
)

# Mostrar datos válidos

head(datos_validos)
# -----------------------------------
# TABLA DE FRECUENCIAS
# -----------------------------------

table(datos$Calidad_Aire)
## 
##                    Buena                 Moderada         Dañina Sensibles 
##                      970                     7466                     5704 
##                   Dañina               Muy Dañina                Peligrosa 
##                     8600                     1623                      397 
## Extremadamente Peligrosa 
##                      135
# -----------------------------------
# GRÁFICO DE CALIDAD DEL AIRE
# -----------------------------------

barplot(
  
  table(datos$Calidad_Aire),
  
  main = "Calidad del Aire PM2.5",
  
  xlab = "Categorías AQI",
  
  ylab = "Frecuencia"
)