Análisis de Accidentes Mineros: Variable MINE_EXPER

Variable Cuantitativa Discreta - Experiencia en Mina La variable MINE_EXPER representa el tiempo laborado específicamente en la mina actual del empleado involucrado en accidentes. El rango esperado es de 0 a 40 años.

1 Carga y Preparación de Datos

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 MINE_EXPER para el análisis.

1.1 Carga de Librerías y Datos

# 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 x", ncol(datos), "variables\n")
## ✓ Dimensiones: 4945 observaciones x 45 variables
# Buscar la variable MINE_EXPER
if("MINE_EXPER" %in% names(datos)) {
  cat("✓ Variable encontrada como: MINE_EXPER\n")
  MINE_EXPER_raw <- datos$MINE_EXPER
} else if("EXPERTO_MINA" %in% names(datos)) {
  cat("✓ Variable encontrada como: EXPERTO_MINA\n")
  MINE_EXPER_raw <- datos$EXPERTO_MINA
} else {
  
# Buscar alternativas
  nombres_similares <- grep("MINE|EXPER|MINA", names(datos), value = TRUE, ignore.case = TRUE)
  if(length(nombres_similares) > 0) {
    cat("Usando:", nombres_similares[1], "\n")
    MINE_EXPER_raw <- datos[[nombres_similares[1]]]
  } else {
    stop("Variable no encontrada")
  }
}
## ✓ Variable encontrada como: MINE_EXPER
# Limpieza
MINE_EXPER <- suppressWarnings(as.numeric(MINE_EXPER_raw))
MINE_EXPER <- MINE_EXPER[!is.na(MINE_EXPER)]
MINE_EXPER <- MINE_EXPER[MINE_EXPER >= 0]  # Según especificación: 0-40 años

# Tamaño muestral
n <- length(MINE_EXPER)

# Reporte
datos_originales <- length(MINE_EXPER_raw)
datos_eliminados <- datos_originales - n
tasa_validez <- round((n / datos_originales) * 100, 2)

2 Distribución de Frecuencias - Regla de Sturges

Método estadístico para determinar el número óptimo de intervalos (clases) al construir una tabla de frecuencias agrupadas o un histograma.

2.1 Parámetros de Sturges y Límites de Clase

Se calculan el número óptimo de intervalos y su amplitud.

# Parámetros de Sturges
R <- max(MINE_EXPER) - min(MINE_EXPER)
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(MINE_EXPER) - min(MINE_EXPER) =", round(max(MINE_EXPER), 4), "-", round(min(MINE_EXPER), 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), "años"),
    n,
    round(1 + 3.3 * log10(n), 4),
    k,
    paste(round(A, 4), "años")
  ),
  Unidad = c("años", "datos", "", "intervalos", "años/int.")
)

knitr::kable(parametros_sturges, caption = "Parámetros de la Regla de Sturges")
Parámetros de la Regla de Sturges
Parámetro Cálculo Valor Unidad
Rango (R) max(MINE_EXPER) - min(MINE_EXPER) = 58 - 0.02 57.98 años años
Número de datos (n) n = 4253 4253 datos
Fórmula de k 1 + 3.3 × log₁₀( 4253 ) 12.9747
Número de intervalos (k) floor( 12.9747 ) = 12 12 intervalos
Amplitud de clase (A) R / k = 57.98 / 12 = 4.8317 4.8317 años años/int.
# Límites de clase
liminf <- seq(from = min(MINE_EXPER), to = max(MINE_EXPER) - A, by = A)
limsup <- seq(from = min(MINE_EXPER) + A, to = max(MINE_EXPER), by = A)
MC <- (liminf + limsup) / 2

# Ajustar si es necesario
if(length(limsup) < length(liminf)) {
  limsup <- c(limsup, max(MINE_EXPER))
}
if(length(liminf) > length(limsup)) {
  liminf <- liminf[1:length(limsup)]
}
k <- min(k, length(liminf))

2.2 Frecuencias Absolutas

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(MINE_EXPER >= liminf[i] & MINE_EXPER <= limsup[i])
  } else {
    n_i[i] <- sum(MINE_EXPER >= liminf[i] & MINE_EXPER < limsup[i])
  }
}

