title: “Longitude” output: html_document: toc: true toc_float: true toc_depth: 3 number_sections: true theme: united highlight: tango code_folding: show fig_width: 8 fig_height: 6 fig_align: ‘center’ —

#Limpiar entorno
rm(list = ls())
#Cargar librerías
if (!require("readr")) install.packages("readr")
## Loading required package: readr
if (!require("dplyr")) install.packages("dplyr")
## Loading required package: 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
if (!require("knitr")) install.packages("knitr")
## Loading required package: knitr
if (!require("moments")) install.packages("moments")
## Loading required package: moments
library(readr)
library(dplyr)
library(knitr)
library(moments)
#Cargar datos
ruta <- "D:/PUNTOS LA LO.csv"
datos <- read_csv(ruta)
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
## Rows: 2500 Columns: 341
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (116): FID, DEPOSIT_AN, DEPOSIT_UI, DEPOSIT_NA, DEPOSIT_LO, DEPOSIT_EN,...
## dbl  (164): FE2O3_WT_P, FEO_WT_PER, H2OTOTAL_W, CO2_WT_PER, CO2_DETECT, LOIT...
## lgl   (59): TOP_DEPTH_, BASE_DEPTH, PROVINCE, STRAT_UNIT, STRAT_UN_1, STRAT_...
## date   (2): ANALYSIS_D, LAST_UPDAT
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cat("✓ Datos cargados exitosamente\n")
## ✓ Datos cargados exitosamente
cat("✓ Dimensiones:", nrow(datos), "observaciones\n")
## ✓ Dimensiones: 2500 observaciones
#Extraer y limpiar variable

LONGITUDE_raw <- datos$DEPOSIT__1
LONGITUDE <- as.numeric(LONGITUDE_raw)
LONGITUDE <- LONGITUDE[!is.na(LONGITUDE)]
LONGITUDE <- LONGITUDE[LONGITUDE != 0]

n <- length(LONGITUDE)
#Extraer y limpiar variable

LONGITUDE_raw <- datos$DEPOSIT__1
LONGITUDE <- as.numeric(LONGITUDE_raw)
LONGITUDE <- LONGITUDE[!is.na(LONGITUDE)]
LONGITUDE <- LONGITUDE[LONGITUDE != 0]

n <- length(LONGITUDE)
#Parámetros de Sturges
R <- max(LONGITUDE) - min(LONGITUDE)
k <- floor(1 + 3.3 * log10(n))
A <- R / k

parametros_sturges <- data.frame(
  Parámetro = c("Rango (R)", 
                "Número de datos (n)", 
                "Número de intervalos (k)", 
                "Amplitud de clase (A)"),
  Valor = c(round(R,4), n, k, round(A,4))
)

kable(parametros_sturges, 
      caption = "Tabla 1: Parámetros de Sturges para la variable LONGITUDE (coordenadas geográficas)")
Tabla 1: Parámetros de Sturges para la variable LONGITUDE (coordenadas geográficas)
Parámetro Valor
Rango (R) 94.0931
Número de datos (n) 2500.0000
Número de intervalos (k) 12.0000
Amplitud de clase (A) 7.8411
#Intervalos y frecuencias
Li <- seq(min(LONGITUDE), max(LONGITUDE) - A, by = A)
Ls <- seq(min(LONGITUDE) + A, max(LONGITUDE), by = A)
MC <- (Li + Ls) / 2

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

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

TDF <- data.frame(
  Clase = 1:k,
  Li = round(Li,2),
  Ls = round(Ls,2),
  MC = round(MC,2),
  ni = ni,
  hi = hi,
  Niasc = Niasc,
  Nidsc = Nidsc,
  Hiasc = Hiasc,
  Hidsc = Hidsc
)

kable(TDF,
      caption = "Tabla 2: Distribución de frecuencias de LONGITUDE (puntos geográficos)")
