Este informe sigue la base de datos de mineralogía con la que se ha estado trabajando previamente, esta vez, con la adición del análisis de varianza (ANOVA)

#Primero, instalamos los paquetes necesarios y cargamos los datos
install.packages("readxl")
## 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("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)


datos <- read_excel("Base_Datos_Mineralogia (1).xlsx", sheet = "Mineralogia")
datos$Tipo_Roca <- as.factor(datos$Tipo_Roca)
str(datos)
## tibble [100 × 6] (S3: tbl_df/tbl/data.frame)
##  $ ID_Muestra        : num [1:100] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Tipo_Roca         : Factor w/ 3 levels "Ígnea","Metamórfica",..: 3 1 3 3 3 3 1 3 3 1 ...
##  $ Mineral_Principal : chr [1:100] "Mica" "Calcita" "Cuarzo" "Feldespato" ...
##  $ Dureza_Mohs       : num [1:100] 2.77 2.85 8.34 4.1 5.93 ...
##  $ Contenido_Silice_%: num [1:100] 60.9 57.1 45.3 33.1 51.9 ...
##  $ Color             : chr [1:100] "Negro" "Verde" "Blanco" "Blanco" ...
colnames(datos)[colnames(datos) == "Contenido_Silice_%"] <- "Silice"

# Convertir a factor
datos$Tipo_Roca <- as.factor(datos$Tipo_Roca)

#Revisamos la estructura
str(datos)
## tibble [100 × 6] (S3: tbl_df/tbl/data.frame)
##  $ ID_Muestra       : num [1:100] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Tipo_Roca        : Factor w/ 3 levels "Ígnea","Metamórfica",..: 3 1 3 3 3 3 1 3 3 1 ...
##  $ Mineral_Principal: chr [1:100] "Mica" "Calcita" "Cuarzo" "Feldespato" ...
##  $ Dureza_Mohs      : num [1:100] 2.77 2.85 8.34 4.1 5.93 ...
##  $ Silice           : num [1:100] 60.9 57.1 45.3 33.1 51.9 ...
##  $ Color            : chr [1:100] "Negro" "Verde" "Blanco" "Blanco" ...
#Ahora obtenemos las estadísticas descriptivas por grupo
resumen <- datos %>%
  group_by(Tipo_Roca) %>%
  summarise(
    Media_Silice = mean(Silice, na.rm = TRUE),
    SD_Silice = sd(Silice, na.rm = TRUE),
    Media_Dureza = mean(Dureza_Mohs, na.rm = TRUE),
    SD_Dureza = sd(Dureza_Mohs, na.rm = TRUE),
    n = n()
  )
resumen
## # A tibble: 3 × 6
##   Tipo_Roca    Media_Silice SD_Silice Media_Dureza SD_Dureza     n
##   <fct>               <dbl>     <dbl>        <dbl>     <dbl> <int>
## 1 Ígnea                56.3      12.0         5.17      1.75    44
## 2 Metamórfica          56.4      15.4         6.08      1.81    22
## 3 Sedimentaria         55.9      15.4         5.27      2.31    34
#Elegimos gráficos de barras con error estándar
# Silice
ggplot(resumen, aes(x = Tipo_Roca, y = Media_Silice)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_errorbar(aes(ymin = Media_Silice - SD_Silice, ymax = Media_Silice + SD_Silice), width = 0.2) +
  labs(title = "Contenido de Sílice por Tipo de Roca", y = "Media ± SD", x = "Tipo de Roca") +
  theme_minimal()

# Dureza
ggplot(resumen, aes(x = Tipo_Roca, y = Media_Dureza)) +
  geom_bar(stat = "identity", fill = "salmon") +
  geom_errorbar(aes(ymin = Media_Dureza - SD_Dureza, ymax = Media_Dureza + SD_Dureza), width = 0.2) +
  labs(title = "Dureza Mohs por Tipo de Roca", y = "Media ± SD", x = "Tipo de Roca") +
  theme_minimal()

#Y, ahora, el ANOVA y la prueba de Tukey para el sílice
modelo_silice <- aov(Silice ~ Tipo_Roca, data = datos)
resumen_silice <- summary(modelo_silice)
resumen_silice
##             Df Sum Sq Mean Sq F value Pr(>F)
## Tipo_Roca    2      4    2.05    0.01   0.99
## Residuals   97  18931  195.17
tukey_silice <- TukeyHSD(modelo_silice)
plot(tukey_silice, las = 1, col = "blue")

#Y el ANOVA y prueba de Tukey para la dureza de Mohs
modelo_dureza <- aov(Dureza_Mohs ~ Tipo_Roca, data = datos)
resumen_dureza <- summary(modelo_dureza)
resumen_dureza
##             Df Sum Sq Mean Sq F value Pr(>F)
## Tipo_Roca    2   13.2   6.583   1.698  0.188
## Residuals   97  376.1   3.877
tukey_dureza <- TukeyHSD(modelo_dureza)
plot(tukey_dureza, las = 1, col = "darkred")

cat(" Conclusiones\n\n")
##  Conclusiones
# Para Silice
p_silice <- resumen_silice[[1]]$`Pr(>F)`[1]
cat("Contenido de Sílice (%):\n")
## Contenido de Sílice (%):
if (p_silice < 0.05) {
  cat("- El ANOVA detecta diferencias significativas entre tipos de roca (p =", round(p_silice, 4), ").\n")
  diferencias <- TukeyHSD(modelo_silice)$Tipo_Roca
  sig <- rownames(diferencias)[diferencias[, "p adj"] < 0.05]
  if (length(sig) > 0) {
    cat("- Tukey encontró diferencias entre:\n")
    for (c in sig) cat("  •", c, "\n")
  } else {
    cat("- Tukey no encontró diferencias significativas entre pares específicos.\n")
  }
} else {
  cat("- No se detectaron diferencias significativas en el contenido de sílice (p =", round(p_silice, 4), ").\n")
}
## - No se detectaron diferencias significativas en el contenido de sílice (p = 0.9896 ).
cat("\nDureza Mohs:\n")
## 
## Dureza Mohs:
p_dureza <- resumen_dureza[[1]]$`Pr(>F)`[1]
if (p_dureza < 0.05) {
  cat("- El ANOVA detecta diferencias significativas entre tipos de roca (p =", round(p_dureza, 4), ").\n")
  diferencias <- TukeyHSD(modelo_dureza)$Tipo_Roca
  sig <- rownames(diferencias)[diferencias[, "p adj"] < 0.05]
  if (length(sig) > 0) {
    cat("- Tukey encontró diferencias entre:\n")
    for (c in sig) cat("  •", c, "\n")
  } else {
    cat("- Tukey no encontró diferencias significativas entre pares específicos.\n")
  }
} else {
  cat("- No se detectaron diferencias significativas en la dureza (p =", round(p_dureza, 4), ").\n")
}
## - No se detectaron diferencias significativas en la dureza (p = 0.1885 ).