ANÁLISIS ESTADÍSTICO

CARGA DE DATOS Y LIBRERÍAS

CARGA DE DATOS

#Limpiar entorno
rm(list = ls())
#Cargar librerías
if (!require("readr")) install.packages("readr")
if (!require("dplyr")) install.packages("dplyr")
if (!require("knitr")) install.packages("knitr")
if (!require("moments")) install.packages("moments")

library(readr)
library(dplyr)
library(knitr)
library(moments)
#Cargar datos
ruta <- "D:/contenido_cobre_2500_registros.csv"
datos <- read_csv(ruta)

cat("✓ Datos cargados exitosamente\n")
## ✓ Datos cargados exitosamente
cat("✓ Dimensiones:", nrow(datos), "observaciones\n")
## ✓ Dimensiones: 2500 observaciones

EXTRAER Y LIMPIAR LA VARIABLE

ASIGNACION DE VARIABLES

# Extraer y limpiar la variable CONTENIDO_COBRE_PORCENTAJE
CONTENIDO_COBRE_PORCENTAJE_raw <- datos$CONTENIDO_COBRE_PORCENTAJE
CONTENIDO_COBRE_PORCENTAJE <- as.numeric(CONTENIDO_COBRE_PORCENTAJE_raw)
CONTENIDO_COBRE_PORCENTAJE <- CONTENIDO_COBRE_PORCENTAJE[!is.na(CONTENIDO_COBRE_PORCENTAJE)]
CONTENIDO_COBRE_PORCENTAJE <- CONTENIDO_COBRE_PORCENTAJE[CONTENIDO_COBRE_PORCENTAJE != 0]

n <- length(CONTENIDO_COBRE_PORCENTAJE)

TABLA DE DISTRIBUCION DE PARAMETROS POR STURGES

# Parámetros de Sturges
R <- max(CONTENIDO_COBRE_PORCENTAJE) - min(CONTENIDO_COBRE_PORCENTAJE)
k <- floor(1 + 3.3 * log10(n))
A <- R / k

parametros_sturges <- data.frame(
  Parámetro = c("Rango (R)", 
                "Número de datos (n)", 
                "Número de intervalos (k)", 
                "Amplitud de clase (A)"),
  Valor = c(round(R, 4), n, k, round(A, 4))
)

kable(parametros_sturges, 
      caption = "Tabla 1: Parámetros de Sturges para la variable Contenido de Cobre (%)"
)
Tabla 1: Parámetros de Sturges para la variable Contenido de Cobre (%)
Parámetro Valor
Rango (R) 4.9460
Número de datos (n) 2500.0000
Número de intervalos (k) 12.0000
Amplitud de clase (A) 0.4122
# Intervalos y frecuencias
Li <- seq(min(CONTENIDO_COBRE_PORCENTAJE), max(CONTENIDO_COBRE_PORCENTAJE) - A, by = A)
Ls <- seq(min(CONTENIDO_COBRE_PORCENTAJE) + A, max(CONTENIDO_COBRE_PORCENTAJE), by = A)
MC <- (Li + Ls) / 2

ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(CONTENIDO_COBRE_PORCENTAJE >= Li[i] & CONTENIDO_COBRE_PORCENTAJE <= Ls[i])
  } else {
    ni[i] <- sum(CONTENIDO_COBRE_PORCENTAJE >= Li[i] & CONTENIDO_COBRE_PORCENTAJE < Ls[i])
  }
}

hi <- round((ni / n) * 100, 2)
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- round(cumsum(hi), 2)
Hidsc <- round(rev(cumsum(rev(hi))), 2)

TDF <- data.frame(
  Clase = 1:k,
  Li = round(Li, 2),
  Ls = round(Ls, 2),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Niasc = Niasc,
  Nidsc = Nidsc,
  Hiasc = Hiasc,
  Hidsc = Hidsc
)

kable(TDF,
      caption = "Tabla 2: Distribución de frecuencias de Contenido de Cobre (%)")
