Para el desarrollo de este trabajo se ha empleado una base de datos con información de una serie de muestras tomadas en un yacimiento mineral. Cada muestra despliega la concentración de varios elementos, en partes por millon, que se hallaron dentro del depósito.
En primera instancia, se cargarón las librerias que se emplearon a lo largo del estudio para generar el código y las gráficas correspondientes.
Se realizó un análisis exploratiro de los datos y la correspondiente limpieza y depuración de los mismos. Para hacerlo fue necesario cargar la base de datos a modo de data.frame. También, se empleó la función head() para hacer una primera inspeción a la matriz assay y su conjunto de datos.
La información encontrada es, naturalmente, corespondiente con la descripción inicial. Es decir, en su mayoría el data.frame está compuesto por las partes por millon de los elementos que tienen las muestras de la columna Sample_ID. Sin embargo, hay información en porcentajes que debe pasarse a concentración [ppm].Para completar esto se realiza una conversión de los faltantes y se reescribe assay.
#Se reescribe la variable para incluir la conversión de % a ppm
assay= assay %>% mutate(Fe_ppm=`Fe_%`*10000, CA_ppm=`CA_%`*10000, P_ppm=`P_%`*10000, Mg_ppm=`Mg_ %`*10000, Ti_ppm=`Ti_%`*10000, Al_ppm=`Al_%`*10000, Na_ppm=`Na_%`*10000, K_ppm=`K_%`*10000, S_ppm=`S_%`*10000)
#También se reescribe para incluir algunas conversiones de ppm a %
assay=assay %>% mutate(`Cr_%`=Cr_ppm/10000, `Pb_%`=Pb_ppm/10000, `Ni_%`=Ni_ppm/10000)
Parte de la información está mezclada con datos irrelevantes para estudio que se pretende realizar. Datos como Hole_ID, From, To, Length o Wgt_kg son metadatos prescindibles. También, para algunos elementos minerales la proporción se expresa por medio de porcentajes, lo cual es útil, pero se precisa separarla para tener un orden.
En consecuencia, creó un nuevo data.frame que sólo contuviese las partes por millón de cada elemento.
#Minerales con elementos en partes por millon [ppm]
Mineral_ppm = assay %>% select(contains("ppm"))
También, siguiendo el mismo principio, se seleccionaron los datos de los porcentajes para agruparlos en un nuevo data.frame.
#Porcentaje de concentración de los elementos [%]
Mineral_porcent= assay %>% select(contains("%"))
head(Mineral_porcent)
## # A tibble: 6 × 13
## `Cu_%` `Fe_%` `CA_%` `P_%` `Mg_ %` `Ti_%` `Al_%` `Na_%` `K_%` `S_%` `Cr_%`
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.137 3.79 0.7 0.152 0.82 0.429 8.36 2.83 2.47 0.1 0.003
## 2 0.0199 3.57 0.72 0.148 0.92 0.409 7.61 2.32 2.55 0.1 0.0029
## 3 2.47 2.87 1.27 0.132 0.44 0.362 7.19 1.06 2.59 0.1 0.0027
## 4 0.0263 4.68 1.34 0.203 1.47 0.535 8.38 3.9 2.27 0.1 0.0032
## 5 0.0825 4.05 1.72 0.22 2.28 0.575 8.94 2.98 2.62 0.1 0.0032
## 6 0.326 3.27 1.56 0.195 1.24 0.496 7.5 2.19 2.46 0.1 0.0029
## # ℹ 2 more variables: `Pb_%` <dbl>, `Ni_%` <dbl>
Es posible apreciar que algunos de los elementos que se encuentran dentro de la variable Mineral_porcent están asociados a minerales de interes ecónomico o lo son. Se sospecha que está es la razón por la que se expresó su valor en porcentaje ya que de esta manera se podría interpretar más claramente la porporción de cada uno de estos elementos dentro de la muestra.
Se corrubora que los datos se encuentren limpios y sin errores. Es pertinente realizar esto, puesto que, de lo contrario, eventualmente se generarían problemas en el tratamiento de datos. Esto se ejecuta tanto para los data.frames creados anteriormente como para la base de datos general.
#Para los datos de la base de datos general
sum(is.null(assay))
## [1] 0
#Mineral_porcent
sum(is.null(Mineral_porcent))
## [1] 0
#Mineral_ppm
sum(is.null(Mineral_porcent))
## [1] 0
La base de datos no contiene valores vacíos y, por lo tanto, tampoco los data.frame creados. Gracias a esto será posible continuar trabajando sin preocupaciones.
Se busca definir las tres muestras con mayores concentraciones para elementos economicamente rentables. Por este motivo se relaiza un filtro y se crea una serie de variables que contengan aquellas tres muestras con mayor concentración en ppm. Esta información también se asocia con el Hole_id que puede proporcionar información relevante con respecto a cuál es el sitio en que hay mayor concentración de elementos de interes económico.
# Cobre
assay %>% arrange(desc(Cu_ppm)) %>% select(Cu_ppm, Sample_ID, Hole_Id) %>% head(3)
## # A tibble: 3 × 3
## Cu_ppm Sample_ID Hole_Id
## <dbl> <chr> <chr>
## 1 10000 G-0003 MC00001
## 2 10000 G-0009 CA00003
## 3 10000 G-0012 CA00005
#Hierro
assay %>% arrange(desc(Fe_ppm)) %>% select(Fe_ppm, Sample_ID, Hole_Id) %>% head(3)
## # A tibble: 3 × 3
## Fe_ppm Sample_ID Hole_Id
## <dbl> <chr> <chr>
## 1 80300 G-1965 CA00143
## 2 75900 G-2357 CA00144
## 3 70900 G-2578 CA00139
# Aluminio
assay %>% arrange(desc(Al_ppm)) %>% select(Al_ppm, Sample_ID, Hole_Id) %>% head(3)
## # A tibble: 3 × 3
## Al_ppm Sample_ID Hole_Id
## <dbl> <chr> <chr>
## 1 116600 G-1157 CA00115
## 2 116600 G-1562 CA00142
## 3 110400 G-0084 CA00017
#Niquel
assay %>% arrange(desc(Ni_ppm)) %>% select(Ni_ppm, Sample_ID, Hole_Id) %>% head(3)
## # A tibble: 3 × 3
## Ni_ppm Sample_ID Hole_Id
## <dbl> <chr> <chr>
## 1 79.7 G-1956 CA00143
## 2 78.1 G-2021 CA00143
## 3 76.2 G-2026 CA00143
# Cromo
assay %>% arrange(desc(Cr_ppm)) %>% select(Cr_ppm, Sample_ID, Hole_Id) %>% head(3)
## # A tibble: 3 × 3
## Cr_ppm Sample_ID Hole_Id
## <dbl> <chr> <chr>
## 1 125 G-2123 CA00143
## 2 113 G-2357 CA00144
## 3 104 G-0013 CA00005
# Pb
assay %>% arrange(desc(Pb_ppm)) %>% select(Pb_ppm, Sample_ID, Hole_Id) %>% head(3)
## # A tibble: 3 × 3
## Pb_ppm Sample_ID Hole_Id
## <dbl> <chr> <chr>
## 1 1368. G-2717 CA00146
## 2 925. G-0006 CA00002
## 3 826. G-2719 CA00146
Los lugares en los que se encuentran los núcleos CA00144, CA00143 y CA00142 son sitios en los que aparecen altas concentraciones tanto de Cromo, como de Niquel, Aluminio y Hierro. Si queremos estudiar esto más a detalle podría ser interesante estudiar una muestra que tenga altas concentraciones de estos cuatro elementos. Por lo tanto, se creó un filtro para analizar tres muestras que contengan altas concentraciones de estos elementos simultaneamente.
assay %>% filter(Cr_ppm >= 90 & Ni_ppm >= 74 & Al_ppm >=85000 & Fe_ppm >= 6000) %>% select(Hole_Id, Sample_ID, Cr_ppm, Ni_ppm, Al_ppm, Fe_ppm)
## # A tibble: 7 × 6
## Hole_Id Sample_ID Cr_ppm Ni_ppm Al_ppm Fe_ppm
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 CA00005 G-0013 104 74.7 88800 69500
## 2 CA00143 G-2017 90 74.8 88900 64800
## 3 CA00143 G-2021 98 78.1 99900 62700
## 4 CA00143 G-2023 93 75.5 92700 67300
## 5 CA00143 G-2024 98 74 98100 69000
## 6 CA00143 G-2026 95 76.2 89900 63900
## 7 CA00144 G-2357 113 74 88900 75900
La información encontrada concuerda con el Hole_Id CA00143, en consecuencia, se recomidenda estudiar esta zona ya que tiene una alta concentración de de estos cuatro minerales de interes económico. Finalmente, es curioso notar como aquel sitio que tiene mayores concentraciones es el CA00005, es también aquel que posee las concentraciones más altas de Cobre.
Se precica identificar cualquier muestra del campo Sample_ID que contenga una proporción de cobre (Cu) superior al 10% y Níquel (Ni) superior a 5ppm. Es decir, se tienen que hallar todas aquellas muestras que cumplan ambos criterios simultáneamente.
Primero se realiza una revisión general de ambas matrices, tanto la de Niquel como Cobre.
Est_Cu_percent= summary(assay$`Cu_%`)
Est_Cu_percent
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00015 0.00401 0.00686 0.12757 0.02242 7.54800
Est_Ni_ppm= summary(assay$Ni_ppm)
Est_Ni_ppm
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.30 22.50 24.60 27.52 27.20 79.70
Al revisar los datos se comprendió que no existe ningún valor de cobre con una concentración superior al 10%. De hecho, el dato máximo de concentración en porcentaje de cobre es de tan sólo 7.54. Por otro lado, existe una alta canitdad de valores de concentración de Niquel mayores a \(5ppm\) debido a que la media y mediana son superiores a 20. Por este motivo se considero pertinente cambiar un poco los parámetros para la busqueda de muestras.
Entonces, se buscarán todas aquellas muestras que cumplan que contenga una proporción de cobre (Cu) superior al 3% (los cuales son datos atípicos ya que son superiores al tercer cuartil) y Níquel (Ni) mayor a 20ppm
#Filtrar los datos
Ni_Cu= assay %>%
filter(`Cu_%`>3 & Ni_ppm > 5) %>%
select(Sample_ID, Hole_Id, `Cu_%`, Ni_ppm)
#Presentación de los valores
Ni_Cu
## # A tibble: 11 × 4
## Sample_ID Hole_Id `Cu_%` Ni_ppm
## <chr> <chr> <dbl> <dbl>
## 1 G-0012 CA00005 5.70 27.6
## 2 G-1007 CA00020 6.24 14
## 3 G-1204 CA00122 3.72 61.7
## 4 G-1219 CA00125 3.57 65.1
## 5 G-2747 CA00147 3.71 40.9
## 6 G-2748 CA00147 7.55 45.3
## 7 G-2749 CA00147 3.77 37.8
## 8 G-2805 CA00150 3.63 43.4
## 9 G-2806 CA00150 3.02 53
## 10 G-2816 CA00151 4.02 56
## 11 G-2915 CA00156 3.18 29.4
Gracias a la función dim(Ni_Cu) se determió que existe un total de 11 muestras que cumplen con los criterios propuestos anteriormente. También se consideró útil asociar el Sample_ID con el Hole_ID con el fin de relacionar cada muestra con un espacio y además notar si hay núcleos que presenten más esta característica. Por ejemplo, el espacio de muestreo CA00147 presenta una cantidad atípica de muestras con este criterio.
Para conocer el mineral principal que pudiera ser encontrado dentro del yamiento es primoldial discernir los elementos más comunes y en mayor concentración. Por lo tanto, se realizó un análisis estadístico de la variable Mineral_porcent con el fin de discriminar los datos.
#Resumen estadístico de los elementos presentes en Mineral_porcent
summary(Mineral_ppm)
## Mo_ppm Cu_ppm Pb_ppm Zn_ppm
## Min. : 0.1000 Min. : 1.5 Min. : 1.30 Min. : 7.0
## 1st Qu.: 0.5000 1st Qu.: 40.1 1st Qu.: 6.20 1st Qu.: 84.0
## Median : 0.6000 Median : 68.6 Median : 7.80 Median : 95.0
## Mean : 0.9477 Mean : 852.6 Mean : 18.76 Mean :100.4
## 3rd Qu.: 0.7000 3rd Qu.: 224.2 3rd Qu.: 11.20 3rd Qu.:111.0
## Max. :257.1000 Max. :10000.0 Max. :1368.10 Max. :247.0
##
## Ag_ppm Ni_ppm Co_ppm Mn_ppm
## Min. : 0.050 Min. : 1.30 Min. : 0.50 Min. : 71.0
## 1st Qu.: 0.100 1st Qu.:22.50 1st Qu.:14.40 1st Qu.: 605.0
## Median : 0.100 Median :24.60 Median :15.90 Median : 816.0
## Mean : 1.127 Mean :27.52 Mean :16.63 Mean : 852.2
## 3rd Qu.: 0.200 3rd Qu.:27.20 3rd Qu.:17.60 3rd Qu.:1029.0
## Max. :73.900 Max. :79.70 Max. :57.90 Max. :3126.0
##
## As_ppm U_ppm Th_ppm Sr_ppm
## Min. : 0.500 Min. :0.300 Min. : 0.400 Min. : 43.0
## 1st Qu.: 1.000 1st Qu.:1.400 1st Qu.: 6.100 1st Qu.:193.0
## Median : 2.000 Median :1.600 Median : 7.000 Median :282.0
## Mean : 2.185 Mean :1.575 Mean : 6.768 Mean :296.7
## 3rd Qu.: 3.000 3rd Qu.:1.800 3rd Qu.: 7.800 3rd Qu.:391.0
## Max. :43.000 Max. :7.200 Max. :15.400 Max. :790.0
##
## Cd_ppm Sb_ppm Bi_ppm V_ppm
## Min. : 0.050 Min. :0.0500 Min. :0.05000 Min. : 4
## 1st Qu.: 0.200 1st Qu.:0.1000 1st Qu.:0.05000 1st Qu.: 93
## Median : 0.400 Median :0.1000 Median :0.10000 Median :102
## Mean : 4.804 Mean :0.1256 Mean :0.09482 Mean :107
## 3rd Qu.: 0.900 3rd Qu.:0.1000 3rd Qu.:0.10000 3rd Qu.:118
## Max. :736.300 Max. :8.9000 Max. :1.10000 Max. :242
##
## La_ppm Cr_ppm Ba_ppm W_ppm
## Min. : 2.90 Min. : 5.00 Min. : 82.0 Min. : 0.0500
## 1st Qu.:34.30 1st Qu.: 30.00 1st Qu.: 535.0 1st Qu.: 0.5000
## Median :38.70 Median : 33.00 Median : 653.0 Median : 0.7000
## Mean :38.25 Mean : 36.91 Mean : 701.5 Mean : 0.8815
## 3rd Qu.:42.40 3rd Qu.: 38.00 3rd Qu.: 769.0 3rd Qu.: 0.9000
## Max. :75.90 Max. :125.00 Max. :8793.0 Max. :149.0000
##
## Zr_ppm Ce_ppm Sn_ppm Y_ppm
## Min. : 3.3 Min. : 6.00 Min. : 0.200 Min. : 2.90
## 1st Qu.:228.2 1st Qu.: 64.00 1st Qu.: 1.600 1st Qu.:14.60
## Median :251.0 Median : 70.00 Median : 1.800 Median :16.10
## Mean :248.7 Mean : 69.47 Mean : 1.783 Mean :16.46
## 3rd Qu.:271.3 3rd Qu.: 76.00 3rd Qu.: 1.900 3rd Qu.:17.70
## Max. :381.2 Max. :187.00 Max. :31.900 Max. :31.30
##
## Nb_ppm Ta_ppm Be_ppm Sc_ppm
## Min. : 0.50 Min. :0.100 Min. :1.000 Min. : 1.0
## 1st Qu.:17.80 1st Qu.:1.200 1st Qu.:2.000 1st Qu.: 9.0
## Median :20.20 Median :1.400 Median :2.000 Median :10.0
## Mean :19.92 Mean :1.341 Mean :1.814 Mean :10.5
## 3rd Qu.:22.20 3rd Qu.:1.500 3rd Qu.:2.000 3rd Qu.:11.0
## Max. :31.50 Max. :5.200 Max. :4.000 Max. :23.0
##
## Li_ppm Rb_ppm Hf_ppm In_ppm
## Min. : 2.60 Min. : 4.10 Min. : 0.100 Min. :0.05000
## 1st Qu.: 25.90 1st Qu.: 54.10 1st Qu.: 5.200 1st Qu.:0.05000
## Median : 35.50 Median : 70.70 Median : 5.800 Median :0.05000
## Mean : 35.62 Mean : 72.37 Mean : 5.736 Mean :0.05215
## 3rd Qu.: 43.30 3rd Qu.: 89.00 3rd Qu.: 6.200 3rd Qu.:0.05000
## Max. :106.40 Max. :188.10 Max. :10.100 Max. :0.12000
##
## Ge_ppm Re_ppm Se_ppm Te_ppm
## Min. :0.0500 Min. :0.0050 Min. :1.000 Min. :0.5000
## 1st Qu.:0.0600 1st Qu.:0.0050 1st Qu.:1.000 1st Qu.:0.5000
## Median :0.0900 Median :0.0050 Median :1.000 Median :0.5000
## Mean :0.1147 Mean :0.0141 Mean :1.007 Mean :0.5004
## 3rd Qu.:0.1300 3rd Qu.:0.0050 3rd Qu.:1.000 3rd Qu.:0.5000
## Max. :0.7100 Max. :8.5870 Max. :3.000 Max. :1.2000
## NA's :2
## Tl_ppm Fe_ppm CA_ppm P_ppm
## Min. :0.5000 Min. : 1700 Min. : 2200 Min. : 250
## 1st Qu.:0.5000 1st Qu.:37900 1st Qu.: 9100 1st Qu.:1490
## Median :0.5000 Median :41200 Median : 12100 Median :1750
## Mean :0.6091 Mean :42117 Mean : 15640 Mean :1742
## 3rd Qu.:0.7000 3rd Qu.:44700 3rd Qu.: 17300 3rd Qu.:1960
## Max. :2.0000 Max. :80300 Max. :313100 Max. :3220
##
## Mg_ppm Ti_ppm Al_ppm Na_ppm
## Min. : 3100 Min. : 110 Min. : 2800 Min. : 140
## 1st Qu.:11100 1st Qu.: 4470 1st Qu.: 78900 1st Qu.:27760
## Median :13200 Median : 5100 Median : 82900 Median :33930
## Mean :14327 Mean : 5210 Mean : 82461 Mean :32422
## 3rd Qu.:16700 3rd Qu.: 5560 3rd Qu.: 87300 3rd Qu.:38410
## Max. :43800 Max. :11090 Max. :116600 Max. :59900
##
## K_ppm S_ppm
## Min. : 800 Min. : 1000
## 1st Qu.:17400 1st Qu.: 1000
## Median :22800 Median : 1000
## Mean :21886 Mean : 1179
## 3rd Qu.:26900 3rd Qu.: 1000
## Max. :44900 Max. :15000
##
La información anterior expresa los valores estadísticos de distribución de tendencia central más relevantes para estudiar individualmente cada uno de los elementos presentes en el yacimiento. Estos son: el valor mínimo y máximo, la media, la mediana y, finalmente, el primer y tercer cuartil.
Entonces, se busca comprar cuál son los elementos más comunes. En consecuencia, se estudian los datos teniendo en cuenta la desviación estándar de los mismos. Para ello se observa la diferencia entre los máximos y minimos y se puede tener una idea del rango intercuartil. De esta manera será posible identificar superficialmente cuáles son aquellos elementos que tienen valores más sesgados.
Para hacer este análisis se tiene en cuenta la media y la mediana. No obstante, no se utilizan indiscriminadamente. La media se emplea para distribuciones normales con pocos valores atípicos. Por el contrario, la mediana se utiliza para indicar la tendencia central en distribuciones númericas sesgadas.
Por ejemplo, en el caso del Cu el valor mínimo es de \(1.5\) mientras que el máximo es de \(10,000\). Esto deja en evidencia que existe una ditribución sesgada de los datos. Por lo tanto, es recomendable usar la mediana (\(68.6\)) y no la media (\(816.0\)) para la interpretación de la concentración del cobre en este yacimiento.
Con el objetino de comprender la distribución de los elementos se emplea la desviación estándar. Una desviación estándar baja indica que la mayor parte de la concentración tienden a estar agrupada cerca de su media, es decir, con pocos valores atípicos. Por el contrariro, un valor alto muestra que los datos de concentración se extienden sobre un rango de valores más amplio. De esta manera se podrá saber que criterio emplear según cada elemento y así hallar el valor de concentración central.
\[ \sigma^2_n =\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2 \]
#Se identifica la desviación estándar
Desviaciones = data.frame(lapply(Mineral_ppm, sd, na.rm = TRUE))
Como era de esperarse el Cobre presenta la desviación estándar con el valor más alto. Es decir, es aquel mineral con una concentración más atípica. Esto implica que existe alguna zona dentro del yacimiento donde se presenta una mayor o menor cantidad de este elemento.
Siguiendo esta lógica lo mismo ocurre con aquellos minerales con que presentan también valores altos de desviación estándar.
A pesar de lo mencionado anteriormente, aún existe la duda de hacia dónde se distribuyen estos datos atípicos de la concentración. En otras palabras, se debe conocer una manera para determinar si la desviación es consecuencia de una mayor o menor concentración del elemento en el yacimiento.
La medida estadística que describe la simetría de la distribución alrededor de un promedio es el skewness. Mientras más cercano a cero sea el valor del sesgo, entonces, la distribución será más simetrica. En este caso interesa saber si el sesgo es positivo, pues la distribución tendrá una cola asimétrica extendida hacia los valores positivos. Lo que se traduce en que habrá una mayor concentración del elemento en ciertas zonas.
\[ \tilde{\mu}_3=\frac{\sum_{i}^N(X_i-\bar{X})^3}{(N-1)\cdot \sigma^3} \]
# Se identifica el Skewness
Sesgo = data.frame(lapply(Mineral_ppm, skewness, na.rm = TRUE))
Con los datos de la matriz Sesgo se hará un anális de dos concentraciones de dos elementos escogidos arbitrariamente. Uno de ellos tienen un Skewness positivo y el otro negativo.
Para el primer caso se escogió el Niquel (Ni) que tiene una desviación estándar relativamente baja (\(10.368\)) y un sesgo positivo y en parte asimétrico (\(2.488\)).
Esto indica que los valores de concentración están sesgados de forma positiva, ya que la mediana (\(24.60\)) es menor que la media (\(27.52\)). Lo cual permite deducir una cola en el histograma que se exienda hacía la derecha. Además, la mayoría de las concentraciones deben rondar el valor de la mediana. Esto se puede concluir a partir de que la desviación estándar no es particularmente alta.
ggplot(data = data.frame(x = Mineral_ppm$Ni_ppm), aes(x))+ geom_density(fill = "lightslategray", alpha = 0.5) +
geom_vline(aes(xintercept = mean(x), color = "Media"), linetype = "solid", size = 1) +
geom_vline(aes(xintercept = median(x), color = "Mediana"), linetype = "solid", size = 1) +
scale_color_manual(values = c(Media = "royalblue4", Mediana = "tomato3")) +
labs(title = "Histograma Ni_ppm", subtitle = "Concentración del Niquel",x = "Concentración [PPM]", y = "Densidad")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray'))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
En la gráfica se aprecia la presencia de una cierta desviación de forma positiva pues existe una concentración atipica de datos entre los valores de 40 y 80 partes por millon en concentración de Niquel. El pico del histográma, efectivamente, está en concordancia con la mediana y se nota más claramente como la media es mayor.
A pesar de que existe un aumento positivo en la concentración de niquel, este es pequeño. Gracias al histograma de densidad y los datos anteriormente mencionados, se considera que no hay un cambio tan significativo en la frecuencia de concentración de Niquel.
Basicamente, en este yacimiento el Niquel tiene un concentración relativamente constante en partes por millon de \(24.60\). A pesar de que existe una zona de muestreo que parece indicar que hay de un aumento en la concentración, el valor de sesgo es de \(2.488\) lo cual es un indicativo cuantitativo de que ese aumento no es tan relevante.
El análisis gráfico del Berilio sólo se hace con el fin de mostrar un sesgo negativo y se tienen en cuenta los mismos criterios que para el anterior análisis. Por tanto, no es necesario explayarse más de la cuenta.
La mediana es de \(2.00\) y la media de \(1.814\). También, la desviación estándar es de \(0.4335\) un valor bajo que indica que la concentración está bien distribuida. No obstante, el sesgo es negativo \(-0.876\). Esto se explica por un valor mínimo atípico y con una frecuencia alta del mismo, en este caso \(1.00\).
ggplot(data = data.frame(x = Mineral_ppm$Be_ppm), aes(x))+ geom_density(fill = "lightslategray", alpha = 0.5) +
geom_vline(aes(xintercept = mean(x), color = "Media"), linetype = "solid", size = 1) +
geom_vline(aes(xintercept = median(x), color = "Mediana"), linetype = "solid", size = 1) +
scale_color_manual(values = c(Media = "royalblue4", Mediana = "tomato3")) +
labs(title = "Histograma Be_ppm", subtitle = "Concentración del Berilio",x = "Concentración [PPM]", y = "Densidad")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray'))
Ahora que se conoce la desviación estándar y el sesgo es posible crear un filtro para descubrir que valores tomar para comparar los elementos.
Como se expresó anteriormente para conocer el dato estadístico necesario para análizar una muestra se importante precisar si hay una distribución atípica. De esta manera, se podrá discernir si emplear la media o la mediana como el criterio de comparación. Entonces, los datos con valores de desviación estándar mayores a \(10\) se consideran altos como resultado se usa la mediana.
#Media y mediana de cada uno de los datos
Mean_ppm = data.frame(lapply(Mineral_ppm, mean, na.rm = TRUE))
Median_ppm = data.frame(lapply(Mineral_ppm, median, na.rm = TRUE))
Me_Med_sd <- rbind (Mean_ppm, Median_ppm, Desviaciones)
# Filtrar y crear el nuevo data.frame
Elementos_ppm<- Me_Med_sd
# Aplicar las reglas de selección
for (col in 1:ncol(Me_Med_sd)) {
if (Me_Med_sd[3, col] > 10) {
Elementos_ppm[2, col] <- Me_Med_sd[2, col]
} else {
Elementos_ppm[2, col] <- Me_Med_sd[1, col]
}
}
Dentro del data.frame Elementos_ppm se escogen los valores que cumplan con el criterio de la desviación estándar planteado anteriormente. Es decir, si la desviación estándar es baja se considedará media ya que esta medida de tendencia central se ve afectada por los datos atípicios. Por el contrariro si existen una alta desviación estándar, mayor cantidad de datos atípicos, se escoge la mediana.
Elementos_ppm = Elementos_ppm[2,1:46]
Para esta serie de gráficos se empleó una escala logarítmica con el fin de poder vizualizarlos mejor. Ocurre que se tiene una distribución muy desigual, el valor de tendencia central de mediana mayor es de \(816.00_{ppm}\) correspondiente al manganeso (Mn) y el menor es el Reino (Re) con tan sólo \(0.005_{ppm}\).
Nombres=names(Median_ppm)
Median_ppm= rbind(Nombres,Median_ppm)
# Transponer el data.frame
Median_ppm= t(Median_ppm)
# Crear un vector con los nuevos nombres de columna
nombres_columnas <- c("Elementos", "Concentración")
# Asignar nuevos nombres a las columnas de la matriz transpuesta
colnames(Median_ppm) <- nombres_columnas
# Convertir la matriz transpuesta en un nuevo data.frame
Median_ppm <- as.data.frame(Median_ppm)
# Convertir la columna ColumnaNumerica a numérico
Median_ppm$Concentración <- as.numeric(Median_ppm$Concentración)
# Ordenar el data.frame por la columna Frecuencia
Median_ppm <- Median_ppm[order(Median_ppm$Concentración),]
# Convertir la columna 'Categoria' en un factor ordenado
Median_ppm$Elementos <- factor(Median_ppm$Elementos, levels = Median_ppm$Elementos)
# Crear la gráfica de barras organizada de menor a mayor
ggplot(Median_ppm, aes(x = Elementos, y = Concentración)) +
geom_bar(stat = "identity", fill = "lightslategray", alpha = 0.8, color = "black", size = 0.1) +
labs(title = "Concentración [ppm] vs. Elementos", subtitle = "Datos extraidos a partir de la mediana", x = "Elementos", y = "Concentración [PPM]") + scale_y_log10(labels = scales::number_format(accuracy = 1)) +theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(size = 14, face = 'bold', color = 'darkslategray'))
#Nombres=names(Median_ppm)
Mean_ppm= rbind(Nombres, Mean_ppm)
# Transponer el data.frame
Mean_ppm= t(Mean_ppm)
# Crear un vector con los nuevos nombres de columna
nombres_columnas <- c("Elementos", "Concentración")
# Asignar nuevos nombres a las columnas de la matriz transpuesta
colnames(Mean_ppm) <- nombres_columnas
# Convertir la matriz transpuesta en un nuevo data.frame
Mean_ppm <- as.data.frame(Mean_ppm)
# Convertir la columna ColumnaNumerica a numérico
Mean_ppm$Concentración <- as.numeric(Mean_ppm$Concentración)
# Ordenar el data.frame por la columna Frecuencia
Mean_ppm <- Mean_ppm[order(Mean_ppm$Concentración),]
# Convertir la columna 'Categoria' en un factor ordenado
Mean_ppm$Elementos <- factor(Mean_ppm$Elementos, levels = Mean_ppm$Elementos)
# Crear la gráfica de barras organizada de menor a mayor
ggplot(Mean_ppm, aes(x = Elementos, y = Concentración)) +
geom_bar(stat = "identity", fill = "lightslategray", alpha = 0.8, color = "black", size = 0.1) +
labs(title = "Concentración [ppm] vs. Elementos", subtitle = "Datos extraidos a partir de la media", x = "Elementos", y = "Concentración [PPM]") + scale_y_log10(labels = scales::number_format(accuracy = 1)) +theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(size = 14, face = 'bold', color = 'darkslategray'))
Al comparar las gráficas existe una clara diferencia entre la posición que ocupan los valores de algunos de los elementos. Esto depende de la desviación estándar ya que existen valores atípicos para algunos de ellos. Por lo tanto, anteriormente se creó la variable Elementos_ppm que discrimina entre lo valores de la media o mediana. Así se creó este data.frame para realizar la siguiente gráfica.
#Nombres=names(Median_ppm)
Elementos_ppm= rbind(Nombres, Elementos_ppm)
# Transponer el data.frame
Elementos_ppm= t(Elementos_ppm)
head(Elementos_ppm)
## 1 2
## Mo_ppm "Mo_ppm" "0.947706422018349"
## Cu_ppm "Cu_ppm" "68.6"
## Pb_ppm "Pb_ppm" "7.8"
## Zn_ppm "Zn_ppm" "95"
## Ag_ppm "Ag_ppm" "1.12660550458716"
## Ni_ppm "Ni_ppm" "24.6"
# Crear un vector con los nuevos nombres de columna
nombres_columnas <- c("Elementos", "Concentración")
# Asignar nuevos nombres a las columnas de la matriz transpuesta
colnames(Elementos_ppm) <- nombres_columnas
# Convertir la matriz transpuesta en un nuevo data.frame
Elementos_ppm <- as.data.frame(Elementos_ppm)
# Convertir la columna ColumnaNumerica a numérico
Elementos_ppm$Concentración <- as.numeric(Elementos_ppm$Concentración)
# Ordenar el data.frame por la columna Frecuencia
Elementos_ppm <- Elementos_ppm[order(Elementos_ppm$Concentración),]
#Elementos_ppm
# Convertir la columna 'Categoria' en un factor ordenado
Elementos_ppm$Elementos <- factor(Elementos_ppm$Elementos, levels = Elementos_ppm$Elementos)
# Crear la gráfica de barras organizada de menor a mayor
ggplot(Elementos_ppm, aes(x = Elementos, y = Concentración)) +
geom_bar(stat = "identity", fill = "lightslategray", alpha = 0.8, color = "black", size = 0.1) +
labs(title = "Concentración [ppm] vs. Elementos", subtitle = "Clasificación de media o mediana según desviación estándar", x = "Elementos", y = "Concentración [PPM]") + scale_y_log10(labels = scales::number_format(accuracy = 1)) +theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(size = 14, face = 'bold', color = 'darkslategray'))
Ahora que se conoce cuales son los elementos dominantes dentro del yacimiento es posible hacer una correlación litológica para definir cuales podrían ser los minerales principales.
Litology= read_xlsx("PARCIAL1.xlsx", sheet = "Litology")
# Conteo de datos de Litología general
T_Litology = data.frame(table(Litology$Lithology))
# Conteo de datos primer grupo de mineralizaciones en la litología
T_Mine1= data.frame(table(Litology$Mineralization_1))
T_MinStyle1 = data.frame(table(Litology$`Min Style_1`))
T_MinInten = data.frame(table(Litology$`Min Intensity_1`))
# Conteo de datos segundo grupo de mineralizaciones en la litología
T_Mine2 = data.frame(table(Litology$Mineralization_2))
T_MinStyle2 = data.frame(table(Litology$`Min Style_2`))
T_MinInten2 = data.frame(table(Litology$`Min Intensity_2`))
# Conteo de datos de alteraciones en la litología
T_Alte= data.frame(table(Litology$Alteration))
T_AlteStyle=data.frame(table(Litology$`Alteration Style`))
T_AlteInten= data.frame(table(Litology$`Alteration Intensity`))
#Resumen datos de litología
ggplot(T_Litology, aes(x = reorder(Var1, -Freq), y = Freq)) +
geom_bar(stat = "identity", fill = "darkolivegreen4", alpha = 0.8, color = "black", size = 0.1) + # Estilo de las barras
labs(title = "Clases de litología", subtitle = "Frecuencia de litologías en los núcleos de muestreo",x = "Litologías", y = "Frecuencia")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray')) + coord_flip()
#Resumen datos de primera mineralización
ggplot(T_Mine1, aes(x = reorder(Var1, -Freq), y = Freq)) +
geom_bar(stat = "identity", fill = "darkolivegreen4", alpha = 0.8, color = "black", size = 0.1) + # Estilo de las barras
labs(title = "Clases de mineralización", subtitle = "Frecuencia del primer grupo de mineralizaciones",x = "Tipo de mineralización", y = "Frecuencia")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray')) + coord_flip()
#Resumen datos de segunda mineralización
ggplot(T_Mine2, aes(x = reorder(Var1, -Freq), y = Freq)) +
geom_bar(stat = "identity", fill = "darkolivegreen4", alpha = 0.8, color = "black", size = 0.1) + # Estilo de las barras
labs(title = "Clases de mineralización", subtitle = "Frecuencia del segundo grupo de mineralizaciones",x = "Tipo de mineralización", y = "Frecuencia")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray')) + coord_flip()
#Resumen datos de tipo de alteración
ggplot(T_Alte, aes(x = reorder(Var1, -Freq), y = Freq)) +
geom_bar(stat = "identity", fill = "darkolivegreen4", alpha = 0.8, color = "black", size = 0.1) + # Estilo de las barras
labs(title = "Clases de alteración", subtitle = "Frecuencia de tipos de alteraciones presentes en la litología",x = "Tipo de alteración", y = "Frecuencia")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray')) + coord_flip()
Daniel y Karla les toca hacer el análisis. Coméntenme qué necesitan, también puedo sacar gráficas para la intensidad y estilo de mineralización o alteración.
Anteriormente se creó un data.frame que contiene todas las medias de cada una de las variables de Mineral_ppm. Por lo tanto, si se busca conocer el promedio de concentración de Plomo (Pb) sólo sería necesario selecionar el valor correspondiente que se halla en la matriz.
Mean_ppm %>%
filter(Elementos== "Pb_ppm") %>%
select(Elementos, Concentración)
## Elementos Concentración
## Pb_ppm Pb_ppm 18.76487
En este caso la columna Concentración equivale a la concentración promedio. No obstante, este valor también podría hallarse fácilmente aplicando la función mean, que arroja la media aritmética, de un conjunto de datos.
mean(assay$Pb_ppm)
## [1] 18.76487
Como se puede corruborar, el valor es el mismo.
A continuación se hará un análisis estadístico simple de la plata dentro del yacimiento. Con el fin de realizar esto lo primero a tener en cuenta es el resumen estadístico que nos muestra los datos de distribución de la concentración de plata.
summary(assay$Ag_ppm)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.050 0.100 0.100 1.127 0.200 73.900
Sólo con análizar la información presente en el Summary es posible tener idea de cómo está distribuida la plata.
Los datos de concentración de plata en el yacimiento revelan un rango interesante de distribución. El valor mínimo de 0.050 ppm es el punto de partida, y es notable que la mediana y el primer cuartil sean iguales, indicando una simetría en la distribución dentro de este rango. Esto sugiere que aproximadamente el 25% de las muestras caen en el rango entre el valor mínimo y 0.100 ppm, y la mitad de las muestras tienen una concentración igual o inferior a 0.100 ppm. Sin embargo, es importante destacar que la simetría puntual se limita a este rango específico. El tercer cuartil de 0.200 ppm y la presencia de valores atípicos como el máximo de 73.900 ppm indican una variabilidad significativa en la concentración de plata en el yacimiento más allá de este intervalo. Para una comprensión completa de la distribución y la gestión de esta variabilidad, se requiere un análisis más detallado, como un histograma o un diagrama de caja y bigotes (box plot).
ggplot(assay, aes(x = factor(1), y = Ag_ppm)) +
geom_boxplot(width = 0.5, fill = "cadetblue4", color = "black", alpha=0.6) +
geom_point(aes(y = median(Ag_ppm)), shape = 23, fill = "coral3", color = "black", size = 3) +
labs(x = "Plata (Ag)", y = "Concentración [ppm]") +
scale_fill_manual(values = c("lightblue")) +
scale_color_manual(values = c("cadetblue", "coral")) +
theme_minimal() + coord_cartesian(ylim = c(0, 0.7))
Ya que existía una presencia de datos atípicos demasiado marcada fue
necesario realizar una exageración en el eje \(y\) sólo para mostrar aquellos vaolres que
se encontrar en el rango de entre 0 y 0.7. Esto se hizo para que se
pudiera ver la caja como tal y de esta manera apreciar que los datos se
encuentran normalmente distribuidos en el primer cuartil y el tercer
cuartil. Siendo, además, la mediana coincidente con el primer
cuartil.
La concentración de plata es sesgada positivamente, ya que el valor de la mediana (0.100 ppm) es menor que la media (1.127 ppm), y el tercer cuartil (0.200 ppm) es significativamente mayor que la mediana. Además, el valor del skewness positivo (7.251) confirma este sesgo hacia la derecha en la distribución, sugiriendo que hay valores extremadamente altos que están aumentando la media. Sin embargo, la desviación estándar (4.449) indica una dispersión moderada de los datos alrededor de la media. Esto último implica que la concentración de datos atípicos es ínifa y no debe tenerse en cuenta.
ggplot(data = data.frame(x = Mineral_ppm$Ag_ppm), aes(x))+ geom_density(fill = "lightslategray", alpha = 0.5) +
geom_vline(aes(xintercept = mean(x), color = "Media"), linetype = "solid", size = 1) +
geom_vline(aes(xintercept = median(x), color = "Mediana"), linetype = "solid", size = 1) +
scale_color_manual(values = c(Media = "royalblue4", Mediana = "tomato3")) +
labs(title = "Histograma Ag_ppm", subtitle = "Concentración de Plata",x = "Concentración [PPM]", y = "Densidad")+
theme(plot.title=element_text(size=14, face='bold', color='darkslategray')) + coord_cartesian(xlim = c(0, 40))
Como se ve en la gráfica del histograma los datos atípicos no están
distribuidos uniformemente en alguna zona. Simplemente son variaciones
anómalas de la concentración de la plata que se pueden explicar debido a
procesos geólogicos puntuales que ocurrieron en las zonas de
muestreo.
La gráfica de disperión permitirá visualizar los datos de Plata y Cobre, que a pesar de ser distintos, se pretender destacar las similitudes en el conjunto de datos. Esto será útil cuando se buscan valore atípicos y, a su vez, entender la distribución de los datos de ambas variables.
ggplot(assay, aes(x= Cu_ppm, y=Ag_ppm, color=Cu_ppm))+ geom_point() + geom_smooth()+ labs(title = "Grafico de dispersión Cu vs. Ag", subtitle = "Relación entre la concentración de Cobre y Plata",x = "Cobre [ppm]", y = "Plata [ppm]")+ theme(plot.title=element_text(size=14, face='bold', color='darkslategray'))
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
Ya que los datos forman una banda que se extiende desde la parte inferior a la superior derecha se considera que existe una correlación positiva entre el cobre y la plata.
Para tener una medida cuantitativa de la correlación empleamos la función cor(). Esto indicia el grado de correlación que puede ser un valor en el rango de -1 a 1. Donde, -1 implica una correlación nula y 1 significa que la correlación es perfecta.
cor(assay$Cu_ppm, assay$Ag_ppm)
## [1] 0.7629199
El valor de la correlación entre el cobre y la plata dentro del yacimiento es de \(0.7629\) lo cual implica que existe una correlación positiva fuerte.