CARGA DE DATOS

CARGA DE DATOS

knitr::opts_chunk$set(
    echo = TRUE,                   # Muestra el código R en el reporte final.
    message = FALSE,
    warning = FALSE,               # Message y warning evitan que se impriman alertas o mensajes de carga estorbosos en el HTML.
    fig.align = "center"           # Centra automáticamente todas las gráficas generadas.
)

datos <- read.csv("C:/Users/Martin/Desktop/Estadistica/CMDB_Data.csv", 
                  header = TRUE, # Indica que la primera fila contienen los nombres de las variables.
                  sep = ";",     # Define que los puntos y comas es el separador de las columnas del archivo.
                  dec = ".",     # Establece el punto como el operador decimal para los números.
                  fileEncoding = "latin1")

# Verificación inicial del set de datos
str(datos)
## 'data.frame':    1366 obs. of  103 variables:
##  $ ï..LAB_ID            : chr  "C355417" "C360759" "C360762" "C360763" ...
##  $ PREVIOUS_LAB_ID1     : chr  "" "" "" "" ...
##  $ PREVIOUS_LAB_ID2     : chr  "" "" "" "" ...
##  $ PREVIOUS_LAB_ID3     : chr  "" "" "" "" ...
##  $ FIELD_ID             : chr  "RM0001" "RM0027" "RM0030" "RM0031" ...
##  $ JOB_ID               : chr  "MRP11968" "MRP12307" "MRP12307" "MRP12307" ...
##  $ PREVIOUS_JOB_ID1     : chr  "" "" "" "" ...
##  $ PREVIOUS_JOB_ID2     : chr  "" "" "" "" ...
##  $ PREVIOUS_JOB_ID3     : chr  "" "" "" "" ...
##  $ SUBMITTER            : chr  "Rare Metals Task" "Rare Metals Task" "Rare Metals Task" "Rare Metals Task" ...
##  $ PROJECT_NAME         : chr  "Critical and Rare Metals" "Critical and Rare Metals" "Critical and Rare Metals" "Critical and Rare Metals" ...
##  $ X0                   : chr  "30/6/2011" "31/8/2011" "31/8/2011" "31/8/2011" ...
##  $ COLLECTION           : chr  "Mackay-Keck Ore Deposits Collection" "Mackay-Stanford Ore Deposits Collection" "Mackay-Stanford Ore Deposits Collection" "Mackay-Stanford Ore Deposits Collection" ...
##  $ COLLECTION_ID        : chr  "PHNC08_39_1183" "OD21441" "OD22811" "OD25716" ...
##  $ CONTINENT            : chr  "North America" "South America" "South America" "Africa" ...
##  $ COUNTRY              : chr  "United States" "Chile" "Chile" "South Africa" ...
##  $ STATE_PROVINCE       : chr  "Nevada" "Antofagasta" "Tarapacá" "Transvaal" ...
##  $ COUNTY               : chr  "Lyon" "El Loa" "El Tamarugal" "" ...
##  $ DISTRICT_NAME        : chr  "Yerington" "Chuquicamata" "Collahuasi/Quebrada Blanca" "" ...
##  $ DEPOSIT_NAME         : chr  "Pumpkin Hollow" "" "" "" ...
##  $ MINE_NAME            : chr  "Pumpkin Hollow" "Chuquicamata mine" "Collahuasi district" "" ...
##  $ DISTRICT_NAME_COLLECT: chr  "Yerington" "" "" "" ...
##  $ DEPOSIT_NAME_COLLECT : chr  "" "" "" "" ...
##  $ MINE_NAME_COLLECT    : chr  "Pumpkin Hollow" "Chuquicamata" "Poduosa mine" "Messina Mines Ltd." ...
##  $ LOCATE_DESC          : chr  "" "" "Level 25" "" ...
##  $ LATITUDE             : chr  "38,94021" "-22,2871" "-21,0309" "-24,7" ...
##  $ LONGITUDE            : chr  "-119,05178" "-68,8991" "-68,74951" "29,3" ...
##  $ DATUM                : chr  "WGS84" "WGS84" "WGS84" "" ...
##  $ LATITUDE_COLLECT     : chr  "38,92492" "22,28944" "" "" ...
##  $ LONGITUDE_COLLECT    : chr  "-119,1071" "-68,90111" "" "" ...
##  $ DATUM_COLLECT        : chr  "" "WGS84" "" "" ...
##  $ COORDINATES_QUAL     : chr  "100 m" "0m" "" "" ...
##  $ COORDINATES_SOURCE   : chr  "1) iTouchMap.com, approx, A. Orkild-Norton; 2) Mineral Resource Deposit Database Deposit ID 10174173, ore body, M. Granitto" "1) Mindat.org, approx, A. Orkild-Norton; 2) Open-File Report 2017-1079 ID 549, mine, M. Granitto" "1) No coordinates; 2) Mineral Resource Deposit Database Deposit ID 10057511, district, M. Granitto" "1) No coordinates; 2) Google Earth Pro, approx ctr of former province of Transvaal, M. Granitto" ...
##  $ PRIMARY_CLASS        : chr  "rock" "rock" "rock" "rock" ...
##  $ SYSTEM_TYPE          : chr  "IOA-IOCG" "Porphyry Cu-Mo-Au" "Porphyry Cu-Mo-Au" "IOA-IOCG" ...
##  $ DEPOSIT_TYPE         : chr  "IOCG" "Supergene Cu" "Porphyry Cu" "IOCG" ...
##  $ SAMPLE_DESC          : chr  "Nearly solid chalcopyrite mixed with small light brown irregular inclusions of unknown mineralogy; clouds of ma"| __truncated__ "Chalcocite-bronchatite-antlerite(?); highly microfractured igneous rock with green copper sulfates coating microfractures" "Bornite-chalcopyrite; mostly massive chalcopyrite with numerous inclusions of micro-chalcopyrite and widely sca"| __truncated__ "Massive chalcopyrite, IOCG in shear zone; mostly massive fine grain cuprite with widely distributed malachite t"| __truncated__ ...
##  $ Al_pct_AES_ST        : chr  "0,33" "6,65" "0,46" "0,7" ...
##  $ Ca_pct_AES_ST        : chr  "1,1" "0,4" "-0,1" "0,3" ...
##  $ Fe_pct_AES_ST        : chr  "42,4" "0,25" "6,98" "27,8" ...
##  $ K_pct_AES_ST         : chr  "-0,1" "6,1" "0,2" "-0,1" ...
##  $ Mg_pct_AES_ST        : chr  "0,57" "0,1" "0,01" "0,33" ...
##  $ Mn_pct_AES_ST        : chr  "0,02" "-0,01" "-0,01" "-0,01" ...
##  $ P_pct_AES_ST         : chr  "-0,01" "0,01" "0,05" "0,01" ...
##  $ S_pct_AES_ST         : chr  "" "" "" "" ...
##  $ Si_pct_AES_ST        : chr  "" "" "" "" ...
##  $ Ti_pct_AES_ST        : chr  "0,01" "0,11" "-0,01" "-0,01" ...
##  $ F_pct_ISE_Fuse       : chr  "" "" "" "" ...
##  $ Ag_ppm_MS_ST         : chr  "58" "6" "468" "16" ...
##  $ As_ppm_MS_ST         : chr  "-30" "-30" "90" "-30" ...
##  $ Au_ppm               : chr  "" "" "" "" ...
##  $ Au_AM                : chr  "" "" "" "" ...
##  $ B_ppm_AES_ST         : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Ba_ppm_AES_ST        : chr  "-0,5" "924" "121" "174" ...
##  $ Be_ppm_AES_ST        : int  -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 ...
##  $ Bi_ppm_MS_ST         : chr  "1,5" "3,6" "190" "0,4" ...
##  $ Cd_ppm_MS_ST         : chr  "3,6" "-0,2" "0,9" "-0,2" ...
##  $ Ce_ppm_MS_ST         : chr  "0,4" "8,8" "16,3" "3,5" ...
##  $ Co_ppm_MS_ST         : chr  "209" "-0,5" "1,3" "44,8" ...
##  $ Cr_ppm_AES_ST        : int  -10 -10 -10 30 20 20 60 40 20 10 ...
##  $ Cs_ppm_MS_ST         : chr  "0,5" "1,4" "0,2" "-0,1" ...
##  $ Cu_ppm_AES_ST        : chr  "50000,11111" "23300" "50000,11111" "50000,11111" ...
##  $ Dy_ppm_MS_ST         : chr  "-0,05" "0,32" "1,38" "0,37" ...
##  $ Er_ppm_MS_ST         : chr  "-0,05" "0,22" "0,77" "0,23" ...
##  $ Eu_ppm_MS_ST         : chr  "-0,05" "0,14" "0,17" "0,1" ...
##  $ Ga_ppm_MS_ST         : chr  "5" "15" "6" "3" ...
##  $ Gd_ppm_MS_ST         : chr  "-0,05" "0,45" "1,5" "0,39" ...
##  $ Ge_ppm_MS_ST         : int  -1 5 -1 -1 3 8 8 1 2 2 ...
##  $ Hf_ppm_MS_ST         : int  -1 4 -1 -1 5 13 12 2 3 6 ...
##  $ Ho_ppm_MS_ST         : chr  "-0,05" "0,07" "0,25" "0,07" ...
##  $ In_ppm_MS_ST         : chr  "6,4" "-0,2" "3,7" "0,2" ...
##  $ La_ppm_MS_ST         : chr  "0,2" "4,6" "7,2" "1,7" ...
##  $ Li_ppm_AES_ST        : int  -10 -10 -10 -10 30 20 20 20 -10 20 ...
##  $ Lu_ppm_MS_ST         : chr  "-0,05" "-0,05" "0,08" "-0,05" ...
##  $ Mo_ppm_MS_ST         : chr  "-2" "60" "3" "2" ...
##  $ Nb_ppm_MS_ST         : chr  "-1" "4" "-1" "-1" ...
##  $ Nd_ppm_MS_ST         : chr  "0,2" "3,8" "9,1" "1,7" ...
##  $ Ni_ppm_AES_ST        : chr  "144" "6" "-5" "48" ...
##  $ Pb_ppm_MS_ST         : chr  "23" "16" "188" "39" ...
##  $ Pd_ppm_FA_MS         : chr  "" "" "" "" ...
##  $ Pr_ppm_MS_ST         : chr  "-0,05" "1,09" "2,21" "0,46" ...
##  $ Pt_ppm_FA_MS         : chr  "" "" "" "" ...
##  $ Rb_ppm_MS_ST         : chr  "1,2" "148" "7,1" "0,7" ...
##  $ Re_ppm_MS_HF         : chr  "" "" "" "" ...
##  $ Sb_ppm_MS_ST         : chr  "1,2" "2,4" "2,9" "0,3" ...
##  $ Sc_ppm_AES_ST        : int  -5 -5 -5 -5 11 6 15 10 5 6 ...
##  $ Se_ppm_MS_ST         : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Sm_ppm_MS_ST         : chr  "-0,1" "0,6" "1,6" "0,4" ...
##  $ Sn_ppm_MS_ST         : chr  "2" "3" "106" "-1" ...
##  $ Sr_ppm_AES_ST        : chr  "26,6" "114" "22,5" "38,4" ...
##  $ Ta_ppm_MS_ST         : chr  "-0,5" "-0,5" "-0,5" "-0,5" ...
##  $ Tb_ppm_MS_ST         : chr  "-0,05" "0,07" "0,23" "-0,05" ...
##  $ Te_ppm_MS_ST         : chr  "" "" "" "" ...
##  $ Th_ppm_MS_ST         : chr  "0,2" "9,7" "2,6" "0,2" ...
##  $ Tl_ppm_MS_ST         : chr  "-0,5" "0,5" "-0,5" "-0,5" ...
##  $ Tm_ppm_MS_ST         : chr  "-0,05" "-0,05" "0,08" "-0,05" ...
##  $ U_ppm_MS_ST          : chr  "0,3" "1,75" "0,63" "34,8" ...
##  $ V_ppm_AES_ST         : int  51 24 -5 493 68 20 40 159 39 61 ...
##  $ W_ppm_MS_ST          : chr  "-1" "28" "22" "11" ...
##   [list output truncated]

