pinguinos <- palmerpenguins::penguins
library(tidyverse)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
Análisis Exploratorio de Datos (EDA)
Conociendo a los pingüinos
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 PlotMedidas 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
¿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"
\(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 significativaflextable(t_test_results) # imprimir resultados #df: degrees of freedomestimate | .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")Prueba para la diferencia de medias
\(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 freedomUtilizando 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