Variable Cuantitativa Continua - Longitud La longitud representa la posición este-oeste donde ocurren los accidentes mineros. Esta variable permite analizar la distribución espacial de los incidentes, identificando zonas de mayor concentración y patrones geográficos de riesgo.
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 LONGITUDE para el análisis.
# Limpiar entorno
rm(list = ls())
# Cargar librerías
if (!require("readxl")) install.packages("readxl")
library(readxl)
if (!require("moments")) install.packages("moments")
library(moments)
# Cargar datos
ruta <- "C:/Users/arian/OneDrive/Documentos/UNI/estadistica/PROYECTO/1. DATOS/5000_Datos.xlsx"
datos <- read_excel(ruta)
cat("✓ Datos cargados exitosamente\n")
## ✓ Datos cargados exitosamente
cat("✓ Dimensiones:", nrow(datos), "observaciones\n")
## ✓ Dimensiones: 4945 observaciones
# Extraer variable
LONGITUDE_raw <- datos$LONGITUDE
# Limpieza
LONGITUDE <- as.numeric(LONGITUDE_raw)
LONGITUDE <- LONGITUDE[!is.na(LONGITUDE)]
# Tamaño muestral
n <- length(LONGITUDE)
# Reporte
datos_originales <- nrow(datos)
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(LONGITUDE) - min(LONGITUDE)
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 - min =", round(max(LONGITUDE), 4), "-", round(min(LONGITUDE), 4)),
paste("n =", n),
paste("1 + 3.3 × log₁₀(", n, ")"),
paste("floor(", round(1 + 3.3 * log10(n), 4), ")"),
paste(round(R, 4), "/", k)
),
Valor = c(
round(R, 4),
n,
round(1 + 3.3 * log10(n), 4),
k,
round(A, 4)
),
Unidad = c("grados", "datos", "", "intervalos", "grados/intervalo")
)
# Mostrar tabla con formato mejorado
library(knitr)
kable(parametros_sturges,
align = c("l", "l", "r", "l"),
caption = "Tabla 1: Parámetros de la Regla de Sturges para LONGITUDE",
col.names = c("Parámetro", "Cálculo", "Valor", "Unidad"))
| Parámetro | Cálculo | Valor | Unidad |
|---|---|---|---|
| Rango (R) | max - min = -69.0064 - -124.1028 | 55.0964 | grados |
| Número de datos (n) | n = 4945 | 4945.0000 | datos |
| Fórmula de k | 1 + 3.3 × log₁₀( 4945 ) | 13.1907 | |
| Número de intervalos (k) | floor( 13.1907 ) | 13.0000 | intervalos |
| Amplitud de clase (A) | 55.0964 / 13 | 4.2382 | grados/intervalo |
# 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
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(LONGITUDE >= liminf[i] & LONGITUDE <= limsup[i])
} else {
n_i[i] <- sum(LONGITUDE >= liminf[i] & LONGITUDE < 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, 2),
Ls = round(limsup, 2),
MC = round(MC, 2),
fi = n_i,
hi = round(h_i, 2),
Fi = Ni_asc,
Hi = round(Hi_asc, 2)
)
# Mostrar tabla con formato mejorado
library(knitr)
kable(TablaFrecuencias,
align = c("c", "r", "r", "r", "r", "r", "r", "r"),
caption = "Tabla 2: Distribución de Frecuencias de LONGITUDE",
col.names = c("Clase", "Lím. Inf.", "Lím. Sup.", "Marca Clase",
"fi", "hi (%)", "Fi", "Hi (%)"))
| Clase | Lím. Inf. | Lím. Sup. | Marca Clase | fi | hi (%) | Fi | Hi (%) |
|---|---|---|---|---|---|---|---|
| 1 | -124.10 | -119.86 | -121.98 | 108 | 2.18 | 108 | 2.18 |
| 2 | -119.86 | -115.63 | -117.75 | 324 | 6.55 | 432 | 8.74 |
| 3 | -115.63 | -111.39 | -113.51 | 158 | 3.20 | 590 | 11.93 |
| 4 | -111.39 | -107.15 | -109.27 | 421 | 8.51 | 1011 | 20.44 |
| 5 | -107.15 | -102.91 | -105.03 | 172 | 3.48 | 1183 | 23.92 |
| 6 | -102.91 | -98.67 | -100.79 | 45 | 0.91 | 1228 | 24.83 |
| 7 | -98.67 | -94.44 | -96.55 | 245 | 4.95 | 1473 | 29.79 |
| 8 | -94.44 | -90.20 | -92.32 | 321 | 6.49 | 1794 | 36.28 |
| 9 | -90.20 | -85.96 | -88.08 | 995 | 20.12 | 2789 | 56.40 |
| 10 | -85.96 | -81.72 | -83.84 | 889 | 17.98 | 3678 | 74.38 |
| 11 | -81.72 | -77.48 | -79.60 | 934 | 18.89 | 4612 | 93.27 |
| 12 | -77.48 | -73.24 | -75.36 | 286 | 5.78 | 4898 | 99.05 |
| 13 | -73.24 | -69.01 | -71.13 | 47 | 0.95 | 4945 | 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(LONGITUDE)
maximo <- max(LONGITUDE)
rango <- maximo - minimo
media <- mean(LONGITUDE)
mediana <- median(LONGITUDE)
moda <- as.numeric(names(sort(table(LONGITUDE), 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(LONGITUDE)
desv_est <- sd(LONGITUDE)
CV <- (desv_est / media) * 100
Se calculan medidas que dividen la distribución en partes iguales: cuartiles y rango intercuartílico.
cuartiles <- quantile(LONGITUDE)
Q1 <- cuartiles[2]
Q2 <- cuartiles[3]
Q3 <- cuartiles[4]
IQR_val <- IQR(LONGITUDE)
# Detección de outliers
lim_inf_outlier <- Q1 - 1.5 * IQR_val
lim_sup_outlier <- Q3 + 1.5 * IQR_val
outliers <- LONGITUDE[LONGITUDE < lim_inf_outlier | LONGITUDE > lim_sup_outlier]
n_outliers <- length(outliers)
Se calculan medidas que describen la forma de la distribución: asimetría y curtosis.
asimetria <- skewness(LONGITUDE)
curtosis <- kurtosis(LONGITUDE)
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",
"Forma", "Forma"),
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",
"Asimetría", "Curtosis"),
Valor = c(round(minimo, 4), round(media, 4), round(mediana, 4), round(moda, 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),
round(asimetria, 4), round(curtosis, 4)),
Unidad = c("grados", "grados", "grados", "grados", "grados",
"grados²", "grados", "", "grados", "grados", "grados", "grados",
"", ""),
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",
ifelse(asimetria > 0, "Asimétrica positiva", ifelse(asimetria < 0, "Asimétrica negativa", "Simétrica")),
ifelse(curtosis > 3, "Leptocúrtica", ifelse(curtosis < 3, "Platicúrtica", "Mesocúrtica")))
)
# Mostrar tabla con formato mejorado
library(knitr)
kable(tabla_resumen,
align = c("l", "l", "r", "c", "l"),
caption = "Tabla 3: Resumen de Indicadores Estadísticos de LONGITUDE",
col.names = c("Categoría", "Indicador", "Valor", "Unidad", "Interpretación"))
| Categoría | Indicador | Valor | Unidad | Interpretación |
|---|---|---|---|---|
| Tendencia Central | Mínimo | -124.1028 | grados | Valor mínimo observado |
| Tendencia Central | Media | -91.4508 | grados | Promedio de todos los valores |
| Tendencia Central | Mediana | -87.3753 | grados | Valor que divide la muestra en dos partes iguales |
| Tendencia Central | Moda | -109.335 | grados | Valor más frecuente |
| Tendencia Central | Máximo | -69.0064 | grados | Valor máximo observado |
| Dispersión | Varianza | 172.7785 | grados² | Medida de dispersión al cuadrado |
| Dispersión | Desviación Estándar | 13.1445 | grados | Dispersión promedio respecto a la media |
| Dispersión | Coeficiente de Variación | -14.37% | Dispersión relativa (BAJA) | |
| Posición | Cuartil 1 (Q1) | -98.4403 | grados | 25% de datos por debajo |
| Posición | Cuartil 2 (Q2) | -87.3753 | grados | 50% de datos por debajo |
| Posición | Cuartil 3 (Q3) | -81.6933 | grados | 75% de datos por debajo |
| Posición | Rango Intercuartílico | 16.7469 | grados | Rango del 50% central de datos |
| Forma | Asimetría | -0.8686 | Asimétrica negativa | |
| Forma | Curtosis | 2.5049 | Platicúrtica |
Generamos diagramas de barras tanto Global como Local para las frecuencias absolutas para visualizar el conteo de ocurrencias de los valores de la variable.
par(mfrow = c(2, 2), mar = c(5, 4, 4, 2) + 0.1)
hist(LONGITUDE,
main = "Gráfica Nº1: Histograma Global\nFrecuencias Absolutas",
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",
cex = 0.8)
hist(LONGITUDE,
main = "Gráfica Nº2: Histograma Local\nFrecuencias Absolutas",
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",
cex = 0.8)
alturas_porc <- h_i
nombres_barras <- round(MC, 1)
barplot(alturas_porc,
main = "Gráfica Nº3: Histograma Global\nFrecuencias Relativas",
xlab = "Marca de Clase (Longitud)",
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)
# Añadir líneas de media y mediana
abline(v = (media - min(liminf)) / A * 1, col = "red", lwd = 2, lty = 2)
abline(v = (mediana - min(liminf)) / A * 1, col = "blue", lwd = 2, lty = 2)
barplot(alturas_porc,
main = "Gráfica Nº4: Histograma Local\nFrecuencias Relativas",
xlab = "Marca de Clase (Longitud)",
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)
# Añadir líneas de media y mediana
abline(v = (media - min(liminf)) / A * 1, col = "red", lwd = 2, lty = 2)
abline(v = (mediana - min(liminf)) / A * 1, col = "blue", lwd = 2, lty = 2)
boxplot(LONGITUDE,
horizontal = TRUE,
main = "Gráfica Nº5: 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)
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 y, de igual manera, el intercepto de las gráficas de la ojiva ascendente y la descendente.
plot(MC, Ni_asc,
type = "b",
main = "Gráfica Nº6: Ojivas de Frecuencias Absolutas\nVariable LONGITUDE",
xlab = "Marca de Clase (Longitud en grados)",
ylab = "Frecuencia Acumulada Absoluta",
col = "blue",
lwd = 2,
pch = 16,
cex = 1.2,
las = 1,
ylim = c(0, n))
lines(MC, 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")
plot(MC, Hi_asc,
type = "b",
main = "Gráfica Nº7: Ojivas de Frecuencias Relativas\nVariable LONGITUDE",
xlab = "Marca de Clase (Longitud en grados)",
ylab = "Frecuencia Acumulada Relativa (%)",
col = "blue",
lwd = 2,
pch = 16,
cex = 1.2,
las = 1,
ylim = c(0, 100))
lines(MC, Hi_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")
La Variable LONGITUDE fluctua entre [-124.10:-69.00] y sus valores giran en torno a -873.753, con una desviacion estandar de 13.14,muy homogenea, ligeramente Fuerte en la parte baja con la existencia de 3 valores atipicos que empiezan desde 124.1028
Por todo lo anterior, el comportamiento de la variable es favorable, ya que la mayoría de las observaciones se encuentran concentradas dentro de un rango coherente y consistente desde el punto de vista geográfico. La baja variabilidad y la escasa cantidad de valores atípicos sugieren que los datos de longitud son estables y representativos, permitiendo su uso confiable en análisis estadísticos posteriores y en la interpretación espacial de los accidentes, lesiones y enfermedades en operaciones mineras. Los valores atípicos identificados no afectan de manera significativa la estructura general de la distribución y pueden estar asociados a ubicaciones extremas o posibles errores de georreferenciación, los cuales deben ser analizados de forma puntual.