UNIVERSIDAD CENTRAL DEL ECUADOR

PROYECTO: ANÁLISIS ESTADÍSTICO SOBRE LA CALIDAD DE AIRE EN LA INDIA

FECHA: 22/11/2025

  #============================
  # 1. CARGA DE PAQUETES Y DATOS
  # ==============================================================================

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

# Carga de datos
# El archivo ya está cargado en el entorno
datos <- read.csv("C:/Users/WILLIAM/Pictures/overleaf/Datos Cambiados.csv",
                  header = TRUE,
                  sep = ",",
                  dec = ".")

# ==============================================================================
# 2. PREPARACIÓN Y LIMPIEZA DE DATOS DE MONÓXIDO DE CARBONO (CO)
# ==============================================================================

# Extracción de los "-" (valores inexistentes) de la variable CO
co <- datos$CO[datos$CO != "-"]

# Tamaño muestral después de la limpieza
cat("Tamaño muestral del Monóxido de Carbono (sin '-'):", length(co), "\n")
## Tamaño muestral del Monóxido de Carbono (sin '-'): 27472
# Conversión a numérico
co <- as.numeric(co)

# ==============================================================================
# 3. CÁLCULOS PARA LA DISTRIBUCIÓN DE FRECUENCIAS DETALLADA (34 CLASES)
# ==============================================================================

N <- length(co)
min_co <- min(co)
max_co <- max(co)
R <- max_co - min_co

# Número de clases (k): Se mantienen 34 clases para replicar la estructura original
k_detallado <- 34

# Amplitud de clase (A)
A <- R / k_detallado

# Generación de límites de intervalos
Li <- seq(from = min_co, to = max_co - A, by = A)
Ls <- c(seq(from = min_co + A, to = max_co - A, by = A), max_co)

# Redondeo para cálculos de intervalos precisos
co <- round(co, 3)
Li <- round(Li, 3)
Ls <- round(Ls, 3)

# Marcas de Clase (MC)
MC <- (Li + Ls) / 2

# Creación de frecuencias absolutas (ni)
ni <- numeric(length(Li))
for (i in 1:length(Li)) {
  if (i < length(Li)) {
    # Intervalo abierto por la derecha: [Li, Ls)
    ni[i] <- sum(co >= Li[i] & co < Ls[i])
  } else {
    # Último intervalo cerrado: [Li, Ls]
    ni[i] <- sum(co >= Li[i] & co <= Ls[i])
  }
}

# Frecuencias relativas y acumuladas
hi <- (ni / N) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))

# Formatear la columna Intervalo
Intervalo <- paste0("[", round(Li, 2), " - ", round(Ls, 2), ")")
# Corregir el último intervalo para que sea cerrado
Intervalo[length(Intervalo)] <- paste0("[", round(Li[length(Li)], 2), " - ",
                                       round(Ls[length(Ls)], 2), "]")

# Crear el Data Frame (TDF)
TDF_co <- data.frame(
  Intervalo = Intervalo,
  MC = round(MC, 2),
  ni = ni,
  hi = round(hi, 2),
  Ni_ascendente = Ni_asc,
  Ni_descendente = Ni_desc,
  Hi_ascendente = round(Hi_asc, 2),
  Hi_descendente = round(Hi_desc, 2)
)

# Agregar la fila de totales
totales <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(ni),
  hi = sum(hi),
  Ni_ascendente = "-",
  Ni_descendente = "-",
  Hi_ascendente = "-",
  Hi_descendente = "-"
)
TDF_co_completa <- rbind(TDF_co, totales)

# ==============================================================================
# 4. TABLA DE FRECUENCIAS DETALLADA (Tabla Nro. 1)
# ==============================================================================

TDF_co_completa %>%
  gt() %>%
  tab_header(
    title = "Tabla Nro. 1",
    subtitle = "Distribución de frecuencia de concentración de Monóxido de Carbono (CO), estudio calidad del aire en India entre 2015-2020"
  ) %>%
  tab_source_note(
    source_note = "Autor: Grupo 2\n Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india"
  ) %>%
  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 frecuencia de concentración de Monóxido de Carbono (CO), estudio calidad del aire en India entre 2015-2020
