# ===============================================
#UNIVERSIDAD CENTRAL DEL ECUADOR 
# Análisis Estadístico de la Variable Arcilla (%) en Sedimentos Marinos
# Autor:Grupo 3 
#Fecha:10/12/2025
# ===============================================

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
if (!require("moments")) {
  install.packages("moments")
  library(moments)
} else {
  library(moments)
}
## Loading required package: moments
# Lectura y limpieza de datos
setwd("/cloud/project")
datos <- read.csv("Sedimentos Marinos.csv", header = TRUE, sep = ";", dec = ".")
arcilla_raw <- datos$CLAY_PCT
arcilla <- as.numeric(as.character(arcilla_raw))
arcilla <- arcilla[!is.na(arcilla)]
arcilla <- arcilla[arcilla >= 0 & arcilla <= 100]
n <- length(arcilla)
cat("Observaciones válidas de Arcilla (%):", n, "\n\n")
## Observaciones válidas de Arcilla (%): 13299
# Intervalos de clase (amplitud fija = 14)
A <- 14
max_val <- max(arcilla)
Li <- seq(0, ceiling(max_val / A) * A, by = A)  # Límites inferiores: 0, 14, 28...
Ls <- Li + A                                    # Límites superiores
MC <- (Li + Ls) / 2                             # Marcas de clase

# Frecuencias absolutas
ni <- numeric(length(Li)-1)
for (i in 1:(length(Li)-1)) {
  lower <- Li[i]
  upper <- Ls[i]
  if (i == length(Li)-1) {
    ni[i] <- sum(arcilla >= lower)
  } else {
    ni[i] <- sum(arcilla >= lower & arcilla < upper)
  }
}

# Frecuencias relativas (con corrección de redondeo)
hi <- round((ni / n) * 100, 2)
error <- 100 - sum(hi)
if (abs(error) > 0) hi[length(hi)] <- hi[length(hi)] + error

# Acumuladas
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_dsc <- rev(cumsum(rev(hi)))

# Clase modal
moda_idx <- which.max(ni)
moda_intervalo <- paste(Li[moda_idx], "-", Ls[moda_idx])

colores <- gray.colors(length(ni), start = 0.3, end = 0.9)
intervalos <- paste(Li[-length(Li)], "-", Li[-1], sep = "")

# === TABLA DE DISTRIBUCIÓN DE FRECUENCIAS ===
cat("\n")
cat("<h2 style='text-align:center; color:#2c3e50;'>Distribución de frecuencias de la variable Arcilla (%)</h2>\n")
## <h2 style='text-align:center; color:#2c3e50;'>Distribución de frecuencias de la variable Arcilla (%)</h2>
cat("<p style='text-align:center; font-style:italic; color:#7f8c8d;'>Autor: Grupo 3</p>\n")
## <p style='text-align:center; font-style:italic; color:#7f8c8d;'>Autor: Grupo 3</p>
cat("\n")
Lim_Inf <- Li[-length(Li)]
Lim_Sup <- Li[-1]

TDF <- data.frame(
  "Lím. Inf." = Lim_Inf,
  "Lím. Sup." = Lim_Sup,
  "Marca Clase" = MC[-length(MC)],
  "ni" = ni,
  "hi (%)" = paste0(format(round(hi, 2), nsmall = 2), " %"),
  "Ni asc" = Ni_asc,
  "Ni dsc" = Ni_dsc,
  "Hi asc (%)" = paste0(format(round(Hi_asc, 2), nsmall = 2), " %"),
  "Hi dsc (%)" = paste0(format(round(Hi_dsc, 2), nsmall = 2), " %")
)

totales <- data.frame(
  "Lím. Inf." = "", "Lím. Sup." = "Total", "Marca Clase" = "",
  "ni" = n,
  "hi (%)" = "100.00 %",
  "Ni asc" = "",
  "Ni dsc" = "",
  "Hi asc (%)" = "",
  "Hi dsc (%)" = ""
)

TDF <- rbind(TDF, totales)

TDF %>%
  kable("html", escape = FALSE, align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 14) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2c3e50") %>%
  row_spec(nrow(TDF), bold = TRUE, color = "white", background = "#27ae60")
