library(gt)
library(dplyr)
library(e1071)
datos <- read.csv(
"C:/Users/Grace/OneDrive/Documentos/dataset_geologico_limpio_80.csv",
header = TRUE,
sep = ",",
dec = "."
)
day <- round(as.numeric(datos$DAY_ANAL))
day <- na.omit(day)
day <- day[day >= 1 & day <= 31]
n <- length(day)
n
## [1] 26771
DAY_ANAL representa el día del mes en que se realizó el
análisis de cada muestra de sedimento marino. Es una variable
cuantitativa discreta porque se registra mediante números
enteros del 1 al 31. Los valores faltantes y aquellos que se encuentran
fuera de este rango se excluyen del análisis. Aunque posteriormente se
agrupe para facilitar su presentación, la variable conserva su
naturaleza discreta.
frecuencia_sin_agrupar <- as.data.frame(
table(factor(day, levels = 1:31))
)
names(frecuencia_sin_agrupar) <- c("Día", "ni")
frecuencia_sin_agrupar <- frecuencia_sin_agrupar %>%
mutate(
Día = as.character(Día),
hi = ni / n * 100,
Ni_Asc = cumsum(ni),
Hi_Asc = cumsum(hi),
hi = round(hi, 2),
Hi_Asc = round(Hi_Asc, 2)
)
fila_total <- data.frame(
Día = "TOTAL",
ni = n,
hi = 100,
Ni_Asc = NA,
Hi_Asc = NA
)
tabla_sin_agrupar <- bind_rows(frecuencia_sin_agrupar, fila_total)
tabla_sin_agrupar %>%
gt() %>%
cols_label(
Día = "Día",
ni = "ni",
hi = "hi (%)",
Ni_Asc = "Ni asc.",
Hi_Asc = "Hi asc. (%)"
) %>%
fmt_number(
columns = c(ni, Ni_Asc),
decimals = 0,
sep_mark = ".",
dec_mark = ","
) %>%
fmt_number(
columns = c(hi, Hi_Asc),
decimals = 2,
sep_mark = ".",
dec_mark = ","
) %>%
fmt_missing(columns = everything(), missing_text = "") %>%
tab_header(
title = md("**Tabla N.º 1**"),
subtitle = md(
"**Distribución de frecuencias sin agrupar del día de análisis**"
)
) %>%
tab_source_note(source_note = md("__Autor: Grupo 2__")) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(rows = Día == "TOTAL")
)
## Warning: Since gt v0.6.0 `fmt_missing()` is deprecated and will soon be removed.
## ℹ Use `sub_missing()` instead.
## This warning is displayed once every 8 hours.
| Tabla N.º 1 | ||||
| Distribución de frecuencias sin agrupar del día de análisis | ||||
| Día | ni | hi (%) | Ni asc. | Hi asc. (%) |
|---|---|---|---|---|
| 1 | 1.190 | 4,45 | 1.190 | 4,45 |
| 2 | 666 | 2,49 | 1.856 | 6,93 |
| 3 | 505 | 1,89 | 2.361 | 8,82 |
| 4 | 791 | 2,95 | 3.152 | 11,77 |
| 5 | 630 | 2,35 | 3.782 | 14,13 |
| 6 | 930 | 3,47 | 4.712 | 17,60 |
| 7 | 891 | 3,33 | 5.603 | 20,93 |
| 8 | 904 | 3,38 | 6.507 | 24,31 |
| 9 | 599 | 2,24 | 7.106 | 26,54 |
| 10 | 922 | 3,44 | 8.028 | 29,99 |
| 11 | 1.071 | 4,00 | 9.099 | 33,99 |
| 12 | 657 | 2,45 | 9.756 | 36,44 |
| 13 | 1.370 | 5,12 | 11.126 | 41,56 |
| 14 | 769 | 2,87 | 11.895 | 44,43 |
| 15 | 1.111 | 4,15 | 13.006 | 48,58 |
| 16 | 1.380 | 5,15 | 14.386 | 53,74 |
| 17 | 698 | 2,61 | 15.084 | 56,34 |
| 18 | 1.160 | 4,33 | 16.244 | 60,68 |
| 19 | 978 | 3,65 | 17.222 | 64,33 |
| 20 | 788 | 2,94 | 18.010 | 67,27 |
| 21 | 897 | 3,35 | 18.907 | 70,62 |
| 22 | 1.067 | 3,99 | 19.974 | 74,61 |
| 23 | 788 | 2,94 | 20.762 | 77,55 |
| 24 | 543 | 2,03 | 21.305 | 79,58 |
| 25 | 682 | 2,55 | 21.987 | 82,13 |
| 26 | 859 | 3,21 | 22.846 | 85,34 |
| 27 | 694 | 2,59 | 23.540 | 87,93 |
| 28 | 1.279 | 4,78 | 24.819 | 92,71 |
| 29 | 796 | 2,97 | 25.615 | 95,68 |
| 30 | 523 | 1,95 | 26.138 | 97,64 |
| 31 | 633 | 2,36 | 26.771 | 100,00 |
| TOTAL | 26.771 | 100,00 | ||
| Autor: Grupo 2 | ||||
La tabla sin agrupar presenta una fila para cada uno de los 31 días del mes. Aunque permite observar la frecuencia exacta de cada día, la cantidad de categorías dificulta la lectura, la comparación y la representación gráfica. Por esta razón se utiliza la regla de Sturges como referencia para determinar el número teórico de clases:
\[ k = 1 + 3.322\log_{10}(n) \]
R <- max(day) - min(day)
k_teorico <- 1 + 3.322 * log10(n)
k_sturges <- ceiling(k_teorico)
A_teorica <- R / k_sturges
A_utilizada <- 3
cat("Número de observaciones =", n, "\n")
## Número de observaciones = 26771
cat("Número teórico de clases =", round(k_teorico, 2), "\n")
## Número teórico de clases = 15.71
cat("Número recomendado de clases =", k_sturges, "\n")
## Número recomendado de clases = 16
cat("Rango =", R, "días\n")
## Rango = 30 días
cat("Amplitud teórica =", round(A_teorica, 2), "días\n")
## Amplitud teórica = 1.88 días
cat("Amplitud utilizada =", A_utilizada, "días\n")
## Amplitud utilizada = 3 días
La regla de Sturges recomienda aproximadamente 16 clases, con una
amplitud teórica cercana a dos días. Sin embargo, utilizar intervalos de
dos días todavía produciría una tabla y unas gráficas con numerosas
categorías. Por ello se adopta una amplitud práctica de tres
días, que reduce la distribución a 11 intervalos y facilita la
comparación sin perder de forma considerable la variación observada.
Esta agrupación se utiliza únicamente con fines de presentación;
DAY_ANAL continúa siendo una variable cuantitativa
discreta.
orden <- c(
"1-3", "4-6", "7-9", "10-12",
"13-15", "16-18", "19-21", "22-24",
"25-27", "28-30", "31"
)
clasificacion <- cut(
day,
breaks = c(seq(1, 31, by = 3), 32),
right = FALSE,
labels = orden
)
ni <- table(clasificacion)
total <- sum(ni)
hi <- as.numeric(ni) / total * 100
Ni_Asc <- cumsum(as.numeric(ni))
Hi_Asc <- cumsum(hi)
Ni_Desc <- rev(cumsum(rev(as.numeric(ni))))
Hi_Desc <- rev(cumsum(rev(hi)))
tabla_agrupada <- data.frame(
Intervalo = orden,
ni = as.numeric(ni),
hi = round(hi, 2),
Ni_Asc = Ni_Asc,
Hi_Asc = round(Hi_Asc, 2),
Ni_Desc = Ni_Desc,
Hi_Desc = round(Hi_Desc, 2)
)
tabla_agrupada <- bind_rows(
tabla_agrupada,
data.frame(
Intervalo = "TOTAL",
ni = total,
hi = 100,
Ni_Asc = NA,
Hi_Asc = NA,
Ni_Desc = NA,
Hi_Desc = NA
)
)
tabla_agrupada %>%
gt() %>%
cols_label(
Intervalo = "Intervalo",
ni = "ni",
hi = "hi (%)",
Ni_Asc = "Ni asc.",
Hi_Asc = "Hi asc. (%)",
Ni_Desc = "Ni desc.",
Hi_Desc = "Hi desc. (%)"
) %>%
fmt_number(
columns = c(ni, Ni_Asc, Ni_Desc),
decimals = 0,
sep_mark = ".",
dec_mark = ","
) %>%
fmt_number(
columns = c(hi, Hi_Asc, Hi_Desc),
decimals = 2,
sep_mark = ".",
dec_mark = ","
) %>%
fmt_missing(columns = everything(), missing_text = "") %>%
tab_header(
title = md("**Tabla N.º 2**"),
subtitle = md(
"**Distribución de frecuencias del día de análisis agrupada cada tres días**"
)
) %>%
tab_source_note(source_note = md("__Autor: Grupo 2__")) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(rows = Intervalo == "TOTAL")
)
| Tabla N.º 2 | ||||||
| Distribución de frecuencias del día de análisis agrupada cada tres días | ||||||
| Intervalo | ni | hi (%) | Ni asc. | Hi asc. (%) | Ni desc. | Hi desc. (%) |
|---|---|---|---|---|---|---|
| 1-3 | 2.361 | 8,82 | 2.361 | 8,82 | 26.771 | 100,00 |
| 4-6 | 2.351 | 8,78 | 4.712 | 17,60 | 24.410 | 91,18 |
| 7-9 | 2.394 | 8,94 | 7.106 | 26,54 | 22.059 | 82,40 |
| 10-12 | 2.650 | 9,90 | 9.756 | 36,44 | 19.665 | 73,46 |
| 13-15 | 3.250 | 12,14 | 13.006 | 48,58 | 17.015 | 63,56 |
| 16-18 | 3.238 | 12,10 | 16.244 | 60,68 | 13.765 | 51,42 |
| 19-21 | 2.663 | 9,95 | 18.907 | 70,62 | 10.527 | 39,32 |
| 22-24 | 2.398 | 8,96 | 21.305 | 79,58 | 7.864 | 29,38 |
| 25-27 | 2.235 | 8,35 | 23.540 | 87,93 | 5.466 | 20,42 |
| 28-30 | 2.598 | 9,70 | 26.138 | 97,64 | 3.231 | 12,07 |
| 31 | 633 | 2,36 | 26.771 | 100,00 | 633 | 2,36 |
| TOTAL | 26.771 | 100,00 | ||||
| Autor: Grupo 2 | ||||||
grafica_barras <- function(valores, limite, titulo, eje_y) {
par(mar = c(8, 4, 5, 2) + 0.1)
posiciones <- barplot(
valores,
space = 0.10,
col = "gray",
border = "black",
main = titulo,
xlab = "",
ylab = eje_y,
names.arg = FALSE,
xaxt = "n",
ylim = limite
)
text(
posiciones,
par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
labels = orden,
srt = 45,
adj = 1,
xpd = TRUE,
cex = 0.75
)
mtext("Intervalos de Día", side = 1, line = 5.8)
par(mar = c(5, 4, 4, 2) + 0.1)
}
grafica_barras(
as.numeric(ni),
c(0, max(ni) * 1.10),
"Gráfica N.º1: Distribución de cantidad del\nDía de Análisis de Sedimentos Marinos",
"Cantidad"
)
grafica_barras(
as.numeric(ni),
c(0, total),
"Gráfica N.º2: Distribución de cantidad del\nDía de Análisis de Sedimentos Marinos",
"Cantidad"
)
grafica_barras(
hi,
c(0, max(hi) * 1.10),
"Gráfica N.º3: Distribución de cantidad en porcentaje del\nDía de Análisis de Sedimentos Marinos",
"Porcentaje"
)
grafica_barras(
hi,
c(0, 100),
"Gráfica N.º4: Distribución de cantidad en porcentaje del\nDía de Análisis de Sedimentos Marinos",
"Porcentaje"
)
x_clases <- seq_along(orden)
par(mar = c(8, 4, 4, 2) + 0.1)
plot(
x_clases, Ni_Desc,
type = "p", pch = 19, col = "blue",
main = "Gráfica N.º5: Ojiva combinada del Día de Análisis (Ni)",
xlab = "", ylab = "Cantidad acumulada",
xaxt = "n",
xlim = c(0, length(orden) + 0.5),
ylim = c(0, total)
)
axis(1, at = c(0, x_clases), labels = FALSE)
text(
c(0, x_clases),
par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
labels = c("0", orden),
srt = 45, adj = 1, xpd = TRUE, cex = 0.75
)
points(x_clases, Ni_Asc, col = "red", pch = 19)
mtext("Intervalos", side = 1, line = 5.8)
legend(
"bottom",
legend = c("Descendente", "Ascendente"),
col = c("blue", "red"),
pch = c(19, 19),
lty = 0,
horiz = TRUE,
inset = 0.02,
bty = "n"
)
par(mar = c(5, 4, 4, 2) + 0.1)
par(mar = c(8, 4, 4, 2) + 0.1)
plot(
x_clases, Hi_Desc,
type = "p", pch = 19, col = "blue",
main = "Gráfica N.º6: Ojiva combinada del Día de Análisis (Hi)",
xlab = "", ylab = "Porcentaje acumulado",
xaxt = "n",
xlim = c(0, length(orden) + 0.5),
ylim = c(0, 100)
)
axis(1, at = c(0, x_clases), labels = FALSE)
text(
c(0, x_clases),
par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
labels = c("0", orden),
srt = 45, adj = 1, xpd = TRUE, cex = 0.75
)
points(x_clases, Hi_Asc, col = "red", pch = 19)
mtext("Intervalos", side = 1, line = 5.8)
legend(
"bottom",
legend = c("Descendente", "Ascendente"),
col = c("blue", "red"),
pch = c(19, 19),
lty = 0,
horiz = TRUE,
inset = 0.02,
bty = "n"
)
par(mar = c(5, 4, 4, 2) + 0.1)
boxplot(
day,
horizontal = TRUE,
main = "Gráfica N.º7: Distribución de cantidad del\nDía de Análisis de Sedimentos Marinos",
xlab = "Día",
col = "lightblue"
)
media <- mean(day)
mediana <- median(day)
desv <- sd(day)
CV <- desv / media * 100
asimetria <- skewness(day)
curtosis <- kurtosis(day)
minimo <- min(day)
maximo <- max(day)
tabla_indicadores <- data.frame(
Variable = "DAY_ANAL",
Mínimo = minimo,
Máximo = maximo,
Media = round(media, 2),
Mediana = mediana,
Desviación_estándar = round(desv, 2),
CV = round(CV, 2),
Asimetría = round(asimetria, 2),
Curtosis = round(curtosis, 2),
check.names = FALSE
)
tabla_indicadores %>%
gt() %>%
tab_header(
title = md("**Tabla N.º 3**"),
subtitle = md(
"**Indicadores estadísticos de la variable Día de Análisis**"
)
) %>%
tab_source_note(source_note = md("__Autor: Grupo 2__"))
| Tabla N.º 3 | ||||||||
| Indicadores estadísticos de la variable Día de Análisis | ||||||||
| Variable | Mínimo | Máximo | Media | Mediana | Desviación_estándar | CV | Asimetría | Curtosis |
|---|---|---|---|---|---|---|---|---|
| DAY_ANAL | 1 | 31 | 15.83 | 16 | 8.56 | 54.07 | 0 | -1.06 |
| Autor: Grupo 2 | ||||||||
atipicos <- boxplot.stats(day)$out
cantidad_atipicos <- length(atipicos)
tabla_atipicos <- data.frame(
Cantidad_de_atípicos = cantidad_atipicos,
Mínimo = if (cantidad_atipicos > 0) min(atipicos) else NA,
Máximo = if (cantidad_atipicos > 0) max(atipicos) else NA,
check.names = FALSE
)
tabla_atipicos %>%
gt() %>%
fmt_missing(columns = everything(), missing_text = "No aplica") %>%
tab_header(
title = md("**Tabla N.º 4**"),
subtitle = md(
"**Valores atípicos de la variable Día de Análisis**"
)
) %>%
tab_source_note(source_note = md("__Autor: Grupo 2__"))
| Tabla N.º 4 | ||
| Valores atípicos de la variable Día de Análisis | ||
| Cantidad_de_atípicos | Mínimo | Máximo |
|---|---|---|
| 0 | No aplica | No aplica |
| Autor: Grupo 2 | ||
La variable Día de Análisis presenta valores que fluctúan entre 1 y 31, con una concentración en torno a la mediana de 16. La desviación estándar de 8.56 y el coeficiente de variación de 54.07 % indican una alta dispersión y una baja homogeneidad de los datos. La asimetría igual a cero evidencia una distribución aproximadamente simétrica, sin una inclinación marcada hacia los primeros o últimos días del mes. La distribución de los valores a lo largo del rango demuestra que los análisis se realizaron en diferentes momentos del mes y no se concentraron únicamente en un periodo específico. Por todo lo anterior mencionado, el comportamiento de la variable es medianamente beneficioso, debido a que la distribución de los análisis a lo largo del mes permite contar con una cobertura temporal más amplia de las muestras estudiadas.