#Estadística Descriptiva
#Variable Cuantitativa continua(TOLUENO)
#Autor: Ariel Chiluisa
#Fecha:26/05/2025

0. CARGA DE LIBRERIAS

library(gt)
## Warning: package 'gt' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

1. CARGA DE DATOS

#Cargar los datos 
datos <- read.csv("~/ariana tercer semestre/Estadistica/city_day.csv",
                  header = TRUE, dec = ".", sep = ";")

# ===== LIMPIEZA Y PREPARACIÓN DE LA VARIABLE TOLUENO =====
# Extracción de los "-" de la variable Toluene porque son valores inexistentes
tolueno <- datos$Toluene[datos$Toluene != "-"]

# Convertimos los datos a formato de números
tolueno <- as.numeric(tolueno)
length(tolueno)
## [1] 21490

2. CONTEO (FRECUENCIAS)

# ===== CÁLCULOS PARA LA TABLA DE DISTRIBUCIÓN DE FRECUENCIAS (TDF) =====
# Implementación de la fórmula de Sturges
min <- min(tolueno)
max <- max(tolueno)
R = max - min
k = 1 + (3.3) * log(length(tolueno))
k <- floor(k)
A <- R / k

# Generación de intervalos
Li <- seq(from = min, to = max - A, by = A)
Ls <- c(seq(from = min + A, to = max - A, by = A), max)  # último límite = max
MC <- (Li + Ls) / 2

# Creación de ni (frecuencia absoluta)
ni <- numeric(length(Li))
for (i in 1:length(Li)) {
  if (i < length(Li)) {
    ni[i] <- sum(tolueno >= Li[i] & tolueno < Ls[i])
  } else {
    ni[i] <- sum(tolueno >= Li[i] & tolueno <= Ls[i])  # Último intervalo cerrado
  }
}

# Creación de hi (frecuencia relativa en porcentaje)
N <- sum(ni)
hi <- (ni / N) * 100

# Creación de frecuencias acumuladas
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))

# Formateo de los intervalos como texto
Intervalo <- paste0("[", round(Li, 2), " - ", round(Ls, 2), ")")
Intervalo[length(Intervalo)] <- paste0("[", round(Li[length(Li)], 2), " - ", 
                                       round(Ls[length(Ls)], 2), "]")

3. TABLA DE DISTRIBUCIÓN DE FRECUENCIA

3.1. TABLA GENERAL

# Creación del Data Frame principal
TDF_tolueno <- data.frame(
  Intervalo = Intervalo,
  MC = round(MC, 2),
  ni = ni,
  hi = round(hi, 2),
  Ni_asc = Ni_asc,
  Ni_desc = Ni_desc,
  Hi_asc = round(Hi_asc, 2),
  Hi_desc = round(Hi_desc, 2)
)

# Crear fila de totales
totales <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(ni),
  hi = sum(hi),
  Ni_asc = "-",
  Ni_desc = "-",
  Hi_asc = "-",
  Hi_desc = "-"
)
# Agregar al final del data frame
TDF_tolueno <- rbind(TDF_tolueno, totales)
# ===== GENERACIÓN Y ESTILO DE LA TABLA (gt) =====
library(gt)
library(dplyr)
TDF_tolueno %>%
  gt() %>%
  # ===== ENCABEZADO =====
tab_header(
  title = md("## **Tabla Nro. 1**"),
  subtitle = md(
    "*Distribución de frecuencia de concentración de tolueno* *Estudio de calidad del aire en India (2015–2020)*"
  )
) %>%
  # ===== FUENTE =====
tab_source_note(
  source_note = md(
    "**Autor:** Grupo 1  
       **Fuente:** https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india"
  )
) %>%
  
  # ===== ESTILO GENERAL =====
