# Limpiar entorno
rm(list = ls())
# Cargar datos
ruta <- "C:/Users/arian/OneDrive/Documentos/UNI/estadistica/PROYECTO/1. DATOS/5000_Datos.xlsx"
if(!file.exists(ruta)) {
stop("ERROR: Archivo no encontrado. Por favor verifica la ruta.")
}
datos <- read_excel(ruta)
# Extraer y limpiar variable
LONGITUDE_raw <- datos$LONGITUDE
LONGITUDE <- as.numeric(LONGITUDE_raw)
LONGITUDE <- LONGITUDE[!is.na(LONGITUDE)]
LONGITUDE <- LONGITUDE[LONGITUDE != 0]
# Tamaño muestral
n <- length(LONGITUDE)
datos_originales <- nrow(datos)
tasa_validez <- round((n / datos_originales) * 100, 2)| Indicador | Valor |
|---|---|
| Datos originales | 4945 |
| Datos válidos | 4945 |
| Datos eliminados | 0 |
| Tasa de validez | 100% |
# Frecuencias simples
valores_unicos <- sort(unique(LONGITUDE))
Ni_simple <- as.numeric(table(LONGITUDE))
hi_simple <- (Ni_simple / n) * 100
Ni_asc_simple <- cumsum(Ni_simple)
Hi_asc_simple <- cumsum(hi_simple)
Ni_desc_simple <- rev(cumsum(rev(Ni_simple)))
Hi_desc_simple <- rev(cumsum(rev(hi_simple)))
TablaSimple <- data.frame(
Valor = valores_unicos,
Ni = Ni_simple,
"hi (%)" = round(hi_simple, 2),
"Ni Asc" = Ni_asc_simple,
"Hi Asc (%)" = round(Hi_asc_simple, 2),
"Ni Desc" = Ni_desc_simple,
"Hi Desc (%)" = round(Hi_desc_simple, 2),
check.names = FALSE
)
kable(head(TablaSimple, 20), align = 'c',
caption = "Tabla de Distribución de Frecuencias Simple - LONGITUDE (primeros 20 valores)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 12) %>%
row_spec(0, bold = TRUE, color = "white", background = "#3498db") %>%
scroll_box(height = "400px")| Valor | Ni | hi (%) | Ni Asc | Hi Asc (%) | Ni Desc | Hi Desc (%) |
|---|---|---|---|---|---|---|
| -124.1028 | 1 | 0.02 | 1 | 0.02 | 4945 | 100.00 |
| -124.0831 | 1 | 0.02 | 2 | 0.04 | 4944 | 99.98 |
| -123.7850 | 1 | 0.02 | 3 | 0.06 | 4943 | 99.96 |
| -123.3119 | 1 | 0.02 | 4 | 0.08 | 4942 | 99.94 |
| -123.3106 | 1 | 0.02 | 5 | 0.10 | 4941 | 99.92 |
| -123.1919 | 1 | 0.02 | 6 | 0.12 | 4940 | 99.90 |
| -123.1072 | 2 | 0.04 | 8 | 0.16 | 4939 | 99.88 |
| -123.0836 | 1 | 0.02 | 9 | 0.18 | 4937 | 99.84 |
| -123.0664 | 1 | 0.02 | 10 | 0.20 | 4936 | 99.82 |
| -123.0572 | 1 | 0.02 | 11 | 0.22 | 4935 | 99.80 |
| -123.0508 | 1 | 0.02 | 12 | 0.24 | 4934 | 99.78 |
| -123.0506 | 1 | 0.02 | 13 | 0.26 | 4933 | 99.76 |
| -123.0433 | 1 | 0.02 | 14 | 0.28 | 4932 | 99.74 |
| -123.0261 | 3 | 0.06 | 17 | 0.34 | 4931 | 99.72 |
| -122.9233 | 1 | 0.02 | 18 | 0.36 | 4928 | 99.66 |
| -122.9050 | 5 | 0.10 | 23 | 0.47 | 4927 | 99.64 |
| -122.8503 | 1 | 0.02 | 24 | 0.49 | 4922 | 99.53 |
| -122.8233 | 1 | 0.02 | 25 | 0.51 | 4921 | 99.51 |
| -122.7842 | 1 | 0.02 | 26 | 0.53 | 4920 | 99.49 |
| -122.7356 | 1 | 0.02 | 27 | 0.55 | 4919 | 99.47 |
# Parámetros de Sturges
R <- max(LONGITUDE) - min(LONGITUDE)
k <- floor(1 + 3.3 * log10(n))
A <- R / k
# Límites de clase
liminf <- seq(from = min(LONGITUDE), to = max(LONGITUDE) - A, by = A)
limsup <- seq(from = min(LONGITUDE) + A, to = max(LONGITUDE), by = A)
MC <- (liminf + limsup) / 2
# Frecuencias agrupadas
n_i <- numeric(k)
for (i in 1:k) {
if (i == k) {
n_i[i] <- sum(LONGITUDE >= liminf[i] & LONGITUDE <= limsup[i])
} else {
n_i[i] <- sum(LONGITUDE >= liminf[i] & LONGITUDE < limsup[i])
}
}
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)))
TablaAgrupada <- data.frame(
Clase = 1:k,
"Lím. Inf." = round(liminf, 2),
"Lím. Sup." = round(limsup, 2),
"M.C." = round(MC, 2),
Ni = n_i,
"hi (%)" = round(h_i, 2),
"Ni Asc" = Ni_asc,
"Hi Asc (%)" = round(Hi_asc, 2),
"Ni Desc" = Ni_desc,
"Hi Desc (%)" = round(Hi_desc, 2),
check.names = FALSE
)
kable(TablaAgrupada, align = 'c',
caption = "Tabla de Distribución de Frecuencias Agrupada (Sturges) - LONGITUDE") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 11) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2ecc71")| Clase | Lím. Inf. | Lím. Sup. | M.C. | Ni | hi (%) | Ni Asc | Hi Asc (%) | Ni Desc | Hi Desc (%) |
|---|---|---|---|---|---|---|---|---|---|
| 1 | -124.10 | -119.86 | -121.98 | 108 | 2.18 | 108 | 2.18 | 4945 | 100.00 |
| 2 | -119.86 | -115.63 | -117.75 | 324 | 6.55 | 432 | 8.74 | 4837 | 97.82 |
| 3 | -115.63 | -111.39 | -113.51 | 158 | 3.20 | 590 | 11.93 | 4513 | 91.26 |
| 4 | -111.39 | -107.15 | -109.27 | 421 | 8.51 | 1011 | 20.44 | 4355 | 88.07 |
| 5 | -107.15 | -102.91 | -105.03 | 172 | 3.48 | 1183 | 23.92 | 3934 | 79.56 |
| 6 | -102.91 | -98.67 | -100.79 | 45 | 0.91 | 1228 | 24.83 | 3762 | 76.08 |
| 7 | -98.67 | -94.44 | -96.55 | 245 | 4.95 | 1473 | 29.79 | 3717 | 75.17 |
| 8 | -94.44 | -90.20 | -92.32 | 321 | 6.49 | 1794 | 36.28 | 3472 | 70.21 |
| 9 | -90.20 | -85.96 | -88.08 | 995 | 20.12 | 2789 | 56.40 | 3151 | 63.72 |
| 10 | -85.96 | -81.72 | -83.84 | 889 | 17.98 | 3678 | 74.38 | 2156 | 43.60 |
| 11 | -81.72 | -77.48 | -79.60 | 934 | 18.89 | 4612 | 93.27 | 1267 | 25.62 |
| 12 | -77.48 | -73.24 | -75.36 | 286 | 5.78 | 4898 | 99.05 | 333 | 6.73 |
| 13 | -73.24 | -69.01 | -71.13 | 47 | 0.95 | 4945 | 100.00 | 47 | 0.95 |
| Parámetro | Valor |
|---|---|
| Rango (R) | 55.0964 grados |
| Número de intervalos (k) | 13 |
| Amplitud de clase (A) | 4.2382 grados |
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]))
indicadores <- data.frame(
Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo", "Rango"),
Valor = round(c(minimo, media, mediana, moda, maximo, rango), 4),
Unidad = rep("grados", 6)
)
kable(indicadores, align = 'lrc',
caption = "Indicadores de Tendencia Central - LONGITUDE") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9b59b6") %>%
row_spec(c(2, 3), bold = TRUE, background = "#ecf0f1")| Indicador | Valor | Unidad |
|---|---|---|
| Mínimo | -124.1028 | grados |
| Media | -91.4508 | grados |
| Mediana | -87.3753 | grados |
| Moda | -109.3350 | grados |
| Máximo | -69.0064 | grados |
| Rango | 55.0964 | grados |
par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
# HISTOGRAMA GLOBAL - FRECUENCIAS ABSOLUTAS
cat("Generando Histograma Global de Frecuencias Absolutas...\n")## Generando Histograma Global de Frecuencias Absolutas...
hist(LONGITUDE,
main = "Histograma Global de Frecuencias Absolutas\nVariable LONGITUDE",
xlab = "Longitud (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")
# HISTOGRAMA LOCAL - FRECUENCIAS ABSOLUTAS
hist(LONGITUDE,
main = "Histograma Local de Frecuencias Absolutas\nVariable LONGITUDE",
xlab = "Longitud (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")# HISTOGRAMA GLOBAL - FRECUENCIAS RELATIVAS
barplot(h_i,
main = "Histograma Global de Frecuencias Relativas\nVariable LONGITUDE",
xlab = "Marca de Clase",
ylab = "Porcentaje (%)",
col = "darkorange",
border = "white",
names.arg = round(MC, 1),
las = 2,
cex.names = 0.7,
space = 0)
abline(h = 0)
# HISTOGRAMA LOCAL - FRECUENCIAS RELATIVAS
barplot(h_i,
main = "Histograma Local de Frecuencias Relativas\nVariable LONGITUDE",
xlab = "Marca de Clase",
ylab = "Porcentaje (%)",
col = "mediumpurple",
border = "white",
names.arg = round(MC, 1),
las = 2,
cex.names = 0.7,
space = 0,
ylim = c(0, 100))
abline(h = 0)# DIAGRAMA DE CAJA
boxplot(LONGITUDE,
horizontal = TRUE,
main = "Diagrama de Caja\nVariable LONGITUDE",
xlab = "Longitud (grados)",
col = "lightgreen",
border = "darkgreen",
outcol = "red",
outpch = 16,
las = 1)
points(media, 1, pch = 23, bg = "blue", cex = 1.5)par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
# Ojivas Absolutas
plot(MC, Ni_asc, type = "b",
main = "Ojivas - Frecuencias Absolutas",
xlab = "Marca de Clase (grados)",
ylab = "Frecuencia Acumulada (Ni)",
col = "#3498db", lwd = 2, pch = 16, cex = 1.2,
ylim = c(0, n), las = 1)
lines(MC, Ni_desc, type = "b",
col = "#e74c3c", lwd = 2, pch = 16, cex = 1.2)
legend("right",
legend = c("Ascendente", "Descendente"),
col = c("#3498db", "#e74c3c"),
lty = 1, lwd = 2, pch = 16, cex = 0.8, bty = "n")
grid(col = "gray", lty = "dotted")
# Ojivas Relativas
plot(MC, Hi_asc, type = "b",
main = "Ojivas - Frecuencias Relativas",
xlab = "Marca de Clase (grados)",
ylab = "Porcentaje Acumulado (Hi %)",
col = "#3498db", lwd = 2, pch = 16, cex = 1.2,
ylim = c(0, 100), las = 1)
lines(MC, Hi_desc, type = "b",
col = "#e74c3c", lwd = 2, pch = 16, cex = 1.2)
legend("right",
legend = c("Ascendente", "Descendente"),
col = c("#3498db", "#e74c3c"),
lty = 1, lwd = 2, pch = 16, cex = 0.8, bty = "n")
grid(col = "gray", lty = "dotted")| Región | Rango Longitud | Accidentes | Porcentaje (%) |
|---|---|---|---|
| Oeste (Q1) | < -98.44 ° | 1236 | 25.0 |
| Centro-Oeste (Q1-Q2) | -98.44 ° a -87.38 ° | 1236 | 25.0 |
| Centro-Este (Q2-Q3) | -87.38 ° a -81.69 ° | 1233 | 24.9 |
| Este (Q3+) | ≥ -81.69 ° | 1240 | 25.1 |
Se trabajó con 4945 observaciones válidas de ubicaciones geográficas, representando el 100% del total de registros. La eliminación de valores cero y NA asegura que solo se analicen ubicaciones geográficas válidas y verificables.
La media menor que la mediana sugiere una concentración hacia el oeste (longitudes más negativas). Esto indica que existen operaciones mineras con mayor accidentabilidad en zonas occidentales que desplazan el promedio.
Este rango amplio indica una cobertura geográfica extensa que abarca múltiples regiones y posiblemente estados o provincias.
El análisis por cuartiles geográficos revela que la región ** Este ** concentra la mayor cantidad de accidentes con ** 1240 casos ( 25.1 %)**. Esta concentración espacial sugiere:
El intervalo de longitud con mayor concentración de accidentes es la Clase 9 ( -90.2 ° a -85.96 °) con ** 995 casos ( 20.1 %)**.
Esta zona constituye un cluster geográfico crítico que requiere:
La distribución geográfica de accidentes justifica un enfoque regional en la gestión de seguridad:
Las siguientes zonas requieren atención prioritaria inmediata:
La ubicación geográfica puede correlacionar con:
Recomendación crítica: Realizar un estudio correlacional entre LONGITUDE y variables como ACCIDENT_TYPE, NATURE_INJURY, y MINE_EXPER para identificar patrones regionales específicos.
La información geográfica permite:
Implementar un sistema de vigilancia geográfica:
La distribución geográfica facilita:
El análisis geográfico de accidentes mineros revela que la ubicación importa. Los accidentes no se distribuyen uniformemente en el espacio, sino que muestran patrones que reflejan la interacción compleja de factores geológicos, ambientales, tecnológicos y humanos específicos de cada región.
Concentración espacial: 25.1% de accidentes en la región Este demuestra la necesidad de estrategias focalizadas
Diversidad regional: Las diferencias entre zonas sugieren que no existe una solución única para toda el área de estudio
Oportunidades de aprendizaje: Las regiones de baja incidencia guardan lecciones valiosas que pueden replicarse
Eficiencia de recursos: La focalización geográfica puede multiplicar el impacto de inversiones en seguridad
La gestión moderna de seguridad minera debe evolucionar hacia un modelo basado en inteligencia geoespacial:
El mapa de accidentabilidad no es estático. Requiere actualización continua, análisis dinámico y adaptación flexible de estrategias según evolucionen los patrones espaciales.
Universidad Central del Ecuador - FIGEMPA
Carrera de Ingeniería en Minas
Análisis Geoespacial: LONGITUDE
Diciembre 2024
“La seguridad minera tiene coordenadas: entender dónde ocurren los accidentes es el primer paso para prevenirlos”