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)
| 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)
| 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
| 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
| 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
| 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
| 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
| 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) |
|