Analisis estadístico, Uninorte, Raquel Padilla, Enrique Pedrosa y Santiago Rodríguez
###Contextualización
La geología es una disciplina fundamental en el estudio de la estructura, composición y evolución de la Tierra. El análisis de datos geológicos permite comprender fenómenos como la distribución de minerales, la evolución de cuencas sedimentarias, la identificación de estructuras tectónicas y la evaluación de recursos naturales. En este taller, se exploraron datos geológicos para identificar patrones y correlaciones entre variables como la composición química de rocas, la profundidad de yacimientos y la densidad de minerales.
Este taller se centró en la aplicación de métodos de análisis exploratorio de datos (EDA) para estudiar un conjunto de datos geológicos y extraer información clave para la toma de decisiones en la exploración y explotación de recursos naturales.
library(readr)
datos <- readxl::read_excel("basegeo.xlsx")
datos
## # A tibble: 20 × 6
## ID `Profundidad (m)` `Tipo de Roca` `% de SiO2` `Densidad (g/cm³)`
## <dbl> <dbl> <chr> <dbl> <dbl>
## 1 1 120 Sedimentaria 65.2 2.65
## 2 2 230 Ígnea 72.4 2.7
## 3 3 85 Metamórfica 68.3 2.75
## 4 4 150 Sedimentaria 71.1 2.68
## 5 5 300 Ígnea 62 2.6
## 6 6 210 Metamórfica 69.5 2.72
## 7 7 95 Sedimentaria 66.8 2.66
## 8 8 275 Ígnea 73 2.71
## 9 9 140 Metamórfica 64.5 2.64
## 10 10 310 Sedimentaria 70.3 2.69
## 11 11 120 Ígnea 65.2 2.65
## 12 12 230 Metamórfica 72.4 2.7
## 13 13 85 Sedimentaria 68.3 2.75
## 14 14 150 Ígnea 71.1 2.68
## 15 15 300 Metamórfica 62 2.6
## 16 16 210 Sedimentaria 69.5 2.72
## 17 17 95 Ígnea 66.8 2.66
## 18 18 275 Metamórfica 73 2.71
## 19 19 140 Sedimentaria 64.5 2.64
## 20 20 310 Ígnea 70.3 2.69
## # ℹ 1 more variable: `Presencia de Fósiles` <chr>
Teniendo en cuenta el conjunto de datos geológicos, se evaluó lo siguiente:
¿Cuál fue la población objetivo?
Respuesta: Los yacimientos geológicos de rocas, cuya información se
recolectó en términos de profundidad, tipo de roca, porcentaje de
cuarzo, densidad y presencia de fósiles.
¿Existió una muestra? ¿Cuál fue?
Respuesta: Sí, la muestra consistió en 20 observaciones con datos de
distintos yacimientos, recortadas de una población original de 50
observaciones, encontrada en BrightSpace.
Mención de un parámetro y un estadístico en este estudio,
si es posible.
Respuesta: No fue posible obtener un parámetro, ya que solo se trabajó
con una muestra. Sin embargo, se pudo calcular un estadístico, como el
rango de profundidad, siendo este de 225 metros.
# Instalar y cargar el paquete necesario (si no está instalado)
if (!require("readxl")) install.packages("readxl", dependencies=TRUE)
## Cargando paquete requerido: readxl
library(readxl)
# Cargar la base de datos desde el archivo Excel
ruta_archivo <- "basegeo.xlsx" # Reemplaza con la ruta correcta si es necesario
datos <- read_excel(ruta_archivo)
# Obtener el valor mínimo y máximo de la variable "Profundidad (m)"
X_min <- min(datos$`Profundidad (m)`, na.rm = TRUE) # X_min = Mínimo
X_max <- max(datos$`Profundidad (m)`, na.rm = TRUE) # X_max = Máximo
# Calcular el rango (R = X_max - X_min)
R <- X_max - X_min
# Mostrar los resultados con símbolos estadísticos
cat("X_min (Valor mínimo de profundidad) =", X_min, "metros\n")
## X_min (Valor mínimo de profundidad) = 85 metros
cat("X_max (Valor máximo de profundidad) =", X_max, "metros\n")
## X_max (Valor máximo de profundidad) = 310 metros
cat("R (Rango) =", R, "metros\n")
## R (Rango) = 225 metros
str(datos)
## tibble [20 × 6] (S3: tbl_df/tbl/data.frame)
## $ ID : num [1:20] 1 2 3 4 5 6 7 8 9 10 ...
## $ Profundidad (m) : num [1:20] 120 230 85 150 300 210 95 275 140 310 ...
## $ Tipo de Roca : chr [1:20] "Sedimentaria" "Ígnea" "Metamórfica" "Sedimentaria" ...
## $ % de SiO2 : num [1:20] 65.2 72.4 68.3 71.1 62 69.5 66.8 73 64.5 70.3 ...
## $ Densidad (g/cm³) : num [1:20] 2.65 2.7 2.75 2.68 2.6 2.72 2.66 2.71 2.64 2.69 ...
## $ Presencia de Fósiles: chr [1:20] "Sí" "No" "Sí" "No" ...
Respuesta: Se generó el siguiente data frame, clasificando las variables:
# Instalar y cargar el paquete necesario para una mejor visualización (si no está instalado)
if (!require("tibble")) install.packages("tibble", dependencies = TRUE)
## Cargando paquete requerido: tibble
library(tibble)
# Crear el data frame original
df_geologico <- tibble::tibble(
"Variable" = c("ID", "Profundidad del yacimiento", "Tipo de roca", "Composición química (% de SiO2)", "Densidad de mineral (g/cm³)", "Presencia de fósiles"),
"Naturaleza" = c("Cualitativa", "Cuantitativa continua", "Cualitativa", "Cuantitativa continua", "Cuantitativa continua", "Cualitativa"),
"Nivel de medición" = c("Ordinal", "Razón", "Nominal", "Razón", "Razón", "Nominal")
)
# Mostrar la tabla corregida
print(df_geologico)
## # A tibble: 6 × 3
## Variable Naturaleza `Nivel de medición`
## <chr> <chr> <chr>
## 1 ID Cualitativa Ordinal
## 2 Profundidad del yacimiento Cuantitativa continua Razón
## 3 Tipo de roca Cualitativa Nominal
## 4 Composición química (% de SiO2) Cuantitativa continua Razón
## 5 Densidad de mineral (g/cm³) Cuantitativa continua Razón
## 6 Presencia de fósiles Cualitativa Nominal
Tablas 1 y 2. Distribución de frecuencia de las variables categóricas.
# Cargar librerías necesarias
library(readxl)
library(dplyr) # Para manipulación de datos
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Cargar la base de datos desde el archivo Excel
archivo <- "basegeo.xlsx" # Asegúrate de que el nombre sea correcto
hoja <- 1 # Se asume que los datos están en la primera hoja
datos <- read_excel(archivo, sheet = hoja)
# Crear tablas de frecuencia para variables categóricas
frecuencia_tipo_roca <- table(datos$`Tipo de Roca`)
frecuencia_fosiles <- table(datos$`Presencia de Fósiles`)
# Convertir tablas de frecuencia a data frames y calcular porcentaje
table_tipo_roca <- as.data.frame(frecuencia_tipo_roca) %>%
mutate(Porcentaje = round(Freq / sum(Freq) * 100, 2))
table_fosiles <- as.data.frame(frecuencia_fosiles) %>%
mutate(Porcentaje = round(Freq / sum(Freq) * 100, 2))
# Renombrar columnas para mayor claridad
names(table_tipo_roca) <- c("Tipo de Roca", "Frecuencia", "Porcentaje (%)")
names(table_fosiles) <- c("Presencia de Fósiles", "Frecuencia", "Porcentaje (%)")
# Imprimir los resultados
print(table_tipo_roca)
## Tipo de Roca Frecuencia Porcentaje (%)
## 1 Ígnea 7 35
## 2 Metamórfica 6 30
## 3 Sedimentaria 7 35
print(table_fosiles)
## Presencia de Fósiles Frecuencia Porcentaje (%)
## 1 No 10 50
## 2 Sí 10 50
Distribución de frecuencias agrupadas de la profundidad del yacimiento.
# Instalar y cargar la librería si no está instalada
if (!require("readxl")) install.packages("readxl", dependencies = TRUE)
library(readxl) # Cargar librería para leer archivos Excel
# Cargar la base de datos desde Excel
archivo <- "basegeo.xlsx" # Nombre del archivo
hoja <- 1 # Se asume que los datos están en la primera hoja
DATABASE <- read_excel(archivo, sheet = hoja)
# Crear tabla de frecuencias para la variable "Profundidad (m)"
profundidades <- DATABASE$`Profundidad (m)` # Extraer la columna de profundidad
frecuencia_absoluta <- table(cut(profundidades, breaks = 5))
frecuencia_acumulada <- cumsum(frecuencia_absoluta)
frecuencia_relativa <- prop.table(frecuencia_absoluta) * 100 # Convertir a porcentaje
frecuencia_relativa_acumulada <- cumsum(frecuencia_relativa)
# Construir un data frame con las frecuencias y unidades
tabla_frecuencia <- data.frame(
"Intervalo de Profundidad (m)" = names(frecuencia_absoluta),
"Frecuencia Absoluta (número de yacimientos)" = as.vector(frecuencia_absoluta),
"Frecuencia Acumulada (número de yacimientos)" = as.vector(frecuencia_acumulada),
"Frecuencia Relativa (%)" = paste0(round(as.vector(frecuencia_relativa), 2), " %"),
"Frecuencia Relativa Acumulada (%)" = paste0(round(as.vector(frecuencia_relativa_acumulada), 2), " %")
)
# Agregar título descriptivo
cat("Tabla de Frecuencias para la variable 'Profundidad (m)'\n\n")
## Tabla de Frecuencias para la variable 'Profundidad (m)'
# Imprimir la tabla
print(tabla_frecuencia, row.names = FALSE)
## Intervalo.de.Profundidad..m. Frecuencia.Absoluta..número.de.yacimientos.
## (84.8,130] 6
## (130,175] 4
## (175,220] 2
## (220,265] 2
## (265,310] 6
## Frecuencia.Acumulada..número.de.yacimientos. Frecuencia.Relativa....
## 6 30 %
## 10 20 %
## 12 10 %
## 14 10 %
## 20 30 %
## Frecuencia.Relativa.Acumulada....
## 30 %
## 50 %
## 60 %
## 70 %
## 100 %
Interpretación: Punto a: En la primera tabla se observa la distribución de la variable categórica “Tipo de Roca”, la cual presenta tres tipos: ígnea, con una frecuencia de 7 y un porcentaje del 35%; metamórfica, con una frecuencia de 6 y un porcentaje del 30%; y sedimentaria, con una frecuencia de 7 y un porcentaje del 35%. Se puede notar que los tipos de roca ígnea y sedimentaria son los más frecuentes dentro del conjunto de datos. Por otro lado, la segunda tabla muestra la distribución de la variable “Presencia de Fósiles”, donde las respuestas “Sí” y “No” presentan una frecuencia de 10 y 10 datos, respectivamente, lo que equivale a un 50% para cada categoría.
Punto b: A través de los intervalos de la tabla generada, se observa que los datos están agrupados en intervalos de clase de 45 unidades. Se identifican dos intervalos con la mayor frecuencia: el primero (84.8, 130] y el último ((265, 310], ambos con una frecuencia de 6 datos. Esto indica que la distribución de los datos se concentra principalmente en estos dos extremos.
Además, el 50% de los ocho valores restantes se encuentra en el segundo intervalo. También se observa que 12 de los 20 datos corresponden a profundidades superiores a 20, lo que sugiere una distribución asimétrica a la derecha. En este sentido, el 60% de los datos se encuentra dentro del intervalo (175, 220], evidenciando una mayor concentración en los valores más bajos dentro de la escala de profundidad.
Gráficos generados a partir de las tablas anteriores:
Figura 1. Distribución de los tipos de roca.
library(ggplot2)
# Calcular frecuencias y porcentajes
freq_tipo_roca <- table(DATABASE$`Tipo de Roca`)
df_tipo_roca <- as.data.frame(freq_tipo_roca)
df_tipo_roca$Porcentaje <- round(100 * df_tipo_roca$Freq / sum(df_tipo_roca$Freq), 1) # Cálculo de porcentaje
# Asignar colores según el tipo de roca
colores_rocas <- c("Ígnea" = "#8B0000", # Rojo oscuro (magma)
"Sedimentaria" = "#A0522D", # Marrón tierra
"Metamórfica" = "#708090") # Gris pizarra
# Crear el gráfico de pastel con etiquetas de porcentaje
ggplot(df_tipo_roca, aes(x = "", y = Freq, fill = Var1)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
scale_fill_manual(values = colores_rocas) + # Aplicar los colores personalizados
theme_minimal() +
labs(title = "Distribución de Tipos de Roca", fill = "Tipo de Roca") +
theme(axis.text.x = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank()) +
geom_text(aes(label = paste0(Porcentaje, "%")),
position = position_stack(vjust = 0.5), size = 5, color = "white") # Agregar etiquetas de porcentaje
Figura 2. Histograma de la profundidad del yacimiento.
library(ggplot2) # Asegurar que ggplot2 está cargado
ggplot(DATABASE, aes(x = `Profundidad (m)`)) +
geom_histogram(binwidth = 50, color = "black", fill = "skyblue", alpha = 0.7) +
geom_density(aes(y = after_stat(count) * 50), color = "red", linewidth = 1) + # Polígono de frecuencia
theme_minimal() +
labs(title = "Histograma de Profundidad del Yacimiento",
x = "Profundidad (m)",
y = "Frecuencia")
Figura 3. Variabilidad en la composición química de las rocas.
ggplot(DATABASE, aes(x = "", y = `% de SiO2`)) +
geom_boxplot(fill = "lightblue", color = "black") +
theme_minimal() +
labs(title = "Variabilidad de la Composición Química de las Rocas", y = "% de SiO2", x = "")
Interpretación: Punto a: El diagrama circular muestra que los tipos de roca ígnea y sedimentaria tienen la misma representación, cada una con un 35% del total de datos, mientras que las rocas metamórficas representan el 30%. Esto indica que las rocas ígneas y sedimentarias son las más comunes en el conjunto de datos
Punto b: El histograma muestra que la mayor frecuencia de datos se encuentra hasta el intervalo de (175,220] m de profundidad, lo que sugiere que la mayoría del yacimiento se encuentra en esa franja. El polígono de frecuencia indica una distribución asimétrica hacia la derecha, lo que implica que hay menos datos en las mayores profundidades. Esto podría sugerir que la exploración del yacimiento se ha concentrado en profundidades menores o que la presencia de material geológico de interés disminuye a mayor profundidad.
Punto c: El diagrama de caja muestra la variabilidad del porcentaje de SiO₂ en las rocas. La mediana está cerca del 68-69%, indicando que la mitad de los valores son mayores y la otra mitad menores. La mayor parte de los datos (rango intercuartil) se encuentra entre 65% y 70%, mientras que los valores extremos oscilan entre 62.5% y 72.5%. La distribución parece ligeramente sesgada hacia valores menores, pero sin una diferencia significativa. No se observan valores atípicos, lo que sugiere que la variabilidad del SiO₂ en las muestras es moderada y uniforme.
Tabla 4. Estadísticas descriptivas de las variables cuantitativas.
# Instalar paquetes si no están instalados
# Instalar paquetes si no están instalados
if (!require("dplyr")) install.packages("dplyr", dependencies = TRUE)
if (!require("tidyr")) install.packages("tidyr", dependencies = TRUE)
## Cargando paquete requerido: tidyr
# Cargar librerías
library(dplyr)
library(tidyr)
# Seleccionar solo las variables cuantitativas y calcular estadísticas
estadisticas_cuantitativas <- DATABASE %>%
summarise(
Min_Profundidad = min(`Profundidad (m)`),
Max_Profundidad = max(`Profundidad (m)`),
Media_Profundidad = mean(`Profundidad (m)`),
Mediana_Profundidad = median(`Profundidad (m)`),
DesvEst_Profundidad = sd(`Profundidad (m)`),
Min_SiO2 = min(`% de SiO2`),
Max_SiO2 = max(`% de SiO2`),
Media_SiO2 = mean(`% de SiO2`),
Mediana_SiO2 = median(`% de SiO2`),
DesvEst_SiO2 = sd(`% de SiO2`),
Min_Densidad = min(`Densidad (g/cm³)`),
Max_Densidad = max(`Densidad (g/cm³)`),
Media_Densidad = mean(`Densidad (g/cm³)`),
Mediana_Densidad = median(`Densidad (g/cm³)`),
DesvEst_Densidad = sd(`Densidad (g/cm³)`)
) %>%
pivot_longer(cols = everything(),
names_to = "Estadística",
values_to = "Valor") %>%
mutate(
Valor = round(Valor, 3), # Redondear valores a 3 decimales
Unidad = case_when(
grepl("Profundidad", Estadística) ~ "m",
grepl("SiO2", Estadística) ~ "%",
grepl("Densidad", Estadística) ~ "g/cm³",
TRUE ~ ""
),
Nombre_Completo = case_when(
grepl("Min_Profundidad", Estadística) ~ "Mínimo de Profundidad",
grepl("Max_Profundidad", Estadística) ~ "Máximo de Profundidad",
grepl("Media_Profundidad", Estadística) ~ "Media de Profundidad",
grepl("Mediana_Profundidad", Estadística) ~ "Mediana de Profundidad",
grepl("DesvEst_Profundidad", Estadística) ~ "Desviación Estándar de Profundidad",
grepl("Min_SiO2", Estadística) ~ "Mínimo de % de SiO2",
grepl("Max_SiO2", Estadística) ~ "Máximo de % de SiO2",
grepl("Media_SiO2", Estadística) ~ "Media de % de SiO2",
grepl("Mediana_SiO2", Estadística) ~ "Mediana de % de SiO2",
grepl("DesvEst_SiO2", Estadística) ~ "Desviación Estándar de % de SiO2",
grepl("Min_Densidad", Estadística) ~ "Mínimo de Densidad",
grepl("Max_Densidad", Estadística) ~ "Máximo de Densidad",
grepl("Media_Densidad", Estadística) ~ "Media de Densidad",
grepl("Mediana_Densidad", Estadística) ~ "Mediana de Densidad",
grepl("DesvEst_Densidad", Estadística) ~ "Desviación Estándar de Densidad",
TRUE ~ Estadística
)
)
# Imprimir la tabla con las estadísticas reestructuradas
print(estadisticas_cuantitativas)
## # A tibble: 15 × 4
## Estadística Valor Unidad Nombre_Completo
## <chr> <dbl> <chr> <chr>
## 1 Min_Profundidad 85 m Mínimo de Profundidad
## 2 Max_Profundidad 310 m Máximo de Profundidad
## 3 Media_Profundidad 192. m Media de Profundidad
## 4 Mediana_Profundidad 180 m Mediana de Profundidad
## 5 DesvEst_Profundidad 82.6 m Desviación Estándar de Profundidad
## 6 Min_SiO2 62 % Mínimo de % de SiO2
## 7 Max_SiO2 73 % Máximo de % de SiO2
## 8 Media_SiO2 68.3 % Media de % de SiO2
## 9 Mediana_SiO2 68.9 % Mediana de % de SiO2
## 10 DesvEst_SiO2 3.53 % Desviación Estándar de % de SiO2
## 11 Min_Densidad 2.6 g/cm³ Mínimo de Densidad
## 12 Max_Densidad 2.75 g/cm³ Máximo de Densidad
## 13 Media_Densidad 2.68 g/cm³ Media de Densidad
## 14 Mediana_Densidad 2.68 g/cm³ Mediana de Densidad
## 15 DesvEst_Densidad 0.043 g/cm³ Desviación Estándar de Densidad
Gráficas para variables cualitativas # Gráficos de distribución de variables cualitativas
Figuras 1 y 4. Distribución de las variables cualitativas.
# Cargar librerías necesarias
library(ggplot2)
library(readxl)
library(dplyr)
# Cargar la base de datos desde el archivo Excel
archivo <- "basegeo.xlsx" # Asegúrate de que el nombre sea correcto
hoja <- 1 # Se asume que los datos están en la primera hoja
datos <- read_excel(archivo, sheet = hoja)
# Crear tabla de frecuencia para presencia de fósiles
frecuencia_fosiles <- table(datos$`Presencia de Fósiles`)
# Convertir la tabla de frecuencia a data frame y calcular porcentaje
table_fosiles <- as.data.frame(frecuencia_fosiles) %>%
mutate(Porcentaje = round(Freq / sum(Freq) * 100, 2))
# Renombrar columnas
names(table_fosiles) <- c("Presencia de Fósiles", "Frecuencia", "Porcentaje")
# Gráfico de barras para presencia de fósiles
ggplot(table_fosiles, aes(x = `Presencia de Fósiles`, y = Frecuencia, fill = `Presencia de Fósiles`)) +
geom_bar(stat = "identity", color = "black", alpha = 0.7) +
labs(title = "Presencia de Fósiles en Muestras", x = "Presencia de Fósiles", y = "Frecuencia") +
theme_minimal() +
geom_text(aes(label = paste0(Porcentaje, "%")), vjust = -0.5, size = 5)
Explicación de la información relevante obtenida: