1. CARGA DE DATOS Y LIBRERÍAS

# CARGA DE LIBRERÍAS
library(gt)
## Warning: package 'gt' was built under R version 4.6.1
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.6.1
## 
## 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
library(knitr)
## Warning: package 'knitr' was built under R version 4.6.1
library(e1071)
## Warning: package 'e1071' was built under R version 4.6.1
library(moments)
## 
## Adjuntando el paquete: 'moments'
## The following objects are masked from 'package:e1071':
## 
##     kurtosis, moment, skewness
# Cargar datos
datos <- read.csv(
  "~/dataset csv/dataset_geologico_limpio_80.csv",
  header = TRUE,
  sep = ",",
  dec = ".",
  stringsAsFactors = FALSE
)

2. SELECCION DE VARIABLE

# Extraer variable
latitud_raw<- datos$LATITUDE
cat("Primeros valores de LATITUDE:\n")
## Primeros valores de LATITUDE:
head(latitud_raw)
## [1] 41.10000 40.85000 41.38333 41.63333 41.35000 41.90000
# LIMPIEZA DE LA VARIABLE
latitud_raw <- as.numeric(latitud_raw)
latitud<- na.omit(latitud_raw)
summary(latitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -16.23   38.82   41.20   39.25   42.35   80.81
# Número de datos
n <- length(latitud)
cat("Número de observaciones válidas (n):", n, "\n\n")
## Número de observaciones válidas (n): 27784

La variable LATITUDE representa la posición geográfica norte-sur en la que fue recolectada cada muestra de sedimento marino. Es una variable cuantitativa continua, porque puede tomar valores decimales dentro de un intervalo. Para el análisis se eliminan los valores faltantes y se conservan únicamente las latitudes válidas, comprendidas entre −90° y 90°.

3. TABLA DE DISTRIBUCIÓN DE FRECUENCIA

TABLA DE DISTRIBUCIÓN DE CANTIDAD POR STURGES

La distribución de LATITUDE se construye aplicando directamente la regla de Sturges, sin limitar previamente el número de clases. De esta manera, los valores de latitud se organizan en intervalos de clase, permitiendo presentar la agrupación teórica recomendada de acuerdo con el tamaño de la muestra y facilitando el análisis de la ubicación norte-sur de las muestras de sedimento marino.

# Numero de datos
n <- length(latitud)

# Parámetros de Sturges
minimo<- min(latitud)
maximo<- max(latitud)
R <- maximo - minimo
k <- floor(1 + 3.3 * log10(n))
A <- R / k

cat("PARÁMETROS:\n")
## PARÁMETROS:
cat("  Rango (R)            :", round(R, 4), "grados\n")
##   Rango (R)            : 97.0458 grados
cat("  Número intervalos (k):", k, "\n")
##   Número intervalos (k): 15
cat("  Amplitud clase (A)   :", round(A, 4), "grados\n\n")
##   Amplitud clase (A)   : 6.4697 grados
# Límites de clase
li <- seq(from = min(latitud), to = max(latitud) - A, by = A)
ls <- seq(from = min(latitud) + A, to = max(latitud), by = A)
MC <- round((li + ls) / 2,2)
# Frecuencias absolutas agrupadas
n_i <- numeric(length (li))
for (i in 1:length (li)) {
  n_i[i] <- sum(latitud >= li[i] & latitud < ls[i])
}
n_i[length(li)] <- sum(latitud >= li[length(li)] & latitud<= maximo)

# Frecuencias relativas y acumuladas
h_i <- (n_i / sum(n_i)) * 100
Ni_asc <- cumsum(n_i)
Hi_asc <- round(cumsum(h_i),2)
Ni_desc <- rev(cumsum(rev(n_i)))
Hi_desc <- round(rev(cumsum(rev(h_i))),2)
# Crear tabla 
TablaFrecuenciasAgrupada <- round(data.frame(
  li, ls,MC,n_i,h_i,Ni_asc,Hi_asc,Ni_desc,Hi_desc
),2)

TablaFrecuenciasAgrupada[nrow(TablaFrecuenciasAgrupada) + 1, ] <- 
  c(NA, NA, "TOTAL", sum(n_i), round(sum(h_i), 2), NA, NA, NA, NA)

TablaFrecuenciasAgrupada
##        li    ls    MC   n_i   h_i Ni_asc Hi_asc Ni_desc Hi_desc
## 1  -16.23 -9.76   -13    12  0.04     12   0.04   27784     100
## 2   -9.76 -3.29 -6.53     0     0     12   0.04   27772   99.96
## 3   -3.29  3.18 -0.06     0     0     12   0.04   27772   99.96
## 4    3.18  9.65  6.41     9  0.03     21   0.08   27772   99.96
## 5    9.65 16.12 12.88    48  0.17     69   0.25   27763   99.92
## 6   16.12 22.59 19.35  1062  3.82   1131   4.07   27715   99.75
## 7   22.59 29.06 25.82  1882  6.77   3013  10.84   26653   95.93
## 8   29.06 35.53 32.29  2124  7.64   5137  18.49   24771   89.16
## 9   35.53    42 38.76 12443 44.78  17580  63.27   22647   81.51
## 10     42 48.47 45.23  9449 34.01  27029  97.28   10204   36.73
## 11  48.47 54.93  51.7   325  1.17  27354  98.45     755    2.72
## 12  54.93  61.4 58.17    55   0.2  27409  98.65     430    1.55
## 13   61.4 67.87 64.64   151  0.54  27560  99.19     375    1.35
## 14  67.87 74.34 71.11   220  0.79  27780  99.99     224    0.81
## 15  74.34 80.81 77.58     4  0.01  27784    100       4    0.01
## 16   <NA>  <NA> TOTAL 27784   100   <NA>   <NA>    <NA>    <NA>
# Mostrar tabla con formato mejorada

Tabla_GT <- TablaFrecuenciasAgrupada %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.º 1**"),
    subtitle = md("**Tabla de distribución de frecuencias de la variable LATITUDE**")
  ) %>%
  tab_source_note(
    source_note = md("**Autor: Grupo 2**")
  ) %>%
  cols_label(
    li = "Límite Inferior",
    ls = "Límite Superior",
    MC = "Marca de Clase",
    n_i = "ni",
    h_i = "hi (%)",
    Ni_asc = "Ni Asc",
    Hi_asc = "Hi Asc (%)",
    Ni_desc = "Ni Desc",
    Hi_desc = "Hi Desc (%)"
  ) %>%
  fmt_number(
    columns = c(li, ls, MC),
    decimals = 2
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    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),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = MC == "TOTAL"
    )
  )