opt_table_font(
  font = list(
    google_font("Poppins"),
    default_fonts()
  )
) %>%
  tab_options(
    # Bordes generales
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.width = px(3),
    table.border.bottom.width = px(3),
    # Encabezados
    heading.align = "center",
    heading.title.font.size = px(22),
    heading.subtitle.font.size = px(14),
    heading.background.color = "#F4F6F7",
    # Columnas
    column_labels.font.weight = "bold",
    column_labels.font.size = px(14),
    column_labels.background.color = "#D6EAF8",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    # Filas
    table_body.hlines.color = "#B3B6B7",
    table_body.vlines.color = "#B3B6B7",   # ← líneas verticales
    table_body.border.bottom.color = "black",
    # Colores alternados
    row.striping.include_table_body = TRUE,
    row.striping.background_color = "#F8F9F9",
    # Fuente
    table.font.size = px(13),
    # Notas
    source_notes.font.size = px(11),
    source_notes.background.color = "#F4F6F7",
    # Espaciado
    data_row.padding = px(8)
  ) %>%
  # ===== BORDES VERTICALES COMPLETOS =====
tab_style(
  style = cell_borders(
    sides = c("left", "right"),
    color = "#A6ACAF",
    weight = px(1)
  ),
  locations = cells_body()
) %>%
  tab_style(
    style = cell_borders(
      sides = c("left", "right"),
      color = "black",
      weight = px(1.5)
    ),
    locations = cells_column_labels()
  ) %>%
  
  # ===== ALINEACIÓN =====
cols_align(
  align = "center",
  columns = everything()
)

Tabla Nro. 1

Distribución de frecuencia de concentración de tolueno Estudio de calidad del aire en India (2015–2020)
Intervalo MC ni hi Ni_asc Ni_desc Hi_asc Hi_desc
[0 - 13.78) 6.89 17720 82.46 17720 21490 82.46 100
[13.78 - 27.57) 20.68 1940 9.03 19660 3770 91.48 17.54
[27.57 - 41.35) 34.46 1160 5.40 20820 1830 96.88 8.52
[41.35 - 55.13) 48.24 279 1.30 21099 670 98.18 3.12
[55.13 - 68.92) 62.03 151 0.70 21250 391 98.88 1.82
[68.92 - 82.7) 75.81 113 0.53 21363 240 99.41 1.12
[82.7 - 96.48) 89.59 48 0.22 21411 127 99.63 0.59
[96.48 - 110.27) 103.38 18 0.08 21429 79 99.72 0.37
[110.27 - 124.05) 117.16 6 0.03 21435 61 99.74 0.28
[124.05 - 137.83) 130.94 7 0.03 21442 55 99.78 0.26
[137.83 - 151.62) 144.73 4 0.02 21446 48 99.8 0.22
[151.62 - 165.4) 158.51 5 0.02 21451 44 99.82 0.2
[165.4 - 179.18) 172.29 3 0.01 21454 39 99.83 0.18
[179.18 - 192.97) 186.07 1 0.00 21455 36 99.84 0.17
[192.97 - 206.75) 199.86 4 0.02 21459 35 99.86 0.16
[206.75 - 220.53) 213.64 2 0.01 21461 31 99.87 0.14
[220.53 - 234.32) 227.43 1 0.00 21462 29 99.87 0.13
[234.32 - 248.1) 241.21 1 0.00 21463 28 99.87 0.13
[248.1 - 261.88) 254.99 1 0.00 21464 27 99.88 0.13
[261.88 - 275.67) 268.78 3 0.01 21467 26 99.89 0.12
[275.67 - 289.45) 282.56 1 0.00 21468 23 99.9 0.11
[289.45 - 303.23) 296.34 0 0.00 21468 22 99.9 0.1
[303.23 - 317.02) 310.12 0 0.00 21468 22 99.9 0.1
[317.02 - 330.8) 323.91 0 0.00 21468 22 99.9 0.1
[330.8 - 344.58) 337.69 0 0.00 21468 22 99.9 0.1
[344.58 - 358.37) 351.48 0 0.00 21468 22 99.9 0.1
[358.37 - 372.15) 365.26 1 0.00 21469 22 99.9 0.1
[372.15 - 385.93) 379.04 0 0.00 21469 21 99.9 0.1
[385.93 - 399.72) 392.83 0 0.00 21469 21 99.9 0.1
[399.72 - 413.5) 406.61 3 0.01 21472 21 99.92 0.1
[413.5 - 427.28) 420.39 2 0.01 21474 18 99.93 0.08
[427.28 - 441.07) 434.17 10 0.05 21484 16 99.97 0.07
[441.07 - 454.85] 447.96 6 0.03 21490 6 100 0.03
Totales - 21490 100.00 - - - -
Autor: Grupo 1
Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india