2.3 Frecuencias Relativas y Acumuladas

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

2.4 Tabla de frecuencias Relativas y Acumuladas

Se crea un data.frame con todos los tipos de frecuencias.

TablaFrecuencias <- data.frame(
  Clase = 1:k,
  Li = round(liminf[1:k], 2),
  Ls = round(limsup[1:k], 2),
  MC = round(MC[1:k], 2),
  fi = n_i,
  hi = round(h_i, 2),
  Fi = Ni_asc,
  Hi = round(Hi_asc, 2)
)

knitr::kable(TablaFrecuencias, caption = "Tabla de Distribución de Frecuencias") 
Tabla de Distribución de Frecuencias
Clase Li Ls MC fi hi Fi Hi
1 0.02 4.85 2.44 2691 63.29 2691 63.29
2 4.85 9.68 7.27 641 15.08 3332 78.36
3 9.68 14.51 12.10 369 8.68 3701 87.04
4 14.51 19.35 16.93 176 4.14 3877 91.18
5 19.35 24.18 21.76 100 2.35 3977 93.53
6 24.18 29.01 26.59 113 2.66 4090 96.19
7 29.01 33.84 31.43 82 1.93 4172 98.12
8 33.84 38.67 36.26 54 1.27 4226 99.39
9 38.67 43.50 41.09 23 0.54 4249 99.93
10 43.50 48.34 45.92 2 0.05 4251 99.98
11 48.34 53.17 50.75 1 0.02 4252 100.00
12 53.17 58.00 55.58 0 0.00 4252 100.00

3 Indicadores

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.

3.1 Indicadores de Tendencia Central

Son medidas estadísticas que identifican el valor central o típico de un conjunto de datos.

minimo <- min(MINE_EXPER)
maximo <- max(MINE_EXPER)
rango <- maximo - minimo
media <- mean(MINE_EXPER)
mediana <- median(MINE_EXPER)
moda_valor <- as.numeric(names(sort(table(MINE_EXPER), decreasing = TRUE)[1]))

3.2 Indicadores de Dispersión

Se calculan medidas que indican la variabilidad de los datos: varianza, desviación estándar y coeficiente de variación.

varianza <- var(MINE_EXPER)
desv_est <- sd(MINE_EXPER)
CV <- (desv_est / media) * 100

3.3 Indicadores de Posición

Se calculan medidas que dividen la distribución en partes iguales: cuartiles y rango intercuartílico.

cuartiles <- quantile(MINE_EXPER)
Q1 <- cuartiles[2]
Q2 <- cuartiles[3]
Q3 <- cuartiles[4]
IQR_val <- IQR(MINE_EXPER)

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

3.4 Tabla de Resumen de Indicadores

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_valor, 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("años", "años", "años", "años", "años",
             "años²", "años", "", "años", "años", "años", "años"),
  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")
)

knitr::kable(tabla_resumen, caption = "Tabla Resumen de Indicadores Estadísticos")
Tabla Resumen de Indicadores Estadísticos
Categoría Indicador Valor Unidad Interpretación
Tendencia Central Mínimo 0.02 años Valor mínimo observado
Tendencia Central Media 6.2164 años Promedio de todos los valores
Tendencia Central Mediana 2.75 años Valor que divide la muestra en dos partes iguales
Tendencia Central Moda 1 años Valor más frecuente
Tendencia Central Máximo 58 años Valor máximo observado
Dispersión Varianza 71.9761 años² Medida de dispersión al cuadrado
Dispersión Desviación Estándar 8.4839 años Dispersión promedio respecto a la media
Dispersión Coeficiente de Variación 136.48% Dispersión relativa (ALTA)
Posición Cuartil 1 (Q1) 0.69 años 25% de datos por debajo
Posición Cuartil 2 (Q2) 2.75 años 50% de datos por debajo
Posición Cuartil 3 (Q3) 8.08 años 75% de datos por debajo
Posición Rango Intercuartílico 7.39 años Rango del 50% central de datos

3.5 Interpretación de Resultados

