1. CARGA DE LIBRERÍAS Y DATOS

library(gt)
library(dplyr)
library(e1071)
# Cargar el conjunto de datos
datos <- read.csv(
  "C:/Users/Grace/Downloads/dataset_geologico_limpio_80.csv",
  header = TRUE,
  sep = ",",
  dec = "."
)

2. SELECCIÓN DE VARIABLE

# Extraer la variable YEAR_COLL y convertirla a años enteros
year <- round(as.numeric(datos$YEAR_COLL))

# Eliminar valores faltantes y años posteriores a 2024
year <- na.omit(year)
year <- year[year <= 2024]

# Número de observaciones válidas
n <- length(year)
n
## [1] 27438

La variable YEAR_COLL representa el año en que fue recolectada cada muestra de sedimento marino. Es una variable cuantitativa discreta, porque se registra mediante años completos y, por tanto, toma valores enteros contables. La limpieza elimina los datos faltantes y los años posteriores a 2024. Aunque posteriormente se agrupe para facilitar su presentación, la naturaleza de la variable continúa siendo discreta.

3. TABLAS DE DISTRIBUCIÓN DE FRECUENCIAS

Tabla sin agrupar

Primero se presenta la distribución original de YEAR_COLL, conservando cada año observado como una categoría independiente.

# Frecuencias de cada año observado
frecuencia_original <- as.data.frame(table(year))
names(frecuencia_original) <- c("Año", "ni")

frecuencia_original$Año <- as.integer(
  as.character(frecuencia_original$Año)
)
frecuencia_original$hi <- frecuencia_original$ni / n * 100
frecuencia_original$Ni_Asc <- cumsum(frecuencia_original$ni)
frecuencia_original$Hi_Asc <- cumsum(frecuencia_original$hi)

tabla_original <- frecuencia_original %>%
  mutate(
    Año = as.character(Año),
    hi = round(hi, 2),
    Hi_Asc = round(Hi_Asc, 2)
  )

fila_total_original <- data.frame(
  Año = "TOTAL",
  ni = n,
  hi = 100,
  Ni_Asc = NA,
  Hi_Asc = NA
)

tabla_original <- bind_rows(tabla_original, fila_total_original)
TablaOriginal <- tabla_original %>%
  gt() %>%
  cols_label(
    Año = "Año",
    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 original del año de recolección**"
    )
  ) %>%
  tab_source_note(
    source_note = md("__Autor: Grupo 2__")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    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)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Año == "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.
