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 incluyen Arcilloso, Arenoso, Grava y Limoso. Las variables categóricas presentes son “Rio” y “Tipo_Sedimento”, mientras que las numéricas incluyen “Tamaño_Grano_mm”, “Velocidad_Flujo_m_s” y “Carga_Sedimentaria_mg_L”.

Carga de Datos en R

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
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.
numericas <- c("Tamaño_Grano_mm", "Velocidad_Flujo_m_s", "Carga_Sedimentaria_mg_L")
categoricas <- c("Rio", "Tipo_Sedimento")

datos <- datos %>% mutate(across(all_of(numericas), as.numeric))

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

Extracción de Datos Relevantes

library(dplyr)
library(readr)
library(tidyr)

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.
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))
  ) %>%
  mutate(across(where(is.character), as.factor))

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

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, ...].
resumen_categoricas <- lapply(categoricas, function(var) {
  tabla <- datos %>%
    count(!!sym(var)) %>%
    mutate(Proporcion = n / sum(n)) %>%
    mutate(Variable = var)
  return(tabla)
}) %>% bind_rows()

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 Problema

Media

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_O\)) establece que el tamaño medio de grano es menor a 2.0 mm (1o 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 (1o 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

valores <- datos$Tamaño_Grano_mm
valores <- valores[!is.na(valores)]

media <- mean(valores)
desviacion <- sd(valores)
n <- length(valores)

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

(Hipótesis nula y alternativa: μ < 2.0 vs μ ≥ 2.0)

3. Resolución de Elementos

mu0 <- 2.0
x_bar <- media
s <- desviacion
n <- n
alpha <- 0.05

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
gl <- n - 1
cat("Grados de libertad:", gl, "\n")
## Grados de libertad: 99
t_critico <- qt(1 - alpha, df = gl)
cat("Valor crítico t:", t_critico, "\n")
## Valor crítico t: 1.660391
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

library(ggplot2)

x <- seq(-4, 8, length = 200)
y <- dt(x, df = gl)

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.

Debido a que la media de tamaño es mayor a los 2mm con un 95% de certeza, se puede afirmar que la poblacion entera tiende a ser grava.

##Proporción

Planteamiento

En otro muestreo diferente, se desea verificar si la proporción de sedimentos de tipo grava es diferente actualmente al 20% del total de sedimentos analizados. Ya que hay una tendendencia histórica a que 1 de cada 5 sedimentos sea grava.

Hipótesis: - H₀: p = 0.20 - H₁: p ≠ 0.20

Datos: - Nivel de significancia: α = 0.05 - Tamaño de muestra: n = 100 - Número de sedimentos grava: x = 24 - Proporción observada: p = 0.24

1. Identificación de Datos

n <- 100
x <- 24
p_observado <- 0.24
p_hipotetico <- 0.20
alpha <- 0.05

cat("Proporción observada (p):", p_observado, "\n")
## Proporción observada (p): 0.24
cat("Proporción hipotética (p₀):", p_hipotetico, "\n")
## Proporción hipotética (p₀): 0.2
cat("Tamaño de muestra (n):", n, "\n")
## Tamaño de muestra (n): 100

2. 📊 Hipótesis

(Hipótesis nula y alternativa: p = 0.20 vs p ≠ 0.20)

3. Resolución de Elementos

# Estadístico Z
z_calculado <- (p_observado - p_hipotetico) / sqrt(p_hipotetico * (1 - p_hipotetico) / n)
cat("Estadístico de prueba Z calculado:", z_calculado, "\n")
## Estadístico de prueba Z calculado: 1
# Valor crítico para prueba bilateral
z_critico <- qnorm(1 - alpha/2)
cat("Valor crítico Z:", z_critico, "\n")
## Valor crítico Z: 1.959964
# p-valor bilateral
p_valor <- 2 * (1 - pnorm(abs(z_calculado)))
cat("Valor p:", p_valor, "\n")
## Valor p: 0.3173105

4. Verificaciones

a) 📈 Gráfica de la distribución normal

# Parámetros
alpha <- 0.05
z_calculado <- 1.00  # Estadístico Z que calculaste
z_critico <- qnorm(1 - alpha/2)

# Librerías
library(ggplot2)

# Crear datos
x_seq <- seq(-4, 4, length = 1000)
y_seq <- dnorm(x_seq)
df <- data.frame(x = x_seq, y = y_seq)

# Regiones
df$region <- "Centro"
df$region[df$x < -z_critico] <- "Cola Izquierda"
df$region[df$x > z_critico]  <- "Cola Derecha"

# Graficar
ggplot(df, aes(x = x, y = y)) +
  geom_line(color = "blue") +
  geom_area(data = subset(df, region != "Centro"),
            aes(fill = region), alpha = 0.5) +
  geom_vline(xintercept = z_calculado, linetype = "dashed", color = "black") +
  scale_fill_manual(values = c("Cola Izquierda" = "red", "Cola Derecha" = "red")) +
  labs(
    title = "Distribución Normal Estándar con Regiones Críticas (Bilateral)",
    x = "Z", y = "Densidad"
  ) +
  theme_minimal()

b) 📍 Regla de Decisión

if (abs(z_calculado) > z_critico) {
  cat("Decisión: Se rechaza H₀.\n")
} else {
  cat("Decisión: No se rechaza H₀.\n")
}
## Decisión: No 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: No se rechaza H₀.

