#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. |