Intervalo MC ni hi Ni_ascendente Ni_descendente Hi_ascendente Hi_descendente
[0 - 5.17) 2.59 25782 93.85 25782 27472 93.85 100
[5.17 - 10.34) 7.76 572 2.08 26354 1690 95.93 6.15
[10.34 - 15.51) 12.93 311 1.13 26665 1118 97.06 4.07
[15.51 - 20.68) 18.1 206 0.75 26871 807 97.81 2.94
[20.68 - 25.85) 23.27 131 0.48 27002 601 98.29 2.19
[25.85 - 31.02) 28.44 140 0.51 27142 470 98.8 1.71
[31.02 - 36.2) 33.61 84 0.31 27226 330 99.1 1.2
[36.2 - 41.37) 38.78 52 0.19 27278 246 99.29 0.9
[41.37 - 46.54) 43.95 49 0.18 27327 194 99.47 0.71
[46.54 - 51.71) 49.12 32 0.12 27359 145 99.59 0.53
[51.71 - 56.88) 54.29 18 0.07 27377 113 99.65 0.41
[56.88 - 62.05) 59.47 19 0.07 27396 95 99.72 0.35
[62.05 - 67.22) 64.64 13 0.05 27409 76 99.77 0.28
[67.22 - 72.39) 69.81 11 0.04 27420 63 99.81 0.23
[72.39 - 77.56) 74.98 6 0.02 27426 52 99.83 0.19
[77.56 - 82.73) 80.15 9 0.03 27435 46 99.87 0.17
[82.73 - 87.9) 85.32 5 0.02 27440 37 99.88 0.13
[87.9 - 93.08) 90.49 8 0.03 27448 32 99.91 0.12
[93.08 - 98.25) 95.66 4 0.01 27452 24 99.93 0.09
[98.25 - 103.42) 100.83 3 0.01 27455 20 99.94 0.07
[103.42 - 108.59) 106 1 0.00 27456 17 99.94 0.06
[108.59 - 113.76) 111.17 5 0.02 27461 16 99.96 0.06
[113.76 - 118.93) 116.34 3 0.01 27464 11 99.97 0.04
[118.93 - 124.1) 121.52 3 0.01 27467 8 99.98 0.03
[124.1 - 129.27) 126.69 0 0.00 27467 5 99.98 0.02
[129.27 - 134.44) 131.86 2 0.01 27469 5 99.99 0.02
[134.44 - 139.61) 137.03 1 0.00 27470 3 99.99 0.01
[139.61 - 144.78) 142.2 0 0.00 27470 2 99.99 0.01
[144.78 - 149.96) 147.37 1 0.00 27471 2 100 0.01
[149.96 - 155.13) 152.54 0 0.00 27471 1 100 0
[155.13 - 160.3) 157.71 0 0.00 27471 1 100 0
[160.3 - 165.47) 162.88 0 0.00 27471 1 100 0
[165.47 - 170.64) 168.05 0 0.00 27471 1 100 0
[170.64 - 175.81] 173.22 1 0.00 27472 1 100 0
Totales - 27472 100.00 - - - -
Autor: Grupo 2 Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
# ==============================================================================
# 5. CÁLCULOS PARA LA DISTRIBUCIÓN SIMPLIFICADA (13 CLASES)
# ==============================================================================

# Se utiliza la función hist() para obtener los intervalos simplificados
Histograma_co <- hist(co, breaks = 13, plot = FALSE) # No mostrar la gráfica aún

# Extraer elementos simplificados
Lis <- Histograma_co$breaks[1:(length(Histograma_co$breaks) - 1)]
Lss <- Histograma_co$breaks[2:length(Histograma_co$breaks)]
MCs <- (Lis + Lss) / 2
nis <- Histograma_co$counts

# Frecuencias relativas y acumuladas simplificadas
his <- (nis / N) * 100
Nis_asc <- cumsum(nis)
His_asc <- cumsum(his)
Nis_desc <- rev(cumsum(rev(nis)))
His_desc <- rev(cumsum(rev(his)))

# Crear el Data Frame Simplificado
TDF_cosimplificado <- data.frame(
  Intervalo = paste0("[", round(Lis, 2), " - ", round(Lss, 2), ")"),
  MC = round(MCs, 2),
  ni = nis,
  hi = round(his, 2),
  Ni_asc = Nis_asc,
  Hi_asc = round(His_asc, 2),
  Ni_desc = Nis_desc,
  Hi_desc = round(His_desc, 2)
)

