1 Introducción

El presente proyecto tiene como objetivo realizar un análisis estadístico descriptivo de la variable longitud, correspondiente a sedimentos marinos.

El análisis incluye la construcción de una tabla de distribución de frecuencias, representaciones gráficas e indicadores estadísticos, permitiendo interpretar el comportamiento general de la variable estudiada.

2 Lectura y limpieza de datos

setwd("C:/Users/Grace/Favorites/Restudio (Estadistica)")
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)
datos <- read.csv("Sedimentos Marinos.csv",
                  header = TRUE,
                  sep = ";",
                  dec = ".",
                  stringsAsFactors = FALSE)
# Limpieza de LONGITUDE y corrección a negativo (hemisferio oeste)
longitud_raw <- as.numeric(gsub("[^0-9.-]", "", datos$LONGITUDE))
## Warning: NAs introducidos por coerción
# Hacer negativos los valores del hemisferio oeste (América)
longitud <- ifelse(longitud_raw > 0, -longitud_raw, longitud_raw)
# Restringir al dominio válido y eliminar NA
longitud <- longitud[longitud >= -180 & longitud <= 180]
longitud <- na.omit(longitud)

3 Parámetros estadísticos iniciales

n <- length(longitud)
k <- floor(1 + 3.3 * log10(n))

minimo <- min(longitud)
maximo <- max(longitud)
A <- (maximo - minimo) / k

4 Construcción de intervalos de clase

Li <- seq(minimo, maximo - A, by = A)
Ls <- seq(minimo + A, maximo + 1e-6, by = A)
MC <- (Li + Ls) / 2

5 Tabla de distribución de frecuencias

ni <- numeric(length(Li))
for (i in 1:length(Li)) {
  if (i == length(Li)) {
    ni[i] <- sum(longitud >= Li[i])
  } else {
    ni[i] <- sum(longitud >= Li[i] & longitud < Ls[i])
  }
}

hi <- round((ni / n) * 100, 2)
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- round(cumsum(hi), 4)
Hidsc <- round(rev(cumsum(rev(hi))), 4)

# Crear la tabla con los intervalos
TDF <- data.frame(
  Li = round(Li, 6),
  Ls = round(Ls, 6),
  MC = round(MC, 6),
  ni = ni,
  hi = hi,
  Niasc = Niasc,
  Nidsc = Nidsc,
  Hiasc = Hiasc,
  Hidsc = Hidsc
)

# Agregar fila de TOTALES
totales <- data.frame(
  Li = "",
  Ls = "Total",
  MC = "",
  ni = sum(ni),          # debe ser igual a n
  hi = sum(hi),  # suma real de los porcentajes
  Niasc = "",
  Nidsc = "",
  Hiasc = "",
  Hidsc = ""
)

# Unir la fila de totales
TDF <- rbind(TDF, totales)