Se cargaron los datos de todas las variables.

ANÁLISIS DE FRECUENCIAS: CONCENTRACIÓN DE MANGANESO (Mn)

ANÁLISIS DE FRECUENCIAS: CONCENTRACIÓN DE MANGANESO (Mn)

library(dplyr)
library(gt)

#----------------------- PROCESAMIENTO Mn_pct_AES_ST -----------------------

# 1. Limpieza y preparación de la variable
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))

# Separar registros con concentraciones válidas de los nulos/negativos
mn_numerico <- datos$Mn_pct_AES_ST[datos$Mn_pct_AES_ST >= 0 & !is.na(datos$Mn_pct_AES_ST)]
n_sin_datos <- sum(is.na(datos$Mn_pct_AES_ST) | datos$Mn_pct_AES_ST < 0)

# 2. Tabla de Frecuencias de los valores geoquímicos reales
TDF_VALIDOS <- as.data.frame(table(mn_numerico), stringsAsFactors = FALSE)
colnames(TDF_VALIDOS) <- c("CATEGORIA", "ni")

# Convertir categoría a numérico para ordenar de menor a mayor concentración (%)
TDF_VALIDOS$CATEGORIA <- as.numeric(TDF_VALIDOS$CATEGORIA)
TDF_VALIDOS <- TDF_VALIDOS[order(TDF_VALIDOS$CATEGORIA), ]