Tabla 2: Distribución de frecuencias de Contenido de Cobre (%)
Clase Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
1 0.05 0.47 0.26 1263 50.52 1263 2500 50.52 100.00
2 0.47 0.88 0.67 703 28.12 1966 1237 78.64 49.48
3 0.88 1.29 1.08 249 9.96 2215 534 88.60 21.36
4 1.29 1.70 1.50 143 5.72 2358 285 94.32 11.40
5 1.70 2.11 1.91 49 1.96 2407 142 96.28 5.68
6 2.11 2.53 2.32 38 1.52 2445 93 97.80 3.72
7 2.53 2.94 2.73 21 0.84 2466 55 98.64 2.20
8 2.94 3.35 3.15 13 0.52 2479 34 99.16 1.36
9 3.35 3.76 3.56 10 0.40 2489 21 99.56 0.84
10 3.76 4.18 3.97 5 0.20 2494 11 99.76 0.44
11 4.18 4.59 4.38 3 0.12 2497 6 99.88 0.24
12 4.59 5.00 4.79 3 0.12 2500 3 100.00 0.12
intervalos <- paste(round(Li, 2), round(Ls, 2), sep = " - ")
intervalos_resumen <- paste(
  round(Li, 0),
  round(Ls, 0),
  sep = " a "
)

Debido a que los límites de clase obtenidos mediante la regla de Sturges presentan números decimales difíciles de interpretar visualmente.

h <- hist(CONTENIDO_COBRE_PORCENTAJE,
          breaks = k,
          plot = FALSE)

Li <- head(h$breaks, -1)
Ls <- tail(h$breaks, -1)

ni <- h$counts
n <- sum(ni)

hi <- round(ni/n*100, 2)

Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))

Hiasc <- round(cumsum(hi), 2)
Hidsc <- round(rev(cumsum(rev(hi))), 2)

MC <- h$mids

TDF <- data.frame(
  Clase = seq_along(ni),
  Li = round(Li, 2),
  Ls = round(Ls, 2),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Niasc = Niasc,
  Nidsc = Nidsc,
  Hiasc = Hiasc,
  Hidsc = Hidsc
)

kable(
  TDF,
  caption = "Tabla 2: Distribución de frecuencias resumen"
)
Tabla 2: Distribución de frecuencias resumen
Clase Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
1 0.0 0.5 0.25 1349 53.96 1349 2500 53.96 100.00
2 0.5 1.0 0.75 719 28.76 2068 1151 82.72 46.04
3 1.0 1.5 1.25 248 9.92 2316 432 92.64 17.28
4 1.5 2.0 1.75 79 3.16 2395 184 95.80 7.36
5 2.0 2.5 2.25 47 1.88 2442 105 97.68 4.20
6 2.5 3.0 2.75 24 0.96 2466 58 98.64 2.32
7 3.0 3.5 3.25 19 0.76 2485 34 99.40 1.36
8 3.5 4.0 3.75 6 0.24 2491 15 99.64 0.60
9 4.0 4.5 4.25 5 0.20 2496 9 99.84 0.36
10 4.5 5.0 4.75 4 0.16 2500 4 100.00 0.16

GRAFICAS DE DISTRIBUCION DE CANTIDAD

# Histograma 1 (Ajuste estándar / normal)
hist(CONTENIDO_COBRE_PORCENTAJE,
     breaks = k,
     col = "sienna2",
     main = "Gráfica 1: Distribución de cantidad de contenido de cobre\nen depósitos minerales",
     xlab = "Contenido de Cobre (%)",
     ylab = "Frecuencia")

# Histograma 2 (Con margen superior ampliado)
hist(CONTENIDO_COBRE_PORCENTAJE,
     breaks = k,
     col = "chocolate",
     ylim = c(0, max(ni)*1.2),
     main = "Gráfica 2: Distribución global del contenido de cobre\nen depósitos minerales",
     xlab = "Contenido de Cobre (%)",
     ylab = "Frecuencia")

# Calcular media y mediana
media_rel <- mean(CONTENIDO_COBRE_PORCENTAJE)
mediana_rel <- median(CONTENIDO_COBRE_PORCENTAJE)

# Histograma porcentaje
h <- hist(CONTENIDO_COBRE_PORCENTAJE,
          breaks = k,
          plot = FALSE)

porcentaje <- h$counts / sum(h$counts) * 100

par(mar = c(7,4,4,2))

barplot(
  porcentaje,
  names.arg = paste(round(head(h$breaks,-1),2),
                    round(tail(h$breaks,-1),2),
                    sep = "-"),
  col = "sienna",
  ylim = c(0, max(porcentaje)*1.15),
  ylab = "Frecuencia Relativa (%)",
  main = "Gráfica 3: Distribución porcentual del contenido de cobre\nen depósitos minerales",
  las = 2,
  space = 0,
  border = "white"
)

