Actividad en Clase: Pruebas de Hipótesis en R

ACTIVIDAD EN CLASE: PRUEBAS DE HIPÓTESIS EN R

Integrantes

  • Santiago José Rodríguez Serrano
  • Laura Milena Blanco Torres
  • Enrique De Jesús Pedrosa De La Hoz

Fecha

29 Abril 2025

Introducción, Contextualización Base de datos Sedimentológica

La base de datos Sedimentología fue seleccionada de entre las bases de datos recomendadas por la profesora y proviene del Repositorio de Datos en GitHub: Datos Geología. Contiene información detallada sobre muestras de sedimentos recolectadas en distintos ríos, registrando variables como “Tamaño_Grano_mm”, “Velocidad_Flujo_m_s” y “Carga_Sedimentaria_mg_L”, entre otras.

Los ríos incluidos en la base de datos son: Amazonas, Danubio, Misisipi, Nilo y Yangtsé. Los tipos de sedimentos analizados en el estudio incluyen Arcilloso, Arenoso, Grava y Limoso. Las variables categóricas presentes en la base de datos son “Rio” y “Tipo_Sedimento”, mientras que las variables numéricas incluyen “Tamaño_Grano_mm”, “Velocidad_Flujo_m_s” y “Carga_Sedimentaria_mg_L”. Estas variables permiten analizar las características sedimentológicas y la dinámica fluvial en diferentes ubicaciones. En este informe, se realizará un análisis descriptivo de la base de datos y se aplicarán estimaciones estadísticas para comprender su estructura y comportamiento.

Carga de Datos en R

Importar la base de datos y verificar su estructura:

library(readr)
library(dplyr)
## 
## 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
library(ggplot2)
library(skimr)
## Warning: package 'skimr' was built under R version 4.4.3
# Cargar datos
datos <- read_csv2("Base_Datos_Sedimentologia.csv")
## ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
## Rows: 100 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (2): Rio, Tipo_Sedimento
## dbl (4): ID_Muestra, Tamaño_Grano_mm, Velocidad_Flujo_m_s, Carga_Sedimentari...
## 
## ℹ 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.
# Variables
numericas <- c("Tamaño_Grano_mm", "Velocidad_Flujo_m_s", "Carga_Sedimentaria_mg_L")
categoricas <- c("Rio", "Tipo_Sedimento")

# Conversión adecuada
datos <- datos %>% mutate(across(all_of(numericas), as.numeric))

# Ver estructura
skim(datos)
Data summary
Name datos
Number of rows 100
Number of columns 6
_______________________
Column type frequency:
character 2
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Rio 0 1 4 8 0 5 0
Tipo_Sedimento 0 1 5 9 0 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ID_Muestra 0 1 50.50 29.01 1.00 25.75 50.50 75.25 100.00 ▇▇▇▇▇
Tamaño_Grano_mm 0 1 4.96 2.76 0.14 2.59 4.86 7.01 9.99 ▆▆▇▇▆
Velocidad_Flujo_m_s 0 1 1.85 1.01 0.15 1.02 1.85 2.68 3.48 ▇▇▆▇▇
Carga_Sedimentaria_mg_L 0 1 242.45 155.22 12.06 100.23 248.88 378.81 497.45 ▇▅▅▅▆

##Estimaciones Estadísticas, Cálculos Previos #### Estracción de Datos Relevantes

# Cargar paquetes
library(dplyr)
library(readr)
library(tidyr)

# Cargar los datos
datos <- read_delim("Base_Datos_Sedimentologia.csv", delim = ";")
## Rows: 100 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (4): Rio, Tipo_Sedimento, Tamaño_Grano_mm, Velocidad_Flujo_m_s
## dbl (1): ID_Muestra
## num (1): Carga_Sedimentaria_mg_L
## 
## ℹ 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.
# Corregir formato de variables numéricas (cambiar comas por puntos)
datos <- datos %>%
  mutate(
    Tamaño_Grano_mm = as.numeric(gsub(",", ".", Tamaño_Grano_mm)),
    Velocidad_Flujo_m_s = as.numeric(gsub(",", ".", Velocidad_Flujo_m_s)),
    Carga_Sedimentaria_mg_L = as.numeric(gsub(",", ".", Carga_Sedimentaria_mg_L))
  )

# Asegurar que las categóricas sean factores
datos <- datos %>%
  mutate(across(where(is.character), as.factor))