# Renombrar columnas con los nombres finales (usando comillas invertidas para % en R)
colnames(TDF_cosimplificado) <- c("Intervalo", "MC", "ni", "hi(%)",
                                  "Ni_asc", "Hi_asc (%)", "Ni_desc", "Hi_desc (%)")

# Agregar la fila de totales
totaless <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(nis),
  `hi(%)` = sum(his),        # ¡Corregido!
  Ni_asc = "-",
  `Hi_asc (%)` = "-",        # ¡Corregido!
  Ni_desc = "-",
  `Hi_desc (%)` = "-"        # ¡Corregido!
)
# Asegurar que las columnas de totaless coincidan con los nombres finales
colnames(totaless) <- colnames(TDF_cosimplificado)

# Unir los data frames
TDF_cosimplificado_completa <- rbind(TDF_cosimplificado, totaless)

# ==============================================================================
# 6. TABLA DE FRECUENCIAS SIMPLIFICADA (Tabla Nro. 2)
# ==============================================================================

TDF_cosimplificado_completa %>%
  gt() %>%
  tab_header(
    title = "Tabla Nro. 2",
    subtitle = "Distribución de frecuencia simplificada de concentración de Monóxido de Carbono (CO), estudio calidad del aire en India entre 2015-2020"
  ) %>%
  tab_source_note(
    source_note = "Autor: Grupo 2\n Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india"
  ) %>%
  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 frecuencia simplificada de concentración de Monóxido de Carbono (CO), estudio calidad del aire en India entre 2015-2020
Intervalo MC ni hi(%) Ni_asc Hi_asc (%) Ni_desc Hi_desc (%)
[0 - 10) 5 26319 95.80 26319 95.8 27472 100
[10 - 20) 15 530 1.93 26849 97.73 1153 4.2
[20 - 30) 25 265 0.96 27114 98.7 623 2.27
[30 - 40) 35 150 0.55 27264 99.24 358 1.3
[40 - 50) 45 88 0.32 27352 99.56 208 0.76
[50 - 60) 55 38 0.14 27390 99.7 120 0.44
[60 - 70) 65 23 0.08 27413 99.79 82 0.3
[70 - 80) 75 17 0.06 27430 99.85 59 0.21
[80 - 90) 85 14 0.05 27444 99.9 42 0.15
[90 - 100) 95 9 0.03 27453 99.93 28 0.1
[100 - 110) 105 6 0.02 27459 99.95 19 0.07
[110 - 120) 115 7 0.03 27466 99.98 13 0.05
[120 - 130) 125 1 0.00 27467 99.98 6 0.02
[130 - 140) 135 3 0.01 27470 99.99 5 0.02
[140 - 150) 145 1 0.00 27471 100 2 0.01
[150 - 160) 155 0 0.00 27471 100 1 0
[160 - 170) 165 0 0.00 27471 100 1 0
[170 - 180) 175 1 0.00 27472 100 1 0
Totales - 27472 100.00 - - - -
Autor: Grupo 2 Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
# ==============================================================================
# 7. GENERACIÓN DE GRÁFICOS
# ==============================================================================

# ==============================================================================
# 7. GRÁFICA N°1: Histograma Local
# ==============================================================================

hist(co, breaks = 13,
     main = "Gr\u00E1fica N\u00B01: Distribuci\u00F3n de la Concentraci\u00F3n de Mon\u00F3xido de Carbono (CO)
     presente en el estudio sobre calidad del aire en India entre 2015-2020",
     xlab = "CO (mg/m\u00B3)",
     ylab = "Cantidad",
     # max(nis) es la altura máxima para el histograma 'local'
     ylim = c(0, max(nis)),
     col = "darkseagreen3", # Nuevo color
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Histograma_co$breaks,
     labels = round(Histograma_co$breaks, 0), las = 1,
     cex.axis = 0.9)

