UNIVESIDAD CENTRAL DEL ECUADOR, FIGEMPA-INGENIERÍA AMBIENTAL

# Lista de paquetes necesarios
required_packages <- c("dplyr", "ggplot2", "kableExtra", "gt", "magrittr", "tidyr")

# Instalar los paquetes que faltan
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)

# Cargar todos los paquetes necesarios
lapply(required_packages, library, character.only = TRUE)
## [[1]]
## [1] "dplyr"     "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[2]]
## [1] "ggplot2"   "dplyr"     "stats"     "graphics"  "grDevices" "utils"    
## [7] "datasets"  "methods"   "base"     
## 
## [[3]]
##  [1] "kableExtra" "ggplot2"    "dplyr"      "stats"      "graphics"  
##  [6] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[4]]
##  [1] "gt"         "kableExtra" "ggplot2"    "dplyr"      "stats"     
##  [6] "graphics"   "grDevices"  "utils"      "datasets"   "methods"   
## [11] "base"      
## 
## [[5]]
##  [1] "magrittr"   "gt"         "kableExtra" "ggplot2"    "dplyr"     
##  [6] "stats"      "graphics"   "grDevices"  "utils"      "datasets"  
## [11] "methods"    "base"      
## 
## [[6]]
##  [1] "tidyr"      "magrittr"   "gt"         "kableExtra" "ggplot2"   
##  [6] "dplyr"      "stats"      "graphics"   "grDevices"  "utils"     
## [11] "datasets"   "methods"    "base"
# Estadística Descriptiva
# Llumitasig Daniela 
# 19/11/2025

# Cargar las librerías necesarias
library(gt)
library(dplyr)

# Cargar los datos
datos <- read.csv("city_day.csv", header = TRUE, dec = ".", sep = ",")

# Tablas Cualitativas Nominales
# Estado
State <- datos$State

# Tabla de distribución de frecuencia
TDF_State <- data.frame(table(State))
ni <- TDF_State$Freq
hi <- round((ni / sum(ni)) * 100, 2)
hip<-round((ni / sum(ni)) * 100, 2)

# Crear la tabla con las frecuencias y los porcentajes
State <- TDF_State$State
TDF_State <- data.frame(State, ni, hi,hip)

# Agregar fila total
Summary <- data.frame(State = "TOTAL", ni = sum(ni), hi = 100,hip=100)
TDF_State_suma <- rbind(TDF_State, Summary)

# Cambiar nombres de las columnas
colnames(TDF_State_suma) <- c("State", "ni", "hi(%)", "P")


View(TDF_State_suma)


TDF_State_suma %>%
  gt() %>%
  # Agregar el título y subtítulo a la tabla
  tab_header(
    title = md("*Tabla Nro. 1*"),
    subtitle = md("Distribución de frecuencias de registros de calidad de aire por Estado")
  ) %>%
  # Agregar la fuente
  tab_source_note(
    md("**Fuente:** Datos procesados por el autor a partir del archivo *city_day.csv*")
  ) %>%
  # Estilo para los bordes de las celdas
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),  
      color = "black",  
      weight = px(2),  
      style = "solid"   
    ),
    locations = cells_column_labels()  
  ) %>%

  tab_options(
    table.border.top.color = "black", 
    table.border.bottom.color = "black",  
    table.border.top.style = "solid",  
    table.border.bottom.style = "solid",  
    column_labels.border.top.color = "black",  
    column_labels.border.bottom.color = "black",  
    column_labels.border.bottom.width = px(2),  
    row.striping.include_table_body = TRUE,  
    heading.border.bottom.color = "black",  
    heading.border.bottom.width = px(2),  
    table_body.hlines.color = "gray",  
    table_body.border.bottom.color = "black"  
  )
