1. CARGA DE DATOS Y LIBRERÍAS

# CARGA DE 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
library(knitr)
library(e1071)
library(moments)
## 
## Adjuntando el paquete: 'moments'
## The following objects are masked from 'package:e1071':
## 
##     kurtosis, moment, skewness
# Cargar datos
datos <- read.csv(
  "C:/Users/arian/OneDrive/Documentos/Universidad/3er SEMESTRE/estadistica/2026/datos/dataset_geologico_limpio_80.csv",
  header = TRUE,
  sep = ",",
  dec = ".",
  stringsAsFactors = FALSE
)

2. SELECCION DE VARIABLE

# Extraer variable
peso_raw<- datos$WEIGHT
cat("Primeros valores de Pesos de cada muestra:\n")
## Primeros valores de Pesos de cada muestra:
head(peso_raw)
## [1]  88.42723  88.42723        NA 463.34356        NA 500.99390
# LIMPIEZA DE LA VARIABLE
peso_raw <- as.numeric(peso_raw)
peso <- peso_raw[
  !is.na(peso_raw) &
  peso_raw > 0
]
summary(peso)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.01   22.32   41.09  110.20   85.78 9086.10
# Número de datos
n <- length(peso)
cat("Número de observaciones válidas (n):", n, "\n\n")
## Número de observaciones válidas (n): 26756

La variable WEIGHT representa el peso registrado de cada muestra de sedimento marino. Es una variable cuantitativa continua, ya que puede tomar valores numéricos, incluidos valores decimales, dentro de un intervalo. Para el análisis se eliminan los valores faltantes y se conservan las observaciones que contienen información válida de peso.

3. TABLA DE DISTRIBUCIÓN DE FRECUENCIA

TABLA DE DISTRIBUCIÓN DE CANTIDAD POR STURGES

La distribución dePesos de cada muestra se construye aplicando directamente la regla de Sturges, sin limitar previamente el número de clases. De esta manera, los valores de peso 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(peso)

# Parámetros de Sturges
minimo<- min(peso)
maximo<- max(peso)
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), "gramos\n")
##   Rango (R)            : 9086.09 gramos
cat("  Número intervalos (k):", k, "\n")
##   Número intervalos (k): 15
cat("  Amplitud clase (A)   :", round(A, 4), "gramos\n\n")
##   Amplitud clase (A)   : 605.7393 gramos
# Límites de clase
li <- seq(from = min(peso), to = max(peso) - A, by = A)
ls <- seq(from = min(peso) + A, to = max(peso), 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(peso >= li[i] & peso < ls[i])
}
n_i[length(li)] <- sum(peso >= li[length(li)] & peso<= 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     0.01  605.75  302.88 26013 97.22  26013  97.22   26756     100
## 2   605.75 1211.49  908.62   471  1.76  26484  98.98     743    2.78
## 3  1211.49 1817.23 1514.36    73  0.27  26557  99.26     272    1.02
## 4  1817.23 2422.97  2120.1    63  0.24  26620  99.49     199    0.74
## 5  2422.97 3028.71 2725.84    48  0.18  26668  99.67     136    0.51
## 6  3028.71 3634.45 3331.58    24  0.09  26692  99.76      88    0.33
## 7  3634.45 4240.19 3937.32    25  0.09  26717  99.85      64    0.24
## 8  4240.19 4845.92 4543.06    12  0.04  26729   99.9      39    0.15
## 9  4845.92 5451.66 5148.79     6  0.02  26735  99.92      27     0.1
## 10 5451.66  6057.4 5754.53     6  0.02  26741  99.94      21    0.08
## 11  6057.4 6663.14 6360.27     4  0.01  26745  99.96      15    0.06
## 12 6663.14 7268.88 6966.01     5  0.02  26750  99.98      11    0.04
## 13 7268.88 7874.62 7571.75     3  0.01  26753  99.99       6    0.02
## 14 7874.62 8480.36 8177.49     1     0  26754  99.99       3    0.01
## 15 8480.36  9086.1 8783.23     2  0.01  26756    100       2    0.01
## 16    <NA>    <NA>   TOTAL 26756   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 variablePesos de cada muestra**")
  ) %>%
  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 variablePesos de cada muestra