# ----------------------------------
# Gráfica N°2: Histograma Global (Frecuencia Absoluta)
# ----------------------------------
hist(co, breaks = 13,
     main = "Gr\u00E1fica N\u00B02: Distribuci\u00F3n de la Concentraci\u00F3n de Mon\u00F3xido de Carbono (CO)
     presente en el estudio sobre calidad del aire en India entre 2015-2020",
     xlab = "CO (mg/m\u00B3)",
     ylab = "Cantidad",
     # length(co) es la altura máxima (replicando el uso original)
     ylim = c(0, length(co)),
     col = "darkseagreen",
     cex.main = 1,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Histograma_co$breaks,
     labels = round(Histograma_co$breaks, 0), las = 1,
     cex.axis = 0.9)

# ------------------------------------------------------------------------------
# Gráfica N°3: Histograma Porcentual Global (Superposición Eje Y Corregida)
# ------------------------------------------------------------------------------

# Para esta gráfica, usaremos el 'hi(%)' de la tabla simplificada.
porcentajes <- TDF_cosimplificado$`hi(%)`[1:(nrow(TDF_cosimplificado)-1)]
marcas_clase <- TDF_cosimplificado$MC[1:(nrow(TDF_cosimplificado)-1)]

post <- barplot(porcentajes,
                space = 0,
                col = "skyblue",
                main = "Gr\u00E1fica N\u00B03: Distribuci\u00F3n Porcentual Global de CO
        Estudio Calidad del Aire en India, 2015-2020",
                xlab = "CO (mg/m\u00B3)",
                ylab = "Porcentaje (%)",
                # CORRECCIÓN EJE Y 1/2: Lo fijamos entre 0 y 100
                ylim = c(0, 100), 
                cex.main = 0.9,
                cex.lab = 1,
                # Ocultamos etiquetas automáticas del eje X
                xaxt = "n",
                # CORRECCIÓN EJE Y 2/2: Ocultamos las etiquetas automáticas del eje Y (¡CLAVE!)
                yaxt = "n") 

# Dibujamos las etiquetas del Eje X (Marca de Clase) rotadas y pequeñas
axis(side = 1,
     at = post,
     labels = marcas_clase,
     tck = -0.02, 
     las = 2,      
     cex.axis = 0.6) 

# Dibujamos las marcas del Eje Y de forma explícita para asegurar que no se superpongan
axis(side = 2,
     at = seq(0, 100, by = 20), # Dibuja marcas en 0, 20, 40, 60, 80, 100
     las = 1, # Horizontal
     cex.axis = 0.9)

# ------------------------------------------------------------------------------
# Gráfica N°4: Histograma Porcentual Local (Ajustado para máximo en 80)
# ------------------------------------------------------------------------------

n <- as.numeric(nrow(TDF_cosimplificado))
porcentajes <- TDF_cosimplificado$`hi(%)`[1:(n-1)]
marcas_clase <- TDF_cosimplificado$MC[1:(n-1)]

pos <- barplot(
  porcentajes,
  space = 0,
  main = "Gr\u00E1fica N\u00B04: Distribuci\u00F3n Porcentual de Concentraci\u00F3n de CO
  Estudio Calidad del Aire en India, 2015-2020",
  ylab = "Porcentaje (%)",
  xlab = "CO (mg/m\u00B3)",
  
  # AJUSTE CLAVE 1: Fijamos el límite Y en 80 para que la barra más alta (aprox. 95) sobresalga
  ylim = c(0, 80),
  
  col = "darkseagreen",
  cex.main = 0.9,
  cex.lab = 1,
  
  # Ocultamos etiquetas automáticas para control manual
  xaxt = "n",
  yaxt = "n" 
)

# Dibujamos las etiquetas del Eje X (Marca de Clase)
axis(side = 1,
     at = pos,
     labels = marcas_clase,
     tck = -0.04,   
     las = 2,       # Rota etiquetas verticalmente
     cex.axis = 0.6) 

# AJUSTE CLAVE 2: Dibujamos las marcas del Eje Y solo hasta 80
axis(side = 2,
     # Las marcas van de 0 a 80 de 20 en 20 (o el intervalo que prefieras)
     at = seq(0, 80, by = 20), 
     las = 1,       # Horizontal
     cex.axis = 0.9)

# ------------------------------------------------------------------------------
# Gráfica N°5: Diagrama de Caja (Box Plot) para Monóxido de Carbono (CO)
# ------------------------------------------------------------------------------

