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.
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.
# 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)
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(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á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))
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])
}
}
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[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")
| 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 |
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(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]))
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
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)
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")
| 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 |
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")
| 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 |
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)
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)
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")
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.