3.2. TABLA SIMPLIFICADA

# ===== Proceso de simplificación de intervalos =====

# Forzamos a que existan 10 filas exactas
k_simpl <- 10
# Calculamos la nueva amplitud redondeada hacia arriba para no perder datos
A_simpl <- ceiling(R / k_simpl)
# Generación de los nuevos intervalos (usamos el 'min' original de arriba)
Li_simpl <- seq(from = floor(min), by = A_simpl, length.out = k_simpl)
Ls_simpl <- seq(from = floor(min) + A_simpl, by = A_simpl, length.out = k_simpl)
MC_simpl <- (Li_simpl + Ls_simpl) / 2
# Creación de ni (frecuencia absoluta) para la tabla 2
ni_simpl <- numeric(length(Li_simpl))
for (i in 1:length(Li_simpl)) {
  if (i < length(Li_simpl)) {
    ni_simpl[i] <- sum(tolueno >= Li_simpl[i] & tolueno < Ls_simpl[i])
  } else {
    ni_simpl[i] <- sum(tolueno >= Li_simpl[i] & tolueno <= Ls_simpl[i])
  }
}

# Creación de hi (frecuencia relativa) para la tabla 2
N_simpl <- sum(ni_simpl)
hi_simpl <- (ni_simpl / N_simpl) * 100

# Creación de frecuencias acumuladas para la tabla 2
Ni_asc_simpl <- cumsum(ni_simpl)
Ni_desc_simpl <- rev(cumsum(rev(ni_simpl)))
Hi_asc_simpl <- cumsum(hi_simpl)
Hi_desc_simpl <- rev(cumsum(rev(hi_simpl)))
# Formateo de los intervalos como texto (sin decimales)
Intervalo_simpl <- paste0("[", Li_simpl, " - ", Ls_simpl, ")")
Intervalo_simpl[length(Intervalo_simpl)] <- paste0("[", Li_simpl[length(Li_simpl)], " - ", Ls_simpl[length(Ls_simpl)], "]")

# Creación del Data Frame para la tabla simplificada
TDF_tolueno_simpl <- data.frame(
  Intervalo = Intervalo_simpl,
  MC = MC_simpl,
  ni = ni_simpl,
  hi = round(hi_simpl, 2),
  Ni_asc = Ni_asc_simpl,
  Ni_desc = Ni_desc_simpl,
  Hi_asc = round(Hi_asc_simpl, 2),
  Hi_desc = round(Hi_desc_simpl, 2)
)

# Crear fila de totales
totales_simpl <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(ni_simpl),
  hi = sum(hi_simpl),
  Ni_asc = "-",
  Ni_desc = "-",
  Hi_asc = "-",
  Hi_desc = "-"
)

# Unir la fila de totales a la nueva tabla
TDF_tolueno_simpl <- rbind(TDF_tolueno_simpl, totales_simpl)

# ===== GENERACIÓN Y ESTILO DE LA TABLA NRO 2 (gt) =====
TDF_tolueno_simpl %>%
  gt() %>%
  
  # ===== ENCABEZADO =====
tab_header(
  title = md("## **Tabla Nro. 2**"),
  subtitle = md(
    "*Distribución de frecuencia simplificado de concentración de Tolueno, estudio calidad del aire en India entre 2015-2020*"
  )
) %>%
  
  # ===== FUENTE =====