Límite Inferior Límite Superior Marca de Clase ni hi (%) Ni Asc Hi Asc (%) Ni Desc Hi Desc (%)
0.01 605.75 302.88 26013 97.22 26013 97.22 26756 100
605.75 1211.49 908.62 471 1.76 26484 98.98 743 2.78
1211.49 1817.23 1514.36 73 0.27 26557 99.26 272 1.02
1817.23 2422.97 2120.1 63 0.24 26620 99.49 199 0.74
2422.97 3028.71 2725.84 48 0.18 26668 99.67 136 0.51
3028.71 3634.45 3331.58 24 0.09 26692 99.76 88 0.33
3634.45 4240.19 3937.32 25 0.09 26717 99.85 64 0.24
4240.19 4845.92 4543.06 12 0.04 26729 99.9 39 0.15
4845.92 5451.66 5148.79 6 0.02 26735 99.92 27 0.1
5451.66 6057.4 5754.53 6 0.02 26741 99.94 21 0.08
6057.4 6663.14 6360.27 4 0.01 26745 99.96 15 0.06
6663.14 7268.88 6966.01 5 0.02 26750 99.98 11 0.04
7268.88 7874.62 7571.75 3 0.01 26753 99.99 6 0.02
7874.62 8480.36 8177.49 1 0 26754 99.99 3 0.01
8480.36 9086.1 8783.23 2 0.01 26756 100 2 0.01
NA NA TOTAL 26756 100 NA NA NA NA
Autor: Grupo 2

La distribución obtenida mediante la regla de Sturges genera 15 intervalos con una amplitud aproximada de 605.74 gramos. Con el propósito de facilitar la lectura y representación de la distribución, se construye una tabla simplificada utilizando una amplitud de 1000 gramos, obteniendo 9 intervalos de clase con límites más sencillos. Esta agrupación permite visualizar de manera clara la fuerte concentración de observaciones en los pesos inferiores, manteniendo todos los registros de la variable WEIGHT dentro del análisis.

TABLA DE DISTRIBUCIÓN SIMPLIFICADA

# Límites definitivos
limite_inferior <- 0
limite_superior <- 10000
A <- 1000

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

li <- limites[-length(limites)]
ls <- limites[-1]

# Número de clases
k <- length(li)

# Marca de clase
MC <- (li + ls) / 2

# Frecuencias absolutas
n_i <- numeric(k)

for (i in 1:k) {

  if (i < k) {

    n_i[i] <- sum(
      peso >= li[i] &
      peso < ls[i]
    )

  } else {

    # Último intervalo incluye el límite superior
    n_i[i] <- sum(
      peso >= li[i] &
      peso <= ls[i]
    )
  }
}

# Frecuencia relativa
h_i <- round(
  (n_i / sum(n_i)) * 100,
  2
)

# Acumuladas ascendentes
Ni_asc <- cumsum(n_i)

Hi_asc <- round(
  (Ni_asc / sum(n_i)) * 100,
  2
)

# Acumuladas descendentes
Ni_desc <- rev(cumsum(rev(n_i)))

Hi_desc <- round(
  (Ni_desc / sum(n_i)) * 100,
  2
)

# Crear tabla
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
)

# Agregar TOTAL
TablaFrecuenciasAgrupada[
  nrow(TablaFrecuenciasAgrupada) + 1,
] <- c(
  NA,
  NA,
  NA,
  sum(n_i),
  100,
  NA,
  NA,
  NA,
  NA
)

TablaFrecuenciasAgrupada
##      LI    LS   MC    ni     hi Ni_asc Hi_asc Ni_desc Hi_desc
## 1     0  1000  500 26434  98.80  26434  98.80   26756  100.00
## 2  1000  2000 1500   140   0.52  26574  99.32     322    1.20
## 3  2000  3000 2500    90   0.34  26664  99.66     182    0.68
## 4  3000  4000 3500    45   0.17  26709  99.82      92    0.34
## 5  4000  5000 4500    23   0.09  26732  99.91      47    0.18
## 6  5000  6000 5500     8   0.03  26740  99.94      24    0.09
## 7  6000  7000 6500     7   0.03  26747  99.97      16    0.06
## 8  7000  8000 7500     6   0.02  26753  99.99       9    0.03
## 9  8000  9000 8500     2   0.01  26755 100.00       3    0.01
## 10 9000 10000 9500     1   0.00  26756 100.00       1    0.00
## 11   NA    NA   NA 26756 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: peso"
  ) %>%
  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: peso
