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.
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)
n <- length(longitud)
k <- floor(1 + 3.3 * log10(n))
minimo <- min(longitud)
maximo <- max(longitud)
A <- (maximo - minimo) / k
Li <- seq(minimo, maximo - A, by = A)
Ls <- seq(minimo + A, maximo + 1e-6, by = A)
MC <- (Li + Ls) / 2
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
| 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 |
colores <- gray.colors(length(ni), start = 0.3, end = 0.9)
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
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
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
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
lim_sup <- Ls
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
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
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
# 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")
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")
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")
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")
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")
kable(tabla_resumen,
caption = "Resumen de indicadores estadísticos de la variable Longitud",
escape = FALSE)
| 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 |
# 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")
| 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 |
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.