title(
  xlab = "Contenido de Cobre (%)",
  line = 5.5
)

# Calcular media y mediana 
media_rel_global <- mean(CONTENIDO_COBRE_PORCENTAJE)
mediana_rel_global <- median(CONTENIDO_COBRE_PORCENTAJE)

# Histograma sin dibujar
h <- hist(CONTENIDO_COBRE_PORCENTAJE,
          breaks = k,
          plot = FALSE)

# Frecuencia relativa (%)
hi <- h$counts / sum(h$counts) * 100

# Etiquetas de intervalos
intervalos_graf <- paste(
  round(head(h$breaks,-1), 2),
  round(tail(h$breaks,-1), 2),
  sep = " - "
)

par(mar = c(7,4,4,2))

barplot(
  hi,
  names.arg = intervalos_graf,
  col = "sandybrown",
  ylim = c(0, 100),
  cex.names = 0.7,
  space = 0,
  ylab = "Frecuencia Relativa (%)",
  xlab = "",
  main = "Gráfica 4: Distribución de cantidad en porcentaje del\ncontenido de cobre en depósitos minerales",
  las = 2,
  border = "white"
)

title(
  xlab = "Intervalos de Contenido de Cobre (%)",
  line = 6
)

# Histograma con polígono
histograma <- hist(
  CONTENIDO_COBRE_PORCENTAJE,
  breaks = h$breaks,
  col = rgb(0.82, 0.41, 0.12, 0.6),
  border = "black",
  main = "Gráfica Nº5: Histograma con polígono de frecuencias\ndel contenido de cobre en depósitos minerales",
  xlab = "Contenido de Cobre (%)",
  ylab = "Cantidad"
)

# Polígono de frecuencias
lines(
  histograma$mids,
  histograma$counts,
  type = "o",
  pch = 16,
  lwd = 2,
  col = "saddlebrown"
)

# Ojiva de Frecuencias Absolutas Acumuladas
plot(Ls, Niasc, 
     type = "o", 
     pch = 16, 
     col = "blue",
     main = "Gráfica 6: Ojiva de Frecuencias Absolutas Acumuladas\nde los depósitos por Contenido de Cobre (%)",
     xlab = "Contenido de Cobre (%)",
     ylab = "Frecuencia Acumulada Absoluta (Ni)")

lines(Ls, Nidsc, 
      type = "o", 
      pch = 16, 
      col = "red")

legend("topleft",
       c("Ni Ascendente", "Ni Descendente"),
       col = c("blue", "red"),
       pch = 16)

# Ojiva de Frecuencias Relativas Acumuladas
plot(Ls, Hiasc, 
     type = "o", 
     pch = 16, 
     col = "blue",
     main = "Gráfica 7: Ojiva de Frecuencias Relativas Acumuladas\nde los depósitos por Contenido de Cobre (%)",
     xlab = "Contenido de Cobre (%)",
     ylab = "Frecuencia Acumulada Relativa (%)")

lines(Ls, Hidsc, 
      type = "o", 
      pch = 16, 
      col = "red")

legend("bottomright", 
       c("Hi Ascendente", "Hi Descendente"),
       col = c("blue", "red"), 
       pch = 16)

# Calcular todas las variables necesarias para el boxplot
media_box <- mean(CONTENIDO_COBRE_PORCENTAJE)
mediana_box <- median(CONTENIDO_COBRE_PORCENTAJE)
Q1_box <- quantile(CONTENIDO_COBRE_PORCENTAJE, 0.25)
Q3_box <- quantile(CONTENIDO_COBRE_PORCENTAJE, 0.75)
IQR_box <- IQR(CONTENIDO_COBRE_PORCENTAJE)

# Calcular outliers 
lim_inf_outlier_box <- Q1_box - 1.5 * IQR_box
lim_sup_outlier_box <- Q3_box + 1.5 * IQR_box
outliers_box <- CONTENIDO_COBRE_PORCENTAJE[CONTENIDO_COBRE_PORCENTAJE < lim_inf_outlier_box | CONTENIDO_COBRE_PORCENTAJE > lim_sup_outlier_box]
n_outliers_box <- length(outliers_box)