Límite inferior Límite superior Marca de clase ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
0.00 1,000.00 500.00 26,434 98.80 26,434 98.80 26,756 100.00
1,000.00 2,000.00 1,500.00 140 0.52 26,574 99.32 322 1.20
2,000.00 3,000.00 2,500.00 90 0.34 26,664 99.66 182 0.68
3,000.00 4,000.00 3,500.00 45 0.17 26,709 99.82 92 0.34
4,000.00 5,000.00 4,500.00 23 0.09 26,732 99.91 47 0.18
5,000.00 6,000.00 5,500.00 8 0.03 26,740 99.94 24 0.09
6,000.00 7,000.00 6,500.00 7 0.03 26,747 99.97 16 0.06
7,000.00 8,000.00 7,500.00 6 0.02 26,753 99.99 9 0.03
8,000.00 9,000.00 8,500.00 2 0.01 26,755 100.00 3 0.01
9,000.00 10,000.00 9,500.00 1 0.00 26,756 100.00 1 0.00
NA NA NA 26,756 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

## 4. GRÁFICAS DE DISTRIBUCIÓN DE FRECUENCIA

# Límites de la tabla simplificada
limites <- seq(
  from = 0,
  to = 10000,
  by = 1000
)

li <- limites[-length(limites)]
ls <- limites[-1]

MC <- (li + ls) / 2

k <- length(li)

# Etiquetas de los intervalos
etiquetas <- paste0(
  "[",
  li,
  " - ",
  ls,
  ")"
)

# Último intervalo cerrado
etiquetas[length(etiquetas)] <- paste0(
  "[",
  li[length(li)],
  " - ",
  ls[length(ls)],
  "]"
)
# HISTOGRAMA LOCAL - FRECUENCIAS ABSOLUTAS

hist(
  peso,
  breaks = limites,
  main = "Grafica 1: Distribucion de Cantidad del Peso
  de las Muestras de Sedimentos Marinos",
  xlab = "Peso (gramos)",
  ylab = "Cantidad (ni)",
  col = "lightcoral",
  border = "white",
  xaxt = "n",
  ylim = c(0, 2000)
)

axis(
  1,
  at = limites,
  labels = round(limites, 0),
  las = 2,
  cex.axis = 0.7
)

hist(
  peso,
  breaks = limites,
  main = "Grafica 2: Distribucion de Cantidad del Peso
  de las Muestras de Sedimentos Marinos",
  xlab = "Peso (gramos)",
  ylab = "skyblue",
  border = "black",
  xaxt = "n",
  right = FALSE,
  include.lowest = TRUE,
  ylim = c(0, max(n_i) * 1.10)
)

axis(
  1,
  at = limites,
  labels = limites,
  las = 2,
  cex.axis = 0.7
)

barplot(
  h_i,
  names.arg = etiquetas,
  main = "Grafica 3: Distribucion Porcentual Local del Peso",
  xlab = "Intervalos de Peso (gramos)",
  ylab = "Porcentaje (%)",
  col = "mediumpurple",
  border = "black",
  las = 2,
  cex.names = 0.7,
  space = 0,
  ylim = c(0, 98)
)

barplot(
  h_i,
  names.arg = etiquetas,
  main = "Grafica 4: Distribucion Global Porcentual del Peso
  de las Muestras de Sedimentos Marinos",
  xlab = "Intervalos de Peso (gramos)",
  ylab = "Porcentaje (%)",
  col = "darkorange",
  border = "black",
  las = 2,
  cex.names = 0.7,
  space = 0,
  ylim = c(0, 100)
)

# GRAFICA 5: OJIVAS COMBINADAS DE FRECUENCIAS ABSOLUTAS

# Asegurar que sean vectores numéricos
li <- as.numeric(li)
ls <- as.numeric(ls)
n_i <- as.numeric(n_i)

# Frecuencia acumulada ascendente
Ni_asc <- cumsum(n_i)

# Frecuencia acumulada descendente
Ni_desc <- rev(cumsum(rev(n_i)))

# Coordenadas de las ojivas
x_asc <- c(li[1], ls)
y_asc <- c(0, Ni_asc)

x_desc <- c(li, ls[length(ls)])
y_desc <- c(Ni_desc, 0)

