Proyecto estrictamente académico. Datos: EarthChem PetDB (CC BY 4.0), descargados el 13/10/2026. Web del proyecto: https://crisrumiguano-art.github.io/geoquimica-earthchem-ml/

1. Carga de datos y librerías

Se lee la base limpia (159 760 análisis de roca total × 75 variables). La primera vez se descarga del repositorio del proyecto (26 MB).

knitr::opts_chunk$set(
  echo = TRUE,          # muestra el código en el documento
  message = FALSE,      # sin mensajes de carga de paquetes
  warning = FALSE,      # sin advertencias
  fig.align = "center" # gráficos centrados
)
library(e1071)         # asimetría y curtosis (install.packages("e1071"))
if (!file.exists("data/earthchem_limpio.csv.gz")) {
  dir.create("data", showWarnings = FALSE)
  download.file("https://github.com/crisrumiguano-art/geoquimica-earthchem-ml/raw/main/data/earthchem_limpio.csv.gz",
                "data/earthchem_limpio.csv.gz", mode = "wb")
}
base <- read.csv(gzfile("data/earthchem_limpio.csv.gz", encoding = "UTF-8"), check.names = FALSE)
dim(base)              # filas y columnas
## [1] 159760     75

2. Datos

Se toma la columna de la variable y se quitan las filas vacías (vacío = no medido, nunca cero).

x <- base[["Sample Type"]]                         # la columna de la base
frec <- prop.table(table(x))                 # proporción de cada tipo
x[x %in% names(frec[frec < 0.01])] <- "otros" # los de menos de 1 % se juntan en "otros"
x <- as.character(x)                         # como texto
x <- x[!is.na(x) & x != ""]                  # quita los vacíos

3. Tabla de frecuencias

ni cuenta los casos de cada categoría y hi los expresa en porcentaje; la moda es la categoría con más casos.

conteo <- sort(table(x), decreasing = TRUE)  # cuenta cada categoría, de mayor a menor
categoria <- names(conteo)
ni <- as.vector(conteo)                      # frecuencia absoluta
hi <- round(ni / sum(ni) * 100, 2)           # frecuencia relativa (%)
TDF <- data.frame(categoria, ni, hi)         # nominal: sin acumuladas (no hay orden)
knitr::kable(TDF, caption = "Tabla N° 1: distribución de frecuencias")
Tabla N° 1: distribución de frecuencias
categoria ni hi
igneous:volcanic:mafic 88335 55.29
igneous:plutonic:ultramafic 27820 17.41
igneous:volcanic:clastic 11637 7.28
igneous:volcanic:intermediate 9315 5.83
igneous:plutonic:mafic 6024 3.77
xenolith 5798 3.63
otros 4843 3.03
metamorphic 3856 2.41
igneous:volcanic:felsic 2132 1.33
categoria[which.max(ni)]                     # moda: la categoría con más casos
## [1] "igneous:volcanic:mafic"

4. Gráfico: barras + circular

Diagrama de barras (altura = ni) y diagrama circular (porción = hi).

par(mfrow = c(1, 2), mar = c(9, 5, 4, 1))    # 2 gráficos lado a lado
colores <- gray.colors(length(ni), start = .25, end = .85)       # un gris por categoría
barplot(ni, names.arg = categoria, las = 2, col = colores, ylab = "Cantidad",   # barras: altura = ni
        main = "Gráfica No. 3: Tipo de roca", cex.names = .8, cex.main = .9)
par(mar = c(1, 1, 4, 1))
pie(hi, labels = paste0(hi, "%"), col = colores, clockwise = TRUE, cex = .75,  # circular: porción = hi
    main = "Gráfica No. 4: Tipo de roca (%)", cex.main = .9)
legend("topright", legend = categoria, fill = colores, cex = .6, bty = "n")

5. Conclusión

La categoría más frecuente (moda) es igneous:volcanic:mafic, con el 55,29 % de los 159 760 casos con dato, repartidos en 9 categorías. Predominan las rocas ígneas volcánicas máficas (basaltos), coherente con el peso de las dorsales en la base; las categorías poco frecuentes se agrupan en «Otros» para que el gráfico se pueda leer.