1. CARGA DE DATOS Y LIBRERÍAS

knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE,
  fig.align = "center"
)

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(gt)

datos <- read.csv(
  "C:/Users/Martin/Desktop/Estadistica/CMDB_Data.csv",
  header = TRUE,
  sep = ";",
  dec = ".",
  fileEncoding = "latin1"
)

# Verificar que la variable requerida exista en el archivo
if (!"PRIMARY_CLASS" %in% names(datos)) {
  stop(
    paste0(
      "No se encontró la variable PRIMARY_CLASS. Variables disponibles: ",
      paste(names(datos), collapse = ", ")
    )
  )
}

# Limpiar y estandarizar la variable PRIMARY_CLASS
datos$PRIMARY_CLASS <- trimws(as.character(datos$PRIMARY_CLASS))
datos$PRIMARY_CLASS[
  is.na(datos$PRIMARY_CLASS) |
    datos$PRIMARY_CLASS == "" |
    tolower(datos$PRIMARY_CLASS) %in% c("unknown", "desconocido")
] <- "Desconocido"

datos$PRIMARY_CLASS <- factor(datos$PRIMARY_CLASS)

# Frecuencias con todos los registros y solo con datos clasificados
frecuencias_totales <- sort(table(datos$PRIMARY_CLASS), decreasing = TRUE)
frecuencias_validas <- frecuencias_totales[
  names(frecuencias_totales) != "Desconocido"
]

total_registros <- sum(frecuencias_totales)
total_validos <- sum(frecuencias_validas)

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" ...
##  $ DATE_SUBMITTE        : 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        : Factor w/ 1 level "rock": 1 1 1 1 1 1 1 1 1 1 ...
##  $ 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]

2. TABLAS DE DISTRIBUCIÓN DE FRECUENCIAS

Tabla N.° 1: distribución general, incluyendo registros no clasificados

tabla_1 <- data.frame(
  Clase_primaria = names(frecuencias_totales),
  ni = as.numeric(frecuencias_totales),
  stringsAsFactors = FALSE
)

tabla_1$hi <- tabla_1$ni / total_registros
tabla_1$hi_porc <- tabla_1$hi * 100

tabla_1_final <- rbind(
  tabla_1,
  data.frame(
    Clase_primaria = "TOTAL",
    ni = sum(tabla_1$ni),
    hi = sum(tabla_1$hi),
    hi_porc = sum(tabla_1$hi_porc)
  )
)

tabla_1_final %>%
  gt() %>%
  fmt_number(columns = hi, decimals = 8) %>%
  fmt_number(columns = hi_porc, decimals = 2) %>%
  cols_label(
    Clase_primaria = "Clase primaria",
    ni = "ni",
    hi = "hi",
    hi_porc = "hi_porc"
  ) %>%
  tab_header(
    title = md("**Tabla N.° 1**"),
    subtitle = md("Distribución de muestras según la clase primaria")
  ) %>%
  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.bottom.color = "black",
    table_body.hlines.color = "lightgray",
    row.striping.include_table_body = TRUE
  )
Tabla N.° 1
Distribución de muestras según la clase primaria
Clase primaria ni hi hi_porc
rock 1366 1.00000000 100.00
TOTAL 1366 1.00000000 100.00
Autores: Grupo 1
Semestre 2026 - 2026

Tabla N.° 2: distribución de frecuencias de clases primarias válidas

tabla_2 <- data.frame(
  Clase_primaria = names(frecuencias_validas),
  ni = as.numeric(frecuencias_validas),
  stringsAsFactors = FALSE
)

tabla_2$hi <- tabla_2$ni / total_validos
tabla_2$hi_porc <- tabla_2$hi * 100

tabla_2_final <- rbind(
  tabla_2,
  data.frame(
    Clase_primaria = "TOTAL",
    ni = sum(tabla_2$ni),
    hi = sum(tabla_2$hi),
    hi_porc = sum(tabla_2$hi_porc)
  )
)

tabla_2_final %>%
  gt() %>%
  fmt_number(columns = hi, decimals = 8) %>%
  fmt_number(columns = hi_porc, decimals = 2) %>%
  cols_label(
    Clase_primaria = "Clase primaria",
    ni = "ni",
    hi = "hi",
    hi_porc = "hi_porc"
  ) %>%
  tab_header(
    title = md("**Tabla N.° 2**"),
    subtitle = md("Distribución de frecuencias por clase primaria")
  ) %>%
  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.bottom.color = "black",
    table_body.hlines.color = "lightgray",
    row.striping.include_table_body = TRUE
  )
Tabla N.° 2
Distribución de frecuencias por clase primaria
Clase primaria ni hi hi_porc
rock 1366 1.00000000 100.00
TOTAL 1366 1.00000000 100.00
Autores: Grupo 1
Semestre 2026 - 2026

3. VISUALIZACIÓN DE COMPARATIVAS BÁSICAS

Gráfica 1: comparación local

par(mar = c(7, 5, 4, 2) + 0.1)

