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(RMV)
maximo <- max(RMV)
3.2 Uso de la Regla de Sturges
# Regla de Sturges
k <- 1 + (3.3 * log10(length(RMV)))
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(RMV >= Li[i] & RMV < Ls[i])
}
# Incluir el valor máximo en el último intervalo
ni[length(Li)] <- sum(RMV >= Li[length(Li)] & RMV <= maximo)
# Frecuencia relativa
hi <- round((ni / sum(ni)) * 100, 2)
# Crear tabla
TDF_RMV <- data.frame(
Li, Ls, MC, ni, hi
)
# ================================
# ELIMINAR INTERVALOS CON ni = 0
# ================================
TDF_RMV <- TDF_RMV[TDF_RMV$ni > 0, ]
# Recalcular acumuladas
TDF_RMV$Niasc <- cumsum(TDF_RMV$ni)
TDF_RMV$Nidsc <- rev(cumsum(rev(TDF_RMV$ni)))
TDF_RMV$Hiasc <- round(cumsum(TDF_RMV$hi))
TDF_RMV$Hidsc <- round(rev(cumsum(rev(TDF_RMV$hi))))
4. Tabla de distribución de frecuencia
4.1 Tabla general con Sturges
TDF_RMV_Completo <- rbind(
TDF_RMV,
data.frame(
Li = "Total",
Ls = " ",
MC = " ",
ni = sum(TDF_RMV$ni),
hi = 100,
Niasc = " ",
Nidsc = " ",
Hiasc = " ",
Hidsc = " "
)
)
# ================================
# TABLA GT
# ================================
tabla_RMV <- TDF_RMV_Completo %>%
gt() %>%
tab_header(
title = md("*Tabla Nº1*"),
subtitle = md("**Distribución de frecuencias del valor medio
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_RMV
| Tabla Nº1 |
| Distribución de frecuencias del valor medio
en el estudio de la calidad de agua en Europa (1991-2017) |
| Li |
Ls |
MC |
ni |
hi |
Niasc |
Nidsc |
Hiasc |
Hidsc |
| 0 |
940.5333 |
470.27 |
19948 |
99.74 |
19948 |
20000 |
100 |
100 |
| 940.5333 |
1881.0667 |
1410.8 |
43 |
0.22 |
19991 |
52 |
100 |
0 |
| 1881.0667 |
2821.6 |
2351.33 |
4 |
0.02 |
19995 |
9 |
100 |
0 |
| 2821.6 |
3762.1333 |
3291.87 |
2 |
0.01 |
19997 |
5 |
100 |
0 |
| 4702.6667 |
5643.2 |
5172.93 |
1 |
0.00 |
19998 |
3 |
100 |
0 |
| 10345.8667 |
11286.4 |
10816.13 |
1 |
0.00 |
19999 |
2 |
100 |
0 |
| 13167.4667 |
14108 |
13637.73 |
1 |
0.00 |
20000 |
1 |
100 |
0 |
| Total |
|
|
20000 |
100.00 |
|
|
|
|
| Autor: Grupo 3 |
4.2 Tabla Simplificada
# =============================================
# TABLA SIMPLIFICADA (BASADA EN EL HISTOGRAMA)
# =============================================
# 1. Calcular el histograma
histoP <- hist(
log10(RMV_graf + 1),
breaks = 8,
plot = FALSE
)
# 2. Extraer datos del histograma para la tabla
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)
# 3. Crear el DataFrame base
TDF_Histo_RMV <- data.frame(
LimInf,
LimSup,
Mc,
ni,
hi
)
# Eliminar intervalos vacíos
TDF_Histo_RMV <- TDF_Histo_RMV[TDF_Histo_RMV$ni > 0, ]
# Recalcular frecuencias acumuladas
TDF_Histo_RMV$Ni_asc <- cumsum(TDF_Histo_RMV$ni)
TDF_Histo_RMV$Ni_dsc <- rev(cumsum(rev(TDF_Histo_RMV$ni)))
TDF_Histo_RMV$Hi_asc <- round(cumsum(TDF_Histo_RMV$hi), 2)
TDF_Histo_RMV$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_RMV$hi))), 2)
# 4. Crear fila de totales
TDF_Histo_RMV_Completo <- rbind(
TDF_Histo_RMV,
data.frame(
LimInf = "Total",
LimSup = " ",
Mc = " ",
ni = sum(TDF_Histo_RMV$ni),
hi = 100,
Ni_asc = " ",
Ni_dsc = " ",
Hi_asc = " ",
Hi_dsc = " "
)
)
# 5. Generar y mostrar la Tabla con 'gt'
tabla_Histo_RMV <- TDF_Histo_RMV_Completo %>%
gt() %>%
tab_header(
title = md("*Tabla Nº2*"),
subtitle = md("**Distribución de frecuencias del valor medio
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
)
# Imprimir la tabla
tabla_Histo_RMV
| Tabla Nº2 |
| Distribución de frecuencias del valor medio
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 |
0.5 |
0.25 |
9115 |
48.22 |
9115 |
18904 |
48.22 |
99.99 |
| 0.5 |
1 |
0.75 |
4222 |
22.33 |
13337 |
9789 |
70.55 |
51.77 |
| 1 |
1.5 |
1.25 |
2341 |
12.38 |
15678 |
5567 |
82.93 |
29.44 |
| 1.5 |
2 |
1.75 |
1700 |
8.99 |
17378 |
3226 |
91.92 |
17.06 |
| 2 |
2.5 |
2.25 |
980 |
5.18 |
18358 |
1526 |
97.1 |
8.07 |
| 2.5 |
3 |
2.75 |
497 |
2.63 |
18855 |
546 |
99.73 |
2.89 |
| 3 |
3.5 |
3.25 |
45 |
0.24 |
18900 |
49 |
99.97 |
0.26 |
| 3.5 |
4 |
3.75 |
2 |
0.01 |
18902 |
4 |
99.98 |
0.02 |
| 4 |
4.5 |
4.25 |
2 |
0.01 |
18904 |
2 |
99.99 |
0.01 |
| Total |
|
|
18904 |
100.00 |
|
|
|
|
| Autor: Grupo 3 |
5. Gráficas
5.1 Histograma (ni)
RMV_log <- log10(RMV + 1)
hist(
log10(RMV_graf + 1),
breaks = histoP$breaks,
main = "Gráfica Nº1: Distribución de frecuencias del valor medio
en el estudio de la calidad de agua en Europa (1991-2017)",
xlab = "Valor medio",
ylab = "Cantidad",
col = "deepskyblue",
border = "black"
)

5.2 Histograma General (ni)
# Límites de clase obtenidos en la tabla
cortes <- c(TDF_RMV$Li, max(TDF_RMV$Ls))
barplot(
TDF_Histo_RMV$ni,
col = "lightskyblue1",
main = "Gráfica Nº2: Distribución de frecuencias del valor medio
en el estudio de la calidad de agua en Europa (1991-2017)",
xlab = "Valores medios",
ylab = "Cantidad",
space = 0,
names.arg = round(TDF_Histo_RMV$Mc,2)
)

5.3 Histograma Porcentual (hi)
# =========================
# HISTOGRAMA Nº4: PORCENTUAL
# =========================
bp <- barplot(
TDF_Histo_RMV$hi,
col = "deepskyblue",
main = "Gráfica Nº3: Distribución porcentual de frecuencias del valor medio
en el estudio de la calidad de agua en Europa (1991-2017)",
xlab = "Valor medio",
ylab = "Porcentaje (%)",
space = 0,
names.arg = round(TDF_Histo_RMV$Mc,2)
)
text(
bp,
TDF_Histo_RMV$hi,
labels = round(TDF_Histo_RMV$hi,2),
pos = 3,
cex = 0.8
)

5.4 Histograma Porcentual General (hi)
# ==================================
# HISTOGRAMA Nº5 PORCENTUAL hi
# ==================================
barplot(
TDF_Histo_RMV$hi,
space = 0,
col = "lightskyblue1",
main = "Gráfica Nº4: Distribución porcentual de frecuencias del valor medio
en el estudio de la calidad de agua en Europa (1991-2017)",
xlab = "Valor Medio",
ylab = "Porcentaje (%)",
names.arg = TDF_Histo_RMV$Mc,
ylim = c(0, 100)
)

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

5.6 Boxplot sin valores atípicos
# =============================
# BOXPLOT SIN VALORES ATÍPICOS
# =============================
boxplot(
RMV,
horizontal = TRUE,
outline = FALSE,
col = "forestgreen",
main = "Gráfica Nº6: Diagrama de caja del Valor medio sin valores atipicos, en
el estudio de la calidad de agua en Europa (1991-2017)",
xlab = "Valores medios"
)
points(
mean(RMV),
1,
pch = 19,
col = "red"
)
legend(
"topright",
legend = "Media",
pch = 19,
col = "red"
)

5.7 Boxplot con valores atípicos
# =============================
# BOXPLOT CON VALORES ATÍPICOS
# =============================
boxplot(
RMV,
horizontal = TRUE,
col = "forestgreen",
main = "Gráfica Nº7: Dagrama de caja del Valor Medio con valores atipicos, en el
estudio de la calidad de agua en Europa (1991-2017)",
xlab = "Valor Medio (%)"
)
points(
mean(RMV),
1,
pch = 19,
col = "red"
)
legend(
"topright",
legend = "Media",
pch = 19,
col = "red"
)

5.8 Ojiva ascendente y descendente (Ni)
# =========================
# OJIVAS Ni
# =========================
plot(
TDF_Histo_RMV$LimInf,
TDF_Histo_RMV$Ni_dsc,
main = "Gráfica Nº8: Ojiva ascendente y descendente del Valor Medio, en el
estidio de la calidad de agua en Europa (1991-2017)",
xlab = "Valor Medio (%)",
ylab = "Cantidad",
col = "red",
type = "o",
lwd = 2
)
lines(
TDF_Histo_RMV$LimSup,
TDF_Histo_RMV$Ni_asc,
col = "forestgreen",
type = "o",
lwd = 2
)
legend(
"right",
legend = c(
"Ojiva descendente",
"Ojiva ascendente"
),
col = c("red", "forestgreen"),
pch = c(16, 16),
lty = 1,
bty = "n"
)

5.9 Ojiva ascendente y descendente (Hi)
# =========================
# OJIVAS PORCENTUALES
# =========================
plot(
TDF_Histo_RMV$LimSup,
TDF_Histo_RMV$Hi_asc,
type = "o",
col = "deepskyblue",
pch = 16,
lwd = 2,
main = "Gráfica Nº9: Ojiva ascendente y descendente del Valor Medio, en el
estidio de la calidad de agua en Europa (1991-2017)",
xlab = "Valor Medio (%)",
ylab = "Porcentaje acumulado (%)",
ylim = c(0, 100)
)
# Ojiva Descendente
lines(
TDF_Histo_RMV$LimInf,
TDF_Histo_RMV$Hi_dsc,
type = "o",
col = "red",
pch = 17,
lwd = 2
)
grid()
legend(
"right",
legend = c(
"Ojiva Ascendente (%)",
"Ojiva Descendente (%)"
),
col = c("deepskyblue", "red"),
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(RMV)$out
# Cantidad de valores atípicos
n_atipicos <- length(atipicos)
RMV <- na.omit(datos$resultMeanValue)
RMV <- as.numeric(RMV)
media <- round(mean(RMV), 2)
mediana <- round(median(RMV), 2)
# =========================
# MODA (INTERVALO MODAL)
# =========================
# Moda basada en Intervalo Modal de la Tabla Simplificada
fila_modal <- which.max(TDF_Histo_RMV$ni)
moda_intervalar <- paste0(
"[", round(TDF_Histo_RMV$LimInf[fila_modal], 2),
" ; ", round(TDF_Histo_RMV$LimSup[fila_modal], 2), "]"
)
6.2 Dispersión
varianza <- var(RMV)
desv_est <- sd(RMV)
cv <- round((desv_est / media) * 100, 2)
6.3 Asimetría
library(e1071)
asimetria <- skewness(RMV, type = 2)
curtosis <- kurtosis(RMV)
6.4 Tabla de Indicadores
# =========================
# TABLA RESUMEN FINAL
# =========================
tabla_indicadores <- data.frame(
Variable = "resultMeanValue",
Rango = paste0("[", round(min(RMV), 2), " ; ", round(max(RMV), 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 valor medio 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 valor medio en el estudio de la calidad de agua en Europa (1991-2017) |
| Variable |
Rango |
X |
Me |
Mo |
V |
Sd |
Cv |
As |
K |
Valores_Atipicos |
| resultMeanValue |
[0 ; 14108] |
34.44 |
2 |
[0 ; 0.5] |
30500.26 |
174.64 |
507.09 |
41.57 |
2870.26 |
3346 |
| Autor: Grupo 3 |
7. Conclusión
##============##
## CONCLUSION ##
##============##
# La variable Porcentaje de Residuos Orgánicos (%) fluctúa entre 12.78% y 62.3%, y sus valores giran en torno a una mediana de 32%, con una desviación estándar de 11.33%, lo que representa un conjunto de datos con variabilidad moderada (CV = 35.21%). Los valores presentan una asimetría positiva (As = 0.44), indicando una ligera concentración de datos hacia valores menores a la media, y una curtosis negativa (K = -0.06), lo que evidencia una distribución platicúrtica, es decir, más achatada o plana que la distribución normal. Cabe destacar la identificación de 9,434 valores atípicos, lo cual sugiere la presencia de casos excepcionales o extremos dentro del monitoreo de la calidad del agua en Europa (1991-2017) que requieren una revisión detallada. Por lo anterior, aunque la tendencia central es clara, la alta cantidad de valores atípicos señala una heterogeneidad significativa en los niveles de residuos orgánicos a lo largo del periodo y territorio estudiado.