# 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