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 librería para Asimetría y Curtosis
# install.packages("e1071")
library(e1071)

# 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 ÓXIDOS DE NITRÓGENO (NOx)
# ==============================================================================

# Extracción de los "-" (valores inexistentes) de la variable NOx
# NOTA: Asumimos que la columna se llama 'NOx'
nox <- datos$NOx[datos$NOx != "-"]

# Tamaño muestral después de la limpieza
cat("Tamaño muestral del Óxido de Nitrógeno (sin '-'):", length(nox), "\n")
## Tamaño muestral del Óxido de Nitrógeno (sin '-'): 25346
# Conversión a numérico
nox <- as.numeric(nox)

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

N_nox <- length(nox)
min_nox <- min(nox)
max_nox <- max(nox)
R_nox <- max_nox - min_nox

# Número de clases (k): Se mantienen 34 clases
k_detallado_nox <- 34

# Amplitud de clase (A)
A_nox <- R_nox / k_detallado_nox

# Generación de límites de intervalos
Li_nox <- seq(from = min_nox, to = max_nox - A_nox, by = A_nox)
Ls_nox <- c(seq(from = min_nox + A_nox, to = max_nox - A_nox, by = A_nox), max_nox)

# Redondeo para cálculos de intervalos precisos
nox <- round(nox, 3)
Li_nox <- round(Li_nox, 3)
Ls_nox <- round(Ls_nox, 3)

# Marcas de Clase (MC)
MC_nox <- (Li_nox + Ls_nox) / 2

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

# Frecuencias relativas y acumuladas
hi_nox <- (ni_nox / N_nox) * 100
Ni_asc_nox <- cumsum(ni_nox)
Ni_desc_nox <- rev(cumsum(rev(ni_nox)))
Hi_asc_nox <- cumsum(hi_nox)
Hi_desc_nox <- rev(cumsum(rev(hi_nox)))

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

# Crear el Data Frame (TDF)
TDF_nox <- data.frame(
  Intervalo = Intervalo_nox,
  MC = round(MC_nox, 2),
  ni = ni_nox,
  hi = round(hi_nox, 2),
  Ni_ascendente = Ni_asc_nox,
  Ni_descendente = Ni_desc_nox,
  Hi_ascendente = round(Hi_asc_nox, 2),
  Hi_descendente = round(Hi_desc_nox, 2)
)

# Agregar la fila de totales
totales_nox <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(ni_nox),
  hi = sum(hi_nox),
  Ni_ascendente = "-",
  Ni_descendente = "-",
  Hi_ascendente = "-",
  Hi_descendente = "-"
)
TDF_nox_completa <- rbind(TDF_nox, totales_nox)

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

TDF_nox_completa %>%
  gt() %>%
  tab_header(
    title = "Tabla Nro. 1",
    subtitle = "Distribución de frecuencia de concentración de Óxidos de Nitrógeno (NOₓ), 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 Óxidos de Nitrógeno (NOₓ), estudio calidad del aire en India entre 2015-2020
Intervalo MC ni hi Ni_ascendente Ni_descendente Hi_ascendente Hi_descendente
[0 - 13.75) 6.88 6840 26.99 6840 25346 26.99 100
[13.75 - 27.51) 20.63 7896 31.15 14736 18506 58.14 73.01
[27.51 - 41.26) 34.38 4526 17.86 19262 10610 76 41.86
[41.26 - 55.02) 48.14 2145 8.46 21407 6084 84.46 24
[55.02 - 68.77) 61.89 1366 5.39 22773 3939 89.85 15.54
[68.77 - 82.52) 75.65 788 3.11 23561 2573 92.96 10.15
[82.52 - 96.28) 89.4 516 2.04 24077 1785 94.99 7.04
[96.28 - 110.03) 103.15 402 1.59 24479 1269 96.58 5.01
[110.03 - 123.78) 116.91 259 1.02 24738 867 97.6 3.42
[123.78 - 137.54) 130.66 192 0.76 24930 608 98.36 2.4
[137.54 - 151.29) 144.42 134 0.53 25064 416 98.89 1.64
[151.29 - 165.05) 158.17 91 0.36 25155 282 99.25 1.11
[165.05 - 178.8) 171.92 61 0.24 25216 191 99.49 0.75
[178.8 - 192.55) 185.68 36 0.14 25252 130 99.63 0.51
[192.55 - 206.31) 199.43 32 0.13 25284 94 99.76 0.37
[206.31 - 220.06) 213.18 19 0.07 25303 62 99.83 0.24
[220.06 - 233.82) 226.94 14 0.06 25317 43 99.89 0.17
[233.82 - 247.57) 240.69 9 0.04 25326 29 99.92 0.11
[247.57 - 261.32) 254.45 7 0.03 25333 20 99.95 0.08
[261.32 - 275.08) 268.2 5 0.02 25338 13 99.97 0.05
[275.08 - 288.83) 281.95 1 0.00 25339 8 99.97 0.03
[288.83 - 302.58) 295.71 2 0.01 25341 7 99.98 0.03
[302.58 - 316.34) 309.46 1 0.00 25342 5 99.98 0.02
[316.34 - 330.09) 323.22 0 0.00 25342 4 99.98 0.02
[330.09 - 343.85) 336.97 0 0.00 25342 4 99.98 0.02
[343.85 - 357.6) 350.72 0 0.00 25342 4 99.98 0.02
[357.6 - 371.35) 364.48 0 0.00 25342 4 99.98 0.02
[371.35 - 385.11) 378.23 3 0.01 25345 4 100 0.02
[385.11 - 398.86) 391.98 0 0.00 25345 1 100 0
[398.86 - 412.62) 405.74 0 0.00 25345 1 100 0
[412.62 - 426.37) 419.49 0 0.00 25345 1 100 0
[426.37 - 440.12) 433.25 0 0.00 25345 1 100 0
[440.12 - 453.88) 447 0 0.00 25345 1 100 0
[453.88 - 467.63] 460.75 1 0.00 25346 1 100 0
Totales - 25346 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) - NOx
# ==============================================================================

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

