1 CARGA DE DATOS

datos <- read.csv(
  "Datos Mineros.csv",
  header = TRUE,
  sep = ";",
  dec = ".",
  fileEncoding = "latin1"
)

1.1 CARGA DE LIBRERIAS

library(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
library(stringr)
library(gt)
library(moments)
library(knitr)

2 TABLA DE DISTRIBUCION DE CANTIDAD

La variable NO_INJURIES, aunque es de naturaleza discreta, fue agrupada en intervalos con el fin de facilitar la representación gráfica, suavizar la distribución y permitir un análisis más claro del comportamiento estadístico.

# Extraer variable NO_INJURIES

df_inj <- data.frame(variable = datos$NO_INJURIES)

NO_INJURIES <- as.numeric(df_inj$variable)
NO_INJURIES <- NO_INJURIES[!is.na(NO_INJURIES)]

Fila total de las sumas de ni y hi

# Extraer variable NO_INJURIES

#  Agrupar la variable en intervalos 
inj <- NO_INJURIES
clasificacion <- character(length(inj))

for(i in seq_along(inj)){
  
  if(inj[i] >= 0 & inj[i] < 1){
    clasificacion[i] <- "[0 , 1)"
  } else if(inj[i] >= 1 & inj[i] < 2){
    clasificacion[i] <- "[1 , 2)"
  } else if(inj[i] >= 2 & inj[i] < 3){
    clasificacion[i] <- "[2 , 3)"
  } else if(inj[i] >= 3 & inj[i] < 4){
    clasificacion[i] <- "[3 , 4)"
  } else if(inj[i] >= 4 & inj[i] < 5){
    clasificacion[i] <- "[4 , 5)"
  } else if(inj[i] >= 5 & inj[i] < 6){
    clasificacion[i] <- "[5 , 6)"
  } else if(inj[i] >= 6 & inj[i] < 7){
    clasificacion[i] <- "[6 , 7)"
  } else if(inj[i] >= 7 & inj[i] < 8){
    clasificacion[i] <- "[7 , 8)"
  } else if(inj[i] >= 8 & inj[i] < 9){
    clasificacion[i] <- "[8 , 9)"
  } else if(inj[i] >= 9 & inj[i] <= 10){
    clasificacion[i] <- "[9 , 10]"
  } else {
    clasificacion[i] <- NA
  }
}

# Quitar NA
clasificacion <- na.omit(clasificacion)

# Orden de intervalos
orden <- c("[0 , 1)",
           "[1 , 2)",
           "[2 , 3)",
           "[3 , 4)",
           "[4 , 5)",
           "[5 , 6)",
           "[6 , 7)",
           "[7 , 8)",
           "[8 , 9)",
           "[9 , 10]")

clasificacion <- factor(clasificacion, levels = orden)


#  Frecuencias simples y acumuladas

ni <- table(clasificacion)
total <- sum(ni)
hi <- round(as.numeric(ni) / total * 100, 2)

Ni_Asc <- cumsum(ni)
Hi_Asc <- cumsum(hi)

Ni_Desc <- rev(cumsum(rev(ni)))
Hi_Desc <- rev(cumsum(rev(hi)))

tabla_final <- data.frame(
  Intervalo = names(ni),
  ni = as.numeric(ni),
  hi = hi,
  Ni_Asc = as.numeric(Ni_Asc),
  Hi_Asc = round(Hi_Asc, 2),
  Ni_Desc = as.numeric(Ni_Desc),
  Hi_Desc = round(Hi_Desc, 2),
  check.names = FALSE
)
tabla_final
##    Intervalo   ni    hi Ni_Asc Hi_Asc Ni_Desc Hi_Desc
## 1    [0 , 1)  591 11.95    591  11.95    4945  100.00
## 2    [1 , 2) 4309 87.14   4900  99.09    4354   88.05
## 3    [2 , 3)   32  0.65   4932  99.74      45    0.91
## 4    [3 , 4)    7  0.14   4939  99.88      13    0.26
## 5    [4 , 5)    2  0.04   4941  99.92       6    0.12
## 6    [5 , 6)    2  0.04   4943  99.96       4    0.08
## 7    [6 , 7)    1  0.02   4944  99.98       2    0.04
## 8    [7 , 8)    0  0.00   4944  99.98       1    0.02
## 9    [8 , 9)    0  0.00   4944  99.98       1    0.02
## 10  [9 , 10]    1  0.02   4945 100.00       1    0.02

TABLA DE DISTRIBUCIÓN DE CANTIDAD FINAL

fila_total <- data.frame(
  Intervalo = "TOTAL",
  ni = sum(tabla_final$ni),
  hi = round(sum(tabla_final$hi), 2),
  Ni_Asc = "-",
  Hi_Asc = "-",
  Ni_Desc = "-",
  Hi_Desc = "-"
)

tabla_final <- rbind(tabla_final, fila_total)


# 7) Reemplazar NA por guiones

tabla_final[is.na(tabla_final)] <- "-"


# 8) TABLA GT (bonita)

TablaInj <- tabla_final %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº. 1*"),
    subtitle = md("**Tabla de distribución del número de lesionados en accidentes mineros (EE.UU.)**")
  ) %>%
  tab_source_note(
    source_note = md("__Autor: Grupo 1__")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = gt::px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = gt::px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Intervalo == "TOTAL")
  )