Tabla_GT
Tabla N.º 1
Tabla de distribución de frecuencias de la variable LATITUDE
Límite Inferior Límite Superior Marca de Clase ni hi (%) Ni Asc Hi Asc (%) Ni Desc Hi Desc (%)
-16.23 -9.76 -13 12 0.04 12 0.04 27784 100
-9.76 -3.29 -6.53 0 0 12 0.04 27772 99.96
-3.29 3.18 -0.06 0 0 12 0.04 27772 99.96
3.18 9.65 6.41 9 0.03 21 0.08 27772 99.96
9.65 16.12 12.88 48 0.17 69 0.25 27763 99.92
16.12 22.59 19.35 1062 3.82 1131 4.07 27715 99.75
22.59 29.06 25.82 1882 6.77 3013 10.84 26653 95.93
29.06 35.53 32.29 2124 7.64 5137 18.49 24771 89.16
35.53 42 38.76 12443 44.78 17580 63.27 22647 81.51
42 48.47 45.23 9449 34.01 27029 97.28 10204 36.73
48.47 54.93 51.7 325 1.17 27354 98.45 755 2.72
54.93 61.4 58.17 55 0.2 27409 98.65 430 1.55
61.4 67.87 64.64 151 0.54 27560 99.19 375 1.35
67.87 74.34 71.11 220 0.79 27780 99.99 224 0.81
74.34 80.81 77.58 4 0.01 27784 100 4 0.01
NA NA TOTAL 27784 100 NA NA NA NA
Autor: Grupo 2

La regla de Sturges recomienda 15 clases, lo que genera límites de clase con valores decimales que, aunque son estadísticamente válidos, resultan complejos para la lectura y la comparación. Por esta razón se elabora una tabla simplificada de 10 clases con límites más sencillos, a fin de facilitar la comprensión e interpretación de la distribución. Esta simplificación no modifica la naturaleza continua de la variable.

TABLA DE DISTRIBUCIÓN SIMPLIFICADA

cat("TABLA DE FRECUENCIAS SIMPLE (AGRUPADA)\n")
## TABLA DE FRECUENCIAS SIMPLE (AGRUPADA)
# Límites extremos redondeados a múltiplos de 10
limite_inferior <- floor(minimo / 10) * 10
limite_superior <- ceiling(maximo / 10) * 10