boxplot(CONTENIDO_COBRE_PORCENTAJE,
        horizontal = TRUE,
        col = "sandybrown",
        main = "Gráfica 7: Distribución del Contenido de Cobre (%)\ncon detección de valores atípicos",
        xlab = "Contenido de Cobre (%)",
        ylab = "",
        border = "saddlebrown")

# Añadir estadísticos importantes
points(media_box, 1, pch = 23, bg = "red", cex = 1.2)

legend("topright",
       legend = c(paste("Media:", round(media_box, 4)),
                  paste("Mediana:", round(mediana_box, 4)),
                  paste("Q1:", round(Q1_box, 4)),
                  paste("Q3:", round(Q3_box, 4)),
                  paste("Outliers:", n_outliers_box)),
       bty = "n",
       cex = 0.8)

# Ver resumen estadístico
summary(CONTENIDO_COBRE_PORCENTAJE)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0540  0.2939  0.4616  0.6612  0.7976  5.0000
# Histograma con diagrama de caja superpuesto
hist(
  CONTENIDO_COBRE_PORCENTAJE,
  breaks = h$breaks,
  col = "lightgray",
  border = "white",
  main = "Gráfica Nº8: Histograma con diagrama de caja superpuesto\ndel contenido de cobre en depósitos minerales",
  xlab = "Contenido de Cobre (%)",
  ylab = "Cantidad"
)

boxplot(
  CONTENIDO_COBRE_PORCENTAJE,
  horizontal = TRUE,
  at = par("usr")[4] * 0.70,
  add = TRUE,
  xaxt = "n",
  yaxt = "n",
  boxwex = par("usr")[4] * 0.30,
  col = rgb(0.9, 0.5, 0.2, 0.4),
  border = "saddlebrown"
)

INDICADORES ESTADISTICOS Y OUTLIERS

# Calcular indicadores de tendencia central
minimo <- min(CONTENIDO_COBRE_PORCENTAJE)
maximo <- max(CONTENIDO_COBRE_PORCENTAJE)
rango <- maximo - minimo
media <- mean(CONTENIDO_COBRE_PORCENTAJE)
mediana <- median(CONTENIDO_COBRE_PORCENTAJE)
moda <- as.numeric(names(sort(table(CONTENIDO_COBRE_PORCENTAJE), decreasing = TRUE)[1]))

# Crear tabla
tendencia_central <- data.frame(
  Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo", "Rango"),
  Valor = c(
    round(minimo, 4),
    round(media, 4),
    round(mediana, 4),
    round(moda, 4),
    round(maximo, 4),
    round(rango, 4)
  ),
  Unidad = rep("%", 6),
  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 en la muestra",
    "Valor máximo observado",
    "Diferencia entre el máximo y el mínimo"
  )
)

kable(tendencia_central,
      caption = "Tabla 3: Indicadores de Tendencia Central para la variable CONTENIDO_COBRE_PORCENTAJE",
      align = "l")
Tabla 3: Indicadores de Tendencia Central para la variable CONTENIDO_COBRE_PORCENTAJE
Indicador Valor Unidad Interpretación
Mínimo 0.0540 % Valor mínimo observado
Media 0.6612 % Promedio de todos los valores
Mediana 0.4616 % Valor que divide la muestra en dos partes iguales
Moda 1.3000 % Valor más frecuente en la muestra
Máximo 5.0000 % Valor máximo observado
Rango 4.9460 % Diferencia entre el máximo y el mínimo
# Calcular indicadores de dispersión
varianza <- var(CONTENIDO_COBRE_PORCENTAJE)
desv_est <- sd(CONTENIDO_COBRE_PORCENTAJE)
CV <- (desv_est / media) * 100

# Interpretación del CV
if(CV < 15) {
  interpretacion_CV <- "BAJA (CV < 15%)"
} else if(CV < 30) {
  interpretacion_CV <- "MODERADA (15% ≤ CV < 30%)"
} else {
  interpretacion_CV <- "ALTA (CV ≥ 30%)"
}