# Mostrar la tabla
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
TDF %>%
  kable(caption = "Distribución de frecuencias de la variable Longitud",
        col.names = c("Lím. Inf.", "Lím. Sup.", "Marca Clase", "ni", "hi (%)",
                      "Ni ↑", "Ni ↓", "Hi ↑ (%)", "Hi ↓ (%)"),
        align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE,
                position = "center",
                font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%   # Cabecera destacada
  row_spec(nrow(TDF), bold = TRUE, color = "white", background = "#337ab7")  # Fila "Total" en azul
Distribución de frecuencias de la variable Longitud
Lím. Inf. Lím. Sup. Marca Clase ni hi (%) Ni ↑ Ni ↓ Hi ↑ (%) Hi ↓ (%)
-124.25 -111.841122 -118.045561 12 2.19 12 548 2.19 100
-111.841122 -99.432243 -105.636682 0 0.00 12 536 2.19 97.81
-99.432243 -87.023364 -93.227804 125 22.81 137 536 25 97.81
-87.023364 -74.614486 -80.818925 104 18.98 241 411 43.98 75
-74.614486 -62.205608 -68.410047 271 49.45 512 307 93.43 56.02
-62.205608 -49.796729 -56.001168 0 0.00 512 36 93.43 6.57
-49.796729 -37.38785 -43.59229 5 0.91 517 36 94.34 6.57
-37.38785 -24.978972 -31.183411 0 0.00 517 31 94.34 5.66
-24.978972 -12.570093 -18.774533 12 2.19 529 31 96.53 5.66
-12.570094 -0.161215 -6.365654 19 3.47 548 19 100 3.47
Total 548 100.00

6 Representaciones gráficas

colores <- gray.colors(length(ni), start = 0.3, end = 0.9)

6.1 Tabla de distribución de la longitud de los sedimentos marinos (Histograma de frecuencia absoluta local)

hist(
  longitud,
  breaks = seq(minimo, maximo + 1e-6, A),
  right = FALSE,
  main = "Gráfica Nº2: Frecuencia de longitud local de sedimentos marinos ",
  xlab = "Longitud (grados)",
  ylab = "Cantidad",
  col = colores
)
Distribución absoluta local de la longitud

Distribución absoluta local de la longitud

6.2 Tabla de distribución de la longitud de los sedimentos marinos (Histograma de frecuencia absoluta global)

hist(
  longitud,
  breaks = seq(minimo, maximo + 1e-6, A),
  right = FALSE,
  main = "Gráfica Nº3: Frecuencia de longitud global de sedimentos marinos",
  xlab = "Longitud (grados)",
  ylab = "Cantidad",
  col = colores,
  ylim = c(0, max(ni) + 5)
)
Distribución absoluta global de la longitud

Distribución absoluta global de la longitud

6.3 Tabla de distribución de la longitud de los sedimentos marinos (Histograma de frecuencia relativa local)

intervalos <- paste(
  round(Li, 4),
  round(Ls, 4),
  sep = " - "
)

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

Distribución relativa local de la longitud

6.4 Tabla de distribución de la longitud de los sedimentos marinos (Histograma de frecuencia relativa global)

barplot(
  hi,
  names.arg = intervalos,
  col = colores,
  ylim = c(0, 100),
  cex.names = 0.6,
  space = 0,
  ylab = "Porcentaje (%)",
  xlab = "Longitud (grados)",
  main = "Gráfica Nº5: Porcentaje de longitud global de sedimentos marinos",
  las = 2
)
Distribución relativa global de la longitud

Distribución relativa global de la longitud

6.5 Ojivas

lim_sup <- Ls

6.5.1 Ojiva absoluta (Ni)

lim_sup <- Ls

plot(lim_sup, Niasc, type = "o", pch = 16, col = "blue",
     main = "Ojiva absoluta de la longitud",
     xlab = "Longitud (grados)",
     ylab = "Frecuencia acumulada absoluta")

lines(lim_sup, Nidsc, type = "o", pch = 16, col = "red")

legend("topleft",
       c("Ni Ascendente", "Ni Descendente"),
       col = c("blue", "red"),
       pch = 16)
Ojiva absoluta de la longitud

Ojiva absoluta de la longitud

6.5.2 Ojiva relativa (Hi)

plot(lim_sup, Hiasc, type="o", pch=16, col="blue",
main="Ojiva relativa de la longitud",
xlab="Longitud (grados)",
ylab="Frecuencia acumulada relativa (%)")

lines(lim_sup, Hidsc, type="o", pch=16, col="red")
legend("bottomright", c("Hi Ascendente","Hi Descendente"),
col=c("blue","red"), pch=16)
Ojiva relativa

Ojiva relativa

6.6 Boxplot

Boxplot de la longitud

boxplot(longitud,
horizontal = TRUE,
col = "lightblue",
main = "Distribución de la longitud de los sedimentos marinos",
xlab = "Longitud (grados)")
Boxplot de la longitud

Boxplot de la longitud

7 Medidas estadísticas completas

# 4.1 Posición
minimo <- min(longitud)
maximo <- max(longitud)
rango <- maximo - minimo
media <- mean(longitud)
mediana <- median(longitud)
cuartiles <- quantile(longitud, probs = c(0.25, 0.5, 0.75))

cat("### 4.1 Posición\n\n")

7.1 4.1 Posición

cat("mínimo    <- min(longitud)  → ", round(minimo, 4), "\n")

mínimo <- min(longitud) → -124.25

cat("máximo    <- max(longitud)  → ", round(maximo, 4), "\n")

máximo <- max(longitud) → -0.1612

cat("rango     <- máximo - mínimo → ", round(rango, 4), "\n")

rango <- máximo - mínimo → 124.0888

cat("media     <- mean(longitud) → ", round(media, 4), "\n")

media <- mean(longitud) → -74.8882

cat("mediana   <- median(longitud) → ", round(mediana, 4), "\n\n")

mediana <- median(longitud) → -73.721

cat("### Cuartiles\n\n")

7.2 Cuartiles

print(cuartiles[1:3])
  25%       50%       75% 

-86.27250 -73.72100 -69.91225

# 4.2 Dispersión
varianza <- var(longitud)
desviacion <- sd(longitud)
coef_var <- ifelse(abs(media) < 0.01, NA, (desviacion / media) * 100)  # Evita división por cero

cat("\n### 4.2 Dispersión\n\n")

7.3 4.2 Dispersión

cat("varianza      <- var(longitud) → ", round(varianza, 4), "\n")

varianza <- var(longitud) → 383.8082

cat("desviación    <- sd(longitud)  → ", round(desviacion, 4), "\n")

desviación <- sd(longitud) → 19.591

if (!is.na(coef_var)) {
  cat("coef_var      <- desviacion / media * 100 → ", round(coef_var, 4), "%\n\n")
} else {
  cat("coef_var      <- No aplicable (media cercana a cero)\n\n")
}

coef_var <- desviacion / media * 100 → -26.1604 %

cat("*Nota: coeficiente de variación no se usa si media aritmética es cercana a 0 o negativa*\n\n")

Nota: coeficiente de variación no se usa si media aritmética es cercana a 0 o negativa

# 4.3 Forma
library(moments)
asimetria <- skewness(longitud)
curtosis <- kurtosis(longitud)

cat("### 4.3 Forma\n\n")

7.4 4.3 Forma

cat("asimetría   <- skewness(longitud) → ", round(asimetria, 4), "\n")

asimetría <- skewness(longitud) → 1.7319

cat("curtosis    <- kurtosis(longitud) → ", round(curtosis, 4), "\n\n")

curtosis <- kurtosis(longitud) → 8.6143

# 4.4 Tabla resumen horizontal
valores <- c(
  minimo,
  maximo,
  rango,
  media,
  mediana,
  cuartiles[1],
  cuartiles[3],
  varianza,
  desviacion,
  coef_var,
  asimetria,
  curtosis
)

nombres <- c(
  "Min",
  "Max",
  "Rango",
  "Media aritmética",
  "Mediana",
  "Q1",
  "Q3",
  "Varianza",
  "s",
  "s2",
  "As",
  "K"
)

tabla_resumen <- data.frame(t(round(valores, 4)))
colnames(tabla_resumen) <- nombres

cat("### 4.4 Tabla resumen\n\n")

7.5 4.4 Tabla resumen

kable(tabla_resumen, 
      caption = "Resumen de indicadores estadísticos de la variable Longitud",
      escape = FALSE)
Resumen de indicadores estadísticos de la variable Longitud
Min Max Rango Media aritmética Mediana Q1 Q3 Varianza s s2 As K
-124.25 -0.1612 124.0888 -74.8882 -73.721 -86.2725 -69.9122 383.8082 19.591 -26.1604 1.7319 8.6143

7.6 Detección de valores atípicos (outliers)

# Calcular IQR
IQR_val <- cuartiles[3] - cuartiles[1]

# Límites para detectar outliers (regla 1.5 × IQR)
limite_inferior <- cuartiles[1] - 1.5 * IQR_val
limite_superior <- cuartiles[3] + 1.5 * IQR_val

# Extraer outliers
outliers <- longitud[longitud < limite_inferior | longitud > limite_superior]

# Número de outliers
num_outliers <- length(outliers)

# Valores mínimo y máximo de los outliers (si existen)
min_outlier <- if(num_outliers > 0) min(outliers) else NA
max_outlier <- if(num_outliers > 0) max(outliers) else NA

# Crear tabla resumen de outliers
Tabla_outliers <- data.frame(
  "Cantidad de outliers" = num_outliers,
  "Valor mínimo de outliers" = round(min_outlier, 4),
  "Valor máximo de outliers" = round(max_outlier, 4),
  "Límite inferior" = round(limite_inferior, 4),
  "Límite superior" = round(limite_superior, 4)
)

# Mostrar tabla con estilo bonito
library(kableExtra)

Tabla_outliers %>%
  kable(caption = "Resumen de valores atípicos (outliers) en la variable Longitud") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE,
                position = "center") %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Resumen de valores atípicos (outliers) en la variable Longitud