Tabla Nro. 1
Distribución de frecuencias de registros de calidad de aire por Estado
State ni hi(%) P
Andhra Pradesh 2413 8.17 8.17
Assam 502 1.70 1.70
Bihar 1858 6.29 6.29
Chandigarh 304 1.03 1.03
Delhi 2009 6.80 6.80
Gujarat 2009 6.80 6.80
Haryana 1679 5.69 5.69
Jharkhand 1169 3.96 3.96
Karnataka 2009 6.80 6.80
Kerala 1436 4.86 4.86
Madhya Pradesh 289 0.98 0.98
Maharashtra 2009 6.80 6.80
Meghalaya 310 1.05 1.05
Mizoram 113 0.38 0.38
Odisha 1863 6.31 6.31
Punjab 1221 4.13 4.13
Rajasthan 1114 3.77 3.77
Tamil Nadu 2395 8.11 8.11
Telangana 2006 6.79 6.79
Uttar Pradesh 2009 6.80 6.80
West Bengal 814 2.76 2.76
TOTAL 29531 100.00 100.00
Fuente: Datos procesados por el autor a partir del archivo city_day.csv
# Se agruparon los estados en diferentes zonas para simplificar y organizar los datos, ya que el número de valores que puede tomar la variable 'State' excedió el límite de representaciones posibles en un diagrama de barras.

# Crear columna Zona usando ifelse


# Crear el data frame con los 21 estados
tabla <- data.frame(
  State = c(
    "Andhra Pradesh", "Assam", "Bihar", "Chandigarh", "Delhi", "Gujarat", 
    "Haryana", "Jharkhand", "Karnataka", "Kerala", "Madhya Pradesh", "Maharashtra", 
    "Meghalaya", "Mizoram", "Odisha", "Punjab", "Rajasthan", "Tamil Nadu", 
    "Telangana", "Uttar Pradesh", "West Bengal"
  )
)

# Asignar las zonas correspondientes a cada estado usando ifelse

tabla$Zona <- ifelse(tabla$State %in% c("Uttar Pradesh", "Haryana", "Delhi"),
                     "Norte",
ifelse(tabla$State %in% c("Gujarat", "Rajasthan", "Maharashtra", "Goa", "Chandigarh", "Punjab"),
                            "Oeste",
ifelse(tabla$State %in% c("Tamil Nadu", "Kerala"),
                                   "Sur",
ifelse(tabla$State %in% c("Bihar", "Odisha", "Assam", "West Bengal", "Jharkhand", "Meghalaya", "Mizoram", "Tripura"),
                                          "Este", 
ifelse(tabla$State %in% c("Madhya Pradesh", "Telangana", "Karnataka", "Andhra Pradesh"),
                                                 "Centro", NA)))))

# Verificar la asignación correcta de zonas

table(tabla$State, tabla$Zona)
##                 
##                  Centro Este Norte Oeste Sur
##   Andhra Pradesh      1    0     0     0   0
##   Assam               0    1     0     0   0
##   Bihar               0    1     0     0   0
##   Chandigarh          0    0     0     1   0
##   Delhi               0    0     1     0   0
##   Gujarat             0    0     0     1   0
##   Haryana             0    0     1     0   0
##   Jharkhand           0    1     0     0   0
##   Karnataka           1    0     0     0   0
##   Kerala              0    0     0     0   1
##   Madhya Pradesh      1    0     0     0   0
##   Maharashtra         0    0     0     1   0
##   Meghalaya           0    1     0     0   0
##   Mizoram             0    1     0     0   0
##   Odisha              0    1     0     0   0
##   Punjab              0    0     0     1   0
##   Rajasthan           0    0     0     1   0
##   Tamil Nadu          0    0     0     0   1
##   Telangana           1    0     0     0   0
##   Uttar Pradesh       0    0     1     0   0
##   West Bengal         0    1     0     0   0
# Contamos las frecuencias de cada zona en la columna "Zona"

library(dplyr)
library(knitr)
library(kableExtra)