# Definir variables
numericas <- c("Tamaño_Grano_mm", "Velocidad_Flujo_m_s", "Carga_Sedimentaria_mg_L")
categoricas <- c("Rio", "Tipo_Sedimento")

# -----------------------
# Crear tabla resumen para numéricas
resumen_numericas <- datos %>%
  select(all_of(numericas)) %>%
  summarise(across(
    everything(),
    list(
      Media = ~mean(., na.rm = TRUE),
      Mediana = ~median(., na.rm = TRUE),
      Desviacion = ~sd(., na.rm = TRUE),
      Varianza = ~var(., na.rm = TRUE),
      Minimo = ~min(., na.rm = TRUE),
      Maximo = ~max(., na.rm = TRUE),
      n = ~sum(!is.na(.))
    ),
    .names = "{.col}_{.fn}"
  )) %>%
  pivot_longer(cols = everything(), 
               names_to = c("Variable", ".value"), 
               names_sep = "_")
## Warning: Expected 2 pieces. Additional pieces discarded in 21 rows [1, 2, 3, 4, 5, 6, 7,
## 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...].
# -----------------------
# Crear tabla de proporciones para categóricas
resumen_categoricas <- lapply(categoricas, function(var) {
  tabla <- datos %>%
    count(!!sym(var)) %>%
    mutate(Proporcion = n / sum(n)) %>%
    mutate(Variable = var)
  return(tabla)
}) %>% bind_rows()

# -----------------------
# Mostrar tablas
print("Resumen de Variables Numéricas:")
## [1] "Resumen de Variables Numéricas:"
print(resumen_numericas)
## # A tibble: 21 × 4
##    Variable    Grano Flujo Sedimentaria
##    <chr>       <dbl> <dbl>        <dbl>
##  1 Tamaño      4.96  NA              NA
##  2 Tamaño      4.86  NA              NA
##  3 Tamaño      2.76  NA              NA
##  4 Tamaño      7.64  NA              NA
##  5 Tamaño      0.136 NA              NA
##  6 Tamaño      9.99  NA              NA
##  7 Tamaño    100     NA              NA
##  8 Velocidad  NA      1.85           NA
##  9 Velocidad  NA      1.85           NA
## 10 Velocidad  NA      1.01           NA
## # ℹ 11 more rows
print("Resumen de Variables Categóricas (Frecuencias y Proporciones):")
## [1] "Resumen de Variables Categóricas (Frecuencias y Proporciones):"
print(resumen_categoricas)
## # A tibble: 9 × 5
##   Rio          n Proporcion Variable       Tipo_Sedimento
##   <fct>    <int>      <dbl> <chr>          <fct>         
## 1 Amazonas    25       0.25 Rio            <NA>          
## 2 Danubio     15       0.15 Rio            <NA>          
## 3 Misisipi    16       0.16 Rio            <NA>          
## 4 Nilo        17       0.17 Rio            <NA>          
## 5 Yangtsé     27       0.27 Rio            <NA>          
## 6 <NA>        24       0.24 Tipo_Sedimento Arcilloso     
## 7 <NA>        24       0.24 Tipo_Sedimento Arenoso       
## 8 <NA>        24       0.24 Tipo_Sedimento Grava         
## 9 <NA>        28       0.28 Tipo_Sedimento Limoso

🧪 Planteamiento del problemas

Media

El objetivo de este análisis es determinar si un sedimento puede clasificarse como grava, basándonos en el tamaño medio de grano como criterio. Según la clasificación granulométrica, si el tamaño medio de grano es mayor o igual a 2.0 mm, el sedimento se considera grava. En caso contrario, si el tamaño medio de grano es menor a 2.0 mm, no se considera grava. Para llevar a cabo esta clasificación, se obtuvo una muestra aleatoria de sedimento de tamaño \(n = 100\), con una media del tamaño de grano de \(\bar{x} = 4.9626\) mm y una desviación estándar muestral de \(s = 2.7632\) mm. Se utilizó un nivel de confianza del 95%, lo que implica un nivel de significancia de \(\alpha = 0.05\). Las hipótesis planteadas son: la hipótesis nula (\(H_0\)) establece que el tamaño medio de grano es menor a 2.0 mm (lo que indicaría que el sedimento no es grava), mientras que la hipótesis alternativa (\(H_1\)) establece que el tamaño medio de grano es mayor o igual a 2.0 mm (lo que indicaría que el sedimento sí es grava). Este es un caso de prueba de una cola (cola derecha), ya que nos interesa verificar si la media es mayor o igual a 2.0 mm.

