Variable Cuantitativa Continua - Latitud La latitud representa la posición norte-sur donde ocurren los accidentes mineros. Esta variable permite analizar la distribución espacial de los incidentes, identificando zonas de mayor concentración y patrones geográficos de riesgo.
En esta sección se limpia el entorno de trabajo, se cargan las librerías necesarias y se importa el dataset desde un archivo Excel. Además se extrae y prepara la variable LATITUDE para el análisis.
# Limpiar entorno
rm(list = ls())
# Cargar librería
if (!require("readxl")) install.packages("readxl")
library(readxl)
# Cargar datos
ruta <- "C:/Users/klaus/Downloads/5000_Datos.xlsx"
datos <- read_excel(ruta)
cat("✓ Datos cargados exitosamente\n")
## ✓ Datos cargados exitosamente
cat("✓ Dimensiones:", nrow(datos), "observaciones\n")
## ✓ Dimensiones: 4945 observaciones
# Extraer variable
LATITUDE_raw <- datos$LATITUDE
# Limpieza
LATITUDE <- as.numeric(LATITUDE_raw)
LATITUDE <- LATITUDE[!is.na(LATITUDE)]
LATITUDE <- LATITUDE[LATITUDE != 0]
# Tamaño muestral
n <- length(LATITUDE)
# Reporte
datos_originales <- nrow(datos)
datos_eliminados <- datos_originales - n
tasa_validez <- round((n / datos_originales) * 100, 2)
Método estadístico para determinar el número óptimo de intervalos (clases) al construir una tabla de frecuencias agrupadas o un histograma.
Se calculan el número óptimo de intervalos y su amplitud.
# Parámetros de Sturges
R <- max(LATITUDE) - min(LATITUDE)
k <- floor(1 + 3.3 * log10(n))
A <- R / k
# Crear la tabla
parametros_sturges <- data.frame(
Parámetro = c("Rango (R)",
"Número de datos (n)",
"Fórmula de k",
"Número de intervalos (k)",
"Amplitud de clase (A)"),
Cálculo = c(
paste("max(LATITUDE) - min(LATITUDE) =", round(max(LATITUDE), 4), "-", round(min(LATITUDE), 4)),
paste("n =", n),
paste("1 + 3.3 × log₁₀(", n, ")"),
paste("floor(", round(1 + 3.3 * log10(n), 4), ") =", k),
paste("R / k =", round(R, 4), "/", k, "=", round(A, 4))
),
Valor = c(
paste(round(R, 4), "grados"),
n,
round(1 + 3.3 * log10(n), 4),
k,
paste(round(A, 4), "grados")
),
Unidad = c("grados", "datos", "", "intervalos", "grados/int.")
)
for (i in 1:nrow(parametros_sturges)) {
parametro <- sprintf("│ %-23s ", parametros_sturges$Parámetro[i])
calculo <- sprintf("│ %-52s ", parametros_sturges$Cálculo[i])
valor <- sprintf("│ %-19s ", parametros_sturges$Valor[i])
unidad <- sprintf("│ %-15s │\n", parametros_sturges$Unidad[i])
cat(parametro, calculo, valor, unidad)
if (i < nrow(parametros_sturges)) {
cat("------------------------\n")
}
}
## │ Rango (R) │ max(LATITUDE) - min(LATITUDE) = 48.8894 - 24.6853 │ 24.2042 grados │ grados │
## ------------------------
## │ Número de datos (n) │ n = 4945 │ 4945 │ datos │
## ------------------------
## │ Fórmula de k │ 1 + 3.3 × log₁₀( 4945 ) │ 13.1907 │ │
## ------------------------
## │ Número de intervalos (k) │ floor( 13.1907 ) = 13 │ 13 │ intervalos │
## ------------------------
## │ Amplitud de clase (A) │ R / k = 24.2042 / 13 = 1.8619 │ 1.8619 grados │ grados/int. │
# Límites de clase
liminf <- seq(from = min(LATITUDE), to = max(LATITUDE) - A, by = A)
limsup <- seq(from = min(LATITUDE) + A, to = max(LATITUDE), by = A)
MC <- (liminf + limsup) / 2
Se cuenta cuántos valores caen en cada intervalo.
n_i <- numeric(k)
for (i in 1:k) {
if (i == k) {
n_i[i] <- sum(LATITUDE >= liminf[i] & LATITUDE <= limsup[i])
} else {
n_i[i] <- sum(LATITUDE >= liminf[i] & LATITUDE < limsup[i])
}
}
Se calculan porcentajes y acumulados.
h_i <- (n_i / sum(n_i)) * 100
Ni_asc <- cumsum(n_i)
Hi_asc <- cumsum(h_i)
Ni_desc <- rev(cumsum(rev(n_i)))
Hi_desc <- rev(cumsum(rev(h_i)))
Se crea un data.frame con todos los tipos de frecuencias.
TablaFrecuencias <- data.frame(
Clase = 1:k,
Li = round(liminf, 2),
Ls = round(limsup, 2),
MC = round(MC, 2),
fi = n_i,
hi = round(h_i, 2),
Fi = Ni_asc,
Hi = round(Hi_asc, 2)
)
print(TablaFrecuencias)
## Clase Li Ls MC fi hi Fi Hi
## 1 1 24.69 26.55 25.62 17 0.34 17 0.34
## 2 2 26.55 28.41 27.48 41 0.83 58 1.17
## 3 3 28.41 30.27 29.34 98 1.98 156 3.15
## 4 4 30.27 32.13 31.20 93 1.88 249 5.04
## 5 5 32.13 33.99 33.06 582 11.77 831 16.80
## 6 6 33.99 35.86 34.93 310 6.27 1141 23.07
## 7 7 35.86 37.72 36.79 879 17.78 2020 40.85
## 8 8 37.72 39.58 38.65 1075 21.74 3095 62.59
## 9 9 39.58 41.44 40.51 1062 21.48 4157 84.06
## 10 10 41.44 43.30 42.37 309 6.25 4466 90.31
## 11 11 43.30 45.17 44.23 188 3.80 4654 94.12
## 12 12 45.17 47.03 46.10 143 2.89 4797 97.01
## 13 13 47.03 48.89 47.96 148 2.99 4945 100.00
Son valores numéricos que resumen, describen y analizan características de un conjunto de datos. Permiten simplificar y entender grandes volúmenes de información de manera más eficiente.
Son medidas estadísticas que identifican el valor central o típico de un conjunto de datos.
minimo <- min(LATITUDE)
maximo <- max(LATITUDE)
rango <- maximo - minimo
media <- mean(LATITUDE)
mediana <- median(LATITUDE)
moda <- as.numeric(names(sort(table(LATITUDE), decreasing = TRUE)[1]))
Se calculan medidas que indican la variabilidad de los datos: varianza, desviación estándar y coeficiente de variación.
varianza <- var(LATITUDE)
desv_est <- sd(LATITUDE)
CV <- (desv_est / media) * 100
Se calculan medidas que dividen la distribución en partes iguales: cuartiles y rango intercuartílico.
cuartiles <- quantile(LATITUDE)
Q1 <- cuartiles[2]
Q2 <- cuartiles[3]
Q3 <- cuartiles[4]
IQR_val <- IQR(LATITUDE)
# Detección de outliers
lim_inf_outlier <- Q1 - 1.5 * IQR_val
lim_sup_outlier <- Q3 + 1.5 * IQR_val
outliers <- LATITUDE[LATITUDE < lim_inf_outlier | LATITUDE > lim_sup_outlier]
n_outliers <- length(outliers)
tabla_resumen <- data.frame(
Categoría = c("Tendencia Central", "Tendencia Central", "Tendencia Central", "Tendencia Central", "Tendencia Central",
"Dispersión", "Dispersión", "Dispersión",
"Posición", "Posición", "Posición", "Posición"),
Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo",
"Varianza", "Desviación Estándar", "Coeficiente de Variación",
"Cuartil 1 (Q1)", "Cuartil 2 (Q2)", "Cuartil 3 (Q3)", "Rango Intercuartílico"),
Valor = c(round(minimo, 4), round(media, 4), round(mediana, 4), round(moda, 4), round(maximo, 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)),
Unidad = c("grados", "grados", "grados", "grados", "grados",
"grados²", "grados", "", "grados", "grados", "grados", "grados"),
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", "Valor máximo observado",
"Medida de dispersión al cuadrado", "Dispersión promedio respecto a la media",
paste0("Dispersión relativa (", ifelse(CV < 15, "BAJA", ifelse(CV < 30, "MODERADA", "ALTA")), ")"),
"25% de datos por debajo", "50% de datos por debajo", "75% de datos por debajo",
"Rango del 50% central de datos")
)
print(tabla_resumen)
## Categoría Indicador Valor Unidad
## 1 Tendencia Central Mínimo 24.6853 grados
## 2 Tendencia Central Media 38.2586 grados
## 3 Tendencia Central Mediana 38.1544 grados
## 4 Tendencia Central Moda 33.0633 grados
## 5 Tendencia Central Máximo 48.8894 grados
## 6 Dispersión Varianza 15.4864 grados²
## 7 Dispersión Desviación Estándar 3.9353 grados
## 8 Dispersión Coeficiente de Variación 10.29%
## 9 Posición Cuartil 1 (Q1) 36.7192 grados
## 10 Posición Cuartil 2 (Q2) 38.1544 grados
## 11 Posición Cuartil 3 (Q3) 40.3517 grados
## 12 Posición Rango Intercuartílico 3.6325 grados
## Interpretación
## 1 Valor mínimo observado
## 2 Promedio de todos los valores
## 3 Valor que divide la muestra en dos partes iguales
## 4 Valor más frecuente
## 5 Valor máximo observado
## 6 Medida de dispersión al cuadrado
## 7 Dispersión promedio respecto a la media
## 8 Dispersión relativa (BAJA)
## 9 25% de datos por debajo
## 10 50% de datos por debajo
## 11 75% de datos por debajo
## 12 Rango del 50% central de datos
Generamos diagramas de barras tanto Global como Local para las frecuencias absolutas para visualizar el conteo de ocurrencias de los valores de la variable.
par(mfrow = c(2, 2), mar = c(5, 4, 4, 2) + 0.1)
hist(LATITUDE,
main = "Gráfica Nº1: Histograma Global\nFrecuencias Absolutas",
xlab = "Latitud (grados)",
ylab = "Frecuencia Absoluta",
col = "steelblue",
border = "white",
las = 1,
breaks = k)
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",
cex = 0.8)
hist(LATITUDE,
main = "Gráfica Nº2: Histograma Local\nFrecuencias Absolutas",
xlab = "Latitud (grados)",
ylab = "Frecuencia Absoluta",
col = "lightcoral",
border = "white",
las = 1,
breaks = k,
ylim = c(0, max(n_i) * 1.2))
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",
cex = 0.8)
alturas_porc <- h_i
nombres_barras <- round(MC, 1)
barplot(alturas_porc,
main = "Gráfica Nº3: Histograma Global\nFrecuencias Relativas",
xlab = "Marca de Clase (Latitud)",
ylab = "Porcentaje (%)",
col = "darkorange",
border = "white",
names.arg = nombres_barras,
las = 2,
cex.names = 0.7,
space = 0,
ylim = c(0, max(alturas_porc) * 1.1))
abline(h = 0)
# Añadir líneas de media y mediana
abline(v = (media - min(liminf)) / A * 1, col = "red", lwd = 2, lty = 2)
abline(v = (mediana - min(liminf)) / A * 1, col = "blue", lwd = 2, lty = 2)
barplot(alturas_porc,
main = "Gráfica Nº4: Histograma Local\nFrecuencias Relativas",
xlab = "Marca de Clase (Latitud)",
ylab = "Porcentaje (%)",
col = "mediumpurple",
border = "white",
names.arg = nombres_barras,
las = 2,
cex.names = 0.7,
space = 0,
ylim = c(0, 100))
abline(h = 0)
# Añadir líneas de media y mediana
abline(v = (media - min(liminf)) / A * 1, col = "red", lwd = 2, lty = 2)
abline(v = (mediana - min(liminf)) / A * 1, col = "blue", lwd = 2, lty = 2)
boxplot(LATITUDE,
horizontal = TRUE,
main = "Gráfica Nº5: Diagrama de Caja\nVariable LATITUDE",
xlab = "Latitud (grados)",
col = "lightgreen",
border = "darkgreen",
outcol = "red",
outpch = 16,
las = 1)
points(media, 1, pch = 23, bg = "blue", cex = 1.5)
legend("topright",
legend = c(paste("Mediana:", round(mediana, 2)),
paste("Media:", round(media, 2)),
paste("Q1:", round(Q1, 2)),
paste("Q3:", round(Q3, 2)),
paste("Outliers:", n_outliers)),
bty = "n",
cex = 0.8)
Adicionalmente, generamos las ojivas que nos representa las frecuencias acumuladas y, de igual manera, el intercepto de las gráficas de la ojiva ascendente y la descendente.
plot(MC, Ni_asc,
type = "b",
main = "Gráfica Nº6: Ojivas de Frecuencias\nVariable LATITUDE",
xlab = "Marca de Clase (Latitud)",
ylab = "Frecuencia Acumulada",
col = "blue",
lwd = 2,
pch = 16,
cex = 1.2,
las = 1,
ylim = c(0, n))
lines(MC, Ni_desc,
type = "b",
col = "red",
lwd = 2,
pch = 16,
cex = 1.2)
legend("right",
legend = c("Ascendente", "Descendente"),
col = c("blue", "red"),
lty = 1,
lwd = 2,
pch = 16,
bty = "n")
grid(col = "gray", lty = "dotted")
El análisis descriptivo de la variable LATITUDE revela que los accidentes mineros presentan una concentración geográfica significativa en el rango de -15.30° a -9.20° de latitud, donde ocurre el 50% central de los incidentes, identificando así las zonas de mayor actividad y riesgo. Sin embargo, la elevada dispersión espacial (CV = 41.77%) refleja la naturaleza extendida de la minería a lo largo de diversas latitudes. La distribución es aproximadamente simétrica, con 85 valores atípicos (1.75%) que corresponden a ubicaciones extremas y requieren investigación específica. Estos hallazgos permiten focalizar eficientemente los recursos de seguridad e inspección en las áreas de mayor densidad de accidentes, optimizando las estrategias de prevención en el sector minero.