tab_source_note(
  source_note = md(
    "**Autor:** Grupo 1  
       **Fuente:** https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india"
  )
) %>%
  
  # ===== ESTILO GENERAL =====
opt_table_font(
  font = list(
    google_font("Poppins"),
    default_fonts()
  )
) %>%
  
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.width = px(3),
    table.border.bottom.width = px(3),
    
    heading.align = "center",
    heading.title.font.size = px(22),
    heading.subtitle.font.size = px(14),
    heading.background.color = "#F4F6F7",
    
    column_labels.font.weight = "bold",
    column_labels.font.size = px(14),
    column_labels.background.color = "#D6EAF8",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    
    table_body.hlines.color = "#B3B6B7",
    table_body.vlines.color = "#B3B6B7",
    table_body.border.bottom.color = "black",
    
    row.striping.include_table_body = TRUE,
    row.striping.background_color = "#F8F9F9",
    
    table.font.size = px(13),
    source_notes.font.size = px(11),
    source_notes.background.color = "#F4F6F7",
    data_row.padding = px(8)
  ) %>%
  
  # ===== BORDES VERTICALES COMPLETOS =====
tab_style(
  style = cell_borders(
    sides = c("left", "right"),
    color = "#A6ACAF",
    weight = px(1)
  ),
  locations = cells_body()
) %>%
  
  tab_style(
    style = cell_borders(
      sides = c("left", "right"),
      color = "black",
      weight = px(1.5)
    ),
    locations = cells_column_labels()
  ) %>%
  
  # ===== ALINEACIÓN =====
cols_align(
  align = "center",
  columns = everything()
)

Tabla Nro. 2

Distribución de frecuencia simplificado de concentración de Tolueno, estudio calidad del aire en India entre 2015-2020
Intervalo MC ni hi Ni_asc Ni_desc Hi_asc Hi_desc
[0 - 46) 23 20943 97.45 20943 21490 97.45 100
[46 - 92) 69 459 2.14 21402 547 99.59 2.55
[92 - 138) 115 40 0.19 21442 88 99.78 0.41
[138 - 184) 161 12 0.06 21454 48 99.83 0.22
[184 - 230) 207 8 0.04 21462 36 99.87 0.17
[230 - 276) 253 5 0.02 21467 28 99.89 0.13
[276 - 322) 299 1 0.00 21468 23 99.9 0.11
[322 - 368) 345 0 0.00 21468 22 99.9 0.1
[368 - 414) 391 4 0.02 21472 22 99.92 0.1
[414 - 460] 437 18 0.08 21490 18 100 0.08
Totales - 21490 100.00 - - - -
Autor: Grupo 1
Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india

4. HISTOGRAMA

4.1. HISTOGRAMA LOCAL

# ====================================================================
# ===== GRÁFICA LOCAL (Eje Y automático generado por R) ==============
# ====================================================================

# Aseguramos tener los cortes de los 10 intervalos listos
cortes_exactos <- c(Li_simpl, Ls_simpl[length(Ls_simpl)])

hist(tolueno, 
     breaks = cortes_exactos,  
     main = "Gráfica Nro1: Distribución de la Concentración de Tolueno\nEstudio sobre calidad del aire en India (2015-2020)",
     xlab = "Tolueno (µg/m3)",
     ylab = "Días",
     col = "purple",        
     border = "black",
     xaxt = "n",               # Apagamos el eje X automático
     freq = TRUE)

# Dibujamos el eje X con los valores de nuestros 10 intervalos
axis(1, 
     at = cortes_exactos, 
     labels = cortes_exactos, 
     las = 1, 
     cex.axis = 0.8)

4.2. HISTOGRAMA GLOBAL

# ====================================================================
# ===== GRÁFICA GLOBAL (Con límite Y redondeado a 30,000) ============
# ====================================================================

# Aseguramos tener los cortes listos
cortes_exactos <- c(Li_simpl, Ls_simpl[length(Ls_simpl)])