# Definición de horizontes cuantitativos
total_variable <- sum(TDF_VALIDOS$ni)        # Total de muestras con datos de Mn
total_general  <- total_variable + n_sin_datos # Total absoluto de la matriz

# 3. Agrupación: Top 10 valores de concentración más bajos + Otros
if(nrow(TDF_VALIDOS) > 10) {
  tabla_top <- head(TDF_VALIDOS, 10)
  sum_otros <- sum(TDF_VALIDOS$ni[11:nrow(TDF_VALIDOS)])
  fila_otros <- data.frame(CATEGORIA = "Otras Concentraciones", ni = sum_otros)
  tabla_final_base <- rbind(tabla_top, fila_otros)
} else {
  tabla_final_base <- TDF_VALIDOS
}

# Convertir CATEGORIA a carácter para permitir la unión de las filas de totales
tabla_final_base$CATEGORIA <- as.character(tabla_final_base$CATEGORIA)

# 4. Calcular frecuencias (hi) escaladas a 100 respecto al total general
tabla_final_base$hi <- round((tabla_final_base$ni / total_general) * 100, 4)

# 5. FILA DEL TOTAL EXCLUSIVO DE LA VARIABLE (Muestras con lecturas de Mn)
fila_total_var <- data.frame(
  CATEGORIA = "TOTAL VARIABLE (Mn)", 
  ni = total_variable,
  hi = round((total_variable / total_general) * 100, 4)
)

# 6. FILA DE CONTRASTE: REGISTROS SIN INFORMACIÓN ANALÍTICA
fila_sin_datos <- data.frame(
  CATEGORIA = "Sin Datos", 
  ni = n_sin_datos,
  hi = round((n_sin_datos / total_general) * 100, 4)
)

# 7. FILA DEL TOTAL GENERAL DEL PROYECTO
fila_total_general <- data.frame(
  CATEGORIA = "TOTAL GENERAL", 
  ni = total_general,
  hi = 100 # Forzado para cierre perfecto de balance estadístico
)

# Consolidar toda la matriz de datos en orden lógico estructurado
tabla_final <- rbind(tabla_final_base, fila_total_var, fila_sin_datos, fila_total_general)
colnames(tabla_final) <- c("Valor Mn (%)", "ni", "hi")

#----------------------- GENERAR SALIDA ESTÉTICA CON 'gt' -----------------------
tabla_mn_completa_gt <- tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 1**"), 
    subtitle = md("Distribución de frecuencias para concentraciones de Manganeso (Mn)")
  ) %>%
  tab_source_note(
    source_note = md("Autores: Grupo 1 <br> Semestre 2026 - 2026")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black",
    row.striping.include_table_body = TRUE
  )

# Renderizar la tabla en el documento
tabla_mn_completa_gt
Tabla N° 1
Distribución de frecuencias para concentraciones de Manganeso (Mn)
Valor Mn (%) ni hi
0.001 6 0.4392
0.0011 6 0.4392
0.0012 4 0.2928
0.0013 3 0.2196
0.0014 3 0.2196
0.0015 3 0.2196
0.0016 4 0.2928
0.0017 1 0.0732
0.0018 1 0.0732
0.0019 3 0.2196
Otras Concentraciones 1039 76.0615
TOTAL VARIABLE (Mn) 1073 78.5505
Sin Datos 293 21.4495
TOTAL GENERAL 1366 100.0000
Autores: Grupo 1
Semestre 2026 - 2026