# Crear tabla
dispersion <- data.frame(
  Indicador = c("Varianza", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(
    round(varianza, 4),
    round(desv_est, 4),
    paste0(round(CV, 2), "%")
  ),
  Unidad = c("%²", "%", ""),
  Interpretación = c(
    "Medida de dispersión al cuadrado",
    "Dispersión promedio respecto a la media",
    paste("Dispersión relativa:", interpretacion_CV)
  )
)

kable(dispersion,
      caption = "Tabla 4: Indicadores de Dispersión para la variable CONTENIDO_COBRE_PORCENTAJE",
      align = "l")
Tabla 4: Indicadores de Dispersión para la variable CONTENIDO_COBRE_PORCENTAJE
Indicador Valor Unidad Interpretación
Varianza 0.3601 Medida de dispersión al cuadrado
Desviación Estándar 0.6001 % Dispersión promedio respecto a la media
Coeficiente de Variación 90.76% Dispersión relativa: ALTA (CV ≥ 30%)
# Calcular indicadores de posición
cuartiles <- quantile(CONTENIDO_COBRE_PORCENTAJE)
Q1 <- cuartiles[2]
Q2 <- cuartiles[3]
Q3 <- cuartiles[4]
IQR_val <- IQR(CONTENIDO_COBRE_PORCENTAJE)

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

# Crear tabla
posicion <- data.frame(
  Indicador = c("Cuartil 1 (Q1)", "Cuartil 2 (Q2 - Mediana)", "Cuartil 3 (Q3)", 
                "Rango Intercuartílico (IQR)", "Límite Inferior Outliers", 
                "Límite Superior Outliers", "Número de Outliers"),
  Valor = c(
    round(Q1, 4),
    round(Q2, 4),
    round(Q3, 4),
    round(IQR_val, 4),
    round(lim_inf_outlier, 4),
    round(lim_sup_outlier, 4),
    paste0(n_outliers, " (", porc_outliers, "%)")
  ),
  Unidad = c(rep("%", 6), "observaciones"),
  Interpretación = c(
    "25% de datos por debajo de este valor",
    "50% de datos por debajo de este valor (coincide con mediana)",
    "75% de datos por debajo de este valor",
    "Rango del 50% central de datos (Q3 - Q1)",
    "Límite inferior para detección de valores atípicos",
    "Límite superior para detección de valores atípicos",
    "Cantidad y porcentaje de valores atípicos detectados"
  )
)

kable(posicion,
      caption = "Tabla 5: Indicadores de Posición y detección de outliers en CONTENIDO_COBRE_PORCENTAJE",
      align = "l")
Tabla 5: Indicadores de Posición y detección de outliers en CONTENIDO_COBRE_PORCENTAJE
Indicador Valor Unidad Interpretación
Cuartil 1 (Q1) 0.2939 % 25% de datos por debajo de este valor
Cuartil 2 (Q2 - Mediana) 0.4616 % 50% de datos por debajo de este valor (coincide con mediana)
Cuartil 3 (Q3) 0.7976 % 75% de datos por debajo de este valor
Rango Intercuartílico (IQR) 0.5037 % Rango del 50% central de datos (Q3 - Q1)
Límite Inferior Outliers -0.4617 % Límite inferior para detección de valores atípicos
Límite Superior Outliers 1.5532 % Límite superior para detección de valores atípicos
Número de Outliers 174 (6.96%) observaciones Cantidad y porcentaje de valores atípicos detectados
# Calcular coeficiente de asimetría de Fisher
asimetria <- moments::skewness(CONTENIDO_COBRE_PORCENTAJE)

if(abs(asimetria) < 0.5) {
  interpretacion_asimetria <- "Distribución simétrica"
} else if(asimetria > 0) {
  interpretacion_asimetria <- "Asimetría positiva (sesgo a la derecha)"
} else {
  interpretacion_asimetria <- "Asimetría negativa (sesgo a la izquierda)"
}

# Curtosis
curtosis <- moments::kurtosis(CONTENIDO_COBRE_PORCENTAJE) - 3

if(abs(curtosis) < 0.5) {
  interpretacion_curtosis <- "Distribución mesocúrtica (normal)"
} else if(curtosis > 0) {
  interpretacion_curtosis <- "Distribución leptocúrtica (picuda)"
} else {
  interpretacion_curtosis <- "Distribución platicúrtica (aplanada)"
}

# Crear tabla
forma <- data.frame(
  Indicador = c("Coeficiente de Asimetría (Fisher)", "Interpretación Asimetría",
                "Coeficiente de Curtosis (Exceso)", "Interpretación Curtosis"),
  Valor = c(
    round(asimetria, 4),
    interpretacion_asimetria,
    round(curtosis, 4),
    interpretacion_curtosis
  ),
  Fórmula = c(
    "g₁ = E[(X-μ)³]/σ³",
    "|g₁| < 0.5: Simétrica; g₁ > 0: Positiva; g₁ < 0: Negativa",
    "g₂ = E[(X-μ)⁴]/σ⁴ - 3",
    "|g₂| < 0.5: Mesocúrtica; g₂ > 0: Leptocúrtica; g₂ < 0: Platicúrtica"
  )
)

kable(forma,
      caption = "Tabla 6: Indicadores de forma de la distribución de CONTENIDO_COBRE_PORCENTAJE",
      align = "l")
Tabla 6: Indicadores de forma de la distribución de CONTENIDO_COBRE_PORCENTAJE
Indicador Valor Fórmula
Coeficiente de Asimetría (Fisher) 2.7208 g₁ = E[(X-μ)³]/σ³
Interpretación Asimetría Asimetría positiva (sesgo a la derecha) |g₁| < 0.5: Simétrica; g₁ > 0: Positiva; g₁ < 0: Negativa
Coeficiente de Curtosis (Exceso) 9.9288 g₂ = E[(X-μ)⁴]/σ⁴ - 3
Interpretación Curtosis Distribución leptocúrtica (picuda) |g₂| < 0.5: Mesocúrtica; g₂ > 0: Leptocúrtica; g₂ < 0: Platicúrtica
tabla_resumen <- data.frame(
  Categoría = c("Tendencia Central", "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", "Forma", "Forma"),
  Indicador = c("Mínimo", "Media", "Mediana", "Moda", "Máximo", "Rango",
                "Varianza", "Desviación Estándar", "Coeficiente de Variación",
                "Cuartil 1 (Q1)", "Cuartil 2 (Q2)", "Cuartil 3 (Q3)", 
                "Rango Intercuartílico",
                "Asimetría (g₁)", "Interpretación Asimetría",
                "Curtosis (g₂)", "Interpretación Curtosis"),
  Valor = c(
    round(minimo, 4), round(media, 4), round(mediana, 4), round(moda, 4), 
    round(maximo, 4), round(rango, 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), interpretacion_asimetria,
    round(curtosis, 4), interpretacion_curtosis
  ),
  Unidad = c("%", "%", "%", "%", "%", "%",
             "%²", "%", "", "%", "%", "%", "%",
             "", "", "", "")
)

kable(tabla_resumen,
      caption = "Tabla 7: Resumen completo de indicadores estadísticos de CONTENIDO_COBRE_PORCENTAJE",
      align = "l",
      row.names = FALSE)
Tabla 7: Resumen completo de indicadores estadísticos de CONTENIDO_COBRE_PORCENTAJE
Categoría Indicador Valor Unidad
Tendencia Central Mínimo 0.054 %
Tendencia Central Media 0.6612 %
Tendencia Central Mediana 0.4616 %
Tendencia Central Moda 1.3 %
Tendencia Central Máximo 5 %
Tendencia Central Rango 4.946 %
Dispersión Varianza 0.3601
Dispersión Desviación Estándar 0.6001 %
Dispersión Coeficiente de Variación 90.76%
Posición Cuartil 1 (Q1) 0.2939 %
Posición Cuartil 2 (Q2) 0.4616 %
Posición Cuartil 3 (Q3) 0.7976 %
Posición Rango Intercuartílico 0.5037 %
Forma Asimetría (g₁) 2.7208
Forma Interpretación Asimetría Asimetría positiva (sesgo a la derecha)
Forma Curtosis (g₂) 9.9288
Forma Interpretación Curtosis Distribución leptocúrtica (picuda)

Conclusión

La variable contenido de cobre en porcentaje (%) presenta valores que fluctúan entre un mínimo de 0.0540 % y un máximo de 5.0000 %, con una mediana de 0.4616 %. La desviación estándar de 0.6001 % refleja la dispersión observada respecto a la media de 0.6612 %. El análisis de forma señala una asimetría positiva y una distribución leptocúrtica, con un total de 174 valores atípicos identificados 6.96 %, los cuales corresponden a depósitos con ley de cobre significativamente superior o diferente al promedio de la población.