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[["Alteration Grade"]]                         # la columna de la base
x <- factor(x, levels = 0:5, labels = c("0 fresca", "1 leve", "2 moderada", "3 extensa", "4 casi total", "5 total"))   # códigos 0-5 -> nombres
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.

orden <- c("0 fresca", "1 leve", "2 moderada", "3 extensa", "4 casi total", "5 total")   # ordinal: su orden natural
conteo <- table(factor(x, levels = orden))   # cuenta cada categoría, en ese orden
categoria <- names(conteo)
ni <- as.vector(conteo)                      # frecuencia absoluta
hi <- round(ni / sum(ni) * 100, 2)           # frecuencia relativa (%)
Ni <- cumsum(ni)                             # acumulada absoluta (solo ordinales)
Hi <- round(cumsum(ni) / sum(ni) * 100, 2)   # acumulada relativa (%)
TDF <- data.frame(categoria, ni, hi, Ni, Hi)
knitr::kable(TDF, caption = "Tabla N° 1: distribución de frecuencias")
Tabla N° 1: distribución de frecuencias
categoria ni hi Ni Hi
0 fresca 15594 46.90 15594 46.90
1 leve 4523 13.60 20117 60.51
2 moderada 8489 25.53 28606 86.04
3 extensa 3958 11.90 32564 97.94
4 casi total 529 1.59 33093 99.53
5 total 155 0.47 33248 100.00
categoria[which.max(ni)]                     # moda: la categoría con más casos
## [1] "0 fresca"
categoria[which(Hi >= 50)[1]]                # mediana: donde Hi llega al 50 %
## [1] "1 leve"

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. 7: Grado de alteración", 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. 8: Grado de alteración (%)", cex.main = .9)
legend("topright", legend = categoria, fill = colores, cex = .6, bty = "n")

5. Conclusión

La categoría más frecuente (moda) es 0 fresca, con el 46,9 % de los 33 248 casos con dato, repartidos en 6 categorías. Casi la mitad de los análisis informados son de rocas frescas. Los de rocas muy alteradas se deben usar con cuidado en los elementos que el agua mueve con facilidad (K, Rb, Ba).