Tabla 2: Distribución de frecuencias de LONGITUDE (puntos geográficos)
Clase Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
1 -162.84 -155.00 -158.92 881 35.24 881 2500 35.24 100.00
2 -155.00 -147.16 -151.08 2 0.08 883 1619 35.32 64.76
3 -147.16 -139.31 -143.24 5 0.20 888 1617 35.52 64.68
4 -139.31 -131.47 -135.39 6 0.24 894 1612 35.76 64.48
5 -131.47 -123.63 -127.55 0 0.00 894 1606 35.76 64.24
6 -123.63 -115.79 -119.71 273 10.92 1167 1606 46.68 64.24
7 -115.79 -107.95 -111.87 1185 47.40 2352 1333 94.08 53.32
8 -107.95 -100.11 -104.03 56 2.24 2408 148 96.32 5.92
9 -100.11 -92.27 -96.19 3 0.12 2411 92 96.44 3.68
10 -92.27 -84.43 -88.35 76 3.04 2487 89 99.48 3.56
11 -84.43 -76.59 -80.51 6 0.24 2493 13 99.72 0.52
12 -76.59 -68.74 -72.67 7 0.28 2500 7 100.00 0.28
#Histograma con media y mediana
media <- mean(LONGITUDE)
mediana <- median(LONGITUDE)

hist(
  LONGITUDE,
  breaks = seq(min(LONGITUDE), max(LONGITUDE) + A, A),
  col = "steelblue",
  main = "Distribución de la Longitud de los puntos geográficos",
  xlab = "Longitud (grados)",
  ylab = "Frecuencia"
)

abline(v = media, col = "red", lwd = 2, lty = 2)
abline(v = mediana, col = "blue", lwd = 2, lty = 2)

legend("topright",
       legend = c(paste("Media =", round(media, 2)),
                  paste("Mediana =", round(mediana, 2))),
       col = c("red", "blue"),
       lty = 2,
       lwd = 2,
       bty = "n")

#Histograma global
hist(
  LONGITUDE,
  breaks = seq(min(LONGITUDE), max(LONGITUDE) + A, A),
  col = "lightcoral",
  main = "Distribución global de la Longitud",
  xlab = "Longitud",
  ylab = "Frecuencia"
)
abline(v = media, col = "red", lwd = 2, lty = 2)
abline(v = mediana, col = "blue", lwd = 2, lty = 2)

legend("topright",
       legend = c(paste("Media =", round(media, 2)),
                  paste("Mediana =", round(mediana, 2))),
       col = c("red", "blue"),
       lty = 2,
       lwd = 2,
       bty = "n")

# Calcular media y mediana
media_rel <- mean(LONGITUDE)
mediana_rel <- median(LONGITUDE)

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

# Transformar a posición del barplot
pos_media <- (media_rel - min(Li)) / A
pos_mediana <- (mediana_rel - min(Li)) / A

barplot(
  hi,
  names.arg = intervalos,
  col = "darkorange",
  ylim = c(0, max(hi) + 5),
  space = 0,
  cex.names = 0.7,
  ylab = "Frecuencia Relativa (%)",
  xlab = "Intervalos de Longitud (grados)",
  main = "Gráfica 3: Distribución porcentual de LONGITUDE por intervalos",
  las = 2,
  border = "white"
)

# Líneas de media y mediana
abline(v = pos_media, col = "red", lwd = 2, lty = 2)
abline(v = pos_mediana, col = "blue", lwd = 2, lty = 2)

# Leyenda
legend("topright",
       legend = c(paste("Media =", round(media_rel, 2)),
                  paste("Mediana =", round(mediana_rel, 2))),
       col = c("red", "blue"),
       lty = 2,
       lwd = 2,
       bty = "n")

# Calcular media y mediana 
media_rel_global <- mean(LONGITUDE)
mediana_rel_global <- median(LONGITUDE)

# Posición en barplot
pos_media_bar_global <- (media_rel_global - min(Li)) / A
pos_mediana_bar_global <- (mediana_rel_global - min(Li)) / A

barplot(
  hi,   
  names.arg = intervalos,
  col = "mediumpurple",
  ylim = c(0, 100),
  cex.names = 0.7,
  space = 0,
  ylab = "Frecuencia Relativa Acumulada (%)",
  xlab = "Intervalos de Longitud (grados)",
  main = "Gráfica 4: Distribución acumulada porcentual de LONGITUDE",
  las = 2,
  border = "white"
)

# Líneas
abline(v = pos_media_bar_global, col = "red", lwd = 2, lty = 2)
abline(v = pos_mediana_bar_global, col = "blue", lwd = 2, lty = 2)

# Leyenda
legend("topright",
       legend = c(paste("Media =", round(media_rel_global, 2)),
                  paste("Mediana =", round(mediana_rel_global, 2))),
       col = c("red", "blue"),
       lty = 2,
       lwd = 2,
       bty = "n")