# Amplitud de clase
A <- 10

# Límites de clase
li <- seq(from = limite_inferior,
          to = limite_superior - A,
          by = A)

ls <- seq(from = limite_inferior + A,
          to = limite_superior,
          by = A)

# Número de intervalos y rango
k <- length(li)
R <- limite_superior - limite_inferior

cat("PARÁMETROS:\n")
## PARÁMETROS:
cat("  Rango (R)            :", round(R, 4), "grados\n")
##   Rango (R)            : 110 grados
cat("  Número intervalos (k):", k, "\n")
##   Número intervalos (k): 11
cat("  Amplitud clase (A)   :", A, "grados\n\n")
##   Amplitud clase (A)   : 10 grados
# Marca de clase
MC <- round((li + ls) / 2, 2)

# Frecuencias absolutas agrupadas
n_i <- numeric(length(li))

for (i in 1:length(li)) {
  n_i[i] <- sum(latitud >= li[i] & latitud < ls[i])
}

# Corregir el último intervalo para incluir el valor máximo
n_i[length(li)] <- sum(latitud >= li[length(li)] &
                         latitud <= limite_superior)

# Frecuencias relativas y acumuladas
h_i <- round((n_i / sum(n_i)) * 100, 2)
Ni_asc <- cumsum(n_i)
Hi_asc <- round(cumsum(h_i), 2)
Ni_desc <- rev(cumsum(rev(n_i)))
Hi_desc <- round(rev(cumsum(rev(h_i))), 2)

# Crear tabla agrupada
TablaFrecuenciasAgrupada <- data.frame(
  LI = li,
  LS = ls,
  MC = MC,
  ni = n_i,
  hi = h_i,
  Ni_asc = Ni_asc,
  Hi_asc = Hi_asc,
  Ni_desc = Ni_desc,
  Hi_desc = Hi_desc
)

# Fila TOTAL
TablaFrecuenciasAgrupada[nrow(TablaFrecuenciasAgrupada) + 1, ] <-
  c(NA, NA, NA, sum(n_i), round(sum(h_i), 1), NA, NA, NA, NA)

# Mostrar tabla
TablaFrecuenciasAgrupada
##     LI  LS  MC    ni     hi Ni_asc Hi_asc Ni_desc Hi_desc
## 1  -20 -10 -15    12   0.04     12   0.04   27784  100.01
## 2  -10   0  -5     0   0.00     12   0.04   27772   99.97
## 3    0  10   5     9   0.03     21   0.07   27772   99.97
## 4   10  20  15  1074   3.87   1095   3.94   27763   99.94
## 5   20  30  25  2642   9.51   3737  13.45   26689   96.07
## 6   30  40  35  4267  15.36   8004  28.81   24047   86.56
## 7   40  50  45 19034  68.51  27038  97.32   19780   71.20
## 8   50  60  55   324   1.17  27362  98.49     746    2.69
## 9   60  70  65   417   1.50  27779  99.99     422    1.52
## 10  70  80  75     3   0.01  27782 100.00       5    0.02
## 11  80  90  85     2   0.01  27784 100.01       2    0.01
## 12  NA  NA  NA 27784 100.00     NA     NA      NA      NA
library(gt)

TablaFrecuenciasAgrupada_gt <- TablaFrecuenciasAgrupada %>%
  gt() %>%
  tab_header(
    title = md("**Tabla de distribución de frecuencias agrupada**"),
    subtitle = "Variable: Latitud"
  ) %>%
  cols_label(
    LI = "Límite inferior",
    LS = "Límite superior",
    MC = "Marca de clase",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_desc = "Ni ↓",
    Hi_desc = "Hi ↓ (%)"
  ) %>%
  fmt_number(
    columns = c(LI, LS, MC, hi, Hi_asc, Hi_desc),
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(ni, Ni_asc, Ni_desc),
    decimals = 0
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = is.na(LI)
    )
  ) %>%
  tab_options(
    table.font.size = px(13),
    heading.title.font.size = px(18),
    heading.subtitle.font.size = px(14),
    table.width = pct(100)
  )