# Extraer elementos simplificados
Lis_nox <- Histograma_nox$breaks[1:(length(Histograma_nox$breaks) - 1)]
Lss_nox <- Histograma_nox$breaks[2:length(Histograma_nox$breaks)]
MCs_nox <- (Lis_nox + Lss_nox) / 2
nis_nox <- Histograma_nox$counts

# Frecuencias relativas y acumuladas simplificadas
his_nox <- (nis_nox / N_nox) * 100
Nis_asc_nox <- cumsum(nis_nox)
His_asc_nox <- cumsum(his_nox)
Nis_desc_nox <- rev(cumsum(rev(nis_nox)))
His_desc_nox <- rev(cumsum(rev(his_nox)))

# Crear el Data Frame Simplificado
TDF_noxsimplificado <- data.frame(
  Intervalo = paste0("[", round(Lis_nox, 2), " - ", round(Lss_nox, 2), ")"),
  MC = round(MCs_nox, 2),
  ni = nis_nox,
  hi = round(his_nox, 2),
  Ni_asc = Nis_asc_nox,
  Hi_asc = round(His_asc_nox, 2),
  Ni_desc = Nis_desc_nox,
  Hi_desc = round(His_desc_nox, 2)
)

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

# Agregar la fila de totales (Código Corregido)
totaless_nox <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(nis_nox),
  `hi(%)` = sum(his_nox),
  Ni_asc = "-",
  `Hi_asc (%)` = "-",
  Ni_desc = "-",
  `Hi_desc (%)` = "-"
)
# Asegurar que las columnas de totaless coincidan con los nombres finales
colnames(totaless_nox) <- colnames(TDF_noxsimplificado)

# Unir los data frames
TDF_noxsimplificado_completa <- rbind(TDF_noxsimplificado, totaless_nox)

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