Lím..Inf. Lím..Sup. Marca.Clase ni hi…. Ni.asc Ni.dsc Hi.asc…. Hi.dsc….
0 14 7 9134 68.68 % 9134 13299 68.68 % 100.00 %
14 28 21 1762 13.25 % 10896 4165 81.93 % 31.32 %
28 42 35 1408 10.59 % 12304 2403 92.52 % 18.07 %
42 56 49 469 3.53 % 12773 995 96.05 % 7.48 %
56 70 63 279 2.10 % 13052 526 98.15 % 3.95 %
70 84 77 213 1.60 % 13265 247 99.75 % 1.85 %
84 98 91 34 0.25 % 13299 34 100.00 % 0.25 %
Total 13299 100.00 %
cat("\n\n")
# === GRÁFICAS ===
cat("Generando gráficas...\n")
## Generando gráficas...
hist(arcilla, breaks = Li, right = FALSE, col = colores,
     main = "Gráfica Nº2: Distribución absoluta local de Arcilla (%)",
     xlab = "Porcentaje de Arcilla (%)", ylab = "Frecuencia absoluta")

hist(arcilla, breaks = Li, right = FALSE, col = colores,
     main = "Gráfica Nº3: Distribución absoluta global de Arcilla (%)",
     xlab = "Porcentaje de Arcilla (%)", ylab = "Frecuencia absoluta",
     ylim = c(0, n + 1000))

barplot(hi, names.arg = intervalos, col = colores, space = 0, las = 2,
        main = "Gráfica Nº4: Distribución relativa local de Arcilla (%)",
        xlab = "Intervalos de Arcilla (%)", ylab = "Porcentaje (%)",
        ylim = c(0, max(hi) + 5))

barplot(hi, names.arg = intervalos, col = colores, space = 0, las = 2,
        main = "Gráfica Nº5: Distribución relativa global de Arcilla (%)",
        xlab = "Intervalos de Arcilla (%)", ylab = "Porcentaje (%)",
        ylim = c(0, 100))

plot(Lim_Sup, Ni_asc, type = "o", pch = 16, col = "blue",
     main = "Ojiva absoluta", xlab = "Porcentaje de Arcilla (%)", ylab = "Frecuencia absoluta acumulada")
lines(Lim_Sup, Ni_dsc, type = "o", pch = 16, col = "red")
legend("topleft", c("Ascendente", "Descendente"), col = c("blue", "red"), pch = 16)

plot(Lim_Sup, cumsum(hi), type = "o", pch = 16, col = "blue",
     main = "Ojiva relativa", xlab = "Porcentaje de Arcilla (%)", ylab = "Frecuencia relativa acumulada (%)", ylim = c(0, 105))
lines(Lim_Sup, rev(cumsum(rev(hi))), type = "o", pch = 16, col = "red")
legend("bottomright", c("Ascendente", "Descendente"), col = c("blue", "red"), pch = 16)

boxplot(arcilla, horizontal = TRUE, col = "lightblue", border = "darkblue",
        main = "Diagrama de caja y bigotes - Arcilla (%)",
        xlab = "Porcentaje de Arcilla (%)")

# === CÁLCULOS DE INDICADORES ESTADÍSTICOS (antes de usarlos) ===
media <- mean(arcilla)
mediana <- median(arcilla)
varianza <- var(arcilla)
desv_est <- sd(arcilla)
coef_var <- round((desv_est / media) * 100, 2)
minimo <- min(arcilla)
maximo <- max(arcilla)

q1 <- quantile(arcilla, 0.25)
q3 <- quantile(arcilla, 0.75)
iqr_val <- q3 - q1

asimetria <- round(skewness(arcilla), 3)
curtosis <- round(kurtosis(arcilla), 3)

# === TABLA DE INDICADORES ===
cat("\n\n<h2 style='text-align:center; color:#2c3e50;'>Resumen de indicadores estadísticos</h2>\n\n")
## 
## 
## <h2 style='text-align:center; color:#2c3e50;'>Resumen de indicadores estadísticos</h2>
indicadores <- data.frame(
  Símbolo = c("n", "Mín", "Máx", "$\\bar{x}$", "Me", "Q₁", "Q₃", "IQR", "$s^2$", "s", "CV", "Moda", "$g_1$", "$g_2$"),
  Indicador = c("Número de observaciones", "Mínimo", "Máximo", "Media aritmética", "Mediana", "Primer cuartil", "Tercer cuartil", "Rango intercuartílico", "Varianza muestral", "Desviación estándar", "Coeficiente de variación", "Clase modal", "Coef. de asimetría (Fisher)", "Coef. de curtosis (Fisher)"),
  Valor = c(n, round(minimo, 2), round(maximo, 2), round(media, 2), round(mediana, 2), round(q1, 2), round(q3, 2), round(iqr_val, 2), round(varianza, 2), round(desv_est, 2), paste0(coef_var, " %"), moda_intervalo, asimetria, curtosis),
  Unidad = c("", "%", "%", "%", "%", "%", "%", "%", "%²", "%", "%", "intervalo", "", "")
)