TablaFrecuenciasAgrupada_gt
Tabla de distribución de frecuencias agrupada
Variable: Latitud
Límite inferior Límite superior Marca de clase ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
−20.00 −10.00 −15.00 12 0.04 12 0.04 27,784 100.01
−10.00 0.00 −5.00 0 0.00 12 0.04 27,772 99.97
0.00 10.00 5.00 9 0.03 21 0.07 27,772 99.97
10.00 20.00 15.00 1,074 3.87 1,095 3.94 27,763 99.94
20.00 30.00 25.00 2,642 9.51 3,737 13.45 26,689 96.07
30.00 40.00 35.00 4,267 15.36 8,004 28.81 24,047 86.56
40.00 50.00 45.00 19,034 68.51 27,038 97.32 19,780 71.20
50.00 60.00 55.00 324 1.17 27,362 98.49 746 2.69
60.00 70.00 65.00 417 1.50 27,779 99.99 422 1.52
70.00 80.00 75.00 3 0.01 27,782 100.00 5 0.02
80.00 90.00 85.00 2 0.01 27,784 100.01 2 0.01
NA NA NA 27,784 100.00 NA NA NA NA
TablaFrecuenciasAgrupada <- data.frame(
  Intervalo = paste0("[", li, " - ", ls, ")"),
  LI = li,
  LS = ls,
  MC = MC,
  ni = n_i,
  hi = h_i,
  Ni_asc = Ni_asc,
  Hi_asc = Hi_asc,
  Ni_desc = Ni_desc,
  Hi_desc = Hi_desc
)

TablaFrecuenciasAgrupada[nrow(TablaFrecuenciasAgrupada) + 1, ] <-
  c("TOTAL", NA, NA, NA, sum(n_i), round(sum(h_i), 1), NA, NA, NA, NA)

4. GRÁFICAS DE DISTRIBUCIÓN DE FRECUENCIA

## HISTOGRAMA LOCAL - FRECUENCIAS ABSOLUTAS
hist(latitud,
     breaks = c(li, limite_superior),
     main = "Grafica 1: Distribucion de Cantidad de la Latitud 
     de Depositos Marinos",
     xlab = "Latitud (grados)",
     ylab = "Cantidad (ni)",
     col = "lightcoral",
     border = "white",
     xaxt = "n",
     ylim = c(0, max(n_i)*1.2))

axis(1,
     at = c(li, maximo),
     labels = round(c(li, maximo),2),
     las = 2,
     cex.axis = 0.7)

# HISTOGRAMA GLOBAL - FRECUENCIAS ABSOLUTAS
hist(latitud,
     breaks = c(li, limite_superior),
     main = "Grafica 2: Distribucion de Cantidad de 
     la Latitud de Depositos Marinos",
     xlab = "Latitud (grados)",
     ylab = "Cantidad (ni)",
     col = "steelblue",
     border = "white",
     xaxt = "n",
     ylim = c(0,n))

axis(1,
     at = c(li, maximo),
     labels = round(c(li, maximo),2),
     las = 2,
     cex.axis = 0.7)

# HISTOGRAMA LOCAL - FRECUENCIAS RELATIVAS
# Etiquetas de los intervalos
etiquetas <- paste0("[", round(li,2), " - ", round(ls,2), ")")

bp <- barplot(h_i,
              main = "Grafica 3: Distribucion de Porcentaje de 
              la Latitud de Depositos Marinos",
              xlab = "Limites de Clase",
              ylab = "Porcentaje (%)",
              col = "mediumpurple",
              border = "white",
              names.arg = etiquetas,
              las = 2,
              cex.names = 0.7,
              space = 0,
              ylim = c(0,max(h_i)*1.2))

axis(1, at = bp, labels = etiquetas, las = 2, cex.axis = 0.7)
box()

# HISTOGRAMA GLOBAL - FRECUENCIAS RELATIVAS

bp <- barplot(h_i,
              main = "Grafica 4: Distribucion de Porcentaje de la Latitud de Depositos Marinos",
              xlab = "Limites de Clase",
              ylab = "Porcentaje (%)",
              col = "darkorange",
              border = "white",
              names.arg = etiquetas,
              las = 2,
              cex.names = 0.7,
              space = 0,
              ylim = c(0,100))

axis(1, at = bp, labels = etiquetas, las = 2, cex.axis = 0.7)
box()

# OJIVAS - FRECUENCIAS ABSOLUTAS
plot(MC, Ni_asc,
     type = "b",
     main = "Grafica 5: Ojivas Combinadas de Cantidad acumulada de 
     la latitud de Depòsitos Marinos",
     xlab = "latitud (grados)",
     ylab = "Cantidad Acumulada (NI)",
     col = "blue",
     lwd = 2,pch = 16,cex = 1.2,las = 1,
     ylim = c(0, n))