ANÁLISIS DESCRIPTIVO Y AGRUPACIÓN EN CLASES (STRUGES) DEL MANGANESO

ANÁLISIS DESCRIPTIVO Y AGRUPACIÓN EN CLASES (STRUGES) DEL MANGANESO

# Cargar las librerías al inicio
library(dplyr)
library(gt)

#------------------------- PREPARACIÓN DE DATOS -------------------------

datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))

# Creamos la variable de trabajo Mn asegurando que los datos estén limpios y sin negativos
Mn <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST >= 0]

#------------------------- ANÁLISIS DE CONCENTRACIÓN (ESTADÍSTICOS) -------------------------
cat("\n=======================================================\n")
## 
## =======================================================
cat("ANÁLISIS DE CONCENTRACIÓN (Mn_pct_AES_ST):\n")
## ANÁLISIS DE CONCENTRACIÓN (Mn_pct_AES_ST):
cat("La concentración promedio es: ", round(mean(Mn, na.rm = TRUE), 3), " % \n")
## La concentración promedio es:  0.456  %
cat("La concentración máxima detectada es: ", max(Mn, na.rm = TRUE), " % \n")
## La concentración máxima detectada es:  32.6  %
cat("Total de muestras analizadas: ", sum(!is.na(Mn)), " registros \n")
## Total de muestras analizadas:  1073  registros
cat("=======================================================\n")
## =======================================================
#------------------------- TABLA DE FRECUENCIAS - STURGES -------------------------
# 1. Parámetros básicos: Rango, Número de clases (Sturges) y Amplitud
R <- max(Mn, na.rm = TRUE) - min(Mn, na.rm = TRUE)
k <- floor(1 + 3.322 * log10(length(Mn)))
A <- R / k

# 2. Definición de límites y Marcas de Clase (MC)
liminf <- seq(from = min(Mn, na.rm = TRUE), by = A, length.out = k)
limsup <- liminf + A
MC <- (liminf + limsup) / 2

# 3. Conteo de frecuencias absolutas por clase (n)
n <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    n[i] <- sum(Mn >= liminf[i] & Mn <= limsup[i], na.rm = TRUE)
  } else {
    n[i] <- sum(Mn >= liminf[i] & Mn < limsup[i], na.rm = TRUE)
  }
}

# 4. Cálculos de frecuencias relativas y acumuladas
hi <- (n / sum(n)) * 100
Ni_asc <- cumsum(n)             # Frecuencia absoluta acumulada (ascendente)
Hi_asc <- cumsum(hi)            # Frecuencia relativa acumulada (ascendente)
Ni_desc <- rev(cumsum(rev(n)))  # Frecuencia absoluta acumulada (descendente)
Hi_desc <- rev(cumsum(rev(hi))) # Frecuencia relativa acumulada (descendente)

#------------------------- CONSTRUCCIÓN DE LA TABLA -------------------------
TablaMn_Sturges <- data.frame(
  Clase = as.character(1:k), 
  liminf = round(liminf, 3),
  limsup = round(limsup, 3),
  MC = round(MC, 3),
  n = n,
  hi = round(hi, 2),
  Ni_asc = Ni_asc,
  Hi_asc = round(Hi_asc, 2),
  Ni_desc = Ni_desc,
  Hi_desc = round(Hi_desc, 2)
)

# Fila de TOTALES para cierre de tabla
fila_totales_Mn <- data.frame(
  Clase = "**TOTALES**",
  liminf = NA,
  limsup = NA,
  MC = NA,
  n = sum(n),
  hi = 100,
  Ni_asc = NA,
  Hi_asc = NA,
  Ni_desc = NA,
  Hi_desc = NA
)

# Unión de cuerpo y totales
TablaMn_Final <- rbind(TablaMn_Sturges, fila_totales_Mn)

#------------------------- MOSTRAR TABLA FINAL CON 'gt' -------------------------
tabla_sturges_mn_gt <- TablaMn_Final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 2**"),
    subtitle = md("Distribución de frecuencias para concentraciones de Manganeso (Mn_pct_AES_ST) <br> mediante Regla de Sturges")
  ) %>%
  tab_source_note(
    source_note = md("Autores: Grupo 1 <br> Semestre 2026 - 2026")
  ) %>%
  fmt_markdown(columns = Clase) %>%
  cols_label(
    Clase = "Clase",
    liminf = "Linf (%)",
    limsup = "Lsup (%)",
    MC = "MC (%)",
    n = "n (abs)",
    hi = "hi (%)",
    Ni_asc = "Ni (↑)",
    Hi_asc = "Hi (↑)",
    Ni_desc = "Ni (↓)",
    Hi_desc = "Hi (↓)"
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black",
    row.striping.include_table_body = TRUE
  ) %>%
  sub_missing(
    columns = everything(),
    missing_text = "NA"
  )