indicadores %>%
  kable("html", escape = FALSE, align = c("c", "l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 14) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")
Símbolo Indicador Valor Unidad
n Número de observaciones 13299
Mín Mínimo 0 %
Máx Máximo 94.71 %
\(\bar{x}\) Media aritmética 12.77 %
Me Mediana 3.96 %
Q₁ Primer cuartil 0.43 %
Q₃ Tercer cuartil 19.82 %
IQR Rango intercuartílico 19.4 %
\(s^2\) Varianza muestral 313.22
s Desviación estándar 17.7 %
CV Coeficiente de variación 138.55 % %
Moda Clase modal 0 - 14 intervalo
\(g_1\) Coef. de asimetría (Fisher) 1.769
\(g_2\) Coef. de curtosis (Fisher) 5.855
# === DETECCIÓN DE OUTLIERS ===
lim_inf_out <- q1 - 1.5 * iqr_val
lim_sup_out <- q3 + 1.5 * iqr_val
outliers <- arcilla[arcilla < lim_inf_out | arcilla > lim_sup_out]

cat("\n\n=== DETECCIÓN DE VALORES ATÍPICOS (regla de Tukey) ===\n")
## 
## 
## === DETECCIÓN DE VALORES ATÍPICOS (regla de Tukey) ===
cat("Límite inferior:", round(lim_inf_out, 2), "%\n")
## Límite inferior: -28.66 %
cat("Límite superior:", round(lim_sup_out, 2), "%\n")
## Límite superior: 48.92 %
cat("Cantidad de outliers detectados:", length(outliers), "\n")
## Cantidad de outliers detectados: 687
# === CONCLUSIÓN ===
cat("\n\n<h2 style='text-align:center; color:#2c3e50;'>Conclusión</h2>\n")
## 
## 
## <h2 style='text-align:center; color:#2c3e50;'>Conclusión</h2>
cat("<p style='text-align:justify; font-size:16px; line-height:1.6;'>\n")
## <p style='text-align:justify; font-size:16px; line-height:1.6;'>
cat("La variable Arcilla (%) fluctúa en torno al 4 % (mediana = 3.96 %), con una desviación estándar de 17.7 %, lo que indica un conjunto de datos de valores heterogéneos, con una fuerte concentración de valores en el extremo inferior. ")
## La variable Arcilla (%) fluctúa en torno al 4 % (mediana = 3.96 %), con una desviación estándar de 17.7 %, lo que indica un conjunto de datos de valores heterogéneos, con una fuerte concentración de valores en el extremo inferior.
cat("La distribución es claramente asimétrica positiva, es decir, sesgada hacia la derecha, con la mayoría de los valores concentrados hacia la izquierda. ")
## La distribución es claramente asimétrica positiva, es decir, sesgada hacia la derecha, con la mayoría de los valores concentrados hacia la izquierda.
cat("Se detecta la presencia de 127 outliers que van desde aproximadamente el 49 % hasta el 94.71 %.<br><br>\n")
## Se detecta la presencia de 127 outliers que van desde aproximadamente el 49 % hasta el 94.71 %.<br><br>
cat("Por todo lo anterior, este comportamiento puede considerarse \"bueno\" si el objetivo del estudio es caracterizar la variabilidad natural en ambientes marinos, ya que refleja procesos reales de deposición diferencial de arcilla. ")
## Por todo lo anterior, este comportamiento puede considerarse "bueno" si el objetivo del estudio es caracterizar la variabilidad natural en ambientes marinos, ya que refleja procesos reales de deposición diferencial de arcilla.
cat("Por el contrario, resulta \"malo\" o problemático desde un punto de vista estadístico clásico, pues la alta dispersión, asimetría y presencia de outliers dificultan la aplicación de técnicas paramétricas, complican generalizaciones y pueden distorsionar modelos predictivos.\n")
## Por el contrario, resulta "malo" o problemático desde un punto de vista estadístico clásico, pues la alta dispersión, asimetría y presencia de outliers dificultan la aplicación de técnicas paramétricas, complican generalizaciones y pueden distorsionar modelos predictivos.
cat("</p>\n")
## </p>
cat("\n¡Análisis completo de Arcilla (%) finalizado con éxito!\n")
## 
## ¡Análisis completo de Arcilla (%) finalizado con éxito!