lines(MC, Ni_desc,
      type = "b",col = "red",
      lwd = 2,pch = 16,cex = 1.2)

legend("right",
       legend = c("Ascendente", "Descendente"), 
       col = c("blue", "red"),lty = 1,
       lwd = 2,pch = 16,bty = "n")
grid(col = "gray", lty = "dotted")

# OJIVAS - FRECUENCIAS RELATIVAS
plot(MC, Hi_asc,
     type = "b",
     main = "Grafica 6: Ojivas Combinadas de Cantidad acumulada 
     de la latitud de Depòsitos Marinos",
     xlab = "latitud (grados)", 
     ylab = "Cantidad Acumulada (HI)",
     col = "blue",
     lwd = 2,pch = 16,cex = 1.2,las = 1,ylim = c(0, 100))

lines(MC, Hi_desc,
      type = "b",col = "red",
      lwd = 2,pch = 16,cex = 1.2)

legend("right",
       legend = c("Ascendente (%)", "Descendente (%)"),
       col = c("blue", "red"),lty = 1,
       lwd = 2, pch = 16, bty = "n")
grid(col = "gray", lty = "dotted")

# DIAGRAMA DE CAJA
media <- mean(latitud)
boxplot(latitud,
        horizontal = TRUE,
        main = "Grafica 7: Diagrama de Cajade la distribucio de cantidad de la latitud en Depòsitos Marinos",
        xlab = "latitud (grados)",
        col = "lightgreen",
        border = "darkgreen",
        outcol = "red",
        outpch = 16,
        las = 1)
points(media, 1, pch = 23, bg = "blue", cex = 1.5)

# GRAFICA 8: HISTOGRAMA CON DIAGRAMA DE CAJA SOBREPUESTO

# Histograma
h <- hist(latitud,
          breaks = c(li, maximo),
          probability = TRUE,
          main = "Grafica 8: Histograma y Diagrama de Caja Sobrepuesto",
          xlab = "Latitud (grados)",
          ylab = "Densidad",
          col = "lightgray",
          border = "black",
          xaxt = "n")

axis(1,
     at = c(li, maximo),
     labels = round(c(li, maximo),2),
     las = 2,
     cex.axis = 0.7)

# Posición vertical donde aparecerá la caja
altura_caja <- max(h$density) * 0.5

# Boxplot horizontal sobrepuesto
boxplot(latitud,
        horizontal = TRUE,
        add = TRUE,
        at = altura_caja,
        axes = FALSE,
        boxwex = max(h$density) * 0.75,
        col = rgb(0, 0.75, 1, 0.5),
        border = "black",
        outline = TRUE)

grid(col = "gray", lty = "dotted")

# Histograma usando porcentajes reales
h <- hist(latitud,
          breaks = c(li, maximo),
          plot = FALSE)

# Convertir frecuencias absolutas a porcentajes
h$counts <- h_i

# Dibujar histograma con barras en porcentaje
plot(h,
     freq = TRUE,
     main = "Grafica 9: Poligono de Frecuencias Relativas de la Latitud",
     xlab = "Latitud (grados)",
     ylab = "Porcentaje (%)",
     col = "white",
     border = "black",
     xaxt = "n",
     ylim = c(0, max(h_i) * 1.2))
## Warning in plot.histogram(h, freq = TRUE, main = "Grafica 9: Poligono de
## Frecuencias Relativas de la Latitud", : the AREAS in the plot are wrong --
## rather use 'freq = FALSE'
axis(1,
     at = c(li, maximo),
     labels = round(c(li, maximo), 2),
     las = 2,
     cex.axis = 0.7)

# Agregar puntos extremos para cerrar el polígono
MC_pol <- c(MC[1] - A, MC, MC[length(MC)] + A)
h_i_pol <- c(0, h_i, 0)

lines(MC_pol,
      h_i_pol,
      type = "b",
      lwd = 3,
      pch = 16,
      col = "blue")

grid(col = "gray", lty = "dotted")

5. INDICADORES ESTADÍSTICOS

# Cálculo de indicadores

minimo <- min(latitud)
maximo <- max(latitud)
rango <- maximo - minimo
media <- mean(latitud)
mediana <- median(latitud)
moda <- as.numeric(names(sort(table(latitud), decreasing = TRUE)[1]))

varianza <- var(latitud)
desviacion_estandar <- sd(latitud)
rango <- range(latitud)
coeficiente_variacion <- (desviacion_estandar / media) * 100


asimetria <- skewness(latitud)
curtosis <- kurtosis(latitud)

