0. Librerías
# -------------------------
# Cargar librerías
# -------------------------
library(gt)
library(dplyr)
##
## 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
3. Frecuencia
3.1 Rango
# Valores mínimo y máximo
minimo <- min(CYP)
maximo <- max(CYP)
3.2 Uso de la Regla de Sturges
# Regla de Sturges
k <- 1 + (3.3 * log10(length(CYP)))
k <- floor(k)
# Rango y amplitud
R <- maximo - minimo
A <- R / k
3.3 Límites de clase
# Límites de clase
Li <- round(seq(from = minimo, to = maximo - A, by = A), 4)
Ls <- round(seq(from = minimo + A, to = maximo, by = A), 4)
# Marca de clase
MC <- round((Li + Ls) / 2, 2)
3.4 Creación de columnas
# Frecuencia absoluta
ni <- numeric(length(Li))
for (i in 1:length(Li)) {
ni[i] <- sum(CYP >= Li[i] & CYP < Ls[i])
}
# Incluir el valor máximo en el último intervalo
ni[length(Li)] <- sum(CYP >= Li[length(Li)] & CYP <= maximo)
# Frecuencia relativa
hi <- round((ni / sum(ni)) * 100, 2)
# Crear tabla base
TDF_CYP <- data.frame(
Li, Ls, MC, ni, hi
)
# ================================
# ELIMINAR INTERVALOS CON ni = 0
# ================================
TDF_CYP <- TDF_CYP[TDF_CYP$ni > 0, ]
# Recalcular acumuladas
TDF_CYP$Niasc <- cumsum(TDF_CYP$ni)
TDF_CYP$Nidsc <- rev(cumsum(rev(TDF_CYP$ni)))
TDF_CYP$Hiasc <- round(cumsum(TDF_CYP$hi))
TDF_CYP$Hidsc <- round(rev(cumsum(rev(TDF_CYP$hi))))
4. Tabla de distribución de frecuencia
4.1 Tabla general con Sturges
TDF_CYP_Completo <- rbind(
TDF_CYP,
data.frame(
Li = "Total",
Ls = " ",
MC = " ",
ni = sum(TDF_CYP$ni),
hi = 100,
Niasc = " ",
Nidsc = " ",
Hiasc = " ",
Hidsc = " "
)
)
# ================================
# TABLA GT (MÉTODO STURGES)
# ================================
tabla_CYP <- TDF_CYP_Completo %>%
gt() %>%
tab_header(
title = md("*Tabla Nº1*"),
subtitle = md("**Distribución de frecuencias de composición porcentual de residuos verdes en el estudio de la calidad de agua en Europa (1991-2017)**")
) %>%
tab_source_note(
source_note = md("Autor: Grupo 3")
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
row.striping.include_table_body = TRUE
)
tabla_CYP
| Tabla Nº1 |
| Distribución de frecuencias de composición porcentual de residuos verdes en el estudio de la calidad de agua en Europa (1991-2017) |
| Li |
Ls |
MC |
ni |
hi |
Niasc |
Nidsc |
Hiasc |
Hidsc |
| 0 |
2.0307 |
1.02 |
14881 |
74.81 |
14881 |
19893 |
75 |
100 |
| 2.0307 |
4.0613 |
3.05 |
3957 |
19.89 |
18838 |
5012 |
95 |
25 |
| 4.0613 |
6.092 |
5.08 |
280 |
1.41 |
19118 |
1055 |
96 |
5 |
| 6.092 |
8.1227 |
7.11 |
44 |
0.22 |
19162 |
775 |
96 |
4 |
| 10.1533 |
12.184 |
11.17 |
129 |
0.65 |
19291 |
731 |
97 |
4 |
| 14.2147 |
16.2453 |
15.23 |
198 |
1.00 |
19489 |
602 |
98 |
3 |
| 18.276 |
20.3067 |
19.29 |
322 |
1.62 |
19811 |
404 |
100 |
2 |
| 28.4293 |
30.46 |
29.44 |
82 |
0.41 |
19893 |
82 |
100 |
0 |
| Total |
|
|
19893 |
100.00 |
|
|
|
|
| Autor: Grupo 3 |
4.2 Tabla Simplificada
# =========================================================
# TABLA SIMPLIFICADA CONTINUA (MÁXIMO 10 FILAS)
# =========================================================
# Para asegurar que la tabla simplificada sea continua y tenga un máximo de 10 filas,
# forzamos exactamente 10 breaks en la función del histograma.
histoP <- hist(
CYP,
breaks = 10,
plot = FALSE
)
# Extraer límites continuos directos del histograma
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites) - 1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histoP$mids
ni <- histoP$counts
hi <- round((ni / sum(ni)) * 100, 2)
# Crear el DataFrame base continuo
TDF_Histo_CYP <- data.frame(
LimInf,
LimSup,
Mc,
ni,
hi
)
# Se mantienen todas las filas para asegurar continuidad absoluta de la variable en el estudio.
# Recalcular frecuencias acumuladas
TDF_Histo_CYP$Ni_asc <- cumsum(TDF_Histo_CYP$ni)
TDF_Histo_CYP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_CYP$ni)))
TDF_Histo_CYP$Hi_asc <- round(cumsum(TDF_Histo_CYP$hi), 2)
TDF_Histo_CYP$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_CYP$hi))), 2)
# Crear fila de totales
TDF_Histo_CYP_Completo <- rbind(
TDF_Histo_CYP,
data.frame(
LimInf = "Total",
LimSup = " ",
Mc = " ",
ni = sum(TDF_Histo_CYP$ni),
hi = 100,
Ni_asc = " ",
Ni_dsc = " ",
Hi_asc = " ",
Hi_dsc = " "
)
)
# Generar Tabla Simplificada con 'gt'
tabla_Histo_CYP <- TDF_Histo_CYP_Completo %>%
gt() %>%
tab_header(
title = md("*Tabla Nº2*"),
subtitle = md("**Distribución continua de frecuencias de composición de residuos verdes en
el estudio de la calidad de agua en Europa (1991-2017)**")
) %>%
tab_source_note(
source_note = md("Autor: Grupo 3")
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
row.striping.include_table_body = TRUE
)
tabla_Histo_CYP
| Tabla Nº2 |
| Distribución continua de frecuencias de composición de residuos verdes en
el estudio de la calidad de agua en Europa (1991-2017) |
| LimInf |
LimSup |
Mc |
ni |
hi |
Ni_asc |
Ni_dsc |
Hi_asc |
Hi_dsc |
| 0 |
5 |
2.5 |
18838 |
94.70 |
18838 |
19893 |
94.7 |
100 |
| 5 |
10 |
7.5 |
324 |
1.63 |
19162 |
1055 |
96.33 |
5.3 |
| 10 |
15 |
12.5 |
156 |
0.78 |
19318 |
731 |
97.11 |
3.67 |
| 15 |
20 |
17.5 |
493 |
2.48 |
19811 |
575 |
99.59 |
2.89 |
| 20 |
25 |
22.5 |
0 |
0.00 |
19811 |
82 |
99.59 |
0.41 |
| 25 |
30 |
27.5 |
0 |
0.00 |
19811 |
82 |
99.59 |
0.41 |
| 30 |
35 |
32.5 |
82 |
0.41 |
19893 |
82 |
100 |
0.41 |
| Total |
|
|
19893 |
100.00 |
|
|
|
|
| Autor: Grupo 3 |
5. Gráficas
5.1 Histograma (ni)
# =========================================
# Histograma generado por RStudio
# =========================================
hist(
CYP,
breaks = histoP$breaks,
main = "Gráfica Nº1: Distribución de frecuencias de composición porcentual
de residuos verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Cantidad",
col = "aquamarine3",
border = "black"
)

5.2 Histograma General (ni)
# ===========================================================
# Histograma con relación a la totalidad de los datos
# ===========================================================
barplot(
TDF_Histo_CYP$ni,
col = "aquamarine2",
main = "Gráfica Nº2: Distribución de frecuencias de composición porcentual
de residuos verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Cantidad",
space = 0,
ylim = c(0, 20000),
names.arg = round(TDF_Histo_CYP$Mc, 2)
)

5.3 Histograma Porcentual (hi)
# ======================================
# Histograma porcentual que genera RStudio
# ======================================
bp <- barplot(
TDF_Histo_CYP$hi,
col = "aquamarine3",
main = "Gráfica Nº3: Distribución porcentual de frecuencias de composición de
residuos verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Porcentaje (%)",
space = 0,
names.arg = round(TDF_Histo_CYP$Mc, 2)
)

5.4 Histograma Porcentual General (hi)
# ===========================================================
# Histograma porcentual con relación a la totalidad
# ===========================================================
barplot(
TDF_Histo_CYP$hi,
space = 0,
col = "aquamarine2",
main = "Gráfica Nº4: Distribución porcentual de frecuencias de composición
de residuos verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Porcentaje (%)",
names.arg = TDF_Histo_CYP$Mc,
ylim = c(0, 100)
)

5.5 Polígono de frecuencias (hi)
bp <- barplot(
TDF_Histo_CYP$hi,
col = "aquamarine3",
main = "Gráfica Nº5: Polígono de frecuencia de la distribución porcentual
de composición de residuos verdes en el estudio de la calidad
de agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Porcentaje (%)",
space = 0,
names.arg = round(TDF_Histo_CYP$Mc, 2),
ylim = c(0, max(TDF_Histo_CYP$hi) * 1.2)
)
# Polígono superpuesto
lines(
bp,
TDF_Histo_CYP$hi,
type = "o",
pch = 16,
lwd = 2,
col = "black"
)
# Etiquetas de texto
text(
bp,
TDF_Histo_CYP$hi,
labels = round(TDF_Histo_CYP$hi, 2),
pos = 3,
cex = 0.8,
col = "black"
)

5.6 Boxplot
# =============================
# BOXPLOT CON VALORES ATÍPICOS
# =============================
boxplot(
CYP,
horizontal = TRUE,
col = "forestgreen",
main = "Gráfica Nº6: Diagrama de caja de composición porcentual de residuos
verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)"
)
points(
mean(CYP),
1,
pch = 19,
col = "red"
)
legend(
"topright",
legend = "Media",
pch = 19,
col = "red"
)

