# 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
NO_INJURIES_raw <- datos$NO_INJURIES
NO_INJURIES <- as.numeric(NO_INJURIES_raw)
NO_INJURIES <- NO_INJURIES[!is.na(NO_INJURIES)]
# Tamaño muestral
n <- length(NO_INJURIES)
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(NO_INJURIES))
Ni_simple <- as.numeric(table(NO_INJURIES))
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(TablaSimple, align = 'c',
caption = "Tabla de Distribución de Frecuencias Simple - NO_INJURIES") %>%
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 (%) |
|---|---|---|---|---|---|---|
| 0 | 591 | 11.95 | 591 | 11.95 | 4945 | 100.00 |
| 1 | 4309 | 87.14 | 4900 | 99.09 | 4354 | 88.05 |
| 2 | 32 | 0.65 | 4932 | 99.74 | 45 | 0.91 |
| 3 | 7 | 0.14 | 4939 | 99.88 | 13 | 0.26 |
| 4 | 2 | 0.04 | 4941 | 99.92 | 6 | 0.12 |
| 5 | 2 | 0.04 | 4943 | 99.96 | 4 | 0.08 |
| 6 | 1 | 0.02 | 4944 | 99.98 | 2 | 0.04 |
| 10 | 1 | 0.02 | 4945 | 100.00 | 1 | 0.02 |
# Parámetros de Sturges
R <- max(NO_INJURIES) - min(NO_INJURIES)
k <- floor(1 + 3.3 * log10(n))
A <- R / k
# Límites de clase
liminf <- seq(from = min(NO_INJURIES), to = max(NO_INJURIES) - A, by = A)
limsup <- seq(from = min(NO_INJURIES) + A, to = max(NO_INJURIES), by = A)
MC <- (liminf + limsup) / 2
# Frecuencias agrupadas
n_i <- numeric(k)
for (i in 1:k) {
if (i == k) {
n_i[i] <- sum(NO_INJURIES >= liminf[i] & NO_INJURIES <= limsup[i])
} else {
n_i[i] <- sum(NO_INJURIES >= liminf[i] & NO_INJURIES < 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) - NO_INJURIES") %>%
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 | 0.00 | 0.77 | 0.38 | 591 | 11.95 | 591 | 11.95 | 4945 | 100.00 |
| 2 | 0.77 | 1.54 | 1.15 | 4309 | 87.14 | 4900 | 99.09 | 4354 | 88.05 |
| 3 | 1.54 | 2.31 | 1.92 | 32 | 0.65 | 4932 | 99.74 | 45 | 0.91 |
| 4 | 2.31 | 3.08 | 2.69 | 7 | 0.14 | 4939 | 99.88 | 13 | 0.26 |
| 5 | 3.08 | 3.85 | 3.46 | 0 | 0.00 | 4939 | 99.88 | 6 | 0.12 |
| 6 | 3.85 | 4.62 | 4.23 | 2 | 0.04 | 4941 | 99.92 | 6 | 0.12 |
| 7 | 4.62 | 5.38 | 5.00 | 2 | 0.04 | 4943 | 99.96 | 4 | 0.08 |
| 8 | 5.38 | 6.15 | 5.77 | 1 | 0.02 | 4944 | 99.98 | 2 | 0.04 |
| 9 | 6.15 | 6.92 | 6.54 | 0 | 0.00 | 4944 | 99.98 | 1 | 0.02 |
| 10 | 6.92 | 7.69 | 7.31 | 0 | 0.00 | 4944 | 99.98 | 1 | 0.02 |
| 11 | 7.69 | 8.46 | 8.08 | 0 | 0.00 | 4944 | 99.98 | 1 | 0.02 |
| 12 | 8.46 | 9.23 | 8.85 | 0 | 0.00 | 4944 | 99.98 | 1 | 0.02 |
| 13 | 9.23 | 10.00 | 9.62 | 1 | 0.02 | 4945 | 100.00 | 1 | 0.02 |
| Parámetro | Valor |
|---|---|
| Rango (R) | 10 lesionados |
| Número de intervalos (k) | 13 |
| Amplitud de clase (A) | 0.7692 lesionados |
minimo <- min(NO_INJURIES)
maximo <- max(NO_INJURIES)
rango <- maximo - minimo
media <- mean(NO_INJURIES)
mediana <- median(NO_INJURIES)
moda <- as.numeric(names(sort(table(NO_INJURIES), decreasing = TRUE)[1]))
indicadores <- data.frame(
Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo", "Rango"),
Valor = c(minimo, round(media, 4), mediana, moda, maximo, rango),
Unidad = rep("lesionados", 6)
)
kable(indicadores, align = 'lrc',
caption = "Indicadores de Tendencia Central - NO_INJURIES") %>%
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 | 0.0000 | lesionados |
| Media | 0.8954 | lesionados |
| Mediana | 1.0000 | lesionados |
| Moda | 1.0000 | lesionados |
| Máximo | 10.0000 | lesionados |
| Rango | 10.0000 | lesionados |
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(NO_INJURIES,
main = "Histograma Global de Frecuencias Absolutas\nVariable NO_INJURIES",
xlab = "Número de Lesionados",
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
cat("Generando Histograma Local de Frecuencias Absolutas...\n")## Generando Histograma Local de Frecuencias Absolutas...
hist(NO_INJURIES,
main = "Histograma Local de Frecuencias Absolutas\nVariable NO_INJURIES",
xlab = "Número de Lesionados",
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
cat("Generando Histograma Global de Frecuencias Relativas...\n")## Generando Histograma Global de Frecuencias Relativas...
barplot(h_i,
main = "Histograma Global de Frecuencias Relativas\nVariable NO_INJURIES",
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
cat("Generando Histograma Local de Frecuencias Relativas...\n")## Generando Histograma Local de Frecuencias Relativas...
barplot(h_i,
main = "Histograma Local de Frecuencias Relativas\nVariable NO_INJURIES",
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)par(mar = c(4, 4, 3, 1))
boxplot(NO_INJURIES, horizontal = TRUE,
main = "Diagrama de Caja - NO_INJURIES",
xlab = "Número de Lesionados",
col = "#2ecc71", border = "#27ae60",
outcol = "red", outpch = 16, las = 1)
points(media, 1, pch = 23, bg = "blue", cex = 1.5)
legend("topright",
legend = c("Media", "Mediana", "Valores atípicos"),
pch = c(23, NA, 16),
col = c("blue", "black", "red"),
lty = c(NA, 1, NA),
lwd = c(NA, 2, NA),
pt.bg = c("blue", NA, NA),
bty = "n", cex = 0.8)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",
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",
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")Se trabajó con 4945 observaciones válidas de un total de 4945 registros, lo que representa una tasa de validez del 100%. Esta alta tasa de validez indica una excelente calidad en los datos analizados, proporcionando una base sólida para las conclusiones derivadas.
La variable NO_INJURIES presenta los siguientes indicadores centrales:
La mediana mayor que la media indica una asimetría negativa (sesgada a la izquierda), lo cual es poco común en datos de accidentabilidad y merece un análisis más profundo.
El análisis revela que:
Del total de accidentes analizados, ** 4900 casos ( 99.1 %)** involucraron 1 o menos lesionados, mientras que ** 45 casos ( 0.9 %)** resultaron en múltiples lesionados. Esto indica que:
El análisis de la variable NO_INJURIES revela que, aunque los accidentes en operaciones mineras son una realidad, la mayoría involucran un número limitado de personas lesionadas. Esto sugiere que las medidas de seguridad existentes tienen un efecto positivo en la contención de la severidad de los accidentes.
Sin embargo, la presencia de casos con múltiples lesionados subraya la necesidad imperativa de mantener y fortalecer continuamente los protocolos de seguridad. Cada lesionado representa no solo un costo humano y económico, sino también una oportunidad de aprendizaje para prevenir futuros incidentes.
La seguridad en la minería debe ser una prioridad constante, con inversión sostenida en: