Aplicación de Programas Informáticos 2026

Inferncia Estadística: Intervalos de Confianza y Pruebas de Hipótesis para la media de una y dos poblaciones

Author
Affiliation

Cátedra de Cálculo Estadístico y Biometría

Facultad de Ciencias Agrarias, UNCUYO

Análisis Exploratorio de Datos (EDA)

pinguinos <- palmerpenguins::penguins

library(tidyverse)

Conociendo a los pingüinos

Important

Recordemos que anteriormente detectamos valores faltantes (NA) en el dataset para algunas unidades de análisis

Vamos a visualizar el conjunto de datos sin considerar los datos faltantes.

num_esp_isla <- pinguinos |>
  drop_na() |>
  count(island, species) |>
  ggplot() +
  geom_col(aes(x = species, y = n, fill = species)) +
  geom_label(aes(x = species, y = n, label = n)) +
  facet_wrap(~island) +
  theme(axis.text.x = element_text(angle = 45)) +
  theme(legend.position = "none") + # This line removes the legend
  labs(title = "Número de individuos según epecies en cada island", 
       x="Especie", y="Número de individuos")

num_esp_isla # Visualizar Plot

Medidas resumen para una variable cualitativa

Resumen de medidas para la longitud de pico por especie

med_res<-pinguinos |> 
  group_by(species) |> 
  drop_na() |> 
  summarise(media_mm = mean(bill_length_mm),
            desvio_mm= sd(bill_length_mm),
            maximo_mm = max(bill_length_mm),
            minimo_mm = min(bill_length_mm),
            CV = desvio_mm/media_mm*100
            )
med_res
# A tibble: 3 × 6
  species   media_mm desvio_mm maximo_mm minimo_mm    CV
  <fct>        <dbl>     <dbl>     <dbl>     <dbl> <dbl>
1 Adelie        38.8      2.66      46        32.1  6.86
2 Chinstrap     48.8      3.34      58        40.9  6.84
3 Gentoo        47.6      3.11      59.6      40.9  6.53
med_res <- pinguinos |>
  group_by(species, island) |>
  drop_na() |>
  summarise(
    media_mm = round(mean(bill_length_mm), 2),# Redondeado a 2 decimales
    desvio_mm = round(sd(bill_length_mm), 2), 
    maximo_mm = round(max(bill_length_mm), 2),
    minimo_mm = round(min(bill_length_mm), 2),
    CV = round(desvio_mm / media_mm * 100, 2) 
  )
`summarise()` has grouped output by 'species'. You can override using the
`.groups` argument.
med_res
# A tibble: 5 × 7
# Groups:   species [3]
  species   island    media_mm desvio_mm maximo_mm minimo_mm    CV
  <fct>     <fct>        <dbl>     <dbl>     <dbl>     <dbl> <dbl>
1 Adelie    Biscoe        39.0      2.48      45.6      34.5  6.36
2 Adelie    Dream         38.5      2.48      44.1      32.1  6.44
3 Adelie    Torgersen     39.0      3.03      46        33.5  7.76
4 Chinstrap Dream         48.8      3.34      58        40.9  6.84
5 Gentoo    Biscoe        47.6      3.11      59.6      40.9  6.54
Important

¿Cómo visualizar las medidas para species según la isla ?

Mejoramos la visualización con flextable📦

#install.pakage(flextable)

library(flextable) # mejora las salidas de tablas

flextable(med_res)

species

island

media_mm

desvio_mm

maximo_mm

minimo_mm

CV

Adelie

Biscoe

38.98

2.48

45.6

34.5

6.36

Adelie

Dream

38.52

2.48

44.1

32.1

6.44

Adelie

Torgersen

39.04

3.03

46.0

33.5

7.76

Chinstrap

Dream

48.83

3.34

58.0

40.9

6.84

Gentoo

Biscoe

47.57

3.11

59.6

40.9

6.54

Utilizando rstatix📦

#install.packages(rstatix)

library(rstatix) # una forma amigable de obtener estadísticas 

https://rpkgs.datanovia.com/rstatix/

medidas<-pinguinos |>
  group_by(species, island) |> 
  get_summary_stats(bill_length_mm, type = "five_number")
  
flextable(medidas)

species

island

variable

n