1. Identificación de datos

# Extraer y limpiar los datos de la columna 'Tamaño_Grano_mm'
valores <- datos$Tamaño_Grano_mm

# Eliminar valores NA
valores <- valores[!is.na(valores)]

# Calcular estadísticos
media <- mean(valores)
desviacion <- sd(valores)
n <- length(valores)

# Mostrar resultados
cat("Estadísticos de la columna 'Tamaño_Grano_mm':\n")
## Estadísticos de la columna 'Tamaño_Grano_mm':
cat("Media:", media, "\n")
## Media: 4.962555
cat("Desviación estándar:", desviacion, "\n")
## Desviación estándar: 2.763216
cat("Tamaño de muestra:", n, "\n")
## Tamaño de muestra: 100

2. 📊 Hipótesis

El objetivo es verificar si el sedimento puede clasificarse como grava. Para esto, planteamos las siguientes hipótesis:

  • Hipótesis nula (H₀): μ < 2.0 mm. El sedimento no es grava.
  • Hipótesis alternativa (H₁): μ ≥ 2.0 mm. El sedimento sí es grava.

Este es un caso de prueba de una cola (cola derecha), ya que estamos interesados en verificar si la media del tamaño de grano es mayor o igual a 2.0 mm.

3. Resolución de Elementos

# Definir parámetros conocidos
mu0 <- 2.0        # Media bajo hipótesis nula
x_bar <- media    # Media muestral
s <- desviacion   # Desviación estándar muestral
n <- n            # Tamaño de la muestra
alpha <- 0.05     # Nivel de significancia

# Calcular el estadístico de prueba t
t_calculado <- (x_bar - mu0) / (s / sqrt(n))
cat("Estadístico de prueba t calculado:", t_calculado, "\n")
## Estadístico de prueba t calculado: 10.7214
# Grados de libertad
gl <- n - 1
cat("Grados de libertad:", gl, "\n")
## Grados de libertad: 99
# Valor crítico para cola derecha
t_critico <- qt(1 - alpha, df = gl)
cat("Valor crítico t para alfa=0.05:", t_critico, "\n")
## Valor crítico t para alfa=0.05: 1.660391
# Cálculo del valor p
p_valor <- 1 - pt(t_calculado, df = gl)
cat("Valor p:", p_valor, "\n")
## Valor p: 0

##4. Verificaciones ###a) 📈 Gráfica de la distribución t

# Gráfica de la distribución t
library(ggplot2)

# Secuencia de valores para la curva
x <- seq(-4, 8, length = 200)
y <- dt(x, df = gl)

# Crear el gráfico
ggplot(data.frame(x, y), aes(x, y)) +
  geom_line(color = "blue") +
  geom_area(data = subset(data.frame(x, y), x > t_critico), aes(x=x, y=y), fill="red", alpha=0.5) +
  geom_vline(xintercept = t_calculado, color="black", linetype="dashed") +
  labs(title = "Distribución t Student con Región Crítica (cola derecha)",
       x = "t", y = "Densidad") +
  theme_minimal()

###b) 📏 Regla de Decisión

if (t_calculado > t_critico) {
  cat("Decisión: Se rechaza H₀.\n")
} else {
  cat("Decisión: No se rechaza H₀.\n")
}
## Decisión: Se rechaza H₀.

###c) 🧮 P-Value

if (p_valor < alpha) {
  cat("Decisión basada en p-valor: Se rechaza H₀.\n")
} else {
  cat("Decisión basada en p-valor: No se rechaza H₀.\n")
}
## Decisión basada en p-valor: Se rechaza H₀.

###5. 📚 Conclusiones e Interpretación

if (t_calculado > t_critico & p_valor < alpha) {
  cat("Conclusión Final: Hay suficiente evidencia para afirmar que el sedimento puede clasificarse como grava.\n")
} else {
  cat("Conclusión Final: No hay suficiente evidencia para afirmar que el sedimento pueda clasificarse como grava.\n")
}
## Conclusión Final: Hay suficiente evidencia para afirmar que el sedimento puede clasificarse como grava.