TablaInj
Tabla Nº. 1
Tabla de distribución del número de lesionados en accidentes mineros (EE.UU.)
Intervalo ni hi Ni_Asc Hi_Asc Ni_Desc Hi_Desc
[0 , 1) 591 11.95 591 11.95 4945 100
[1 , 2) 4309 87.14 4900 99.09 4354 88.05
[2 , 3) 32 0.65 4932 99.74 45 0.91
[3 , 4) 7 0.14 4939 99.88 13 0.26
[4 , 5) 2 0.04 4941 99.92 6 0.12
[5 , 6) 2 0.04 4943 99.96 4 0.08
[6 , 7) 1 0.02 4944 99.98 2 0.04
[7 , 8) 0 0.00 4944 99.98 1 0.02
[8 , 9) 0 0.00 4944 99.98 1 0.02
[9 , 10] 1 0.02 4945 100 1 0.02
TOTAL 4945 100.00 - - - -
Autor: Grupo 1

3 GRÁFICAS DE DISTRIBUCIÓN DE CANTIDAD

Histograma de cantidad

hist(NO_INJURIES,
     main = "Gráfica Nº1: Distribución de NO_INJURIES",
     col = "gray",
     ylab = "Cantidad",
     xlab = "Número de lesionados")

Histograma de cantidad en porcentaje

# Barras en porcentaje (sin TOTAL)
hi_plot <- tabla_final$hi[tabla_final$Intervalo != "TOTAL"]
etiquetas_x <- tabla_final$Intervalo[tabla_final$Intervalo != "TOTAL"]

barplot(as.numeric(hi_plot),
        main = "Gráfica Nº2: Distribución porcentual de Número de Lesionados",
        col = "gray",
        space = 0,
        las = 2,
        xlab = "Intervalos de Número de Lesionados",
        ylab = "Porcentaje (%)",
        names.arg = etiquetas_x,
        ylim = c(0, 100))

3.1 OJIVAS

Ojivas combinadas Ni

x_intervalos <- seq_along(ni)

plot(x = x_intervalos,
     y = as.numeric(Ni_Asc),
     type = "o",
     col = "blue",
     main = "Gráfica Nº5: Ojiva combinada (Ni)",
     xlab = "Intervalos",
     ylab = "Cantidad acumulada (Ni)",
     xaxt = "n")

axis(1,
     at = x_intervalos,
     labels = orden,
     las = 2,
     cex.axis = 0.8)

lines(x = x_intervalos,
      y = as.numeric(Ni_Desc),
      type = "o",
      col = "red")

Ojivas combinadas Ni

plot(x = x_intervalos,
     y = as.numeric(Hi_Asc),
     type = "o",
     col = "blue",
     main = "Gráfica Nº6: Ojiva combinada (Hi)",
     xlab = "Intervalos",
     ylab = "Porcentaje acumulado (Hi)",
     ylim = c(0, 100),
     xaxt = "n")