5. 📚 Conclusiones e Interpretación

if (abs(z_calculado) > z_critico & p_valor < alpha) {
  cat("Conclusión Final: Hay suficiente evidencia para afirmar que la proporción de grava es diferente del 20%.\n")
} else {
  cat("Conclusión Final: No hay suficiente evidencia para afirmar que la proporción de grava sea diferente del 20%.\n")
}
## Conclusión Final: No hay suficiente evidencia para afirmar que la proporción de grava sea diferente del 20%.

Con base en los resultados de la prueba de hipótesis, no hay suficiente evidencia estadística para afirmar que la proporción de sedimentos de tipo grava sea diferente del 20% históricamente observado. Aunque la proporción observada en la muestra fue del 24%, esta diferencia no es significativa. Por lo tanto, no se puede rechazar que la proporción actual se diferente a la histórica del 20%.

Varianza

Planteamiento

Se desea verificar si la varianza de la velocidad del flujo en los ríos tropicales ha cambiado respecto al valor histórico, que es σ²₀ = 1.5 (m/s)². Se tiene una muestra de 30 observaciones con varianza muestral s² = 0.95 (m/s)².

Hipótesis: - H₀: σ² = 1.5 - H₁: σ² ≠ 1.5

Datos: - Nivel de significancia: α = 0.05 - Tamaño de muestra: n = 30 - Varianza muestral: s² = 0.95 - Varianza hipotética: σ²₀ = 1.5

1. Identificación de Datos

n <- 30
s2_muestra <- 0.95
s2_hipotetica <- 1.5
alpha <- 0.05

cat("Varianza muestral (s²):", s2_muestra, "\n")
## Varianza muestral (s²): 0.95
cat("Varianza hipotética (σ²₀):", s2_hipotetica, "\n")
## Varianza hipotética (σ²₀): 1.5
cat("Tamaño de muestra (n):", n, "\n")
## Tamaño de muestra (n): 30

2. 📊 Hipótesis

(Hipótesis nula y alternativa: σ² = 1.5 vs σ² ≠ 1.5)

3. Resolución de Elementos

# Estadístico Chi-cuadrado
chi2_calculado <- (n - 1) * s2_muestra / s2_hipotetica
cat("Estadístico de prueba Chi² calculado:", chi2_calculado, "\n")
## Estadístico de prueba Chi² calculado: 18.36667
# Valores críticos
chi2_critico_inf <- qchisq(alpha / 2, df = n - 1)
chi2_critico_sup <- qchisq(1 - alpha / 2, df = n - 1)
cat("Valor crítico inferior:", chi2_critico_inf, "\n")
## Valor crítico inferior: 16.04707
cat("Valor crítico superior:", chi2_critico_sup, "\n")
## Valor crítico superior: 45.72229
# p-valor
p_valor <- 2 * min(
  pchisq(chi2_calculado, df = n - 1),
  1 - pchisq(chi2_calculado, df = n - 1)
)
cat("Valor p:", p_valor, "\n")
## Valor p: 0.1270894

4. Verificaciones

a) 📈 Gráfica de la distribución Chi-cuadrado

# Librerías
library(ggplot2)

# Crear datos
x_vals <- seq(0, 60, length.out = 1000)
dens_vals <- dchisq(x_vals, df = n - 1)
df_plot <- data.frame(x = x_vals, y = dens_vals)

# Regiones
df_plot$region <- "Centro"
df_plot$region[df_plot$x < chi2_critico_inf] <- "Cola Izquierda"
df_plot$region[df_plot$x > chi2_critico_sup] <- "Cola Derecha"

# Graficar
ggplot(df_plot, aes(x = x, y = y)) +
  geom_line(color = "blue") +
  geom_area(data = subset(df_plot, region != "Centro"),
            aes(fill = region), alpha = 0.5) +
  geom_vline(xintercept = chi2_calculado, linetype = "dashed", color = "black") +
  scale_fill_manual(values = c("Cola Izquierda" = "red", "Cola Derecha" = "red")) +
  labs(
    title = "Distribución Chi-cuadrado con Regiones Críticas (Bilateral)",
    x = "Chi²", y = "Densidad"
  ) +
  theme_minimal()

b) 📍 Regla de Decisión

if (chi2_calculado < chi2_critico_inf || chi2_calculado > chi2_critico_sup) {
  cat("Decisión: Se rechaza H₀.\n")
} else {
  cat("Decisión: No se rechaza H₀.\n")
}
## Decisión: No 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: No se rechaza H₀.

5. 📚 Conclusiones e Interpretación

if (chi2_calculado > chi2_critico_inf & chi2_calculado < chi2_critico_sup & p_valor > alpha) {
  cat("Conclusión Final: No hay suficiente evidencia para afirmar que la varianza del flujo ha cambiado respecto al valor histórico.\n")
} else {
  cat("Conclusión Final: Hay evidencia suficiente para afirmar que la varianza del flujo ha cambiado respecto al valor histórico.\n")
}
## Conclusión Final: No hay suficiente evidencia para afirmar que la varianza del flujo ha cambiado respecto al valor histórico.

##Conclusion Dado que el valor del estadístico (18.37) está entre los valores críticos (16.05 y 45.72), y el p-valor (0.127) es mayor que el nivel de significancia (0.05), no se rechaza la hipótesis nula. La varianza del flujo en los ríos tropicales no ha cambiado significativamente respecto al valor histórico.