1. CARGA DE LIBRERÍAS Y DATOS

library(gt)
library(dplyr)
library(e1071)
datos <- read.csv(
  "C:/Users/Grace/OneDrive/Documentos/dataset_geologico_limpio_80.csv",
  header = TRUE,
  sep = ",",
  dec = "."
)

2. SELECCIÓN DE VARIABLE

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.

3. TABLAS DE DISTRIBUCIÓN DE FRECUENCIAS

Tabla sin agrupar

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

Justificación de la agrupación y aplicación de Sturges

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.

Tabla agrupada cada tres días

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

4. GRÁFICAS DE DISTRIBUCIÓN DE FRECUENCIAS

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"
)

5. INDICADORES ESTADÍSTICOS

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

Valores atípicos

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

6. CONCLUSIÓN

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.