CajaCO <- boxplot(co, 
                  horizontal = T,
                  col = "turquoise", 
                  border = "black",
                  main = "Gr\u00E1fica N\u00B05: Distribuci\u00F3n de la concentraci\u00F3n de Mon\u00F3xido de Carbono (CO),
                  estudio calidad del aire en India desde 2015-2020",
                  xlab = "CO (mg/m\u00B3)",
                  # Ajustes de texto
                  cex.main = 0.9,
                  cex.lab = 1)

# ------------------------------------------------------------------------------
# Gráfica N°6: Ojiva Ascendente y Descendente para Monóxido de Carbono (CO)
# ------------------------------------------------------------------------------

# 1. Definir los límites de clase extendidos (añadiendo el punto cero)
# Esto asegura que la gráfica inicie en 0 y termine en el máximo.
Limites_X <- c(Lis[1], Lss) # [Min_CO, Ls1, Ls2, ..., Ls_max]

# 2. Definir frecuencias acumuladas extendidas

# Frecuencia Ascendente: [0, Ni_asc1, Ni_asc2, ..., N]
Frec_Asc_Ext <- c(0, Nis_asc) 

# Frecuencia Descendente: [N, Ni_desc1, Ni_desc2, ..., 0]
# La frecuencia descendente de la última clase es 0, no la de la penúltima.
Frec_Desc_Ext <- c(Nis_desc, 0)

# Ojiva ascendente
plot(Limites_X, Frec_Asc_Ext, 
     type = "b", 
     main = "Gr\u00E1fica N\u00B06: Ojiva ascendente y descendente de la
     distribuci\u00F3n de la concentraci\u00F3n de Mon\u00F3xido de Carbono (CO)",
     
     # Ajustamos la etiqueta X para CO
     xlab = "CO (mg/m\u00B3)",
     ylab = "Cantidad", 
     
     pch = 19,
     col = "turquoise", 
     
     # Aseguramos que el eje Y cubra desde 0 hasta el total de datos (N)
     ylim = c(0, N), 
     
     # Aseguramos que el eje X vaya desde 0 hasta el límite superior máximo
     xlim = c(0, max(Lss)), 
     
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9
)

# Ojiva descendente (Usa los mismos Limites_X extendidos)
lines(Limites_X, Frec_Desc_Ext, 
      type = "b", 
      col = "black", 
      pch = 19)

# ------------------------------------------------------------------------------
# Gráfica N°7: Ojiva Ascendente y Descendente PORCENTUAL para Monóxido de Carbono (CO)
# ------------------------------------------------------------------------------

# 1. Definir los límites de clase extendidos (igual que en la Gráfica N°6)
# Esto asegura que la gráfica inicie y termine correctamente en el eje X.
Limites_X <- c(Lis[1], Lss) 

# 2. Definir frecuencias PORCENTUALES acumuladas extendidas

# Frecuencia Ascendente: [0, Hi_asc1, Hi_asc2, ..., 100]
Frec_H_Asc_Ext <- c(0, His_asc) 

# Frecuencia Descendente: [100, Hi_desc1, Hi_desc2, ..., 0]
# Nota: La última clase debe terminar en 0%.
Frec_H_Desc_Ext <- c(His_desc, 0)

# Ojiva ascendente (usa Límites Extendidos y Frecuencia Relativa Acumulada Ascendente)
plot(Limites_X, Frec_H_Asc_Ext, 
     type = "b", 
     main = "Gr\u00E1fica N\u00B07: Ojiva ascendente y descendente de la
     distribuci\u00F3n PORCENTUAL de Mon\u00F3xido de Carbono (CO)",
     
     # Etiqueta X para CO
     xlab = "CO (mg/m\u00B3)",
     # Etiqueta Y para Porcentaje (como solicitaste)
     ylab = "Porcentaje (%)", 
     
     pch = 19,
     col = "blue", # Color azul para la ascendente (como en tu referencia)
     
     # Ajuste CLAVE: El eje Y va de 0 a 100
     ylim = c(0, 100), 
     
     # Aseguramos que el eje X vaya desde 0 hasta el límite superior máximo
     xlim = c(0, max(Lss)), 
     
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9
)