5.7 Ojiva ascendente y descendente (Ni)
# 1. Crear un único eje X con todos los límites (desde el primero hasta el último)
eje_x <- c(TDF_Histo_CYP$LimInf, TDF_Histo_CYP$LimSup[length(TDF_Histo_CYP$LimSup)])
# Ascendente: Empieza en 0 y sube acumulando ni
ni_asc_plot <- c(0, TDF_Histo_CYP$Ni_asc)
# Descendente: Empieza en el Total y baja hasta 0
ni_dsc_plot <- c(TDF_Histo_CYP$Ni_dsc, 0)
# 3. Graficar Ojiva Descendente (Rojo)
plot(
eje_x, ni_dsc_plot,
main = "Gráfica Nº7: Ojiva ascendente y descendente de composición porcentual
de residuos verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Cantidad",
col = "lightblue3",
type = "o",
lwd = 2,
pch = 16,
ylim = c(0, max(ni_asc_plot))
)
# 4. Superponer Ojiva Ascendente (Verde)
lines(
eje_x, ni_asc_plot,
col = "black",
type = "o",
lwd = 2,
pch = 16
)
# Leyenda
legend(
"right",
legend = c("Ojiva descendente", "Ojiva ascendente"),
col = c("lightblue3", "black"),
lty = 1,
pch = 16,
bty = "n"
)