centros_local <- barplot(
  frecuencias_validas,
  main = "Gráfica 1: Muestras de Elementos Críticos por Clase Primaria (LOCAL)",
  xlab = "Clase primaria",
  ylab = "Cantidad de muestras por clase primaria",
  col = "lightgreen",
  las = 2,
  cex.names = 0.8,
  ylim = c(0, max(frecuencias_validas) * 1.20)
)

text(
  centros_local,
  frecuencias_validas,
  labels = frecuencias_validas,
  pos = 3,
  col = "darkblue",
  font = 2
)

Gráfica 2: comparación global

par(mar = c(7, 5, 4, 2) + 0.1)

centros_global <- barplot(
  frecuencias_validas,
  main = "Gráfica 2: Muestras de Elementos Críticos por Clase Primaria (GLOBAL)",
  xlab = "Clase primaria",
  ylab = "Cantidad de muestras por clase primaria",
  col = "mediumpurple",
  las = 2,
  cex.names = 0.8,
  ylim = c(0, total_registros),
  yaxt = "n"
)

puntos_eje <- unique(round(c(seq(0, total_registros, length.out = 6), total_registros)))
axis(side = 2, at = puntos_eje, las = 1)

text(
  centros_global,
  frecuencias_validas,
  labels = frecuencias_validas,
  pos = 3,
  col = "darkblue",
  font = 2
)

4. ANÁLISIS DE FRECUENCIA ABSOLUTA

Gráfica 3: frecuencia absoluta

par(mar = c(7, 5, 4, 2) + 0.1)

centros_abs <- barplot(
  frecuencias_validas,
  main = "Gráfica 3: Distribución de Frecuencias por PRIMARY_CLASS",
  xlab = "Clase primaria",
  ylab = "Frecuencia absoluta (ni)",
  col = "gold",
  las = 2,
  cex.names = 0.8,
  ylim = c(0, max(frecuencias_validas) * 1.20)
)

text(
  centros_abs,
  frecuencias_validas,
  labels = frecuencias_validas,
  pos = 3,
  col = "darkblue",
  font = 2
)

Gráfica 4: frecuencia relativa porcentual

porcentajes <- prop.table(frecuencias_validas) * 100

par(mar = c(7, 5, 4, 2) + 0.1)

centros_porc <- barplot(
  porcentajes,
  main = "Gráfica 4: Distribución Porcentual por PRIMARY_CLASS",
  xlab = "Clase primaria",
  ylab = "Porcentaje (%)",
  col = "darkred",
  las = 2,
  cex.names = 0.8,
  ylim = c(0, max(100, max(porcentajes) * 1.10)),
  yaxt = "n"
)

axis(
  side = 2,
  at = seq(0, 100, by = 20),
  labels = paste0(seq(0, 100, by = 20), "%"),
  las = 1
)

text(
  centros_porc,
  porcentajes,
  labels = paste0(round(porcentajes, 2), "%"),
  pos = 3,
  font = 2
)

5. COMPOSICIÓN GLOBAL

Gráfica 5: composición porcentual por clase primaria

porcentajes_pie <- round(prop.table(frecuencias_validas) * 100, 1)
colores <- rainbow(length(frecuencias_validas), s = 0.55, v = 0.90)

etiquetas <- paste0(
  names(frecuencias_validas),
  " (",
  porcentajes_pie,
  "%)"
)

par(mar = c(2, 2, 4, 13), xpd = TRUE)

pie(
  frecuencias_validas,
  labels = paste0(porcentajes_pie, "%"),
  col = colores,
  main = "Gráfica 5: Composición Global de Muestras por Clase Primaria",
  radius = 0.90
)

legend(
  x = 1.15,
  y = 1,
  legend = etiquetas,
  fill = colores,
  title = "Clases primarias",
  cex = 0.8,
  bty = "o",
  y.intersp = 1.3
)

6. INDICADOR ESTADÍSTICO

Tabla N.° 3: moda de la variable PRIMARY_CLASS

clase_moda <- names(frecuencias_validas)[which.max(frecuencias_validas)]
frecuencia_moda <- as.numeric(max(frecuencias_validas))

tabla_3 <- data.frame(
  Variable = "Clase primaria",
  Moda = clase_moda,
  Frecuencia = frecuencia_moda
)

tabla_3 %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.° 3**"),
    subtitle = md(
      "Indicador Estadístico de la Moda:<br>Clase primaria más frecuente en las minas archivadas"
    )
  ) %>%
  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.bottom.color = "black"
  )
Tabla N.° 3
Indicador Estadístico de la Moda:
Clase primaria más frecuente en las minas archivadas
Variable Moda Frecuencia
Clase primaria rock 1366
Autores: Grupo 1
Semestre 2026 - 2026

7. CONCLUSIÓN

El análisis de la variable PRIMARY_CLASS confirma que la mayoría de los registros se concentra en la categoría rock, que representa el 100% de las muestras con clase primaria identificada. Esta tendencia evidencia el predominio de dicha clasificación dentro de los depósitos de elementos críticos documentados y muestra que las categorías no se distribuyen de manera uniforme.