# Renderizar la tabla en el reporte
tabla_sturges_mn_gt
Tabla N° 2
Distribución de frecuencias para concentraciones de Manganeso (Mn_pct_AES_ST)
mediante Regla de Sturges
Clase Linf (%) Lsup (%) MC (%) n (abs) hi (%) Ni (↑) Hi (↑) Ni (↓) Hi (↓)
1 0.001 2.965 1.483 1038 96.74 1038 96.74 1073 100.00
2 2.965 5.928 4.446 14 1.30 1052 98.04 35 3.26
3 5.928 8.892 7.410 7 0.65 1059 98.70 21 1.96
4 8.892 11.855 10.373 10 0.93 1069 99.63 14 1.30
5 11.855 14.819 13.337 0 0.00 1069 99.63 4 0.37
6 14.819 17.782 16.301 0 0.00 1069 99.63 4 0.37
7 17.782 20.746 19.264 3 0.28 1072 99.91 4 0.37
8 20.746 23.709 22.228 0 0.00 1072 99.91 1 0.09
9 23.709 26.673 25.191 0 0.00 1072 99.91 1 0.09
10 26.673 29.636 28.155 0 0.00 1072 99.91 1 0.09
11 29.636 32.600 31.118 1 0.09 1073 100.00 1 0.09
TOTALES NA NA NA 1073 100.00 NA NA NA NA
Autores: Grupo 1
Semestre 2026 - 2026

POLÍGONO DE FRECUENCIA

POLÍGONO DE FRECUENCIAS RELATIVAS DEL MANGANESO (Mn)

#----------------------- PROCESAMIENTO AUTOMÁTICO Mn_PCT_AES_ST -----------------------

# 1. Conversión de la variable a numérico y limpieza de datos
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))
Mn_VAR <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST >= 0]

#----------------------- EXTRACCIÓN METODOLÓGICA DE STURGES -----------------------

# 2. Parámetros base desde la tabla
n_total <- length(Mn_VAR)
k_sturges <- floor(1 + 3.322 * log10(n_total)) 

rango_mn <- max(Mn_VAR) - min(Mn_VAR)
amplitud_mn <- rango_mn / k_sturges
breaks_sturges <- seq(from = min(Mn_VAR), by = amplitud_mn, length.out = k_sturges + 1)

# 3. Captura de datos en memoria (plot = FALSE)
hist_objeto <- hist(Mn_VAR, breaks = breaks_sturges, plot = FALSE, right = FALSE)

# Extraemos las Marcas de Clase (MC) reales del gráfico
mc_reales <- hist_objeto$mids 

# Convertimos los conteos absolutos a frecuencias relativas porcentuales (hi %)
hi_porcentaje <- (hist_objeto$counts / n_total) * 100

#----------------------- ANCLAJE A CERO CON MARCAS DE CLASE -----------------------

# 4. Creamos los extremos ficticios para que el polígono toque el eje X en cero
mc_inicio <- mc_reales[1] - amplitud_mn
mc_final  <- mc_reales[length(mc_reales)] + amplitud_mn

# Unimos los puntos: Marcas de Clase (X) y Frecuencias Relativas hi (Y)
marcas_clase_mn   <- c(mc_inicio, mc_reales, mc_final)
frecuencias_hi_mn <- c(0, hi_porcentaje, 0)

# Detectamos el porcentaje máximo real para calibrar el eje Y
max_y_hi <- max(frecuencias_hi_mn)

#----------------------- GRAFICAR POLÍGONO DE FRECUENCIAS (hi) -----------------------
par(mar = c(6, 5, 4, 2)) # Margen inferior ligeramente amplio para las MC verticales

# 5. Inicializar el lienzo ajustado a las Marcas de Clase y porcentajes
plot(marcas_clase_mn, frecuencias_hi_mn,
     type = "n",
     main = "Gráfica 1: Polígono de Frecuencias Relativas de Manganeso (Mn)",
     xlab = "Concentración de Mn (%)",
     ylab = "Frecuencia Relativa - hi (%)",
     xlim = c(mc_inicio, mc_final), 
     ylim = c(0, max_y_hi * 1.1), # Un 10% de espacio arriba del pico más alto                        
     xaxt = "n", yaxt = "n",
     panel.first = grid(nx = NULL, ny = NULL, col = "gray90")) # Rejilla de fondo

# 6. DIBUJAR EL POLÍGONO
lines(marcas_clase_mn, frecuencias_hi_mn, type = "l", col = "darkblue", lwd = 3)

# Luego dibujamos los puntos (pch=19) ÚNICAMENTE en las marcas de clase reales de tu tabla
points(mc_reales, hi_porcentaje, pch = 19, col = "darkblue", cex = 1.2)

# 7. Relleno translúcido bajo la curva
polygon(marcas_clase_mn, frecuencias_hi_mn, col = rgb(0, 0, 0.5, 0.12), border = NA)

#----------------------- PERSONALIZACIÓN DE EJES CONTINUOS -----------------------

# Eje X: Imprime las Marcas de Clase 
axis(1, at = mc_reales, labels = round(mc_reales, 3), cex.axis = 0.75, las = 1)

# Eje Y: Valores horizontales dinámicos calculados a partir de los datos
marcas_eje_y <- pretty(c(0, max_y_hi))
axis(2, at = marcas_eje_y, 
     labels = paste0(marcas_eje_y, "%"), 
     las = 1, cex.axis = 0.8)

ANÁLISIS GRÁFICO: HISTOGRAMA DISTRIBUCIÓN DE MANGANESO

HISTOGRAMA DISTRIBUCIÓN DE MANGANESO

#----------------------- PROCESAMIENTO Mn_pct_AES_ST -----------------------

# 1. Conversión de Mn_pct_AES_ST a numérico 
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))

# Creamos variable de trabajo para las gráficas y FILTRAMOS los negativos
Mn_VAR <- datos$Mn_pct_AES_ST
Mn_VAR <- Mn_VAR[Mn_VAR >= 0 & !is.na(Mn_VAR)] 

#----------------------- TABLA DE FRECUENCIAS SIMPLIFICADA -----------------------
# Al ser continua, agrupamos por rangos automáticos (bins) para que la tabla sea legible
k_simplificado <- 5
breaks_mn_simp <- pretty(Mn_VAR, n = k_simplificado)
HistogramaMn <- hist(Mn_VAR, breaks = breaks_mn_simp, plot = FALSE)