TablaOriginal
Tabla N.º 1
Distribución de frecuencias original del año de recolección
Año ni hi (%) Ni asc. Hi asc. (%)
1945 1 0,00 1 0,00
1947 1 0,00 2 0,01
1950 1 0,00 3 0,01
1953 1 0,00 4 0,01
1955 23 0,08 27 0,10
1956 1 0,00 28 0,10
1957 119 0,43 147 0,54
1958 4 0,01 151 0,55
1959 51 0,19 202 0,74
1960 28 0,10 230 0,84
1961 130 0,47 360 1,31
1962 85 0,31 445 1,62
1963 443 1,61 888 3,24
1964 1.110 4,05 1.998 7,28
1965 653 2,38 2.651 9,66
1966 270 0,98 2.921 10,65
1967 173 0,63 3.094 11,28
1968 440 1,60 3.534 12,88
1969 295 1,08 3.829 13,96
1970 229 0,83 4.058 14,79
1971 14 0,05 4.072 14,84
1972 13 0,05 4.085 14,89
1973 25 0,09 4.110 14,98
1974 23 0,08 4.133 15,06
1975 14 0,05 4.147 15,11
1976 18 0,07 4.165 15,18
1977 78 0,28 4.243 15,46
1978 193 0,70 4.436 16,17
1979 48 0,17 4.484 16,34
1980 173 0,63 4.657 16,97
1981 625 2,28 5.282 19,25
1982 883 3,22 6.165 22,47
1983 845 3,08 7.010 25,55
1984 596 2,17 7.606 27,72
1985 271 0,99 7.877 28,71
1986 223 0,81 8.100 29,52
1987 789 2,88 8.889 32,40
1988 528 1,92 9.417 34,32
1989 800 2,92 10.217 37,24
1990 636 2,32 10.853 39,55
1991 853 3,11 11.706 42,66
1992 788 2,87 12.494 45,54
1993 1.181 4,30 13.675 49,84
1994 552 2,01 14.227 51,85
1995 773 2,82 15.000 54,67
1996 1.925 7,02 16.925 61,68
1997 1.176 4,29 18.101 65,97
1998 1.169 4,26 19.270 70,23
1999 811 2,96 20.081 73,19
2000 752 2,74 20.833 75,93
2001 552 2,01 21.385 77,94
2002 1.047 3,82 22.432 81,76
2003 239 0,87 22.671 82,63
2004 663 2,42 23.334 85,04
2005 443 1,61 23.777 86,66
2006 254 0,93 24.031 87,58
2007 440 1,60 24.471 89,19
2008 263 0,96 24.734 90,15
2009 154 0,56 24.888 90,71
2010 817 2,98 25.705 93,68
2011 595 2,17 26.300 95,85
2012 739 2,69 27.039 98,55
2013 314 1,14 27.353 99,69
2014 37 0,13 27.390 99,83
2015 10 0,04 27.400 99,86
2016 4 0,01 27.404 99,88
2017 9 0,03 27.413 99,91
2018 5 0,02 27.418 99,93
2019 3 0,01 27.421 99,94
2020 4 0,01 27.425 99,95
2021 2 0,01 27.427 99,96
2022 4 0,01 27.431 99,97
2023 5 0,02 27.436 99,99
2024 2 0,01 27.438 100,00
TOTAL 27.438 100,00

Autor: Grupo 2

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

La tabla sin agrupar contiene una fila por cada año diferente observado. Debido a la cantidad de filas, su lectura y comparación resultan poco prácticas. 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) \]

# Rango de la variable
R <- max(year) - min(year)

# Número teórico de clases según Sturges
k_teorico <- 1 + 3.322 * log10(n)
k_sturges <- ceiling(k_teorico)

# Amplitud teórica exacta y amplitud redondeada
A_teorica <- R / k_sturges
A_redondeada <- ceiling(A_teorica)

cat("Número de observaciones =", n, "\n")
## Número de observaciones = 27438
cat("Número teórico de clases =", round(k_teorico, 2), "\n")
## Número teórico de clases = 15.74
cat("Número recomendado de clases =", k_sturges, "\n")
## Número recomendado de clases = 16
cat("Rango =", R, "años\n")
## Rango = 79 años
cat("Amplitud teórica =", round(A_teorica, 2), "años\n")
## Amplitud teórica = 4.94 años
cat("Amplitud redondeada =", A_redondeada, "años\n")
## Amplitud redondeada = 5 años

Sturges proporciona una recomendación teórica y una amplitud poco práctica para representar años. Por ello, con el propósito de obtener intervalos fáciles de identificar, comparar e interpretar, se adopta una amplitud convencional de 10 años. En consecuencia, los datos se presentan por décadas. Esta agrupación es únicamente una estrategia de presentación y no convierte la variable en continua.

Tabla agrupada por décadas

# Intervalos de diez años
orden <- c(
  "1940-1949",
  "1950-1959",
  "1960-1969",
  "1970-1979",
  "1980-1989",
  "1990-1999",
  "2000-2009",
  "2010-2019",
  "2020-2024"
)

clasificacion <- cut(
  year,
  breaks = c(1940, 1950, 1960, 1970, 1980, 1990,
             2000, 2010, 2020, 2025),
  right = FALSE,
  labels = orden
)

# Verificar si algún año quedó fuera de los intervalos definidos
if (any(is.na(clasificacion))) {
  warning("Existen años fuera de los intervalos definidos.")
}

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