plot(Ls, Niasc, 
     type = "o", 
     pch = 16, 
     col = "blue",
     main = "Gráfica 5: Ojiva de Frecuencias Absolutas Acumuladas 
     de los puntos geográficos por Longitud",
     xlab = "Longitud (grados)",
     ylab = "Frecuencia Acumulada Absoluta (Ni)")

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

legend("topleft",
       c("Ni Ascendente", "Ni Descendente"),
       col = c("blue", "red"),
       pch = 16)

plot(Ls, Hiasc, 
     type = "o", 
     pch = 16, 
     col = "blue",
     main = "Gráfica 6: Ojiva de Frecuencias Relativas Acumuladas 
     de los puntos geográficos por Longitud",
     xlab = "Longitud (grados)",
     ylab = "Frecuencia Acumulada Relativa (%)")

lines(Ls, Hidsc, 
      type = "o", 
      pch = 16, 
      col = "red")

legend("bottomright", 
       c("Hi Ascendente", "Hi Descendente"),
       col = c("blue", "red"), 
       pch = 16)

# Calcular todas las variables necesarias para el boxplot
media_box <- mean(LONGITUDE)
mediana_box <- median(LONGITUDE)
Q1_box <- quantile(LONGITUDE, 0.25)
Q3_box <- quantile(LONGITUDE, 0.75)
IQR_box <- IQR(LONGITUDE)

# Calcular outliers 
lim_inf_outlier_box <- Q1_box - 1.5 * IQR_box
lim_sup_outlier_box <- Q3_box + 1.5 * IQR_box
outliers_box <- LONGITUDE[LONGITUDE < lim_inf_outlier_box | LONGITUDE > lim_sup_outlier_box]
n_outliers_box <- length(outliers_box)

boxplot(LONGITUDE,
        horizontal = TRUE,
        col = "lightblue",
        main = "Gráfica 7: Distribución de la Longitud de los puntos geográficos 
        con detección de valores atípicos",
        xlab = "Longitud (grados)",
        ylab = "",
        border = "darkblue")

# Añadir estadísticos importantes
points(media_box, 1, pch = 23, bg = "red", cex = 1.2)

legend("topright",
       legend = c(paste("Media:", round(media_box, 2)),
                  paste("Mediana:", round(mediana_box, 2)),
                  paste("Q1:", round(Q1_box, 2)),
                  paste("Q3:", round(Q3_box, 2)),
                  paste("Outliers:", n_outliers_box)),
       bty = "n",
       cex = 0.8)

# Calcular indicadores de tendencia central
minimo <- min(LONGITUDE)
maximo <- max(LONGITUDE)
rango <- maximo - minimo
media <- mean(LONGITUDE)
mediana <- median(LONGITUDE)
moda <- as.numeric(names(sort(table(LONGITUDE), decreasing = TRUE)[1]))

# Crear tabla
tendencia_central <- data.frame(
  Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo", "Rango"),
  Valor = c(
    round(minimo, 4),
    round(media, 4),
    round(mediana, 4),
    round(moda, 4),
    round(maximo, 4),
    round(rango, 4)
  ),
  Unidad = rep("grados", 6),
  Interpretación = c(
    "Valor mínimo observado",
    "Promedio de todos los valores",
    "Valor que divide la muestra en dos partes iguales",
    "Valor más frecuente en la muestra",
    "Valor máximo observado",
    "Diferencia entre el máximo y el mínimo"
  )
)

kable(tendencia_central,
      caption = "Tabla 3: Indicadores de Tendencia Central para la variable LONGITUDE en puntos geográficos",
      align = "l")
Tabla 3: Indicadores de Tendencia Central para la variable LONGITUDE en puntos geográficos
Indicador Valor Unidad Interpretación
Mínimo -162.8379 grados Valor mínimo observado
Media -128.6690 grados Promedio de todos los valores
Mediana -115.7830 grados Valor que divide la muestra en dos partes iguales
Moda -115.7830 grados Valor más frecuente en la muestra
Máximo -68.7448 grados Valor máximo observado
Rango 94.0931 grados Diferencia entre el máximo y el mínimo
# Calcular indicadores de dispersión
varianza <- var(LONGITUDE)
desv_est <- sd(LONGITUDE)
CV <- (desv_est / media) * 100

# Interpretación del CV
if(CV < 15) {
  interpretacion_CV <- "BAJA (CV < 15%)"
} else if(CV < 30) {
  interpretacion_CV <- "MODERADA (15% ≤ CV < 30%)"
} else {
  interpretacion_CV <- "ALTA (CV ≥ 30%)"
}