# 2. Generación del Histograma Simplificado
total_muestras_mn <- length(Mn_VAR)

hist(Mn_VAR,
     breaks = breaks_mn_simp,
     main = "Grafica 2: Distribucion de Mn_pct_AES_ST (Simplificada)",
     xlab = "Concentracion de Mn (%)",
     ylab = "Cantidad de muestras",
     col = "#81C784",
     ylim = c(0, total_muestras_mn), # REGLA: Límite Y fijado al total de muestras
     right = FALSE)

# ==============================================================================
# 1. PREPARACIÓN DE DATOS (MÉTODO STURGES)
# ==============================================================================
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))
Mn_VAR <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST >= 0]

# ==============================================================================
# 2. CONFIGURACIÓN METODOLÓGICA (STURGES)
# ==============================================================================
k_sturges <- floor(1 + 3.322 * log10(length(Mn_VAR)))
rango_mn <- max(Mn_VAR) - min(Mn_VAR)
amplitud_mn <- rango_mn / k_sturges
breaks_sturges <- seq(from = min(Mn_VAR), by = amplitud_mn, length.out = k_sturges + 1)

# CREACIÓN CRÍTICA DEL OBJETO 
hist_pro <- hist(Mn_VAR, breaks = breaks_sturges, plot = FALSE, right = FALSE)

# ==============================================================================
# 3. TEXTOS Y COLORES 
# ==============================================================================
colores_degrade <- colorRampPalette(c("cyan", "blue", "purple"))(k_sturges)

etiquetas_intervalos <- paste0("[", round(breaks_sturges[1:k_sturges], 3), " - ", 
                               round(breaks_sturges[2:(k_sturges+1)], 3), "]")

# ==============================================================================
# 4. CONSTRUCCIÓN DE LA GRÁFICA (BARPLOT)
# ==============================================================================
par(mar = c(6, 5, 4, 11)) 

# Guardamos el barplot en un objeto 'bp' para obtener las coordenadas exactas de las barras
# REGLA APLICADA: ylim = c(0, length(Mn_VAR))
bp <- barplot(hist_pro$counts, 
              names.arg = rep("", k_sturges), 
              col = colores_degrade, 
              border = "white",
              main = "Grafica 3: Distribucion de Mn_pct_AES_ST (Regla de Sturges)",
              ylab = "Frecuencia (Cantidad)",
              xlab = "Contenido de Manganeso (%)",
              ylim = c(0, length(Mn_VAR)), 
              yaxt = "n") 

# Añadir frecuencias arriba de cada barra
text(x = bp, 
     y = hist_pro$counts, 
     labels = hist_pro$counts, 
     pos = 3, cex = 0.85, font = 2)

# ==============================================================================
# 5. PERSONALIZACIÓN DE EJES Y LEYENDA
# ==============================================================================
# Eje Y (Fijamos marcas usando el límite total)
marcas_y <- pretty(c(0, length(Mn_VAR))) 
axis(2, at = marcas_y, labels = marcas_y, las = 1, cex.axis = 0.85)

# 6. EJE X 
# Calculamos los puntos de quiebre de las barras
ancho_barra <- bp[2] - bp[1]
posiciones_bordes_x <- c(bp - (ancho_barra / 2), max(bp) + (ancho_barra / 2))

# Dibujamos el eje X usando todos los breaks de Sturges
axis(1, at = posiciones_bordes_x, 
     labels = round(breaks_sturges, 2), cex.axis = 0.7)

# 7. Leyenda a la derecha 
legend(x = max(bp) + (ancho_barra * 1.5), y = max(hist_pro$counts), 
       legend = etiquetas_intervalos, 
       fill = colores_degrade, 
       title = "Intervalos (%)", 
       xpd = TRUE, bty = "n", cex = 0.8)

ANÁLISIS VISUAL ACUMULADO: OJIVA ASCENDENTE Y DESCENDENTE

OJIVAS ni Y hi

#----------------------- PREPARACIÓN DE CORTES ENTEROS -----------------------
paso_mn <- if (ceiling(max(Mn_VAR)) > 10) 1 else 0.5
breaks_entero <- seq(0, ceiling(max(Mn_VAR)) + paso_mn, by = paso_mn)

#----------------------- OJIVA INTEGRADA Y PROFESIONAL -----------------------
par(mar=c(5, 5, 4, 2))

plot(MC, Ni_asc,
     main = "Gráfica 4: Ojiva Combinada de Frecuencias del Manganeso (ni)",
     xlab = "Contenido de Manganeso (%)",
     ylab = "Frecuencia Acumulada (N muestras)",
     type = "b", pch = 19, col = "blue", lwd = 3,
     xaxt = "n", las = 1,
     ylim = c(0, max(Ni_asc) * 1.05),
     panel.first = grid(nx = NULL, ny = NULL, col = "gray90")) 

# Segunda línea (Descendente)
lines(MC, Ni_desc, type = "b", pch = 17, col = "red", lwd = 3, lty = 2)

# Eje X con los intervalos exactos
axis(1, at = breaks_entero, labels = breaks_entero)

# Leyenda reubicada en el espacio vacío del lado derecho
legend("right",
       legend = c("Acumulada Menor que (Ascendente)", "Acumulada Mayor que (Descendente)"),
       col = c("blue", "red"),
       lty = c(1, 2),
       pch = c(19, 17),
       lwd = 2,
       title = "Tipo de Ojiva",
       bty = "n",  
       cex = 0.85) 

#----------------------- OJIVA PROFESIONAL MANGANESO - EN PORCENTAJES (Hi) -----------------------