axis(1, at = x_intervalos, labels = orden, las = 2, cex.axis = 0.8)
lines(x = x_intervalos, y = as.numeric(Hi_Desc), type = "o", col = "red")

3.2 DIAGRAMA DE CAJA

boxplot(NO_INJURIES,
        horizontal = TRUE,
        col = "blue",
        main = "Gráfica Nº7: Distribucion de cantidad de numeros de lesionados",
        xlab = "Número de lesionados")

4 GRÁFICAS DE DISTRIBUCIÓN DE CANTIDAD

Indicadores

#MEDIA ARITMETICA
ri <- min(NO_INJURIES)
rs <- max(NO_INJURIES)
x  <- mean(NO_INJURIES)
x
## [1] 0.8954499
#MEDIANA ARITMETICA
Me <- median(NO_INJURIES)
Me
## [1] 1

DISPERSION

#DESVIACIÓN ESTÁNDAR 
sdv <- sd(NO_INJURIES)
sdv
## [1] 0.3902502
#COEFICIENTE DE VARIACIÓN
CV <- (sdv / x) * 100
CV
## [1] 43.58147

FORMA

#COEFICIENTE DE VARIACIÓN
As <- moments::skewness(NO_INJURIES)
As
## [1] 2.637139
#COEFICIENTE DE VARIACIÓN
K  <- moments::kurtosis(NO_INJURIES)
K
## [1] 77.35958

TABLA DE INDICADORES ESTADISTICOS

TablaIndicadores <- data.frame(
  Variable = "NO_INJURIES",
  minimo = ri,
  maximo = rs,
  x = round(x, 2),
  Me = Me,
  sd = round(sdv, 2),
  `Cv (%)` = round(CV, 2),
  As = round(As, 2),
  K = round(K, 2),
  check.names = FALSE
)

kable(TablaIndicadores, caption = "Tabla N°2. Indicadores estadísticos de Numeros de Lesionados")
Tabla N°2. Indicadores estadísticos de Numeros de Lesionados
Variable minimo maximo x Me sd Cv (%) As K
NO_INJURIES 0 10 0.9 1 0.39 43.58 2.64 77.36

TABLA DE OUTLIERS

outliers <- boxplot.stats(NO_INJURIES)$out
num_outliers <- length(outliers)

# Guardar mínimo y máximo correctamente
minoutliers <- ifelse(num_outliers > 0, min(outliers), NA)
maxoutliers <- ifelse(num_outliers > 0, max(outliers), NA)

num_outliers
## [1] 636
minoutliers
## [1] 0
maxoutliers
## [1] 10
# Tabla Outliers

TablaOutliers <- data.frame(
  Outliers = num_outliers,
  Minimo = minoutliers,
  Maximo = maxoutliers
)

colnames(TablaOutliers) <- c("Outliers", "Mínimo", "Máximo")

kable(
  TablaOutliers,
  format = "markdown",
  caption = "Tabla N°4: Valores atípicos (Outliers) de la variable NO_INJURIES (Número de lesionados en accidentes mineros)"
)
Tabla N°4: Valores atípicos (Outliers) de la variable NO_INJURIES (Número de lesionados en accidentes mineros)
Outliers Mínimo Máximo
636 0 10

5 CONCLUSÍON

La variable Número de lesionados presenta valores que oscilan entre 0 y los niveles máximos observados, evidenciando una marcada concentración en los valores bajos, particularmente en accidentes que involucran uno o ningún lesionado. La mediana refleja que la ocurrencia típica corresponde a eventos de baja severidad, mientras que la desviación estándar indica la presencia de variabilidad influenciada por un número reducido de accidentes con múltiples lesionados. Este comportamiento genera una distribución asimétrica positiva, característica común en estudios de accidentabilidad, donde predominan incidentes menores y los eventos severos aparecen con menor frecuencia. La acumulación de observaciones en los intervalos inferiores sugiere que, en términos generales, la mayoría de los accidentes registrados presentan impactos humanos limitados. Sin embargo, la existencia de valores atípicos asociados a accidentes de mayor magnitud resalta la importancia de mantener y fortalecer continuamente las estrategias de prevención y control de riesgos en operaciones mineras.