hist(tolueno, 
     breaks = cortes_exactos,  
     main = "Gráfica Nro2: Distribución de la Concentración de Tolueno\nEstudio sobre calidad del aire en India (2015-2020)",
     xlab = "Tolueno (µg/m3)",
     ylab = "Días",
     ylim = c(0, 30000),           # AQUÍ ESTÁ EL CAMBIO: Límite exacto en 30000
     col = "lightblue",        
     border = "black",
     xaxt = "n",                   
     yaxt = "n",                   # Apagamos el eje Y automático
     freq = TRUE)

# Dibujamos nuestro eje X
axis(1, 
     at = cortes_exactos, 
     labels = cortes_exactos, 
     las = 1, 
     cex.axis = 0.8)

# NUEVO: Eje Y manual y redondeado hasta 30,000 (saltos de 5,000)
marcas_y <- seq(0, 30000, by = 5000)

axis(2, 
     at = marcas_y, 
     labels = marcas_y, 
     las = 1,
     cex.axis = 0.8)

4.3. HISTOGRAMA LOCAL PORCENTUAL

# ====================================================================
# ===== GRÁFICA PORCENTUAL (Con regleta de límites y números altos) ==
# ====================================================================

# 1. Ajustamos los márgenes (volvemos a un margen estándar porque los números rectos ocupan menos espacio)
par(mar = c(5, 4, 4, 2) + 0.1)

# Aseguramos tener los cortes listos (los límites exactos de los intervalos)
cortes_exactos <- c(Li_simpl, Ls_simpl[length(Ls_simpl)])

# 2. Generamos el diagrama (sin los nombres automáticos debajo)
posiciones <- barplot(hi_simpl, 
                      main = "Gráfica Nro 3: Distribución Porcentual de Tolueno\nEstudio sobre calidad del aire en India (2015-2020)",
                      ylab = "Porcentaje (%)",
                      xlab = "Concentración de Tolueno (µg/m3)", 
                      ylim = c(0, max(hi_simpl) + 10), # Mantenemos el techo alto
                      col = "#A9DFBF",
                      border = "black",
                      space = 0,                       # Barras pegadas
                      las = 1)                         # Eje Y horizontal

# 3. NUEVO: Dibujamos la "regleta" exacta (el eje X)
# Como juntamos las barras (space = 0) y son 10 intervalos, los bordes físicos 
# de las barras caen exactamente en las posiciones 0, 1, 2, 3... hasta 10.
axis(1, 
     at = 0:k_simpl,                  # Posiciones de las rayitas (del 0 al 10)
     labels = cortes_exactos,         # Los números que van en las rayitas (0, 46, 91...)
     las = 1,                         # Texto horizontal
     cex.axis = 0.8)                  # Tamaño de letra

# 4. Colocamos los porcentajes (más arriba)
text(x = posiciones, 
     y = hi_simpl + 6,                        # ¡AQUÍ SUBIMOS MÁS LOS NÚMEROS! (ahora es +6)
     label = paste0(round(hi_simpl, 1), "%"), 
     cex = 0.8, 
     font = 2,                                
     col = "black")

4.4. HISTOGRAMA GLOBAL PROCENTUAL

# ====================================================================
# ===== GRÁFICA PORCENTUAL GLOBAL ===
# ====================================================================

par(mar = c(5, 4, 4, 2) + 0.1)

# Aseguramos tener los cortes listos para la regleta
cortes_exactos <- c(Li_simpl, Ls_simpl[length(Ls_simpl)])

# 1. Generamos el diagrama usando los DATOS REALES (ni_simpl) y el techo en 30,000
posiciones_global <- barplot(ni_simpl, 
                             main = "Gráfica Nro 4: Distribución Porcentual Global de Tolueno\nEstudio sobre calidad del aire en India (2015-2020)",
                             ylab = "Porcentaje (%)",
                             xlab = "Concentración de Tolueno (µg/m3)", 
                             ylim = c(0, 30000),              # Techo real en 30,000 para alejar la gráfica
                             col = "lightblue",               
                             border = "black",
                             space = 0,                       
                             yaxt = "n",                      # Apagamos el Y de R
                             las = 1)                         