# Ojiva descendente (Usa los mismos Limites_X extendidos)
lines(Limites_X, Frec_H_Desc_Ext, 
      type = "b", 
      col = "red", # Color rojo para la descendente (como en tu referencia)
      pch = 19)

# Opcional: Añadir leyenda para claridad
legend("topright", 
       legend = c("Ojiva Ascendente", "Ojiva Descendente"), 
       col = c("blue", "red"), 
       pch = 19, 
       bty = "n")

# ==============================================================================
# 8. CÁLCULO DE INDICADORES ESTADÍSTICOS (CO)
# ==============================================================================

# Carga de librería para Asimetría y Curtosis
# install.packages("e1071") 
library(e1071) 

# Carga de librerías para la tabla
# install.packages("gt")
# library(gt)
# library(dplyr) # (Asumidas cargadas al inicio del script)

# --------------------------------
# Indicadores de Tendencia Central
# --------------------------------

# Mediana (Me)
Me <- median(co)

# Media (X)
X <- mean(co)

# Moda (Mo)
# Obtenemos el intervalo de la clase con la frecuencia más alta (Moda de la distribución simplificada)
moda_index <- which.max(TDF_cosimplificado$ni[1:(nrow(TDF_cosimplificado)-1)])
Mo <- TDF_cosimplificado$Intervalo[moda_index]


# --------------------------------
# Indicadores de Dispersión
# --------------------------------

# Varianza
Var_co <- var(co)

# Desviación estándar (sd)
desv <- sd(co)

# Coeficiente de variación (CV)
CV <- (desv / X) * 100


# --------------------------------
# Indicadores de Forma
# --------------------------------

# Coeficiente de Asimetría (As)
As <- skewness(co)

# Curtosis (K)
K <- kurtosis(co)


# --------------------------------
# Creación del Data Frame (Tabla_indicadores)
# --------------------------------

Variable_CO <- "Monóxido de Carbono (CO)"
Rango_CO <- paste0("[", round(min_co, 2), " - ", round(max_co, 2), "]")

Tabla_indicadores <- data.frame(
  Variable = Variable_CO,
  Rango = Rango_CO,
  X = round(X, 3),
  Me = round(Me, 3), 
  Mo = Mo,
  sd = round(desv, 2),
  CV = round(CV, 2),
  As = round(As, 2),
  K = round(K, 2)
)

# Renombrar columnas para la tabla (Mejora de Legibilidad)
colnames(Tabla_indicadores) <- c("Variable", "Rango", "Media (X)", "Mediana (Me)", "Moda (Mo)", "Desv. Est. (sd)", "CV (%)", "Asimetría (As)", "Curtosis (K)")


# ==============================================================================
# 9. TABLA DE INDICADORES ESTADÍSTICOS (Tabla Nro. 3) - Usando GT
# ==============================================================================

Tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nro. 3"),
    subtitle = md("*Indicadores Estadísticos de concentración de Monóxido de Carbono (CO), estudio calidad del aire en India entre 2015-2020 *")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2\n Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  ) %>%
  # Agrupamos las columnas por categoría (Mejora de la presentación)
  tab_spanner(
    label = "Tendencia Central",
    columns = c("Media (X)", "Mediana (Me)", "Moda (Mo)")
  ) %>%
  tab_spanner(
    label = "Dispersión",
    columns = c("Desv. Est. (sd)", "CV (%)")
  ) %>%
  tab_spanner(
    label = "Forma",
    columns = c("Asimetría (As)", "Curtosis (K)")
  ) %>%
  # Formateo de números
  fmt_number(
    columns = c("Media (X)", "Mediana (Me)", "Desv. Est. (sd)", "CV (%)", "Asimetría (As)", "Curtosis (K)"),
    decimals = 2
  ) %>%
  # Opciones de estilo (basado en tu plantilla)
  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. 3
*Indicadores Estadísticos de concentración de Monóxido de Carbono (CO), estudio calidad del aire en India entre 2015-2020 *
Variable Rango
Tendencia Central
Dispersión
Forma
Media (X) Mediana (Me) Moda (Mo) Desv. Est. (sd) CV (%) Asimetría (As) Curtosis (K)
Monóxido de Carbono (CO) [0 - 175.81] 2.25 0.89 [0 - 10) 6.96 309.65 8.88 109.46
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india