min

max

q1

median

q3

Adelie

Biscoe

bill_length_mm

44

34.5

45.6

37.675

38.70

40.700

Adelie

Dream

bill_length_mm

56

32.1

44.1

36.750

38.55

40.375

Adelie

Torgersen

bill_length_mm

51

33.5

46.0

36.650

38.90

41.100

Chinstrap

Dream

bill_length_mm

68

40.9

58.0

46.350

49.55

51.075

Gentoo

Biscoe

bill_length_mm

123

40.9

59.6

45.300

47.30

49.550

Subset: Especie Adelia de las islas Dream y Biscoe

adelia_islas <- pinguinos |>
  filter(species == "Adelie", island %in% c("Dream", "Biscoe"))

UNA POBLACIÓN

One-sample test

Intervalo de confianza

conf<-t.test(
        adelia_islas$bill_length_mm, 
        conf.level = 0.95) 

conf$conf.int  #Límite inferior, Límite superior y nivel de confianza
[1] 38.2197 39.2003
attr(,"conf.level")
[1] 0.95

Se tiene una confianza del 95% que entre 38,22 mm y 39,2 mm se encuentre la verdadera longitud promedio de pico (mm) de los pingüinos de la especie Adelia de las Islas Biscoe o Dream

Prueba bilateral "two.sided"

NoteDada la siguiente hipótesis científica se plantean las hipótesis estadísticas

\(Hc:\) El largo del pico promedio de los pingüinos de la especie Adelia es diferente a 38 mm

\(H_0: 𝝁 = 38mm\)

\(H_1: 𝝁 ≠ 38 mm\)

t.test(adelia_islas$bill_length_mm, 
       mu=38, ) 

    One Sample t-test

data:  adelia_islas$bill_length_mm
t = 2.8734, df = 99, p-value = 0.00497
alternative hypothesis: true mean is not equal to 38
95 percent confidence interval:
 38.2197 39.2003
sample estimates:
mean of x 
    38.71 

Decisión: se rechaza hipóteis nula porque p-valor (0,00497) es menor que alfa (0,05)

Interpretación: existe evidencia muestral suficiente con un nivel de significancia del 5% para afirmar que el largo del pico promedio de los pingüinos de la especie Adelia es diferente a 38 mm

Prueba unilateral

¿Cuál hipótesis estadística (\(Hc\)) que corresponde a cada caso?

\(H_0: 𝝁 = 38mm\)

\(H_1: 𝝁 > 38 mm\)

#argumento "alternative"

t.test(adelia_islas$bill_length_mm, mu=38, 
       alternative = "greater") # derecha

    One Sample t-test

data:  adelia_islas$bill_length_mm
t = 2.8734, df = 99, p-value = 0.002485
alternative hypothesis: true mean is greater than 38
95 percent confidence interval:
 38.29972      Inf
sample estimates:
mean of x 
    38.71 

\(H_0: 𝝁 = 38mm\)

\(H_1: 𝝁 < 38 mm\)

#argumento "alternative"

t.test(adelia_islas$bill_length_mm, mu=38, 
       alternative = "less") # izquierda

    One Sample t-test

data:  adelia_islas$bill_length_mm
t = 2.8734, df = 99, p-value = 0.9975
alternative hypothesis: true mean is less than 38
95 percent confidence interval:
     -Inf 39.12028
sample estimates:
mean of x 
    38.71 

Utilizando rstatix📦

t_test_results <- adelia_islas |> 
  t_test(bill_length_mm ~ 1, 
         mu = 38, 
         conf.level = 0.95, 
         detailed = TRUE, 
         var.equal = TRUE) 
t_test_results
# A tibble: 1 × 12
  estimate .y.    group1 group2     n statistic       p    df conf.low conf.high
*    <dbl> <chr>  <chr>  <chr>  <int>     <dbl>   <dbl> <dbl>    <dbl>     <dbl>
1     38.7 bill_… 1      null …   100      2.87 0.00497    99     38.2      39.2
# ℹ 2 more variables: method <chr>, alternative <chr>
# coloca asteriscos si es significativa
flextable(t_test_results) # imprimir resultados #df: degrees of freedom

estimate

.y.

group1

group2

n

statistic

p

df

conf.low

conf.high

