1. CARGA DE LIBRERÍAS Y DATOS

# CARGA DE LIBRERÍAS
library(gt)
library(dplyr)
library(knitr)
library(e1071)
library(moments)
# CARGA DE DATOS
datos <- read.csv("C:/Users/Grace/OneDrive/Documentos/dataset_geologico_limpio_80.csv",
                  header = TRUE,
                  sep = ",",
                  dec = ".",
                  stringsAsFactors = FALSE)

2. SELECCIÓN DE LA VARIABLE

# LIMPIEZA DE LA VARIABLE
limo_raw <- as.numeric(gsub("[^0-9.-]", "", datos$SILT_PCT))

limo <- na.omit(limo_raw)
limo <- limo[limo >= 0 & limo <= 100]

# Número de datos
n <- length(limo)

La variable SILT_PCT representa el porcentaje de limo presente en cada muestra de sedimento marino. Es una variable cuantitativa continua, porque puede tomar cualquier valor decimal dentro de un intervalo. Para el análisis se eliminan los valores faltantes y se conservan únicamente los porcentajes comprendidos entre 0 y 100.

3. TABLA DE DISTRIBUCIÓN DE FRECUENCIA

TABLA DE DISTRIBUCIÓN DE CANTIDAD POR STURGES

La primera distribución se construye aplicando directamente la regla de Sturges, sin limitar previamente el número de clases. De esta manera se presenta la agrupación teórica recomendada de acuerdo con el tamaño de la muestra.

# Número de datos
n <- length(limo)

k_teorico <- 1 + 3.322 * log10(n)
k_sturges <- ceiling(k_teorico)

# Según recomendación de la asignatura se utilizan
# máximo 10 clases para facilitar la interpretación gráfica

# Mínimo y máximo
minimo <- min(limo)
maximo <- max(limo)

# Rango y amplitud
R <- maximo - minimo
A <- R / k_sturges

# Límites Inferiores y Superiores
# Los limites exactos se usan para contar; los redondeados solo para mostrar.
cortes <- seq(from = minimo, to = maximo, length.out = k_sturges + 1)
Li_calc <- cortes[-length(cortes)]
Ls_calc <- cortes[-1]

Li <- round(Li_calc, 2)
Ls <- round(Ls_calc, 2)

# Marca de clase
MC <- round((Li_calc + Ls_calc)/2, 2)

# Frecuencia absoluta
ni <- numeric(length(Li_calc))
for(i in 1:length(Li_calc)){
  if(i == length(Li_calc)){
    ni[i] <- sum(limo >= Li_calc[i] & limo <= Ls_calc[i])
  } else {
    ni[i] <- sum(limo >= Li_calc[i] & limo < Ls_calc[i])
  }
}

if(sum(ni) != n){
  stop("La suma de frecuencias no coincide con el tamaño muestral.")
}

# Frecuencia relativa
# Se calcula sin redondear para evitar que los acumulados superen 100 %
hi_calc <- (ni / n) * 100
hi <- round(hi_calc, 2)

# Frecuencias acumuladas
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- round(cumsum(hi_calc), 2)
Hidsc <- round(rev(cumsum(rev(hi_calc))), 2)

# Tabla Sturges
TDLimo <- round(data.frame(
  Li, Ls, MC, ni, hi, Niasc, Nidsc, Hiasc, Hidsc
), 2)

# Fila TOTAL
fila_total <- data.frame(
  Li = "TOTAL",
  Ls = "",
  MC = "",
  ni = sum(TDLimo$ni),
  hi = round(sum(hi_calc), 2),
  Niasc = "",
  Nidsc = "",
  Hiasc = "",
  Hidsc = ""
)

TDLimo_p <- rbind(TDLimo, fila_total)

cat("Numero teorico de clases =", round(k_teorico, 2), "\n")
## Numero teorico de clases = 15.74
cat("Numero de clases segun Sturges =", k_sturges, "\n")
## Numero de clases segun Sturges = 16
cat("Amplitud teorica =", round(A, 2), "\n")
## Amplitud teorica = 6.25