# Comprobar longitudes
cat("x_asc:", length(x_asc), "\n")
## x_asc: 11
cat("y_asc:", length(y_asc), "\n")
## y_asc: 11
cat("x_desc:", length(x_desc), "\n")
## x_desc: 11
cat("y_desc:", length(y_desc), "\n")
## y_desc: 11
# Ojiva ascendente
plot(
  x_asc,
  y_asc,
  type = "b",
  main = "Grafica 5: Ojivas Combinadas de Cantidad Acumulada del Peso",
  xlab = "Peso (gramos)",
  ylab = "Cantidad Acumulada (Ni)",
  col = "blue",
  lwd = 2,
  pch = 16,
  las = 1,
  xlim = range(c(x_asc, x_desc)),
  ylim = c(0, sum(n_i))
)

# Ojiva descendente
lines(
  x_desc,
  y_desc,
  type = "b",
  col = "red",
  lwd = 2,
  pch = 16
)

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 peso de Depòsitos Marinos",
     xlab = "peso (gramos)", 
     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(peso)
boxplot(peso,
        horizontal = TRUE,
        main = "Grafica 7: Diagrama de Cajade la distribucio de cantidad de la peso en Depòsitos Marinos",
        xlab = "peso (gramos)",
        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(peso,
          breaks = c(li, maximo),
          probability = TRUE,
          main = "Grafica 8: Histograma y Diagrama de Caja Sobrepuesto",
          xlab = "peso (gramos)",
          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(peso,
        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(peso,
          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 del 
     peso de cada muestra de sedimentos marinos",
     xlab = "peso (gramos)",
     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 del \n peso de cada muestra de sedimentos marinos", : 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(peso)
maximo <- max(peso)
rango <- maximo - minimo
media <- mean(peso)
mediana <- median(peso)
moda <- as.numeric(names(sort(table(peso), decreasing = TRUE)[1]))

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


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

TablaIndicadores <- data.frame(
  Variable = "peso (%)",
  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 peso (%)   0.01 9086.1 110.2   41.09   344.91 312.9811  11.37758  180.687
# Tabla Mejorada
TablaIndicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº3**"),
    subtitle = md("Indicadores estadísticos de la variable WEIGHT (%)")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2")
  )
Tabla Nº3
Indicadores estadísticos de la variable WEIGHT (%)
Variable Minimo Maximo Media Mediana Desv_Est CV Asimetria Curtosis
peso (%) 0.01 9086.1 110.2 41.09 344.91 312.9811 11.37758 180.687
Autor: Grupo 2

OUTLIERS

# Cuartiles
Q1 <- quantile(peso, 0.25)
Q3 <- quantile(peso, 0.75)
IQR_val <- IQR(peso)

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

#Outliers
outliers <- peso[peso < limite_inferior | peso > limite_superior]
num_outliers <- length(outliers)
porcentaje_outliers <- round((num_outliers / n) * 100, 2)

TablaOutliers <- data.frame(
  num_outliers =num_outliers,
  porc_outliers = porcentaje_outliers,
  minimo = limite_inferior,
  máximo = limite_superior
)


TablaOutliers
##     num_outliers porc_outliers    minimo   máximo
## 25%         2935         10.97 -72.86029 180.9614
#Tabla Mejorada 
TablaOutliers %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº4**"),
    subtitle = md("Valores atípicos de la variable WEIGHT de sedimentos marinos (%)")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2")
  )
Tabla Nº4
Valores atípicos de la variable WEIGHT de sedimentos marinos (%)
num_outliers porc_outliers minimo máximo
2935 10.97 -72.86029 180.9614
Autor: Grupo 2

6. CONCLUSION

La variable WEIGHT fluctúa entre 0.01 y 9086.10 gramos, y sus valores giran en torno a la mediana de 41.09 gramos, con una desviación estándar de 344.91 gramos, mostrando un comportamiento altamente heterogéneo. Además, se identificaron 2935 valores atípicos, equivalentes al 10.97 % de las observaciones, según el criterio del rango intercuartílico.

Por todo lo anterior, la distribución de la variable presenta una marcada concentración en los pesos más bajos y una extensión pronunciada hacia valores elevados. Esto se refleja en una asimetría positiva de 11.38 y una curtosis elevada de 180.69, indicando una distribución fuertemente asimétrica y con presencia importante de valores extremos. Sin embargo, estos valores atípicos no deben considerarse automáticamente errores, ya que pueden corresponder a diferencias reales en la cantidad de material recolectado en cada muestra de sedimento marino. En conjunto, la variable WEIGHT presenta una distribución no uniforme, con predominio de muestras de bajo peso y una menor proporción de muestras con pesos considerablemente mayores.