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.
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 |
||
#----------------------- 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. Calculamos los parámetros de Sturges
n_total <- length(Mn_VAR)
k_sturges <- floor(1 + 3.322 * log10(n_total))
# 3. Definimos los cortes de intervalos (breaks) usando el rango real del Manganeso
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)
# 4. CAPTURA DE DATOS OCULTOS: Dejamos que R agrupe y cuente en memoria (plot = FALSE)
hist_objeto <- hist(Mn_VAR, breaks = breaks_sturges, plot = FALSE, right = FALSE)
#----------------------- TRUCO ESTADÍSTICO: ANCLAJE A CERO -----------------------
# 5. Creamos las clases vacías a los extremos para que el polígono toque el eje X
mc_inicio <- hist_objeto$mids[1] - amplitud_mn
mc_final <- hist_objeto$mids[length(hist_objeto$mids)] + amplitud_mn
# Unimos los puntos del mapa: Marcas de Clase (X) y Frecuencias absolutas n (Y)
marcas_clase_mn <- c(mc_inicio, hist_objeto$mids, mc_final)
frecuencias_mn <- c(0, hist_objeto$counts, 0)
# Detectamos la frecuencia máxima real para el eje Y
max_y_mn <- max(frecuencias_mn)
#----------------------- GRAFICAR POLÍGONO DE FRECUENCIAS -----------------------
par(mar = c(5, 5, 4, 2))
# 6. Inicializar el lienzo con el zoom horizontal y vertical calibrados
plot(marcas_clase_mn, frecuencias_mn,
type = "n",
main = "Gráfica 1: Polígono de Frecuencias Absolutas de Manganeso (Mn)",
xlab = "Concentración de Manganeso - Mn (%)",
ylab = "Frecuencia Absoluta (n muestras)",
xlim = c(min(breaks_sturges), max(breaks_sturges)),
ylim = c(0, max_y_mn * 1.1),
xaxt = "n", yaxt = "n",
panel.first = grid(nx = NULL, ny = NULL, col = "gray90")) # Rejilla de fondo
# 7. Dibujar el polígono (Línea continua con puntos en cada marca de clase)
lines(marcas_clase_mn, frecuencias_mn, type = "b", pch = 19, col = "darkblue", lwd = 3)
# 8. Relleno translúcido bajo la curva para acabado profesional
polygon(marcas_clase_mn, frecuencias_mn, col = rgb(0, 0, 0.5, 0.12), border = NA)
#----------------------- PERSONALIZACIÓN DE EJES CONTINUOS -----------------------
# Eje X: Imprime los límites exactos de tu tabla redondeados a 3 decimales
axis(1, at = breaks_sturges, labels = round(breaks_sturges, 3), cex.axis = 0.75, las = 1)
# Eje Y: Muestra marcas redondas de guía y fuerza la impresión del pico
marcas_eje_y <- pretty(c(0, max_y_mn))
marcas_eje_y <- marcas_eje_y[marcas_eje_y < (max_y_mn * 0.9)] # Evita colisiones de texto
axis(2, at = c(marcas_eje_y, max_y_mn), labels = c(marcas_eje_y, max_y_mn), las = 1, cex.axis = 0.8)
#----------------------- 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_s <- pretty(Mn_VAR, n = k_simplificado)
HistogramaMn <- hist(Mn_VAR, breaks = breaks_s, plot = FALSE)
# 2. Generación del Histograma
par(mar = c(5, 5, 5, 2), bg = "white")
limite_y <- max(HistogramaMn$counts) * 1.3
hist(Mn_VAR,
breaks = breaks_s,
main = "Gráfica 2: Distribución de Mn_pct_AES_ST (Simplificada)",
xlab = "Concentración de Manganeso - Mn (%)",
ylab = "Cantidad de muestras",
col = "#81C784",
border = "white",
labels = TRUE,
right = FALSE,
las = 1,
xaxt = "n",
ylim = c(0, limite_y))
axis(1, at = breaks_s, labels = breaks_s, font = 2, col = "gray40", col.axis = "black")
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
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), 2), " % \n")
## La concentración promedio es: 0.46 %
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 = 100,
Ni_desc = NA,
Hi_desc = 100
)
# 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 | 100.00 | NA | 100.00 |
| Autores: Grupo 1 Semestre 2026 - 2026 |
|||||||||
#----------------------- 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]
# Definimos intervalos manuales de 1 en 1, con límite de error estricto
breaks_entero <- seq(0, ceiling(max(Mn_VAR)) + 1, by = 1)
# Cálculo de la tabla de frecuencias para la Ojiva
h_data <- hist(Mn_VAR, breaks = breaks_entero, plot = FALSE)
MC <- h_data$mids
Ni_asc <- cumsum(h_data$counts)
Ni_desc <- rev(cumsum(rev(h_data$counts)))
#----------------------- 1. HISTOGRAMA MEJORADO -----------------------
par(mar=c(5, 5, 5, 2))
h_plot <- hist(Mn_VAR, breaks = breaks_entero,
main = "Gráfica 3: Distribución del Contenido de Manganeso (%)",
xlab = "Contenido de Manganeso (%)",
ylab = "Frecuencia (Cantidad)",
col = "lightgreen", border = "darkgreen",
xaxt = "n",
las = 1,
ylim = c(0, max(h_data$counts) * 1.2))
axis(1, at = breaks_entero, labels = breaks_entero, font = 2)
text(h_plot$mids, h_plot$counts, labels = h_plot$counts,
adj = c(0.5, -0.5), cex = 0.9, font = 2, col = "black")
#----------------------- 2. 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"))
lines(MC, Ni_desc, type = "b", pch = 17, col = "red", lwd = 3, lty = 2)
axis(1, at = breaks_entero, labels = breaks_entero)
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 uniendo el límite inferior de cada clase
breaks_mn <- c(liminf[!is.na(liminf)], limsup[length(limsup) - 1])
par(mar=c(5, 5, 4, 2))
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"))
lines(MC_graficar, Hi_desc_graficar, type = "b", pch = 17, col = "red", lwd = 3, lty = 2)
axis(1, at = breaks_mn, labels = round(breaks_mn, 2), cex.axis = 0.8)
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)
#----------------------- 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]
# Definimos intervalos exactos para Manganeso (+1 para margen de error nulo)
breaks_h <- seq(0, ceiling(max(Mn_VAR)) + 1, by = 1)
h_info <- hist(Mn_VAR, breaks = breaks_h, plot = FALSE)
intervalos <- paste0("[", h_info$breaks[-length(h_info$breaks)], " - ", h_info$breaks[-1], "]")
colores_hist <- rainbow(length(h_info$counts), start = 0.5, end = 0.8)
#----------------------- HISTOGRAMA: ESCALA Y TÍTULO OPTIMIZADOS -----------------------
par(mar=c(5, 5, 5, 8), xpd=TRUE)
hist(Mn_VAR, breaks = breaks_h,
main = "Grafica 6: Distribucion de Mn_pct_AES_ST",
xlab = "Contenido de Manganeso (%)",
ylab = "Frecuencia (Cantidad)",
col = colores_hist,
border = "white",
labels = TRUE,
right = FALSE,
las = 1,
xaxt = "n",
ylim = c(0, max(h_info$counts) * 1.3))
axis(1, at = breaks_h, labels = breaks_h, font = 2)
legend("topright", inset=c(-0.35, 0),
legend = intervalos,
fill = colores_hist,
title = "Intervalos (%)",
cex = 0.8, bty = "n")
#----------------------- PREPARACIÓN DE DATOS (Manganeso) -----------------------
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. 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), 2)
mediana_mn <- round(median(Mn_VAR), 2)
n_outliers <- length(stats_mn$out)
# Generación del Boxplot
boxplot(Mn_VAR, horizontal = TRUE, col = "#E0E0E0", border = "#424242",
main = " Gráfica 7: Análisis de Valores Atípicos (Manganeso)",
xlab = "Concentración de Mn (%)",
pch = 21,
bg = "red",
col.outline = "darkred",
frame = FALSE)
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)
legend("topright",
legend = paste("Atípicos detectados:", n_outliers),
pch = 21,
pt.bg = "red",
bty = "n",
text.col = "darkred",
cex = 0.9)
#----------------------- 3. 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 8: Distribución del Cuerpo Mineral (Sin Atípicos) - Manganeso",
xlab = "Concentración de Mn (%)",
frame = FALSE)
grid(nx = NULL, ny = NA, col = "gray85", lty = "dashed")
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)
library(dplyr)
library(gt)
library(e1071)
#----------------------- ANÁLISIS ESTADÍSTICO Mn_pct_AES_ST -----------------------
datos$Mn_pct_AES_ST <- suppressWarnings(as.numeric(gsub(",", ".", as.character(datos$Mn_pct_AES_ST))))
Mn_LIMPIA <- datos$Mn_pct_AES_ST[!is.na(datos$Mn_pct_AES_ST) & datos$Mn_pct_AES_ST >= 0]
# Cálculos estadísticos descriptivos consolidados
resumen_stats_Mn <- data.frame(
Estadistico = c("Tamaño muestral (n)",
"Mínimo (%)",
"Máximo (%)",
"Media (%)",
"Mediana (%)",
"Desviación Estándar",
"Coef. Variación (%)",
"Asimetría",
"Curtosis"),
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)
)
)
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
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 (%) | 0.00 |
| Máximo (%) | 32.60 |
| Media (%) | 0.46 |
| Mediana (%) | 0.06 |
| Desviación Estándar | 1.87 |
| Coef. Variación (%) | 411.04 |
| Asimetría | 9.37 |
| Curtosis | 115.72 |
| Autores: Grupo 1 Semestre 2026 - 2026 |
|
CONCLUSIÓN DE LA VARIABLE Mg_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, lo que indica un conjunto geoquímico masivamente heterogéneo en el yacimiento. Finalmente, los índices de forma muestran una asimetría fuertemente positiva de 9.37 y una curtosis extrema de 116.49, confirmando una distribución con acumulación marcada en las leyes geoquímicas mínimas (primer intervalo) y la presencia de numerosos valores atípicos (139 muestras) que dominan la variabilidad del depósito.