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