5.8 Ojiva ascendente y descendente (Hi)
# Ascendente: Empieza en 0% y sube hasta 100%
hi_asc_plot <- c(0, TDF_Histo_CYP$Hi_asc)
# Descendente: Empieza en 100% y baja hasta 0%
hi_dsc_plot <- c(TDF_Histo_CYP$Hi_dsc, 0)
# 3. Graficar Ojiva Porcentual Ascendente (Verde)
plot(
eje_x, hi_asc_plot,
type = "o",
col = "black",
pch = 16,
lwd = 2,
main = "Gráfica Nº8: Ojiva porcentual ascendente y descendente de composición
de residuos verdes en el estudio de la calidad de
agua en Europa (1991-2017)",
xlab = "Porcentaje de residuos verdes (%)",
ylab = "Porcentaje acumulado (%)",
ylim = c(0, 100)
)
# 4. Superponer Ojiva Porcentual Descendente (Rojo)
lines(
eje_x, hi_dsc_plot,
type = "o",
col = "skyblue3",
pch = 17,
lwd = 2
)
grid()
# Leyenda
legend(
"right",
legend = c("Ojiva Ascendente (%)", "Ojiva Descendente (%)"),
col = c("black", "skyblue3"),
pch = c(16, 17),
lty = 1,
bty = "n"
)