Cantidad.de.outliers Valor.mínimo.de.outliers Valor.máximo.de.outliers Límite.inferior Límite.superior
25% 43 -124.25 -0.1612 -110.8129 -45.3719

8 Conclusiones

La variable longitud, medida en grados, presenta valores que oscilan entre -124.25 y -0.1612, con una media de -74.8882 y una mediana de -73.721, lo que indica una asimetría leve hacia la derecha (asimetría = 1.7319). Los datos muestran una amplia dispersión, reflejada en un rango de 124.0888 grados y una desviación estándar de 19.591. La distribución es heterogénea y presenta una alta curtosis (8.6143), lo que sugiere una fuerte concentración de valores cercanos a la mediana, junto con la presencia de valores atípicos tanto en los extremos inferiores como superiores. La mayor parte de los datos se concentra entre el primer cuartil (Q1 = -86.2725) y el tercer cuartil (Q3 = -66.9722), evidenciando un patrón de acumulación en ese rango.

Este comportamiento resulta especialmente relevante para el estudio de la distribución geográfica de sedimentos marinos, ya que permite identificar zonas con mayor concentración de muestras a nivel mundial. La concentración de valores en determinadas franjas longitudinales revela patrones espaciales significativos, útiles para la exploración, planificación y aprovechamiento estratégico de recursos marinos en distintas regiones del planeta.