interpretacion <- data.frame(
  Aspecto = c("Tamaño de muestra",
              "Distribución",
              "Dispersión",
              "Valores atípicos",
              "Simetría"),
  Resultado = c(
    paste(n, "observaciones válidas (", tasa_validez, "% de validez)"),
    paste("Rango:", round(minimo, 2), "a", round(maximo, 2), "años"),
    paste("CV =", round(CV, 2), "% -", ifelse(CV < 15, "BAJA", ifelse(CV < 30, "MODERADA", "ALTA"))),
    paste(n_outliers, "valores atípicos (", porc_outliers, "%)"),
    ifelse(abs(media - mediana) < 0.5, "APROXIMADAMENTE SIMÉTRICA", 
           ifelse(media > mediana, "SESGADA A LA DERECHA", "SESGADA A LA IZQUIERDA"))
  )
)

knitr::kable(interpretacion, caption = "Interpretación de los Resultados")
Interpretación de los Resultados
Aspecto Resultado
Tamaño de muestra 4253 observaciones válidas ( 86.01 % de validez)
Distribución Rango: 0.02 a 58 años
Dispersión CV = 136.48 % - ALTA
Valores atípicos 380 valores atípicos ( 8.93 %)
Simetría SESGADA A LA DERECHA

4 Gráficas

4.1 Diagrama de Barras

Generamos diagramas de barras tanto Global como Local para las frecuencias absolutas para visualizar el conteo de ocurrencias de los valores de la variable.

# Configurar diseño de gráficos
par(mfrow = c(2, 2), mar = c(5, 4, 4, 2) + 0.1, oma = c(0, 0, 2, 0))
hist(MINE_EXPER,
     main = "Gráfica 1: Histograma Global\nFrecuencias Absolutas",
     xlab = "Experiencia en Mina (años)",
     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(MINE_EXPER,
     main = "Gráfica 2: Histograma Local\nFrecuencias Absolutas",
     xlab = "Experiencia en Mina (años)",
     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:k], 1)

barplot(alturas_porc,
        main = "Gráfica 3: Histograma Global\nFrecuencias Relativas",
        xlab = "Marca de Clase (Experiencia en Mina)",
        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)

barplot(alturas_porc,
        main = "Gráfica 4: Histograma Local\nFrecuencias Relativas",
        xlab = "Marca de Clase (Experiencia en Mina)",
        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)

4.2 Diagrama de Caja

par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)

boxplot(MINE_EXPER,
        horizontal = TRUE,
        main = "Gráfica 5: Diagrama de Caja\nVariable MINE_EXPER",
        xlab = "Experiencia en Mina (años)",
        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) 

4.3 Ojivas

Adicionalmente, generamos las ojivas que nos representa las frecuencias acumuladas.

plot(MC[1:k], Ni_asc,
     type = "b",
     main = "Gráfica 6: Ojivas de Frecuencias\nVariable MINE_EXPER",
     xlab = "Marca de Clase (Experiencia en Mina)",
     ylab = "Frecuencia Acumulada",
     col = "blue",
     lwd = 2,
     pch = 16,
     cex = 1.2,
     las = 1,
     ylim = c(0, n))

lines(MC[1:k], 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")

5 Conclusiones

El análisis descriptivo de la variable MINE_EXPER (Experiencia en Mina) revela patrones importantes sobre el perfil de experiencia de los trabajadores involucrados en accidentes mineros:

Distribución de la Experiencia: La experiencia promedio en la mina actual es de r round(media, 2) años, con una mediana de r round(mediana, 2) años, indicando que aproximadamente la mitad de los trabajadores accidentados tiene menos de r round(mediana, 2) años de experiencia en esa mina específica.

Variabilidad: El coeficiente de variación de r round(CV, 2)% indica una dispersión r ifelse(CV < 15, “BAJA”, ifelse(CV < 30, “MODERADA”, “ALTA”)) en los niveles de experiencia, lo que refleja una fuerza laboral con diferentes grados de antigüedad en las minas.

Valores Atípicos: Se identificaron r n_outliers valores atípicos (r porc_outliers%), que representan casos de trabajadores con niveles de experiencia extremadamente altos o bajos en relación con la mayoría.