TDF_noxsimplificado_completa %>%
  gt() %>%
  tab_header(
    title = "Tabla Nro. 2",
    subtitle = "Distribución de frecuencia simplificada de concentración de Óxidos de Nitrógeno (NOₓ), 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 Óxidos de Nitrógeno (NOₓ), estudio calidad del aire en India entre 2015-2020
Intervalo MC ni hi(%) Ni_asc Hi_asc (%) Ni_desc Hi_desc (%)
[0 - 50) 25 20762 81.91 20762 81.91 25346 100
[50 - 100) 75 3431 13.54 24193 95.45 4584 18.09
[100 - 150) 125 858 3.39 25051 98.84 1153 4.55
[150 - 200) 175 218 0.86 25269 99.7 295 1.16
[200 - 250) 225 57 0.22 25326 99.92 77 0.3
[250 - 300) 275 15 0.06 25341 99.98 20 0.08
[300 - 350) 325 1 0.00 25342 99.98 5 0.02
[350 - 400) 375 3 0.01 25345 100 4 0.02
[400 - 450) 425 0 0.00 25345 100 1 0
[450 - 500) 475 1 0.00 25346 100 1 0
Totales - 25346 100.00 - - - -
Autor: Grupo 2 Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
# ==============================================================================
# 7. GENERACIÓN DE GRÁFICOS (NOx)
# ==============================================================================

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

hist(nox, breaks = 13,
     main = "Gr\u00E1fica N\u00B01: Distribuci\u00F3n de la Concentraci\u00F3n de Óxidos de Nitrógeno (NOₓ)\npresente en el estudio sobre calidad del aire en India entre 2015-2020",
     xlab = "NOₓ (\u00B5g/m\u00B3)",
     ylab = "Cantidad",
     # max(nis_nox) es la altura máxima para el histograma 'local'
     ylim = c(0, max(nis_nox)),
     col = "darkseagreen3", # Nuevo color
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Histograma_nox$breaks,
     labels = round(Histograma_nox$breaks, 0), las = 1,
     cex.axis = 0.9)

# ----------------------------------
# Gráfica N°2: Histograma Global (Frecuencia Absoluta) - NOx
# ----------------------------------
hist(nox, breaks = 13,
     main = "Gr\u00E1fica N\u00B02: Distribuci\u00F3n de la Concentraci\u00F3n de Óxidos de Nitrógeno (NOₓ)\npresente en el estudio sobre calidad del aire en India entre 2015-2020",
     xlab = "NOₓ (\u00B5g/m\u00B3)",
     ylab = "Cantidad",
     # length(nox) es la altura máxima
     ylim = c(0, length(nox)),
     col = "darkseagreen",
     cex.main = 1,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Histograma_nox$breaks,
     labels = round(Histograma_nox$breaks, 0), las = 1,
     cex.axis = 0.9)

# ------------------------------------------------------------------------------
# Gráfica N°3: Histograma Porcentual Global (NOx)
# ------------------------------------------------------------------------------

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

post_nox <- barplot(porcentajes_nox,
                    space = 0,
                    col = "skyblue",
                    main = "Gr\u00E1fica N\u00B03: Distribuci\u00F3n Porcentual Global de NOₓ\nEstudio Calidad del Aire en India, 2015-2020",
                    xlab = "NOₓ (\u00B5g/m\u00B3)",
                    ylab = "Porcentaje (%)",
                    ylim = c(0, 100),
                    cex.main = 0.9,
                    cex.lab = 1,
                    xaxt = "n",
                    yaxt = "n")

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

# Dibujamos las marcas del Eje Y de forma explícita
axis(side = 2,
     at = seq(0, 100, by = 20),
     las = 1,
     cex.axis = 0.9)

# ------------------------------------------------------------------------------
# Gráfica N°4: Histograma Porcentual Local (NOx)
# ------------------------------------------------------------------------------

n_nox_sim <- as.numeric(nrow(TDF_noxsimplificado))
porcentajes_nox_local <- TDF_noxsimplificado$`hi(%)`[1:(n_nox_sim-1)]
marcas_clase_nox_local <- TDF_noxsimplificado$MC[1:(n_nox_sim-1)]

pos_nox <- barplot(
  porcentajes_nox_local,
  space = 0,
  main = "Gr\u00E1fica N\u00B04: Distribuci\u00F3n Porcentual de Concentraci\u00F3n de NOₓ\nEstudio Calidad del Aire en India, 2015-2020",
  ylab = "Porcentaje (%)",
  xlab = "NOₓ (\u00B5g/m\u00B3)",
  
  # Ajuste de Y para que la barra más alta sobresalga ligeramente si es > 80
  ylim = c(0, max(porcentajes_nox_local) * 1.1),
  
  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_nox,
     labels = marcas_clase_nox_local,
     tck = -0.04,
     las = 2,
     cex.axis = 0.6)

# Dibujamos las marcas del Eje Y
axis(side = 2,
     at = seq(0, round(max(porcentajes_nox_local) * 1.1), by = 20),
     las = 1,
     cex.axis = 0.9)

# ------------------------------------------------------------------------------
# Gráfica N°5: Diagrama de Caja (Box Plot) para NOx
# ------------------------------------------------------------------------------

CajaNOx <- boxplot(nox,
                   horizontal = T,
                   col = "turquoise",
                   border = "black",
                   main = "Gr\u00E1fica N\u00B05: Distribuci\u00F3n de la concentraci\u00F3n de Óxidos de Nitrógeno (NOₓ),\nestudio calidad del aire en India desde 2015-2020",
                   xlab = "NOₓ (\u00B5g/m\u00B3)",
                   cex.main = 0.9,
                   cex.lab = 1)

# ------------------------------------------------------------------------------
# Gráfica N°6: Ojiva Ascendente y Descendente (Cantidad) - NOx
# ------------------------------------------------------------------------------

# 1. Definir los límites de clase extendidos (añadiendo el punto cero)
Limites_X_nox <- c(Lis_nox[1], Lss_nox)

# 2. Definir frecuencias acumuladas extendidas (Cantidad)
Frec_Asc_Ext_nox <- c(0, Nis_asc_nox)
Frec_Desc_Ext_nox <- c(Nis_desc_nox, 0)

# Ojiva ascendente
plot(Limites_X_nox, Frec_Asc_Ext_nox,
     type = "b",
     main = "Gr\u00E1fica N\u00B06: Ojiva ascendente y descendente de la
     distribuci\u00F3n de la concentraci\u00F3n de Óxidos de Nitrógeno (NOₓ)",
     
     xlab = "NOₓ (\u00B5g/m\u00B3)",
     ylab = "Cantidad",
     pch = 19,
     col = "turquoise",
     ylim = c(0, N_nox),
     xlim = c(0, max(Lss_nox)),
     
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9
)

# Ojiva descendente
lines(Limites_X_nox, Frec_Desc_Ext_nox,
      type = "b",
      col = "black",
      pch = 19)

# ------------------------------------------------------------------------------
# Gráfica N°7: Ojiva Ascendente y Descendente PORCENTUAL (NOx)
# ------------------------------------------------------------------------------

# 1. Definir los límites de clase extendidos
Limites_X_nox <- c(Lis_nox[1], Lss_nox)

# 2. Definir frecuencias PORCENTUALES acumuladas extendidas
Frec_H_Asc_Ext_nox <- c(0, His_asc_nox)
Frec_H_Desc_Ext_nox <- c(His_desc_nox, 0)

# Ojiva ascendente
plot(Limites_X_nox, Frec_H_Asc_Ext_nox,
     type = "b",
     main = "Gr\u00E1fica N\u00B07: Ojiva ascendente y descendente de la distribuci\u00F3n PORCENTUAL de Óxidos de Nitrógeno (NOₓ)",
     
     xlab = "NOₓ (\u00B5g/m\u00B3)",
     ylab = "Porcentaje (%)",
     
     pch = 19,
     col = "blue",
     
     ylim = c(0, 100),
     xlim = c(0, max(Lss_nox)),
     
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9
)

# Ojiva descendente
lines(Limites_X_nox, Frec_H_Desc_Ext_nox,
      type = "b",
      col = "red",
      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 (NOx)
# ==============================================================================

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

# Mediana (Me)
Me_nox <- median(nox)

# Media (X)
X_nox <- mean(nox)

# Moda (Mo)
moda_index_nox <- which.max(TDF_noxsimplificado$ni[1:(nrow(TDF_noxsimplificado)-1)])
Mo_nox <- TDF_noxsimplificado$Intervalo[moda_index_nox]


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

# Varianza
Var_nox <- var(nox)

# Desviación estándar (sd)
desv_nox <- sd(nox)

# Coeficiente de variación (CV)
CV_nox <- (desv_nox / X_nox) * 100


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

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

# Curtosis (K)
K_nox <- kurtosis(nox)


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

Variable_NOx <- "Óxidos de Nitrógeno (NOₓ)"
Rango_NOx <- paste0("[", round(min_nox, 2), " - ", round(max_nox, 2), "]")

Tabla_indicadores_NOx <- data.frame(
  Variable = Variable_NOx,
  Rango = Rango_NOx,
  X = round(X_nox, 3),
  Me = round(Me_nox, 3),
  Mo = Mo_nox,
  sd = round(desv_nox, 2),
  CV = round(CV_nox, 2),
  As = round(As_nox, 2),
  K = round(K_nox, 2)
)

# Renombrar columnas para la tabla
colnames(Tabla_indicadores_NOx) <- 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_NOx %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nro. 3"),
    subtitle = md("*Indicadores Estadísticos de concentración de Óxidos de Nitrógeno (NOₓ), 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
  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
  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 Óxidos de Nitrógeno (NOₓ), 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)
Óxidos de Nitrógeno (NOₓ) [0 - 467.63] 32.31 23.52 [0 - 50) 31.65 97.95 2.57 10.83
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india