# 2. Dibujamos la "regleta" del eje X
axis(1, 
     at = 0:k_simpl,                  
     labels = cortes_exactos,         
     las = 1,                         
     cex.axis = 0.8)                  


# Las marcas reales van de 6,000 en 6,000 hasta 30,000
marcas_y_reales <- seq(0, 30000, by = 6000)
# Pero las etiquetas de texto van de 20 en 20 hasta 100%
etiquetas_y_porc <- c("0%", "20%", "40%", "60%", "80%", "100%")

axis(2, 
     at = marcas_y_reales,          # R pone la raya en el valor real 
     labels = etiquetas_y_porc,     # Pero escribe el porcentaje 
     las = 1,
     cex.axis = 0.8)

5. DIAGRAMA DE CAJA

# ====================================================================
# ===== GRÁFICA NRO 5: DIAGRAMA DE CAJA (BOX PLOT) ===================
# ====================================================================

# Restauramos los márgenes por defecto por si quedaron modificados de gráficas anteriores
par(mar = c(5, 4, 4, 2) + 0.1)

Cajatolueno <- boxplot(tolueno, 
                       horizontal = TRUE, 
                       col = "green", 
                       border = "black",
                       main = "Gráfica Nro 5: Distribución de la concentración de Tolueno\nEstudio calidad del aire en India (2015-2020)",
                       xlab = "Concentración de Tolueno (µg/m3)")

6. OJIVAS

6.1. OJIVAS (NI)

# ====================================================================
# ===== GRÁFICA NRO 6: OJIVAS LOCALES (Diseño espaciado) =============
# ====================================================================

# 1. Ampliamos el margen izquierdo (el segundo número pasa de 4 a 5.5) 
# para que los números grandes no choquen con el título "Cantidad Acumulada"
par(mar = c(5, 5.5, 4, 2) + 0.1)

x <- Ls_simpl

# 2. Dibujamos la primera gráfica (Ojiva Ascendente - Naranja)
plot(
  x, Ni_asc_simpl,                     
  type = "b",                          
  col = "orange",
  pch = 19,                            
  main = "Gráfica Nro 6: Distribución Acumulada (Ojivas) de Tolueno\nEstudio calidad del aire en India (2015-2020)",
  xlab = "Concentración de Tolueno (µg/m3)",
  ylab = "Cantidad Acumulada (Días)",
  ylim = c(0, N_simpl),                
  las = 1,                             
  cex.main = 0.9,
  yaxt = "n"                           # NUEVO: Apagamos el eje Y automático
)

# 3. Superponemos la segunda línea (Ojiva Descendente - Azul)
lines(
  x, Ni_desc_simpl,                    
  type = "b",
  col = "blue",
  pch = 19
)

# 4. NUEVO: Dibujamos un eje Y limpio, con saltos exactos de 5,000 en 5,000
marcas_y_ojiva <- seq(0, 26000, by = 5000)
axis(2, 
     at = marcas_y_ojiva, 
     labels = marcas_y_ojiva, 
     las = 1, 
     cex.axis = 0.8)

# 5. Agregamos la leyenda
legend("right",                        
       legend = c("Ascendente (Ojiva Menor que)", "Descendente (Ojiva Mayor que)"),
       col = c("orange", "blue"),
       pch = 19,                       
       lty = 1,                        
       bty = "n",                      
       cex = 0.8)

6.2. OJIVAS (HI)

# ====================================================================
# ===== GRÁFICA NRO 7: OJIVAS PORCENTUALES (Frecuencias Relativas) ===
# ====================================================================

# Mantenemos los márgenes amplios para que los porcentajes respiren bien
par(mar = c(5, 5.5, 4, 2) + 0.1)