method

alternative

38.71

bill_length_mm

1

null model

100

2.87335

0.00497

99

38.2197

39.2003

T-test

two.sided

DOS POBLACIONES INDEPENDIENTES

Two-Sample test

Empezamos con el análisis exploratorio gráfico y numérico

adelia_islas|>
  ggplot() + 
   aes(x = island, 
      y = bill_length_mm, 
      fill = island) + 
   geom_boxplot(outlier.shape = "") + 
   geom_point(position = position_jitter(0.1), col = "grey50") + 
   theme_light() + 
   labs(x = "Isla", 
       y = "longitud del pico (mm)", 
       title = "Longitud del pico por isla en pingüinos de la especie Adelie",
       fill = "Isla", col = "Isla")

💻 Actividad: obtener las medidas resumen para el subset de la especie Adelia

Prueba para la diferencia de medias

NoteHipótesis científica

\(Hc:\) la longitud promedio de pico de los pingüinos de la isla Biscoe es diferente a la isla Dreams

\(H_0: (𝝁_1 -𝝁_2) = 0\)

\(H_1: (𝝁_1 -𝝁_2) ≠ 0\)

t.test(bill_length_mm ~ island,  #variable ~ grupos
       data = adelia_islas, 
       var.equal = TRUE )

    Two Sample t-test

data:  bill_length_mm by island
t = 0.95016, df = 98, p-value = 0.3444
alternative hypothesis: true difference in means between group Biscoe and group Dream is not equal to 0
95 percent confidence interval:
 -0.5151265  1.4615551
sample estimates:
mean in group Biscoe  mean in group Dream 
            38.97500             38.50179 
#df: degrees of freedom

Utilizando rstatix📦

stad.test<-adelia_islas |> 
  t_test(bill_length_mm ~ island,
         var.equal = FALSE,
         conf.level = 0.95) #correccion varianzas no iguales
stad.test
# A tibble: 1 × 8
  .y.            group1 group2    n1    n2 statistic    df     p
* <chr>          <chr>  <chr>  <int> <int>     <dbl> <dbl> <dbl>
1 bill_length_mm Biscoe Dream     44    56     0.949  92.2 0.345

Gráficos listos para publicaciones con qqpubr 📦

El paquete permite visualizar el resultado de la prueba en un gráfico basado ggplot2

#install.packages(ggpubr)
library(ggpubr)
p <- ggboxplot(
      adelia_islas, 
      x = "island", 
      y = "bill_length_mm", 
      color = "island")
  
# Add the p-value manually

p + stat_pvalue_manual(stad.test, 
                       label = "T-test, p={p}", #label = "T-test, p = {p}
                       y.position = 35)

DOS POBLACIONES DEPENDIENTES (muestras pareadas)

# Crear el data frame (tibble) directamente
datos_Fe <- tibble(
  metodo = c("rayos_X", "rayos_X", "rayos_X", "rayos_X", "rayos_X",
             "quimico", "quimico", "quimico", "quimico", "quimico"),
  Fe_mg = c(2.0, 2.0, 2.3, 2.1, 2.4, 2.2, 1.9, 2.5, 2.3, 2.4)
)

# Imprimir el resultado para verificar
print(datos_Fe)
# A tibble: 10 × 2
   metodo  Fe_mg
   <chr>   <dbl>
 1 rayos_X   2  
 2 rayos_X   2  
 3 rayos_X   2.3
 4 rayos_X   2.1
 5 rayos_X   2.4
 6 quimico   2.2
 7 quimico   1.9
 8 quimico   2.5
 9 quimico   2.3
10 quimico   2.4
# Convertir la columna 'metodo' a factor
datos_tidy <- datos_Fe |>
  mutate(metodo = as.factor(metodo))

# Verificar la estructura para ver el cambio
# str(datos_Fe)

datos_Fe |> 
  t_test(Fe_mg ~ metodo, 
         paired = TRUE,   ## por defecto es FALSE
         var.equal = TRUE)
# A tibble: 1 × 8
  .y.   group1  group2     n1    n2 statistic    df     p
* <chr> <chr>   <chr>   <int> <int>     <dbl> <dbl> <dbl>
1 Fe_mg quimico rayos_X     5     5      1.58     4 0.189