TABLA FINAL STURGES CON GT

TablaLimo <- TDLimo_p %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº1**"),
    subtitle = md("Tabla de distribución de cantidad de Limo (%)<br>por regla de Sturges")
  ) %>%
  tab_source_note(source_note = md("Autor: Grupo 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)
  ) %>%
  tab_style(style = cell_text(weight = "bold"), 
            locations = cells_body(rows = Li == "TOTAL"))
TablaLimo
Tabla Nº1
Tabla de distribución de cantidad de Limo (%)
por regla de Sturges
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 6.25 3.12 11336 41.55 11336 27281 41.55 100
6.25 12.5 9.38 2129 7.80 13465 15945 49.36 58.45
12.5 18.75 15.62 1512 5.54 14977 13816 54.9 50.64
18.75 25 21.88 1712 6.28 16689 12304 61.17 45.1
25 31.25 28.12 1231 4.51 17920 10592 65.69 38.83
31.25 37.5 34.38 1259 4.61 19179 9361 70.3 34.31
37.5 43.75 40.62 1377 5.05 20556 8102 75.35 29.7
43.75 50 46.88 1376 5.04 21932 6725 80.39 24.65
50 56.25 53.12 1389 5.09 23321 5349 85.48 19.61
56.25 62.5 59.38 1448 5.31 24769 3960 90.79 14.52
62.5 68.75 65.62 1125 4.12 25894 2512 94.92 9.21
68.75 75 71.88 751 2.75 26645 1387 97.67 5.08
75 81.25 78.12 380 1.39 27025 636 99.06 2.33
81.25 87.5 84.38 170 0.62 27195 256 99.68 0.94
87.5 93.75 90.62 69 0.25 27264 86 99.94 0.32
93.75 100 96.88 17 0.06 27281 17 100 0.06
TOTAL 27281 100.00
Autor: Grupo 2

La regla de Sturges recomienda 16 clases, con una amplitud aproximada de 6.25 puntos porcentuales. Esta cantidad permite mostrar con mayor detalle la distribución, pero genera una tabla extensa y gráficas con numerosos intervalos. Por ello se presenta adicionalmente una tabla simplificada de 10 clases, que facilita la lectura y la comparación sin modificar la naturaleza continua de la variable.

TABLA DE DISTRIBUCIÓN AGRUPADA

# Histograma utilizando 10 clases
# (criterio adoptado para facilitar la interpretación)
k <- 10

histograma_limo <- hist(
  limo,
  breaks = 10,
  plot = FALSE
)

# Límites Inferiores y Superiores
lis <- histograma_limo$breaks[1:(length(histograma_limo$breaks)-1)]
lss <- histograma_limo$breaks[2:length(histograma_limo$breaks)]

# Marca de clase
MC_f <- round(histograma_limo$mids, 2)

# Frecuencia absoluta
ni_f <- histograma_limo$counts

# Frecuencia relativa
hi_f <- round((ni_f / sum(ni_f)) * 100, 2)

# Frecuencias acumuladas
Niasc_f <- cumsum(ni_f)
Nidsc_f <- rev(cumsum(rev(ni_f)))
Hiasc_f <- round(cumsum(hi_f), 2)
Hidsc_f <- round(rev(cumsum(rev(hi_f))), 2)

# Tabla Simplificada
TDLimo_f <- round(data.frame(
  Li = lis,
  Ls = lss,
  MC = MC_f,
  ni = ni_f,
  hi = hi_f,
  Niasc = Niasc_f,
  Nidsc = Nidsc_f,
  Hiasc = Hiasc_f,
  Hidsc = Hidsc_f
), 2)

# Fila TOTAL
fila_total_f <- data.frame(
  Li = "TOTAL",
  Ls = "",
  MC = "",
  ni = sum(TDLimo_f$ni),
  hi = round(sum(TDLimo_f$hi), 1),
  Niasc = "",
  Nidsc = "",
  Hiasc = "",
  Hidsc = ""
)

TDLimo_t <- rbind(TDLimo_f, fila_total_f)

TABLA SIMPLIFICADA FINAL CON GT

TablaLimo_simp <- TDLimo_t %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº2**"),
    subtitle = md("Tabla de distribución simplificada de Limo (%)<br>obtenida mediante el histograma")
  ) %>%
  tab_source_note(source_note = md("Autor: Grupo 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)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Li == "TOTAL")
  )
TablaLimo_simp
Tabla Nº2
Tabla de distribución simplificada de Limo (%)
obtenida mediante el histograma
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 10 5 12796 46.90 12796 27281 46.9 99.99
10 20 15 2478 9.08 15274 14485 55.98 53.09
20 30 25 2422 8.88 17696 12007 64.86 44.01
30 40 35 2049 7.51 19745 9585 72.37 35.13
40 50 45 2193 8.04 21938 7536 80.41 27.62
50 60 55 2264 8.30 24202 5343 88.71 19.58
60 70 65 1902 6.97 26104 3079 95.68 11.28
70 80 75 862 3.16 26966 1177 98.84 4.31
80 90 85 265 0.97 27231 315 99.81 1.15
90 100 95 50 0.18 27281 50 99.99 0.18
TOTAL 27281 100.00
Autor: Grupo 2

4. GRÁFICAS DE DISTRIBUCIÓN DE FRECUENCIA

# Histograma de frecuencia absoluta local
# Representa la cantidad observada en cada intervalo

hist(limo,
     breaks = k,
     main = "Gráfica Nº1: Distribución de cantidad de Limo
     en Sedimentos Marinos ",
     xlab = "Limo (%)",
     ylab = "Cantidad",
     col = "gray",
     border = "black")

# Histograma de frecuencia absoluta global
# Escalado respecto al tamaño total de la muestra

hist(limo,
     breaks = k,
     main = "Gráfica Nº2: Distribución de cantidad de Limo
     en Sedimentos Marinos",
     xlab = "Limo (%)",
     ylab = "Cantidad",
     col = "lightgray",
     border = "black",
     ylim = c(0, n * 1.05))

# Histograma de frecuencia relativa local
# Muestra el porcentaje observado en cada intervalo

barplot(hi_f,
        space = 0,
        names.arg = lss,
        main = "Gráfica Nº3: Distribución de cantidad en porcentaje de Limo
        en Sedimentos Marinos",
        col = "gray",
        xlab = "Limo (%) - Límite Superior",
        ylab = "Porcentaje",
        ylim = c(0, max(hi_f)*1.1),
        las = 2,
        cex.names = 0.75)

# Histograma de frecuencia relativa global
# Escala porcentual completa de 0 a 100 %

barplot(hi_f,
        space = 0,
        names.arg = lss,
        main = "Gráfica Nº4: Distribución de cantidad en porcentaje de Limo
        en Sedimentos Marinos",
        col = "gray",
        xlab = "Limo (%) - Límite Superior",
        ylab = "Porcentaje",
        ylim = c(0,100),
        las = 2,
        cex.names = 0.75)

# Ojiva combinada Ni
par(mar = c(8, 4, 4, 2) + 0.1)

# Añadir los extremos para que ambas ojivas comiencen y terminen completas
x_desc <- c(lis, lss[length(lss)])
y_desc_Ni <- c(Nidsc_f, 0)
x_asc <- c(lis[1], lss)
y_asc_Ni <- c(0, Niasc_f)

plot(x_desc, y_desc_Ni, type="o", pch=19, cex=1.2,
     main="Gráfica Nº5: Ojiva combinada de Limo (Ni)",
     ylab="Cantidad acumulada",
     col="blue",
     xlab="",
     xaxt="n",
     xlim=c(0, max(lss)),
     ylim=c(0, n),
     lwd=2)

lines(x_asc, y_asc_Ni, type="o", pch=19, cex=1.2, col="red", lwd=2)

marcas_x <- unique(c(0, round(lss, 2)))
axis(1, at=marcas_x, labels=FALSE)
text(
  marcas_x,
  par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
  labels=marcas_x,
  srt=45,
  adj=1,
  xpd=TRUE,
  cex=0.75
)
mtext("Limo (%)", side=1, line=5.8)

legend("bottom",
       legend=c("Descendente","Ascendente"),
       col=c("blue","red"),
       pch=c(19,19),
       lwd=c(2,2),
       horiz=TRUE,
       inset=0.02,
       bty="n")

par(mar = c(5, 4, 4, 2) + 0.1)
# Ojiva combinada Hi
par(mar = c(8, 4, 4, 2) + 0.1)

y_desc_Hi <- c(Hidsc_f, 0)
y_asc_Hi <- c(0, Hiasc_f)

plot(x_desc, y_desc_Hi, type="o", pch=19, cex=1.2,
     main="Gráfica Nº6: Ojiva combinada de Limo (Hi)",
     ylab="Porcentaje acumulado",
     col="blue",
     xlab="",
     xaxt="n",
     xlim=c(0, max(lss)),
     ylim=c(0,100),
     lwd=2)

lines(x_asc, y_asc_Hi, type="o", pch=19, cex=1.2, col="red", lwd=2)

marcas_x <- unique(c(0, round(lss, 2)))
axis(1, at=marcas_x, labels=FALSE)
text(
  marcas_x,
  par("usr")[3] - 0.035 * diff(par("usr")[3:4]),
  labels=marcas_x,
  srt=45,
  adj=1,
  xpd=TRUE,
  cex=0.75
)
mtext("Limo (%)", side=1, line=5.8)

legend("bottom",
       legend=c("Descendente","Ascendente"),
       col=c("blue","red"),
       pch=c(19,19),
       lwd=c(2,2),
       horiz=TRUE,
       inset=0.02,
       bty="n")

par(mar = c(5, 4, 4, 2) + 0.1)
# DIAGRAMA DE CAJA
boxplot(limo,
        horizontal = TRUE,
        main = "Gráfica Nº7: Distribución de cantidad de Limo
        en Sedimentos Marinos",
        xlab = "Limo (%)",
        col = "lightblue")

# Justificación:
# Se emplea frecuencia relativa local (Hi) para representar
# la distribución porcentual de los datos y facilitar la
# comparación entre intervalos.
# Histograma con Hi (Frecuencia Relativa Local)

h_rel <- hist(
  limo,
  breaks = k,
  plot = FALSE
)

hist(
  limo,
  breaks = k,
  probability = TRUE,
  freq = FALSE,
  main = "Gráfica N°8: Histograma y Diagrama de Caja Superpuesto - Limo (%)",
  xlab = "Limo (%)",
  ylab = "Hi (%)",
  col = "lightgray",
  border = "black"
)

# Superposición del boxplot

boxplot(
  limo,
  horizontal = TRUE,
  add = TRUE,
  axes = FALSE,

  # Altura donde se dibuja
  at = max(h_rel$density)*0.85,

  # Grosor de la caja
  boxwex = max(h_rel$density)*0.15,

  col = rgb(0,0.65,1,0.55),
  border = "darkblue",
  lwd = 2
)

 #Justificacion:
# Para la representacion conjunta del histograma y poligono
# se emplea la frecuencia relativa local en porcentaje (Hi).
# Las barras y el poligono usan los mismos intervalos de la
# tabla agrupada, por eso la lectura coincide con hi_f.

plot(NA,
     xlim = range(c(lis, lss)),
     ylim = c(0, max(hi_f) * 1.15),
     main = "Grafica N 9: Histograma y Poligono de Frecuencia Relativa de Limo (%)",
     xlab = "Limo (%)",
     ylab = "Frecuencia relativa (%)")

# Histograma en porcentaje
rect(xleft = lis,
     ybottom = 0,
     xright = lss,
     ytop = hi_f,
     col = "lightgray",
     border = "black")

# Poligono cerrado con marcas de clase
x_poly <- c(lis[1], MC_f, lss[length(lss)])
y_poly <- c(0, hi_f, 0)

lines(x_poly,
      y_poly,
      type = "o",
      col = "blue",
      lwd = 2,
      pch = 16)

legend("topright",
       legend = "Poligono de Frecuencia Relativa (%)",
       col = "blue",
       lwd = 2,
       pch = 16,
       bty = "n")

5. INDICADORES ESTADÍSTICOS

# Cálculo de indicadores estadísticos

# Media aritmética (x̄)
media <- mean(limo)

# Mediana (Me)
mediana <- median(limo)

# Desviación estándar muestral (s)
desv <- sd(limo)

# Coeficiente de variación (CV)
CV <- round((desv/media)*100,2)

# Coeficiente de asimetría (As)
asimetria <- round(skewness(limo),2)

# Coeficiente de curtosis (K)
curtosis <- round(kurtosis(limo),2)

# Valor mínimo (Min)
minimo <- min(limo)

# Valor máximo (Max)
maximo <- max(limo)

# Tabla de indicadores estadísticos
TablaIndicadores <- data.frame(
  Variable = "Limo (%)",
  Min = round(minimo,2),      # Mínimo
  Max = round(maximo,2),      # Máximo
  Media = round(media,2),     # x̄
  Me = round(mediana,2),      # Mediana
  s = round(desv,2),          # Desviación estándar
  CV = CV,                    # Coeficiente de variación
  As = asimetria,             # Asimetría
  K = curtosis                # Curtosis
)

TablaIndicadores
##   Variable Min Max Media    Me    s     CV   As    K
## 1 Limo (%)   0 100 23.24 13.12 24.5 105.43 0.76 2.26
# Tabla mejorada de indicadores estadísticos
TablaIndicadores %>%
  gt() %>%
  cols_label(
    Min = "Min",
    Max = "Max",
    Media = "x̄",
    Me = "Me",
    s = "s",
    CV = "Cv",
    As = "As",
    K = "K"
  ) %>%
  tab_header(
    title = md("**Tabla Nº3**"),
    subtitle = md("Indicadores estadísticos de la variable Limo (%)")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2")
  )
Tabla Nº3
Indicadores estadísticos de la variable Limo (%)
Variable Min Max Me s Cv As K
Limo (%) 0 100 23.24 13.12 24.5 105.43 0.76 2.26
Autor: Grupo 2

OUTLIERS

# OUTLIERS
outliers <- boxplot.stats(limo)$out

num_outliers <- length(outliers)

min_out <- ifelse(num_outliers > 0, round(min(outliers),2), NA)
max_out <- ifelse(num_outliers > 0, round(max(outliers),2), NA)

TablaOutliers <- data.frame(
  Cantidad_Outliers = num_outliers,
  Minimo = min_out,
  Maximo = max_out
)

TablaOutliers
##   Cantidad_Outliers Minimo Maximo
## 1                 0     NA     NA
#Tabla Mejorada 
TablaOutliers %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº4**"),
    subtitle = md("Valores atípicos de la variable Limo (%)")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2")
  )
Tabla Nº4
Valores atípicos de la variable Limo (%)
Cantidad_Outliers Minimo Maximo
0 NA NA
Autor: Grupo 2

6. CONCLUSIÓN

La variable Limo (%) presenta valores entre 0 y 100 %, con una media de 23.24 % y una mediana de 13.12 %, lo que indica una concentración en valores bajos. La desviación estándar de 24.50 % y el coeficiente de variación de 105.43 % evidencian alta dispersión y baja homogeneidad. La asimetría positiva de 0.76 refleja un sesgo hacia la derecha por la presencia de concentraciones elevadas, mientras que la curtosis de 2.26 indica una distribución relativamente aplanada. Por todo lo anterior mencionado, el comportamiento de la variable es medianamente beneficioso, pues predominan los contenidos bajos y moderados de limo; sin embargo, la elevada variabilidad reduce la uniformidad de las muestras..