6 Indicadores Estadísticos
6.1 Indicadores de Tendencia Central
# =========================
# INDICADORES ESTADISTICOS
# =========================
# Obtener valores atípicos según el criterio del boxplot
atipicos <- boxplot.stats(CYP)$out
n_atipicos <- length(atipicos)
media <- round(mean(CYP), 2)
mediana <- round(median(CYP), 2)
# Moda basada en Intervalo Modal de la Tabla Simplificada
fila_modal <- which.max(TDF_Histo_CYP$ni)
moda_intervalar <- paste0(
"[", round(TDF_Histo_CYP$LimInf[fila_modal], 2),
" ; ", round(TDF_Histo_CYP$LimSup[fila_modal], 2), "]"
)
6.2 Dispersión
varianza <- var(CYP)
desv_est <- sd(CYP)
cv <- round((desv_est / media) * 100, 2)
6.3 Asimetría
library(e1071)
asimetria <- skewness(CYP, type = 2)
curtosis <- kurtosis(CYP) # <- Corregido con "k"
6.4 Tabla de Indicadores
# =========================
# TABLA RESUMEN FINAL
# =========================
# Creación de la tabla resumen final
tabla_indicadores <- data.frame(
Variable = "Residuos verdes (%)",
Rango = paste0("[", round(min(CYP), 2), " ; ", round(max(CYP), 2), "]"),
X = media,
Me = mediana,
Mo = moda_intervalar,
V = round(varianza, 2),
Sd = round(desv_est, 2),
Cv = cv,
As = round(asimetria, 2),
K = round(curtosis, 2),
Valores_Atipicos = n_atipicos
)
tabla_indicadores_gt <- tabla_indicadores %>%
gt() %>%
tab_header(
title = md("*Tabla Nº3*"),
subtitle = md("**Indicadores estadísticos de la variable composición de
residuos verdes en el estudio de la calidad de agua en Europa (1991-2017)**")
) %>%
tab_source_note(
source_note = md("Autor: Grupo 3")
)
tabla_indicadores_gt
| Tabla Nº3 |
| Indicadores estadísticos de la variable composición de
residuos verdes en el estudio de la calidad de agua en Europa (1991-2017) |
| Variable |
Rango |
X |
Me |
Mo |
V |
Sd |
Cv |
As |
K |
Valores_Atipicos |
| Residuos verdes (%) |
[0 ; 30.46] |
1.3 |
0 |
[0 ; 5] |
13.37 |
3.66 |
281.26 |
4.71 |
25.58 |
731 |
| Autor: Grupo 3 |
7. Conclusión
La variable Composición Porcentual de Residuos de Jardín y Huerto
fluctúa en un rango de [0; 30.46], y sus valores giran en torno a una
mediana de 0, con una desviación estándar de 3.66, lo que representa un
conjunto de datos con una variabilidad extremadamente alta CV = 281.26%.
Los valores presentan una asimetría positiva bastante pronunciada As =
4.71, indicando una fuerte concentración de los datos hacia valores
menores a la media (con una gran acumulación en el cero), y una curtosis
de K = 25.58, lo que evidencia una distribución marcadamente
leptocúrtica. Cabe destacar la identificación de 731 valores atípicos;
esta presencia de datos atípicos, sumada al elevadísimo coeficiente de
variación y la desviación estándar, señalan una alta heterogeneidad
dentro del monitoreo de la calidad del agua en Europa (1991–2017).