TablaIndicadores <- data.frame(
  Variable = "Latitud (%)",
  Minimo = round(minimo,2),
  Maximo = round(maximo,2),
  Media = round(media,2),
  Mediana = round(mediana,2),
  Desv_Est = round(desviacion_estandar,2),
  CV = coeficiente_variacion,
  Asimetria = asimetria,
  Curtosis = curtosis
)

TablaIndicadores
##      Variable Minimo Maximo Media Mediana Desv_Est       CV Asimetria Curtosis
## 1 Latitud (%) -16.23  80.81 39.25    41.2     7.27 18.51402  -0.55677  8.71737
# Tabla Mejorada
TablaIndicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº3**"),
    subtitle = md("Indicadores estadísticos de la variable Latitud (%)")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2")
  )
Tabla Nº3
Indicadores estadísticos de la variable Latitud (%)
Variable Minimo Maximo Media Mediana Desv_Est CV Asimetria Curtosis
Latitud (%) -16.23 80.81 39.25 41.2 7.27 18.51402 -0.55677 8.71737
Autor: Grupo 2

OUTLIERS

# ============================================================
# OUTLIERS
# ============================================================

# Cuartiles e IQR
Q1 <- quantile(latitud, 0.25, na.rm = TRUE)
Q3 <- quantile(latitud, 0.75, na.rm = TRUE)
IQR_val <- IQR(latitud, na.rm = TRUE)

# Límites para detectar outliers
limite_inferior <- Q1 - 1.5 * IQR_val
limite_superior <- Q3 + 1.5 * IQR_val

# Outliers a la izquierda y derecha
outliers_izquierda <- latitud[latitud < limite_inferior]
outliers_derecha <- latitud[latitud > limite_superior]

# Todos los outliers
outliers <- latitud[
  latitud < limite_inferior |
  latitud > limite_superior
]

# Cantidades
num_izquierda <- length(outliers_izquierda)
num_derecha <- length(outliers_derecha)
num_outliers <- length(outliers)

# Porcentaje total de outliers
porcentaje_outliers <- round(
  (num_outliers / length(latitud)) * 100,
  2
)

# Tabla resumen
TablaOutliers <- data.frame(
  `Outliers izquierda` = num_izquierda,
  `Outliers derecha` = num_derecha,
  `Total de outliers` = num_outliers,
  `Porcentaje (%)` = porcentaje_outliers,
  check.names = FALSE
)

TablaOutliers
##   Outliers izquierda Outliers derecha Total de outliers Porcentaje (%)
## 1               4264              755              5019          18.06
# ============================================================
# TABLA GT DE OUTLIERS
# ============================================================

library(gt)

TablaOutliers %>%
  gt() %>%
  tab_header(
    title = "Tabla de Valores Atípicos de LATITUDE",
    subtitle = "Distribución de outliers según su ubicación"
  ) %>%
  cols_align(
    align = "center",
    columns = everything()
  ) %>%
  fmt_number(
    columns = c(
      `Outliers izquierda`,
      `Outliers derecha`,
      `Total de outliers`
    ),
    decimals = 0
  ) %>%
  fmt_number(
    columns = `Porcentaje (%)`,
    decimals = 2
  )
Tabla de Valores Atípicos de LATITUDE
Distribución de outliers según su ubicación
Outliers izquierda Outliers derecha Total de outliers Porcentaje (%)
4,264 755 5,019 18.06

6. CONCLUSION

La variable LATITUDE presenta valores comprendidos entre −16.23° y 80.81°, con una media de 39.25° y una mediana de 41.20°, lo que indica que gran parte de las muestras se concentra alrededor de latitudes cercanas a los 40°. La desviación estándar de 7.27° y el coeficiente de variación de 18.51 % muestran una dispersión moderada de las ubicaciones respecto a su valor central.

La distribución presenta una asimetría negativa moderada de −0.56, lo que indica una ligera extensión hacia las latitudes más bajas. Asimismo, la curtosis de 8.72 evidencia una distribución con una concentración marcada alrededor de determinados valores y con observaciones alejadas del centro. La presencia de valores atípicos no implica necesariamente errores, ya que LATITUDE es una coordenada geográfica y estos registros pueden corresponder a muestras recolectadas en zonas geográficamente alejadas de aquellas donde se concentra la mayoría de los datos. En conjunto, la variable muestra que las muestras de sedimentos marinos no están distribuidas uniformemente según la latitud, sino que presentan una mayor concentración en determinadas franjas geográficas