fila_total <- data.frame(
  Intervalo = "TOTAL",
  ni = total,
  hi = 100,
  Ni_Asc = NA,
  Hi_Asc = NA,
  Ni_Desc = NA,
  Hi_Desc = NA
)

tabla_final <- bind_rows(tabla_final, fila_total)
TablaAgrupada <- tabla_final %>%
  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_missing(columns = everything(), missing_text = "") %>%
  tab_header(
    title = md("**Tabla N.º 2**"),
    subtitle = md(
      "**Distribución de frecuencias del año de recolección agrupada por décadas**"
    )
  ) %>%
  tab_source_note(
    source_note = md("__Autor: Grupo 2__")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    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)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Intervalo == "TOTAL")
  )

TablaAgrupada
Tabla N.º 2
Distribución de frecuencias del año de recolección agrupada por décadas
Intervalo ni hi (%) Ni asc. Hi asc. (%) Ni desc. Hi desc. (%)
1940-1949 2 0.01 2 0.01 27438 100.00
1950-1959 200 0.73 202 0.74 27436 99.99
1960-1969 3627 13.22 3829 13.96 27236 99.26
1970-1979 655 2.39 4484 16.34 23609 86.04
1980-1989 5733 20.89 10217 37.24 22954 83.66
1990-1999 9864 35.95 20081 73.19 17221 62.76
2000-2009 4807 17.52 24888 90.71 7357 26.81
2010-2019 2533 9.23 27421 99.94 2550 9.29
2020-2024 17 0.06 27438 100.00 17 0.06
TOTAL 27438 100.00



Autor: Grupo 2

4. GRÁFICAS DE DISTRIBUCIÓN DE FRECUENCIAS

# Diagrama de barras de frecuencia absoluta con escala local
par(mar = c(8, 4, 5, 2) + 0.1)

posiciones <- barplot(
  as.numeric(ni),
  space = 0.10,
  col = "gray",
  border = "black",
  main = "Gráfica N.º1: Distribución de cantidad del\nAño de Recolección de Sedimentos Marinos",
  xlab = "",
  ylab = "Cantidad",
  names.arg = FALSE,
  xaxt = "n"
)

text(
  posiciones,
  par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
  labels = orden,
  srt = 45,
  adj = 1,
  xpd = TRUE,
  cex = 0.78
)
mtext("Intervalos de Año", side = 1, line = 5.8)

par(mar = c(5, 4, 4, 2) + 0.1)
# Diagrama de barras de frecuencia absoluta con escala global
par(mar = c(8, 4, 5, 2) + 0.1)

posiciones <- barplot(
  as.numeric(ni),
  space = 0.10,
  col = "gray",
  border = "black",
  main = "Gráfica N.º2: Distribución de cantidad del\nAño de Recolección de Sedimentos Marinos",
  xlab = "",
  ylab = "Cantidad",
  names.arg = FALSE,
  xaxt = "n",
  ylim = c(0, total),
  xaxs = "i"
)

text(
  posiciones,
  par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
  labels = orden,
  srt = 45,
  adj = 1,
  xpd = TRUE,
  cex = 0.78
)
mtext("Intervalos de Año", side = 1, line = 5.8)

par(mar = c(5, 4, 4, 2) + 0.1)
# Diagrama de barras de frecuencia relativa con escala local
par(mar = c(8, 4, 5, 2) + 0.1)

posiciones <- barplot(
  hi,
  space = 0.10,
  col = "gray",
  border = "black",
  main = "Gráfica N.º3: Distribución de cantidad en porcentaje del\nAño de Recolección de Sedimentos Marinos",
  xlab = "",
  ylab = "Porcentaje",
  names.arg = FALSE,
  xaxt = "n"
)

text(
  posiciones,
  par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
  labels = orden,
  srt = 45,
  adj = 1,
  xpd = TRUE,
  cex = 0.78
)
mtext("Intervalos de Año", side = 1, line = 5.8)

par(mar = c(5, 4, 4, 2) + 0.1)
# Diagrama de barras de frecuencia relativa con escala global
par(mar = c(8, 4, 5, 2) + 0.1)