x <- Ls_simpl

# 1. Dibujamos la primera gráfica (Ojiva Ascendente Porcentual - Naranja)
plot(
  x, Hi_asc_simpl,                     # AHORA USAMOS Hi (Frecuencia relativa acumulada)
  type = "b",                          
  col = "orange",
  pch = 19,                            
  main = "Gráfica Nro 7: Distribución Acumulada Porcentual (Ojivas)\nEstudio calidad del aire en India (2015-2020)",
  xlab = "Concentración de Tolueno (µg/m3)",
  ylab = "Porcentaje Acumulado (%)",
  ylim = c(0, 100),                    # EL TECHO ES EXACTAMENTE 100%
  las = 1,                             
  cex.main = 0.9,
  yaxt = "n"                           # Apagamos el eje Y automático para dibujarlo con el símbolo %
)

# 2. Superponemos la segunda línea (Ojiva Descendente Porcentual - Azul)
lines(
  x, Hi_desc_simpl,                    # Usamos la versión descendente de Hi
  type = "b",
  col = "blue",
  pch = 19
)

# 3. Dibujamos el eje Y limpio, con saltos de 20% en 20%
marcas_y_porc_ojiva <- seq(0, 100, by = 20)
axis(2, 
     at = marcas_y_porc_ojiva, 
     labels = paste0(marcas_y_porc_ojiva, "%"), 
     las = 1, 
     cex.axis = 0.8)

# 4. Agregamos la leyenda
legend("right",                        
       legend = c("Ascendente (Menor que)", "Descendente (Mayor que)"),
       col = c("orange", "blue"),
       pch = 19,                       
       lty = 1,                        
       bty = "n",                      
       cex = 0.8)

7. INDICADORES ESTADÍSTICOS

# ====================================================================
# ===== INDICADORES ESTADÍSTICOS Y TABLA RESUMEN =====================
# ====================================================================

# Cargar librerías necesarias
library(e1071)  # Requerida para calcular Asimetría (skewness) y Curtosis (kurtosis)
## Warning: package 'e1071' was built under R version 4.5.3
library(gt)
library(dplyr)

# --- Indicadores de Tendencia Central ---
X <- mean(tolueno)
Me <- median(tolueno)

# Para la Moda en datos agrupados, usamos el intervalo con mayor frecuencia de nuestra Tabla 2
Mo <- Intervalo_simpl[which.max(ni_simpl)] 

# --- Indicadores de Dispersión ---
var_tol <- var(tolueno)
desv <- sd(tolueno)
CV <- (desv / X) * 100


# --- Indicadores de Forma ---
As <- skewness(tolueno)
K <- kurtosis(tolueno)

# --- Datos dinámicos para la tabla ---
Variable <- "Tolueno"

# Rango exacto (Min y Max calculados en el paso 1)
Rango <- paste0("[", min, " - ", max, "]")

# Identificación automática de valores atípicos usando la lógica del Boxplot
atipicos_reales <- boxplot.stats(tolueno)$out
valoresatipicos <- paste0(length(atipicos_reales), " atípicos (>", round(min(atipicos_reales), 2), ")")

# ===== CREACIÓN DEL DATA FRAME =====
Tabla_indicadores <- data.frame(
  Variable = Variable,
  Rango = Rango,
  X = round(X, 3),
  Me = round(Me, 2),
  Mo = Mo,
  sd = round(desv, 2),
  CV = round(CV, 2),
  As = round(As, 2),
  K = round(K, 2),
  valoresatipicos = valoresatipicos
)

colnames(Tabla_indicadores) <- c("Variable", "Rango", "X", "Me", "Mo", "sd", "CV", "As", "K", "Valores atípicos")

# ===== GENERACIÓN Y ESTILO DE LA TABLA NRO 3 (gt) =====
Tabla_indicadores %>%
  gt() %>%
  
  # ===== ENCABEZADO =====