# Crear tabla
dispersion <- data.frame(
  Indicador = c("Varianza", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(
    round(varianza, 4),
    round(desv_est, 4),
    paste0(round(CV, 2), "%")
  ),
  Unidad = c("grados²", "grados", ""),
  Interpretación = c(
    "Medida de dispersión al cuadrado",
    "Dispersión promedio respecto a la media",
    paste("Dispersión relativa:", interpretacion_CV)
  )
)

kable(dispersion,
      caption = "Tabla 4: Indicadores de Dispersión para la variable LONGITUDE en puntos geográficos",
      align = "l")
Tabla 4: Indicadores de Dispersión para la variable LONGITUDE en puntos geográficos
Indicador Valor Unidad Interpretación
Varianza 419.6575 grados² Medida de dispersión al cuadrado
Desviación Estándar 20.4855 grados Dispersión promedio respecto a la media
Coeficiente de Variación -15.92% Dispersión relativa: BAJA (CV < 15%)
# Calcular indicadores de posición
cuartiles <- quantile(LONGITUDE)
Q1 <- cuartiles[2]
Q2 <- cuartiles[3]
Q3 <- cuartiles[4]
IQR_val <- IQR(LONGITUDE)

# Detección de outliers
lim_inf_outlier <- Q1 - 1.5 * IQR_val
lim_sup_outlier <- Q3 + 1.5 * IQR_val
outliers <- LONGITUDE[LONGITUDE < lim_inf_outlier | LONGITUDE > lim_sup_outlier]
n_outliers <- length(outliers)
porc_outliers <- round((n_outliers / n) * 100, 2)

# Crear tabla
posicion <- data.frame(
  Indicador = c("Cuartil 1 (Q1)", "Cuartil 2 (Q2 - Mediana)", "Cuartil 3 (Q3)", 
                "Rango Intercuartílico (IQR)", "Límite Inferior Outliers", 
                "Límite Superior Outliers", "Número de Outliers"),
  Valor = c(
    round(Q1, 4),
    round(Q2, 4),
    round(Q3, 4),
    round(IQR_val, 4),
    round(lim_inf_outlier, 4),
    round(lim_sup_outlier, 4),
    paste0(n_outliers, " (", porc_outliers, "%)")
  ),
  Unidad = c(rep("grados", 6), "observaciones"),
  Interpretación = c(
    "25% de datos por debajo de este valor",
    "50% de datos por debajo de este valor (coincide con mediana)",
    "75% de datos por debajo de este valor",
    "Rango del 50% central de datos (Q3 - Q1)",
    "Límite inferior para detección de valores atípicos",
    "Límite superior para detección de valores atípicos",
    "Cantidad y porcentaje de valores atípicos detectados"
  )
)

kable(posicion,
      caption = "Tabla 5: Indicadores de Posición y detección de outliers en LONGITUDE",
      align = "l")
Tabla 5: Indicadores de Posición y detección de outliers en LONGITUDE
Indicador Valor Unidad Interpretación
Cuartil 1 (Q1) -155.281 grados 25% de datos por debajo de este valor
Cuartil 2 (Q2 - Mediana) -115.783 grados 50% de datos por debajo de este valor (coincide con mediana)
Cuartil 3 (Q3) -115.783 grados 75% de datos por debajo de este valor
Rango Intercuartílico (IQR) 39.498 grados Rango del 50% central de datos (Q3 - Q1)
Límite Inferior Outliers -214.528 grados Límite inferior para detección de valores atípicos
Límite Superior Outliers -56.536 grados Límite superior para detección de valores atípicos
Número de Outliers 0 (0%) observaciones Cantidad y porcentaje de valores atípicos detectados
# Calcular coeficiente de asimetría de Fisher
asimetria <- moments::skewness(LONGITUDE)

if(abs(asimetria) < 0.5) {
  interpretacion_asimetria <- "Distribución simétrica"
} else if(asimetria > 0) {
  interpretacion_asimetria <- "Asimetría positiva (sesgo a la derecha)"
} else {
  interpretacion_asimetria <- "Asimetría negativa (sesgo a la izquierda)"
}

# Curtosis
curtosis <- moments::kurtosis(LONGITUDE) - 3

if(abs(curtosis) < 0.5) {
  interpretacion_curtosis <- "Distribución mesocúrtica (normal)"
} else if(curtosis > 0) {
  interpretacion_curtosis <- "Distribución leptocúrtica (picuda)"
} else {
  interpretacion_curtosis <- "Distribución platicúrtica (aplanada)"
}

# Crear tabla
forma <- data.frame(
  Indicador = c("Coeficiente de Asimetría (Fisher)", "Interpretación Asimetría",
                "Coeficiente de Curtosis (Exceso)", "Interpretación Curtosis"),
  Valor = c(
    round(asimetria, 4),
    interpretacion_asimetria,
    round(curtosis, 4),
    interpretacion_curtosis
  ),
  Fórmula = c(
    "g₁ = E[(X-μ)³]/σ³",
    "|g₁| < 0.5: Simétrica; g₁ > 0: Positiva; g₁ < 0: Negativa",
    "g₂ = E[(X-μ)⁴]/σ⁴ - 3",
    "|g₂| < 0.5: Mesocúrtica; g₂ > 0: Leptocúrtica; g₂ < 0: Platicúrtica"
  )
)

kable(forma,
      caption = "Tabla 6: Indicadores de forma de la distribución de LONGITUDE",
      align = "l")
Tabla 6: Indicadores de forma de la distribución de LONGITUDE
Indicador Valor Fórmula
Coeficiente de Asimetría (Fisher) -0.3004 g₁ = E[(X-μ)³]/σ³
Interpretación Asimetría Distribución simétrica |g₁| < 0.5: Simétrica; g₁ > 0: Positiva; g₁ < 0: Negativa
Coeficiente de Curtosis (Exceso) -1.2235 g₂ = E[(X-μ)⁴]/σ⁴ - 3
Interpretación Curtosis Distribución platicúrtica (aplanada) |g₂| < 0.5: Mesocúrtica; g₂ > 0: Leptocúrtica; g₂ < 0: Platicúrtica
tabla_resumen <- data.frame(
  Categoría = c("Tendencia Central", "Tendencia Central", "Tendencia Central", 
                "Tendencia Central", "Tendencia Central", "Tendencia Central",
                "Dispersión", "Dispersión", "Dispersión",
                "Posición", "Posición", "Posición", "Posición",
                "Forma", "Forma", "Forma", "Forma"),
  Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo", "Rango",
                "Varianza", "Desviación Estándar", "Coeficiente de Variación",
                "Cuartil 1 (Q1)", "Cuartil 2 (Q2)", "Cuartil 3 (Q3)", 
                "Rango Intercuartílico",
                "Asimetría (g₁)", "Interpretación Asimetría",
                "Curtosis (g₂)", "Interpretación Curtosis"),
  Valor = c(
    round(minimo, 4), round(media, 4), round(mediana, 4), round(moda, 4), 
    round(maximo, 4), round(rango, 4),
    round(varianza, 4), round(desv_est, 4), paste0(round(CV, 2), "%"),
    round(Q1, 4), round(Q2, 4), round(Q3, 4), round(IQR_val, 4),
    round(asimetria, 4), interpretacion_asimetria,
    round(curtosis, 4), interpretacion_curtosis
  ),
  Unidad = c("grados", "grados", "grados", "grados", "grados", "grados",
             "grados²", "grados", "", "grados", "grados", "grados", "grados",
             "", "", "", "")
)

kable(tabla_resumen,
      caption = "Tabla 7: Resumen completo de indicadores estadísticos de LONGITUDE",
      align = "l",
      row.names = FALSE)
Tabla 7: Resumen completo de indicadores estadísticos de LONGITUDE
Categoría Indicador Valor Unidad
Tendencia Central Mínimo -162.8379 grados
Tendencia Central Media -128.669 grados
Tendencia Central Mediana -115.783 grados
Tendencia Central Moda -115.783 grados
Tendencia Central Máximo -68.7448 grados
Tendencia Central Rango 94.0931 grados
Dispersión Varianza 419.6575 grados²
Dispersión Desviación Estándar 20.4855 grados
Dispersión Coeficiente de Variación -15.92%
Posición Cuartil 1 (Q1) -155.281 grados
Posición Cuartil 2 (Q2) -115.783 grados
Posición Cuartil 3 (Q3) -115.783 grados
Posición Rango Intercuartílico 39.498 grados
Forma Asimetría (g₁) -0.3004
Forma Interpretación Asimetría Distribución simétrica
Forma Curtosis (g₂) -1.2235
Forma Interpretación Curtosis Distribución platicúrtica (aplanada)