MC_graficar     <- MC[!is.na(MC)]
Hi_asc_graficar <- Hi_asc[1:length(MC_graficar)]
Hi_desc_graficar <- Hi_desc[1:length(MC_graficar)]

# Definir los cortes del eje X
breaks_mn <- c(liminf[!is.na(liminf)], limsup[length(limsup) - 1])

# 2. Configurar los márgenes para la leyenda
par(mar=c(5, 5, 4, 2))

# 3. Graficar la curva ascendente 
plot(MC_graficar, Hi_asc_graficar,
     main = "Gráfica 5 : Ojiva Acumulada de Frecuencias de Manganeso (hi)",
     xlab = "Concentración de Manganeso - Mn (%)",
     ylab = "Frecuencia Relativa Acumulada (%)", 
     type = "b", pch = 19, col = "blue", lwd = 3, 
     xaxt = "n", las = 1,
     ylim = c(0, 105), 
     panel.first = grid(nx = NULL, ny = NULL, col = "gray90")) 

# 4. Línea descendente perfectamente emparejada
lines(MC_graficar, Hi_desc_graficar, type = "b", pch = 17, col = "red", lwd = 3, lty = 2)

# 5. Dibujar el Eje X con los intervalos exactos
axis(1, at = breaks_mn, labels = round(breaks_mn, 3), cex.axis = 0.8)

# 6. Leyenda técnica reubicada
legend("right",
       legend = c("Acumulada Menor que (Ascendente %)", "Acumulada Mayor que (Descendente %)"),
       col = c("blue", "red"),
       lty = c(1, 2),
       pch = c(19, 17),
       lwd = 2,
       title = "Tipo de Ojiva",
       bty = "n",  
       cex = 0.85)

BOXPLOT

BOXPLOTS DE VALORES ATÍPICOS Y DISTRIBUCIÓN LIMPIA

#----------------------- PREPARACIÓN DE DATOS (Manganeso) -----------------------
# Conversión a numérico y limpieza de valores nulos o en cero
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))
Mn_VAR <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST > 0]

#----------------------- BOXPLOT: ANÁLISIS DE VALORES ATÍPICOS -----------------------
par(mar=c(5, 6, 5, 2), xpd = FALSE)

# Cálculos estadísticos previos
stats_mn <- boxplot.stats(Mn_VAR)
media_mn  <- round(mean(Mn_VAR), 3)
mediana_mn <- round(median(Mn_VAR), 3)
n_outliers <- length(stats_mn$out)

# Generación del Boxplot
boxplot(Mn_VAR, horizontal = TRUE, col = "#E0E0E0", border = "#424242",
        main = " Gráfica 6: Análisis de Valores Atípicos (Manganeso)", 
        xlab = "Concentración de Mn (%)",
        pch = 21, 
        bg = "red", 
        col.outline = "darkred", 
        frame = FALSE)

# Punto de Media y etiquetas de texto mejor ubicadas
points(media_mn, 1, 
       col = "blue", 
       pch = 18, 
       cex = 2)

text(media_mn, 1.25, 
     labels = paste("Media:", media_mn), 
     col = "blue", 
     font = 2, 
     cex = 0.9)

text(mediana_mn, 0.75, 
     labels = paste("Mediana:", mediana_mn), 
     col = "#424242", 
     font = 2, 
     cex = 0.9)

# Leyenda
legend("topright", 
       legend = paste("Atípicos detectados:", n_outliers),
       pch = 21, 
       pt.bg = "red", 
       bty = "n", 
       text.col = "darkred", 
       cex = 0.9)

#-----------------------BOXPLOT: DISTRIBUCIÓN LIMPIA (MANGANESO) -----------------------
par(mar=c(5, 6, 5, 2))

# Generación del Boxplot sin valores atípicos (outline = FALSE)
boxplot(Mn_VAR, 
        horizontal = TRUE, 
        outline = FALSE, 
        col = "#E0E0E0", 
        border = "#424242",
        main = "Gráfica 7: Distribución del Cuerpo Mineral (Sin Atípicos) - Manganeso", 
        xlab = "Concentración de Mn (%)", 
        frame = FALSE)

# Agregar cuadrícula de fondo
grid(nx = NULL, 
     ny = NA, 
     col = "gray85", 
     lty = "dashed")

# Valores sobre la vista limpia 
points(media_mn, 1, 
       col = "#E65100", 
       pch = 18, 
       cex = 2)

text(media_mn, 1.25, 
     labels = paste("Media:", media_mn), 
     col = "#BF360C", 
     font = 2, 
     cex = 0.9)

text(mediana_mn, 0.75, 
     labels = paste("Mediana:", mediana_mn), 
     col = "#424242", 
     font = 2, 
     cex = 0.9)

HISTOGRAMA CON BOXPLOT SUPERPUESTO (MANGANESO)

HISTOGRAMA CON BOXPLOT FLOTANTE (MANGANESO)

#----------------------- PREPARACIÓN DE DATOS -----------------------
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))
Mn_VAR <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST >= 0]
total_muestras_mn <- length(Mn_VAR)

# Metodología de Sturges
k_sturges <- floor(1 + 3.322 * log10(total_muestras_mn))
rango_mn <- max(Mn_VAR) - min(Mn_VAR)
amplitud_mn <- rango_mn / k_sturges
breaks_sturges <- seq(from = min(Mn_VAR), by = amplitud_mn, length.out = k_sturges + 1)

#----------------------- CÁLCULO DEL HISTOGRAMA (INVISIBLE) -----------------------
hist_pro <- hist(Mn_VAR, breaks = breaks_sturges, plot = FALSE, right = FALSE)

