# Universidad Central del Ecuador
# FACULTAD DE INGENIERÍA EN GEOLOGÍA, MINAS, PETRÓLEOS Y AMBIENTAL
# CARRERA DE INGENIERÍA EN MINAS
# SOFTWARE MINERO
# TEMA: ANÁLISIS EXPLORATORIO DE DATOS
# AUTORES: Monica Alejandro, Antonio Chulde, Wendy Montenegro, Johan Morales, Bryan Pastrano
# FECHA:23/07/2025
# ========================
# Cargar librerías
# ========================
install.packages("BAMMtools")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("PASWR")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("dplyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("readr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("e1071")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("readr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("modeest")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(modeest)
library(BAMMtools)
## Loading required package: ape
library(PASWR)
## Loading required package: lattice
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:ape':
##
## where
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readr)
library(e1071)
##
## Attaching package: 'e1071'
## The following object is masked from 'package:modeest':
##
## skewness
setwd("/cloud/project")
# Cargar datos
datos <- read_csv("cuerpo_superior.csv")
## Rows: 236 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): Sondeo, Litologia
## dbl (11): Id, Distancia, Potencia, Densidad, Desde, Hasta, Este, Norte, Elev...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# ========================
# ANÁLISIS EXPLORATORIO DE COBRE (Cu)
# ========================
# Extraer Cobre
Cobre <- datos$`Cu(ppb)` # Ajusta si el nombre cambia
Cobre <- na.omit(Cobre)
# Visualización básica
hist(Cobre, main = "Histograma de concentración de Cu del compósito en los Óxidos",
xlab = "Concentración de Cu (ppb)",
ylab = "Frecuencia",
col = "lightskyblue", ylim= c(0,100 ), xlim= c(0,2500))

CajaCu <- boxplot(Cobre, horizontal = TRUE, col = 'gray',
main = "Diagrama de caja de Cu (ppb)",
xlab = "Concentración (ppb)")

# Outliers
CuOut <- CajaCu$out
sort(CuOut)
## [1] 258.24 265.81 283.20 286.88 377.81 405.60 546.80 570.14 741.82
## [10] 814.00 929.60 1182.42 1449.49 2097.80 2416.00
min(CuOut)
## [1] 258.24
# Datos comunes (sin outliers)
CuComun <- subset(Cobre, Cobre < min(CuOut))
# Buscar filas correspondientes a CuComun
datosComunes <- datos[datos$`Cu(ppb)` %in% CuComun, ]
# Añadir transformación logarítmica
CuComun <- CuComun + 0.01
logCu <- log10(CuComun)
logCu
## [1] 1.00043408 1.00043408 1.63758979 2.26311508 2.14665507 2.39588529
## [7] 1.78965121 0.88930170 0.65417654 2.18301346 2.04524472 1.42586015
## [13] 1.16967443 0.69284692 1.11561051 -0.09151498 1.45954326 1.20439133
## [19] 1.00043408 1.35044186 0.94497591 2.09840142 2.02649241 1.16375752
## [25] 1.11925589 1.47726600 1.34791519 2.33807782 0.91434316 1.79386020
## [31] 1.19340290 0.71683772 0.20682588 -0.38721614 1.09061071 0.86391738
## [37] 1.55521541 0.12710480 1.74201775 1.22865696 0.14921911 1.03019479
## [43] 0.90363252 1.31449923 0.71683772 1.38399479 0.58092498 0.80685803
## [49] 0.38201704 0.85793526 -0.21467016 0.89817648 2.23787034 1.55714614
## [55] -2.00000000 0.38201704 0.77887447 0.34439227 0.89265103 0.91434316
## [61] 1.38219721 1.69363903 2.01287939 2.09415656 0.98272339 0.96425963
## [67] 1.51067903 1.73166933 0.19033170 0.75815462 0.71349054 0.98045789
## [73] 0.79448805 0.62428210 0.69983773 1.09377178 1.01745073 1.18808437
## [79] 1.01577876 0.77887447 0.35218252 -0.48148606 -0.30980392 0.35024802
## [85] 0.66370093 1.54752858 2.10751523 1.82406072 2.11614265 0.93701611
## [91] 1.54444014
min(logCu)
## [1] -2
logCuPos <- logCu - min(logCu)
# Añadir columna nueva al dataframe filtrado
datosComunes$logCuPos <- logCuPos
# Revisar si columnas de coordenadas/elevación existen
head(datosComunes) # Asegúrate de tener columnas como X, Y, Z o Este, Norte, Elevación
## # A tibble: 6 × 14
## Id Sondeo Distancia Potencia Litologia Densidad Desde Hasta Este Norte
## <dbl> <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 PT101 50 3 OXIDO 0 25 30 765620. 1.22e6
## 2 1 PT101 50 3 OXIDO 0 40 45 765616. 1.22e6
## 3 2 PT102 50 3 OXIDO 0 0 5 765051. 1.22e6
## 4 2 PT102 50 3 OXIDO 0 5 10 765050. 1.22e6
## 5 2 PT102 50 3 OXIDO 0 10 15 765048. 1.22e6
## 6 2 PT102 50 3 OXIDO 0 35 40 765041. 1.22e6
## # ℹ 4 more variables: Elevacion <dbl>, `Cu(ppb)` <dbl>, `Ni(ppm)` <dbl>,
## # logCuPos <dbl>
# Visualizar histograma
hist(logCuPos, main = "Histograma log-Normal de leyes de Cobre en los Óxidos", col = "skyblue")

# Exportar
write.csv(datosComunes, "Datos_Cu_Cuerpo_sup.csv", row.names = FALSE)
#------------------------------------Ni--------------------------------------------
# Extraer Ni
Niquel <- datos$`Ni(ppm)` # Ajusta si el nombre cambia
Niquel <- na.omit(Niquel)
# Visualización básica
hist(Niquel, , main = "Histograma de concentración de Ni del compósito en los Óxidos",
xlab = "Concentración de Ni (ppm)",
ylab = "Frecuencia",
col = "lightskyblue", ylim= c(0,200 ), xlim= c(0,20000))

CajaNi <- boxplot(Niquel, horizontal = TRUE, col = 'gray',
main = "Diagrama de caja de Ni(ppm)",
xlab = "Concentración (ppm)")

# Outliers
NiOut <- CajaNi$out
sort(NiOut)
## [1] 487.70 561.75 622.08 638.00 694.39 892.74 986.60 1113.60 1232.40
## [10] 1684.13 1913.19 3033.54 5052.02 5370.96 7465.44 7539.00
min(NiOut)
## [1] 487.7
# Datos comunes (sin outliers)
NiComun <- subset(Niquel, Niquel < min(NiOut))
# Buscar filas correspondientes a CuComun
datosComunes <- datos[datos$`Ni(ppm)` %in% NiComun, ]
# Añadir transformación logarítmica
NiComun <- NiComun + 0.01
logNi <- log10(NiComun)
min(logNi)
## [1] -2
logNiPos <- logNi - min(logNi)
# Añadir columna nueva al dataframe filtrado
datosComunes$logNiPos <- logNiPos
# Revisar si columnas de coordenadas/elevación existen
head(datosComunes) # Asegúrate de tener columnas como X, Y, Z o Este, Norte, Elevación
## # A tibble: 6 × 14
## Id Sondeo Distancia Potencia Litologia Densidad Desde Hasta Este Norte
## <dbl> <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 PT101 50 3 OXIDO 0 25 30 765620. 1.22e6
## 2 1 PT101 50 3 OXIDO 0 40 45 765616. 1.22e6
## 3 2 PT102 50 3 OXIDO 0 0 5 765051. 1.22e6
## 4 2 PT102 50 3 OXIDO 0 35 40 765041. 1.22e6
## 5 2 PT102 50 3 OXIDO 0 45.2 50.2 765038. 1.22e6
## 6 3 PT103 50 3 OXIDO 0 0 5 765584. 1.22e6
## # ℹ 4 more variables: Elevacion <dbl>, `Cu(ppb)` <dbl>, `Ni(ppm)` <dbl>,
## # logNiPos <dbl>
# Visualizar histograma
hist(logNiPos, main = "Histograma log-Normal de leyes de Niquel en los Óxidos", col = "skyblue")

# Exportar
write.csv(datosComunes, "Datos_Ni_Cuerpo_sup.csv", row.names = FALSE)
# ========================
# CÁLCULO DE INDICADORES ESTADÍSTICOS COMPLETOS
# ========================
resumen_estadistico <- function(variable) {
variable <- na.omit(variable)
n <- length(variable)
media <- mean(variable)
mediana <- median(variable)
moda <- mfv(variable)[1]
minimo <- min(variable)
maximo <- max(variable)
q1 <- quantile(variable, 0.25)
q3 <- quantile(variable, 0.75)
varianza <- var(variable)
desv_std <- sd(variable)
coef_var <- (desv_std / media) * 100
sesgo <- skewness(variable)
curtosis <- kurtosis(variable)
return(c(
Muestra = n,
Media = round(media, 2),
Mediana = round(mediana, 2),
Moda = round(moda, 2),
Mínimo = round(minimo, 2),
Máximo = round(maximo, 2),
`1er Cuartil` = round(q1, 2),
`3er Cuartil` = round(q3, 2),
Varianza = round(varianza, 2),
`Desv. Estándar` = round(desv_std, 2),
`Coef. Variación` = round(coef_var, 2),
Sesgo = round(sesgo, 2),
Curtosis = round(curtosis, 2)
))
}
# Calcular estadísticas para Cu y Ni sin outliers
stats_cu <- resumen_estadistico(Cobre)
stats_ni <- resumen_estadistico(Niquel)
# Crear tabla
tabla_resumen <- data.frame(
Indicador = names(stats_cu),
`Cu(ppb)` = stats_cu,
`Ni(ppm)` = stats_ni
)
# Mostrar tabla en consola
print(tabla_resumen)
## Indicador Cu.ppb. Ni.ppm.
## Muestra Muestra 106.00 106.00
## Media Media 148.51 407.82
## Mediana Mediana 14.67 29.38
## Moda Moda 10.00 8.00
## Mínimo Mínimo 0.00 0.00
## Máximo Máximo 2416.00 7539.00
## 1er Cuartil.25% 1er Cuartil.25% 6.06 11.70
## 3er Cuartil.75% 3er Cuartil.75% 105.46 108.69
## Varianza Varianza 143422.69 1636176.45
## Desv. Estándar Desv. Estándar 378.71 1279.13
## Coef. Variación Coef. Variación 255.00 313.65
## Sesgo Sesgo 4.05 4.31
## Curtosis Curtosis 17.94 18.84
# Exportar a CSV
write.csv(tabla_resumen, "Resumen_Completo_Cu_Ni_CON_OUTLIERS.csv", row.names = FALSE)
# ================================================================================================
# ANÁLISIS EXPLORATORIO CUERPO INFERIOR (SULFUROS)
# ================================================================================================
datos <- read_csv("compositos_inferior.csv")
## Rows: 227 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): Sondeo, Litologia
## dbl (11): Id, Distancia, Potencia, Densidad, Desde, Hasta, Este, Norte, Elev...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# ========================
# ANÁLISIS EXPLORATORIO DE COBRE (Cu)
# ========================
# Extraer Cobre
Cobre <- datos$`Cu(ppb)`
Cobre <- na.omit(Cobre)
# Visualización básica
hist(Cobre, main = "Histograma de concentración de Cu del compósito en los Sulfuros",
xlab = "Concentración de Cu (ppb)",
ylab = "Frecuencia",
col = "lightskyblue", ylim= c(0,150 ), xlim= c(0,10000))

CajaCu <- boxplot(Cobre, horizontal = TRUE, col = 'gray',
main = "Diagrama de caja de Cu (ppb)",
xlab = "Concentración (ppb)")

# Outliers
CuOut <- CajaCu$out
sort(CuOut)
## [1] 2305.73 2894.42 2998.95 3041.71 3220.40 3282.63 3297.21 3578.87
## [9] 3693.99 3850.99 3925.62 4676.33 4845.60 5013.60 6367.96 12103.87
min(CuOut)
## [1] 2305.73
# Datos comunes (sin outliers)
CuComun <- subset(Cobre, Cobre < min(CuOut))
# Buscar filas correspondientes a CuComun
datosComunes <- datos[datos$`Cu(ppb)` %in% CuComun, ]
# Añadir transformación logarítmica
CuComun <- CuComun + 0.01
logCu <- log10(CuComun)
logCu
## [1] 0.6821451 1.0937718 0.4297523 1.9085386 2.4123765 0.6304279 2.7879207
## [8] 2.7614993 1.8716313 3.0795466 0.9827234 0.7788745 0.4166405 2.8984454
## [15] 2.7459877 2.0803739 2.0524631 2.7207297 2.7714331 3.1121390 2.7127086
## [22] 1.3558345 3.1264237 2.3642132 2.0806986 2.2942678 2.5275139 2.2259551
## [29] 2.4626525 2.1908637 2.6683859 2.2326150 1.4655316 1.0937718 0.5065050
## [36] 0.3031961 2.0740847 2.6462272 0.8870544 0.9090209 2.7044851 3.2640359
## [43] 3.2439603 2.0853263 2.6743926 2.9848018 2.2321063 0.6522463 0.5987905
## [50] 1.5000992 2.2110137 0.9781805 0.6812412 2.9344783 2.8766046 2.7651542
## [57] 3.1279369 2.8557372 3.1850858 3.1822320 2.6507154 2.9704678 1.8923729
## [64] 2.4857356 1.9823165 1.3875678 1.8222335 2.5808680 2.6555322 2.2117611
## [71] 2.7107096 2.0694091 2.5297511 1.2535803 2.5985607 2.5596673 2.4549668
## [78] 2.4025881 2.6786640 2.9114293 3.0266313 2.4476696 2.1121691 1.6494322
## [85] 2.0715506 1.8760446 2.3239118 1.5083950 2.2390741 1.7938602 2.3533583
## [92] 2.5968279 1.6513749 1.8965813 1.6128898 1.8389120 2.1058847 2.0421028
## [99] 3.0052964 2.4853807 2.3614823 1.3996737 2.2457594 2.7103459 3.1759783
## [106] 3.1069385 1.7435098 1.4462264 2.0622434 3.1324550 2.9338920 3.2804805
## [113] 2.8741454 3.3087308 2.6220170 1.6776982 0.9449759 0.6444386 1.0338257
## [120] 2.1981345 1.8954778 1.7324742 2.3902460 1.8182919 1.8238653 1.7243578
## [127] 1.5441921 2.5978268 1.6902847 1.6254154 2.2003306 1.0338257 2.1253186
## [134] 0.7604225 1.7438232 0.4440448 1.4153073 2.4395537 2.4582147 3.0706510
## [141] 2.1675831 3.1919203 2.5485245 0.1492191 2.1343684 3.0487952 3.3009605
## [148] 3.1348844 2.6127521 1.4984484 2.3634427 3.2372345 3.0066029 2.2645345
## [155] 3.0315741 2.7851233 1.9053101 2.5670617 2.0515384 2.4490925 2.1976113
## [162] 3.2583547 3.3558594 2.4784655 3.1638618 1.5600262 3.1660273 3.0595861
## [169] 2.6711543 2.4666007 3.0653930 3.2591326
min(logCu)
## [1] 0.1492191
logCuPos <- logCu - min(logCu)
# Añadir columna nueva al dataframe filtrado
datosComunes$logCuPos <- logCuPos
# Revisar si columnas de coordenadas/elevación existen
head(datosComunes) # Asegúrate de tener columnas como X, Y, Z o Este, Norte, Elevación
## # A tibble: 6 × 14
## Id Sondeo Distancia Potencia Litologia Densidad Desde Hasta Este Norte
## <dbl> <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 PT101 50 3 SULFURO 0 55 60 765612. 1.22e6
## 2 1 PT101 50 3 SULFURO 0 60 65 765611. 1.22e6
## 3 1 PT101 50 3 SULFURO 0 65 70 765610. 1.22e6
## 4 1 PT101 50 3 SULFURO 0 85 90 765605. 1.22e6
## 5 1 PT101 50 3 SULFURO 0 90 95 765604. 1.22e6
## 6 1 PT101 50 3 SULFURO 0 95 100 765603. 1.22e6
## # ℹ 4 more variables: Elevacion <dbl>, `Cu(ppb)` <dbl>, `Ni(ppm)` <dbl>,
## # logCuPos <dbl>
# Visualizar histograma
hist(logCuPos, main = "Histograma log-Normal de leyes de Cobre en los Sulfuros", col = "skyblue")

# Exportar
write.csv(datosComunes, "Datos_Cu_Cuerpo_inf.csv", row.names = FALSE)
#------------------------------------Ni--------------------------------------------
# Extraer Ni
Niquel <- datos$`Ni(ppm)` # Ajusta si el nombre cambia
Niquel <- na.omit(Niquel)
# Visualización básica
hist(Niquel, , main = "Histograma de concentración de Ni del compósito en los Sulfuros",
xlab = "Concentración de Ni (ppm)",
ylab = "Frecuencia",
col = "lightskyblue", ylim= c(0,200 ), xlim= c(0,20000))

CajaNi <- boxplot(Niquel, horizontal = TRUE, col = 'gray',
main = "Diagrama de caja de Ni(ppm)",
xlab = "Concentración (ppm)")

# Outliers
NiOut <- CajaNi$out
sort(NiOut)
## [1] 537.02 561.15 628.89 665.02 670.66 759.58 1048.00 1050.04
## [9] 1111.67 1203.94 1328.15 1588.48 1716.60 2192.75 2202.06 2587.97
## [17] 2821.03 4795.72 5181.84 6043.01 7233.77 8496.38 8759.66 9771.65
## [25] 10366.87 13291.04 16154.91 16274.46 19203.93 20197.60
min(NiOut)
## [1] 537.02
# Datos comunes (sin outliers)
NiComun <- subset(Niquel, Niquel < min(NiOut))
# Buscar filas correspondientes a CuComun
datosComunes <- datos[datos$`Ni(ppm)` %in% NiComun, ]
# Añadir transformación logarítmica
NiComun <- NiComun + 0.01
logNi <- log10(NiComun)
min(logNi)
## [1] -2
logNiPos <- logNi - min(logNi)
# Añadir columna nueva al dataframe filtrado
datosComunes$logNiPos <- logNiPos
# Revisar si columnas de coordenadas/elevación existen
head(datosComunes) # Asegúrate de tener columnas como X, Y, Z o Este, Norte, Elevación
## # A tibble: 6 × 14
## Id Sondeo Distancia Potencia Litologia Densidad Desde Hasta Este Norte
## <dbl> <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 PT101 50 3 SULFURO 0 55 60 765612. 1.22e6
## 2 1 PT101 50 3 SULFURO 0 60 65 765611. 1.22e6
## 3 1 PT101 50 3 SULFURO 0 65 70 765610. 1.22e6
## 4 1 PT101 50 3 SULFURO 0 85 90 765605. 1.22e6
## 5 1 PT101 50 3 SULFURO 0 90 95 765604. 1.22e6
## 6 1 PT101 50 3 SULFURO 0 95 100 765603. 1.22e6
## # ℹ 4 more variables: Elevacion <dbl>, `Cu(ppb)` <dbl>, `Ni(ppm)` <dbl>,
## # logNiPos <dbl>
# Visualizar histograma
hist(logNiPos, main = "Histograma log-Normal de leyes de Niquel en los Sulfuros", col = "skyblue")

# Exportar
write.csv(datosComunes, "Datos_Ni_Cuerpo_sup.csv", row.names = FALSE)
# ========================
# CÁLCULO DE INDICADORES ESTADÍSTICOS COMPLETOS
# ========================
resumen_estadistico <- function(variable) {
variable <- na.omit(variable)
n <- length(variable)
media <- mean(variable)
mediana <- median(variable)
moda <- mfv(variable)[1]
minimo <- min(variable)
maximo <- max(variable)
q1 <- quantile(variable, 0.25)
q3 <- quantile(variable, 0.75)
varianza <- var(variable)
desv_std <- sd(variable)
coef_var <- (desv_std / media) * 100
sesgo <- skewness(variable)
curtosis <- kurtosis(variable)
return(c(
Muestra = n,
Media = round(media, 2),
Mediana = round(mediana, 2),
Moda = round(moda, 2),
Mínimo = round(minimo, 2),
Máximo = round(maximo, 2),
`1er Cuartil` = round(q1, 2),
`3er Cuartil` = round(q3, 2),
Varianza = round(varianza, 2),
`Desv. Estándar` = round(desv_std, 2),
`Coef. Variación` = round(coef_var, 2),
Sesgo = round(sesgo, 2),
Curtosis = round(curtosis, 2)
))
}
# Calcular estadísticas para Cu y Ni sin outliers
stats_cu <- resumen_estadistico(Cobre)
stats_ni <- resumen_estadistico(Niquel)
# Crear tabla
tabla_resumen2 <- data.frame(
Indicador = names(stats_cu),
`Cu(ppb)` = stats_cu,
`Ni(ppm)` = stats_ni
)
# Mostrar tabla en consola
print(tabla_resumen2)
## Indicador Cu.ppb. Ni.ppm.
## Muestra Muestra 188.00 188.00
## Media Media 770.95 956.40
## Mediana Mediana 266.78 33.08
## Moda Moda 10.80 2.20
## Mínimo Mínimo 1.40 0.00
## Máximo Máximo 12103.87 20197.60
## 1er Cuartil.25% 1er Cuartil.25% 66.25 10.20
## 3er Cuartil.75% 3er Cuartil.75% 942.09 218.51
## Varianza Varianza 1868357.79 9836650.86
## Desv. Estándar Desv. Estándar 1366.88 3136.34
## Coef. Variación Coef. Variación 177.30 327.93
## Sesgo Sesgo 4.18 4.31
## Curtosis Curtosis 25.75 19.17