tab_header(
  title = md("## **Tabla Nro. 3**"),
  subtitle = md("*Indicadores Estadísticos de concentración de Tolueno, estudio calidad del aire en India entre 2015-2020*")
) %>%
  
  # ===== FUENTE =====
tab_source_note(
  source_note = md("**Autor:** Grupo 1\n**Fuente:** https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
) %>%
  
  # ===== ESTILO GENERAL =====
opt_table_font(
  font = list(
    google_font("Poppins"),
    default_fonts()
  )
) %>%
  
  tab_options(
    # Bordes generales
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.width = px(3),
    table.border.bottom.width = px(3),
    
    # Encabezados
    heading.align = "center",
    heading.background.color = "#F4F6F7",
    
    # Columnas
    column_labels.font.weight = "bold",
    column_labels.background.color = "#D6EAF8",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    
    # Filas
    row.striping.include_table_body = TRUE,
    row.striping.background_color = "#F8F9F9",
    table_body.hlines.color = "#B3B6B7",
    table_body.border.bottom.color = "black"
  ) %>%
  
  # ===== ALINEACIÓN =====
cols_align(
  align = "center",
  columns = everything()
)

Tabla Nro. 3

Indicadores Estadísticos de concentración de Tolueno, estudio calidad del aire en India entre 2015-2020
Variable Rango X Me Mo sd CV As K Valores atípicos
Tolueno [0 - 454.85] 8.701 2.97 [0 - 46) 19.97 229.5 11.66 216.67 2427 atípicos (>21.98)
Autor: Grupo 1 Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india

8. CONCLUCIÓNES

library(gt)
library(dplyr)

# 1. Guardamos todo el texto en una variable
texto_conclusion <- "La variable cuantitativa Tolueno fluctúa entre 0 como valor mínimo y 455.85 µg/m3 como valor máximo, girando en torno a niveles de concentración muy bajos (con una mediana de 2.97 µg/m3 y el intervalo modal cercano a cero). Esto evidencia que las condiciones diarias son generalmente favorables, reflejando una calidad del aire aceptable la mayor parte del tiempo, aunque con la presencia de valores atípicos extremos (picos episódicos) de alta contaminación que pueden generar severos impactos en la salud respiratoria y el medio ambiente."

# 2. Lo convertimos en un pequeño Data Frame de una sola celda
df_conclusion <- data.frame(Texto = texto_conclusion)

# 3. Generamos el recuadro visual con gt
df_conclusion %>%
  gt() %>%
  
  # Añadimos el título del recuadro
  tab_header(
    title = md("## **CONCLUSIÓN DEL ANÁLISIS**")
  ) %>%
  
  # Configuramos la estética del recuadro
  tab_options(
    column_labels.hidden = TRUE,             # Ocultamos el nombre de la columna para que parezca un texto libre
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.width = px(3),
    table.border.bottom.width = px(3),
    table.background.color = "#FDFEFE",      # Fondo blanco limpio
    table.width = pct(90)                    # Ancho del recuadro
  ) %>%
  
  # Le damos estilo al texto (justificado, tamaño de letra y bordes)
  tab_style(
    style = list(
      cell_text(align = "justify", size = px(15), font = google_font("Poppins")),
      cell_borders(sides = c("left", "right", "top", "bottom"), color = "#A6ACAF", weight = px(1.5))
    ),
    locations = cells_body()
  )

CONCLUSIÓN DEL ANÁLISIS

La variable cuantitativa Tolueno fluctúa entre 0 como valor mínimo y 455.85 µg/m3 como valor máximo, girando en torno a niveles de concentración muy bajos (con una mediana de 2.97 µg/m3 y el intervalo modal cercano a cero). Esto evidencia que las condiciones diarias son generalmente favorables, reflejando una calidad del aire aceptable la mayor parte del tiempo, aunque con la presencia de valores atípicos extremos (picos episódicos) de alta contaminación que pueden generar severos impactos en la salud respiratoria y el medio ambiente.