#----------------------- CÁLCULO DEL RANGO X TOTAL -----------------------
xlim_range <- range(c(Mn_VAR, breaks_sturges))

# Aseguramos márgenes
par(mar = c(5, 5, 4, 12), xpd = TRUE)

#----------------------- GRÁFICA INTEGRADA (HISTOGRAMA) -----------------------
colores_degrade <- colorRampPalette(c("cyan", "blue", "purple"))(length(hist_pro$counts))

hist(Mn_VAR, 
     breaks = breaks_sturges, 
     col = colores_degrade, 
     border = "white",
     main = "Gráfica 8: Distribución de Manganeso con Boxplot Interno",
     xlab = "Concentración de Manganeso (%)", 
     ylab = "Frecuencia (Cantidad)", 
     xlim = xlim_range,            
     ylim = c(0, total_muestras_mn), # REGLA: Límite Y fijado al total de muestras
     las = 1,
     labels = TRUE,                
     right = FALSE,
     xaxt = "n")                   

axis(1, at = breaks_sturges, labels = round(breaks_sturges, 3), font = 2, cex.axis = 0.5)

# 3. Superponemos el Boxplot directamente
# Usamos el espacio superior que quedó libre para hacer flotar la caja elegantemente
altura_flotacion <- total_muestras_mn * 0.70  # El boxplot flotará al 70% de la altura total
grosor_caja <- total_muestras_mn * 0.15

boxplot(Mn_VAR, 
        horizontal = TRUE, 
        add = TRUE,             
        axes = FALSE,           
        at = altura_flotacion,  
        boxwex = grosor_caja,   
        col = rgb(0.53, 0.81, 0.98, alpha = 0.7), 
        border = "#1C1C1C",     
        lwd = 1.5,              
        pch = 21, bg = "red",   
        outcol = "darkred")     

# 4. Añadimos la leyenda lateral
intervalos_mn <- paste0("[", round(hist_pro$breaks[-length(hist_pro$breaks)], 3), 
                       " - ", round(hist_pro$breaks[-1], 3), ")")

legend("topright", inset=c(-0.35, 0),
       legend = intervalos_mn,
       fill = colores_degrade,
       title = "Intervalos (%)",
       cex = 0.8, bty = "n")

RESUMEN DESCRIPTIVO

RESUMEN DESCRIPTIVO

# Cargar las librerías al inicio 
library(dplyr)
library(gt)
library(e1071) # Necesaria para el cálculo de Asimetría y Curtosis

#----------------------- ANÁLISIS ESTADÍSTICO Mn_pct_AES_ST -----------------------

# 1. Preparación de la variable continua
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))

# 2. Limpieza de valores nulos o negativos
Mn_LIMPIA <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST >= 0]

# 3. Cálculos estadísticos descriptivos consolidados aplicando simbología
resumen_stats_Mn <- data.frame(
  Estadistico = c("Tamaño muestral (n)", 
                  "Mínimo (Min)", 
                  "Máximo (Max)", 
                  "Media (x̄)", 
                  "Mediana (Me)",
                  "Desviación Estándar (s)", 
                  "Coef. Variación (CV)", 
                  "Asimetría (As)", 
                  "Curtosis (K)"),
  Valor = c(
    length(Mn_LIMPIA),
    min(Mn_LIMPIA),
    max(Mn_LIMPIA),
    mean(Mn_LIMPIA),
    median(Mn_LIMPIA),
    sd(Mn_LIMPIA),
    (sd(Mn_LIMPIA) / mean(Mn_LIMPIA)) * 100,
    skewness(Mn_LIMPIA, type = 2),
    kurtosis(Mn_LIMPIA)
  )
)

# 4. Redondeo técnico para presentación en el reporte (2 decimales)
resumen_stats_Mn$Valor <- round(resumen_stats_Mn$Valor, 2)

#----------------------- SALIDA ESTÉTICA CON 'gt' -----------------------
tabla_stats_mn_gt <- resumen_stats_Mn %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 3**"),
    subtitle = md("Estadística Descriptiva para Concentraciones de Manganeso (Mn)")
  ) %>%
  tab_source_note(
    source_note = md("Autores: Grupo 1 <br> Semestre 2026 - 2026")
  ) %>%
  cols_label(
    Estadistico = "Parámetro Estadístico",
    Valor = "Resultado"
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black",
    row.striping.include_table_body = TRUE
  )

# Renderizar la tabla en el documento de RMarkdown
tabla_stats_mn_gt
Tabla N° 3
Estadística Descriptiva para Concentraciones de Manganeso (Mn)
Parámetro Estadístico Resultado
Tamaño muestral (n) 1073.00
Mínimo (Min) 0.00
Máximo (Max) 32.60
Media (x̄) 0.46
Mediana (Me) 0.06
Desviación Estándar (s) 1.87
Coef. Variación (CV) 411.04
Asimetría (As) 9.37
Curtosis (K) 115.72
Autores: Grupo 1
Semestre 2026 - 2026

CONCLUSION

CONCLUSIÓN DE LA VARIABLE Mn_pct_AES_ST

El análisis descriptivo del manganeso (Mn) sobre 1073 muestras válidas reporta un rango de 0.00% a 32.60%, con una media de 0.46% y una mediana de 0.06%. Su coeficiente de variación (411.04%) y desviación estándar (1.87) reflejan una dispersión extremadamente alta, característica del comportamiento geoquímico heterogéneo de este elemento en el yacimiento. Finalmente, los índices de forma muestran una asimetría fuertemente positiva de 9.37 y una curtosis elevada de 115.72, lo que indica una distribución concentrada hacia valores bajos con presencia de colas muy pesadas y valores atípicos marcados, evidenciando la naturaleza de la mineralización en el sector estudiado.