posiciones <- barplot(
  hi,
  space = 0.10,
  col = "gray",
  border = "black",
  main = "Gráfica N.º4: Distribución de cantidad en porcentaje del\nAño de Recolección de Sedimentos Marinos",
  xlab = "",
  ylab = "Porcentaje",
  names.arg = FALSE,
  xaxt = "n",
  ylim = c(0, 100),
  xaxs = "i"
)

text(
  posiciones,
  par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
  labels = orden,
  srt = 45,
  adj = 1,
  xpd = TRUE,
  cex = 0.78
)
mtext("Intervalos de Año", side = 1, line = 5.8)

par(mar = c(5, 4, 4, 2) + 0.1)
# Ojiva combinada de frecuencias absolutas: solo puntos
x_clases <- seq_along(orden)

# El margen inferior permite mostrar las etiquetas diagonales
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 Año de Recolección (Ni)",
  ylab = "Cantidad acumulada",
  xlab = "",
  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)
# Ojiva combinada de frecuencias relativas: solo puntos
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 Año de Recolección (Hi)",
  ylab = "Porcentaje acumulado",
  xlab = "",
  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)
# Diagrama de caja independiente
boxplot(
  year,
  horizontal = TRUE,
  main = "Gráfica N.º7: Distribución de cantidad del\nAño de Recolección de Sedimentos Marinos",
  xlab = "Año",
  col = "lightblue"
)

5. INDICADORES ESTADÍSTICOS

media <- mean(year)
mediana <- median(year)
desv <- sd(year)
CV <- desv / media * 100
asimetria <- skewness(year)
curtosis <- kurtosis(year)
minimo <- min(year)
maximo <- max(year)

TablaIndicadores <- data.frame(
  Variable = "YEAR_COLL",
  Mínimo = minimo,
  Máximo = maximo,
  Media = round(media, 0),
  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
)
TablaIndicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.º 3**"),
    subtitle = md(
      "**Indicadores estadísticos de la variable Año de Recolección**"
    )
  ) %>%
  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,
    table_body.hlines.color = "gray"
  )
Tabla N.º 3
Indicadores estadísticos de la variable Año de Recolección
Variable Mínimo Máximo Media Mediana Desviación_estándar CV Asimetría Curtosis
YEAR_COLL 1945 2024 1991 1994 13.79 0.69 -0.64 -0.28
Autor: Grupo 2

Valores atípicos

outliers <- boxplot.stats(year)$out
num_outliers <- length(outliers)

TablaOutliers <- data.frame(
  Cantidad_de_atípicos = num_outliers,
  Mínimo = if (num_outliers > 0) min(outliers) else NA,
  Máximo = if (num_outliers > 0) max(outliers) else NA,
  check.names = FALSE
)
TablaOutliers %>%
  gt() %>%
  fmt_missing(columns = everything(), missing_text = "No aplica") %>%
  tab_header(
    title = md("**Tabla N.º 4**"),
    subtitle = md(
      "**Valores atípicos de la variable Año de Recolección**"
    )
  ) %>%
  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,
    table_body.hlines.color = "gray"
  )
Tabla N.º 4
Valores atípicos de la variable Año de Recolección
Cantidad_de_atípicos Mínimo Máximo
147 1945 1957
Autor: Grupo 2

6. CONCLUSIÓN

La variable Año de Recolección presenta valores que fluctúan entre 1945 y 2024, con una concentración en torno a la mediana de 1994. La desviación estándar de 13.79 y el coeficiente de variación de 0.69 % indican una baja dispersión y una alta homogeneidad de los datos. La asimetría negativa (-0.64) evidencia la presencia de registros antiguos que influyen en el extremo izquierdo de la distribución. La acumulación de valores se encuentra en la parte alta de la variable, lo que demuestra que la mayoría de las recolecciones se realizaron en periodos recientes. Por todo lo anterior mencionado, el comportamiento de la variable es medianamente beneficioso, debido a que los registros modernos cuentan con información geológica más confiable y mejor documentada.