# 1) Une la zona a cada registro real del dataset (usa la Zona del diccionario)
datos_zona <- datos %>%
  left_join(tabla, by = "State") %>%
  rename(Zona = Zona.y) %>%     # esta es la zona que tú creaste
  select(-Zona.x)               # elimina la zona vieja del dataset

# 2) Tabla de frecuencias por Zona (tamaño muestral real)
TDF_zona_final <- datos_zona %>%
  filter(!is.na(Zona)) %>%
  count(Zona, name = "ni") %>%
  mutate(`hi (%)` = round(ni / sum(ni) * 100, 2),
P = `hi (%)`)



# 3) Asegurar que no exista un TOTAL previo (evita duplicados)
TDF_zona_final <- TDF_zona_final %>% 
  filter(Zona != "TOTAL")

# Agregar UNA sola fila TOTAL
TDF_zona_final <- bind_rows(
  TDF_zona_final,
  data.frame(
    Zona = "TOTAL",
    ni = sum(TDF_zona_final$ni),
    `hi (%)` = 100,
    `P`=100
  
  )
)


TDF_zona_final$`hi (%)`[TDF_zona_final$Zona == "TOTAL"] <- 100
TDF_zona_final <- TDF_zona_final %>% dplyr::select(Zona, ni, `hi (%)`,`P`)

TDF_zona_final %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 2*"),
    subtitle = md("** Distribución de Frecuencias de las Zonas agrupadas en el estudio de la Calidad de Aire en la India**")
  ) %>%
  tab_source_note(
    source_note = md("Datos procesados por el autor a partir del archivo *city_day.csv*")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )
Tabla Nro. 2
** Distribución de Frecuencias de las Zonas agrupadas en el estudio de la Calidad de Aire en la India**
Zona ni hi (%) P
Centro 6717 22.75 22.75
Este 6629 22.45 22.45
Norte 5697 19.29 19.29
Oeste 6657 22.54 22.54
Sur 3831 12.97 12.97
TOTAL 29531 100.00 100.00
Datos procesados por el autor a partir del archivo city_day.csv
# Diagrama de barras locales

# Eliminar la fila "TOTAL" de la tabla

TDF_zonas_sintotal <- TDF_zona_final[TDF_zona_final$Zona != "TOTAL", ]

par(mar = c(5, 5, 6, 2)) 
barplot(TDF_zonas_sintotal$ni, 
        main = "Gráfica N°1: Distribución de las zonas agrupadas 
        en el Estudio de la Calidad de Aire en la India",
        xlab = "Zona",  
        ylab = "Cantidad",
        col = "skyblue",
        ylim = c(0, 6000),
        
        las = 2,  
        cex.names = 0.6,  
        names.arg = TDF_zonas_sintotal$Zona)  

# Diagrama de barras con los porcentajes

barplot(TDF_zonas_sintotal$hi, 
        main = "Gráfica N°2: Distribución de las zonas agrupadas
        en el Estudio de la Calidad de Aire en la India",
        xlab = "Zona",  
        ylab = "Porcentaje (%)", 
        col = "skyblue",
        ylim = c(0,30),  
        las = 2,  
        cex.names = 0.6,  
        names.arg = TDF_zonas_sintotal$Zona)  

#GDF probabilidad


barplot(TDF_zonas_sintotal$`hi (%)`,
main = "Gráfica N°4: Distribución de probabilidad estados agrupados 
por zona en el Estudio de la Calidad de Aire en la India",
        xlab = "Zona",
        ylab = "Probabilidad(%)",
        col = "blue",
        ylim = c(0,100),
        las = 3,
        cex.names = 0.6,
        names.arg = TDF_zonas_sintotal$Zona)

#La zona centro constituye la categoría más probable, al presentar la mayor frecuencia relativa dentro de la variable nominal Zona.

x <- round((TDF_zona_final$ni[TDF_zona_final$`Zona` == "Centro"] / 29531) * 100, 2)
print(paste("La probabilidad es de:", x, "%"))
## [1] "La probabilidad es de: 22.75 %"