library(readxl)
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ lubridate 1.9.5     ✔ tibble    3.3.1
## ✔ purrr     1.2.1     ✔ tidyr     1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(patchwork)
df_alturas<- read_xlsx("Alturas.xlsx")

Seleccionar solo las variables numéricas principales (en Cm)

variables_cm <- df_alturas %>% 
  select(Hombres = `Male Height in Cm`, Mujeres = `Female Height in Cm`)
  1. Convertir los datos a formato “largo” para usar facetas fácilmente Pasamos las columnas de Cm y Ft a una estructura de filas
df_largo <- df_alturas %>%
  pivot_longer(
    cols = c(`Male Height in Cm`, `Female Height in Cm`, `Male Height in Ft`, `Female Height in Ft`),
    names_to = "Variable",
    values_to = "Altura"
  )

Agrupamos por variable y calculamos Shapiro-Wilk de forma secuencial

shapiro_resultados <- df_largo %>%
  group_by(Variable) %>%
  summarise(
    Estadistico_W = shapiro.test(Altura)$statistic,
    p_value = shapiro.test(Altura)$p.value
  )

print(shapiro_resultados)
## # A tibble: 4 × 3
##   Variable            Estadistico_W p_value
##   <chr>                       <dbl>   <dbl>
## 1 Female Height in Cm         0.991  0.221 
## 2 Female Height in Ft         0.990  0.176 
## 3 Male Height in Cm           0.988  0.0852
## 4 Male Height in Ft           0.988  0.0846

Usamos facet_wrap para crear un gráfico por cada una de las 4 variables

fig <- ggplot(df_largo, aes(x = Altura, fill = Variable)) +
  geom_histogram(aes(y = after_stat(density)), bins = 15, color = "white", alpha = 0.7) +
  geom_density(color = "black", size = 0.8) + 
  facet_wrap(~ Variable, scales = "free") +   # "free" permite que cada variable tenga su propia escala de ejes
  labs(
    title = "Análisis de Normalidad: Histogramas por Variable",
    x = "Valor de la Altura",
    y = "Densidad"
  ) +
  theme_minimal() +
  theme(legend.position = "none") 
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
fig 

Mismo principio de facetas, pero aplicando la geometría de cuantiles de ggplot2

fig <- ggplot(df_largo, aes(sample = Altura, color = Variable)) +
  stat_qq(alpha = 0.7) +
  stat_qq_line(color = "black", size = 0.8) + # Línea de referencia teórica
  facet_wrap(~ Variable, scales = "free") +
  labs(
    title = "Análisis de Normalidad: Gráficos Cuantil-Cuantil (Q-Q)",
    x = "Cuantiles Teóricos",
    y = "Cuantiles Muestrales"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

fig

CONTRASTES PARA HOMBRES (Referencia = 175 cm)

print("=== HOMBRES: Prueba Bilateral (Diferente de 175) ===")
## [1] "=== HOMBRES: Prueba Bilateral (Diferente de 175) ==="
t_hombres_bilateral <- t.test(df_alturas$`Male Height in Cm`, mu = 175, alternative = "two.sided")
print(t_hombres_bilateral)
## 
##  One Sample t-test
## 
## data:  df_alturas$`Male Height in Cm`
## t = -5.4461, df = 198, p-value = 1.516e-07
## alternative hypothesis: true mean is not equal to 175
## 95 percent confidence interval:
##  172.3971 173.7810
## sample estimates:
## mean of x 
##   173.089

CONCLUSION: Me tengo que ir por la alternativa: Hay suficiente evidencia para decir que la media obtenida difiere de 175

print("=== HOMBRES: Prueba Unilateral Derecha (Mayor que 175) ===")
## [1] "=== HOMBRES: Prueba Unilateral Derecha (Mayor que 175) ==="
t_hombres_derecha <- t.test(df_alturas$`Male Height in Cm`, mu = 175, alternative = "greater")
print(t_hombres_derecha)
## 
##  One Sample t-test
## 
## data:  df_alturas$`Male Height in Cm`
## t = -5.4461, df = 198, p-value = 1
## alternative hypothesis: true mean is greater than 175
## 95 percent confidence interval:
##  172.5092      Inf
## sample estimates:
## mean of x 
##   173.089

CONCLUSION: Me tengo que ir por la nula: No hay suficiente evidencia para decir que la media es mayor a 175.

CONTRASTES PARA MUJERES (Referencia = 162 cm)

print("=== MUJERES: Prueba Bilateral (Diferente de 162) ===")
## [1] "=== MUJERES: Prueba Bilateral (Diferente de 162) ==="
t_mujeres_bilateral <- t.test(df_alturas$`Female Height in Cm`, mu = 162, alternative = "two.sided")
print(t_mujeres_bilateral)
## 
##  One Sample t-test
## 
## data:  df_alturas$`Female Height in Cm`
## t = -3.6582, df = 198, p-value = 0.0003256
## alternative hypothesis: true mean is not equal to 162
## 95 percent confidence interval:
##  160.3731 161.5128
## sample estimates:
## mean of x 
##  160.9429

CONCLUSION: Me tengo que ir por la alternativa: Hay suficiente evidencia para decir que la media es diferente de 162

print("=== MUJERES: Prueba Unilateral Izquierda (Menor que 162) ===")
## [1] "=== MUJERES: Prueba Unilateral Izquierda (Menor que 162) ==="
t_mujeres_izquierda <- t.test(df_alturas$`Female Height in Cm`, mu = 162, alternative = "less")
print(t_mujeres_izquierda)
## 
##  One Sample t-test
## 
## data:  df_alturas$`Female Height in Cm`
## t = -3.6582, df = 198, p-value = 0.0001628
## alternative hypothesis: true mean is less than 162
## 95 percent confidence interval:
##      -Inf 161.4205
## sample estimates:
## mean of x 
##  160.9429

CONCLUSION: Me tengo que ir por la alternativa: Hay suficiente evidencia para decir que la media es menor a 162

LS0tCnRpdGxlOiAiRWplcmNpY2lvcyBlc3RhZMOtc3RpY2EiCmF1dGhvcjogIk9zdmFsZG8gRmVybmFuZGV6IgpkYXRlOiAiMjAyNi0wNS0wNSIKb3V0cHV0OgogICBodG1sX2RvY3VtZW50OgogICAgIHRvYzogeWVzCiAgICAgY29kZS1mb2xkOiBzaG93CiAgICAgY29kZS10b29sczogdHJ1ZQogICAgIHRvYy1sb2NhdGlvbjogbGVmdAogICAgIHRvY19kZXB0aDogNAogICAgIHRvY19mbG9hdDogeWVzCiAgICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICAgdGhlbWU6IGZsYXRseQogICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IHNlbnRlbmNlCi0tLQoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCgpgYGB7cn0KZGZfYWx0dXJhczwtIHJlYWRfeGxzeCgiQWx0dXJhcy54bHN4IikKYGBgCgojIyMjIFNlbGVjY2lvbmFyIHNvbG8gbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIHByaW5jaXBhbGVzIChlbiBDbSkKCmBgYHtyfQp2YXJpYWJsZXNfY20gPC0gZGZfYWx0dXJhcyAlPiUgCiAgc2VsZWN0KEhvbWJyZXMgPSBgTWFsZSBIZWlnaHQgaW4gQ21gLCBNdWplcmVzID0gYEZlbWFsZSBIZWlnaHQgaW4gQ21gKQpgYGAKCjIuIENvbnZlcnRpciBsb3MgZGF0b3MgYSBmb3JtYXRvICJsYXJnbyIgcGFyYSB1c2FyIGZhY2V0YXMgZsOhY2lsbWVudGUKUGFzYW1vcyBsYXMgY29sdW1uYXMgZGUgQ20geSBGdCBhIHVuYSBlc3RydWN0dXJhIGRlIGZpbGFzCgpgYGB7cn0KZGZfbGFyZ28gPC0gZGZfYWx0dXJhcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhgTWFsZSBIZWlnaHQgaW4gQ21gLCBgRmVtYWxlIEhlaWdodCBpbiBDbWAsIGBNYWxlIEhlaWdodCBpbiBGdGAsIGBGZW1hbGUgSGVpZ2h0IGluIEZ0YCksCiAgICBuYW1lc190byA9ICJWYXJpYWJsZSIsCiAgICB2YWx1ZXNfdG8gPSAiQWx0dXJhIgogICkKYGBgCgoKQWdydXBhbW9zIHBvciB2YXJpYWJsZSB5IGNhbGN1bGFtb3MgU2hhcGlyby1XaWxrIGRlIGZvcm1hIHNlY3VlbmNpYWwKYGBge3J9CnNoYXBpcm9fcmVzdWx0YWRvcyA8LSBkZl9sYXJnbyAlPiUKICBncm91cF9ieShWYXJpYWJsZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgRXN0YWRpc3RpY29fVyA9IHNoYXBpcm8udGVzdChBbHR1cmEpJHN0YXRpc3RpYywKICAgIHBfdmFsdWUgPSBzaGFwaXJvLnRlc3QoQWx0dXJhKSRwLnZhbHVlCiAgKQoKcHJpbnQoc2hhcGlyb19yZXN1bHRhZG9zKQpgYGAKCgpVc2Ftb3MgZmFjZXRfd3JhcCBwYXJhIGNyZWFyIHVuIGdyw6FmaWNvIHBvciBjYWRhIHVuYSBkZSBsYXMgNCB2YXJpYWJsZXMKYGBge3J9CmZpZyA8LSBnZ3Bsb3QoZGZfbGFyZ28sIGFlcyh4ID0gQWx0dXJhLCBmaWxsID0gVmFyaWFibGUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSwgYmlucyA9IDE1LCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9kZW5zaXR5KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuOCkgKyAKICBmYWNldF93cmFwKH4gVmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlIikgKyAgICMgImZyZWUiIHBlcm1pdGUgcXVlIGNhZGEgdmFyaWFibGUgdGVuZ2Egc3UgcHJvcGlhIGVzY2FsYSBkZSBlamVzCiAgbGFicygKICAgIHRpdGxlID0gIkFuw6FsaXNpcyBkZSBOb3JtYWxpZGFkOiBIaXN0b2dyYW1hcyBwb3IgVmFyaWFibGUiLAogICAgeCA9ICJWYWxvciBkZSBsYSBBbHR1cmEiLAogICAgeSA9ICJEZW5zaWRhZCIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCgpmaWcgCgpgYGAKCgpNaXNtbyBwcmluY2lwaW8gZGUgZmFjZXRhcywgcGVybyBhcGxpY2FuZG8gbGEgZ2VvbWV0csOtYSBkZSBjdWFudGlsZXMgZGUgZ2dwbG90MgpgYGB7cn0KZmlnIDwtIGdncGxvdChkZl9sYXJnbywgYWVzKHNhbXBsZSA9IEFsdHVyYSwgY29sb3IgPSBWYXJpYWJsZSkpICsKICBzdGF0X3FxKGFscGhhID0gMC43KSArCiAgc3RhdF9xcV9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuOCkgKyAjIEzDrW5lYSBkZSByZWZlcmVuY2lhIHRlw7NyaWNhCiAgZmFjZXRfd3JhcCh+IFZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQW7DoWxpc2lzIGRlIE5vcm1hbGlkYWQ6IEdyw6FmaWNvcyBDdWFudGlsLUN1YW50aWwgKFEtUSkiLAogICAgeCA9ICJDdWFudGlsZXMgVGXDs3JpY29zIiwKICAgIHkgPSAiQ3VhbnRpbGVzIE11ZXN0cmFsZXMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpmaWcKYGBgCgoKIyMjIENPTlRSQVNURVMgUEFSQSBIT01CUkVTIChSZWZlcmVuY2lhID0gMTc1IGNtKQoKYGBge3J9CnByaW50KCI9PT0gSE9NQlJFUzogUHJ1ZWJhIEJpbGF0ZXJhbCAoRGlmZXJlbnRlIGRlIDE3NSkgPT09IikKdF9ob21icmVzX2JpbGF0ZXJhbCA8LSB0LnRlc3QoZGZfYWx0dXJhcyRgTWFsZSBIZWlnaHQgaW4gQ21gLCBtdSA9IDE3NSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikKcHJpbnQodF9ob21icmVzX2JpbGF0ZXJhbCkKYGBgCkNPTkNMVVNJT046IE1lIHRlbmdvIHF1ZSBpciBwb3IgbGEgYWx0ZXJuYXRpdmE6IEhheSBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIGRlY2lyIHF1ZSBsYSBtZWRpYSBvYnRlbmlkYSBkaWZpZXJlIGRlIDE3NQoKYGBge3J9CnByaW50KCI9PT0gSE9NQlJFUzogUHJ1ZWJhIFVuaWxhdGVyYWwgRGVyZWNoYSAoTWF5b3IgcXVlIDE3NSkgPT09IikKdF9ob21icmVzX2RlcmVjaGEgPC0gdC50ZXN0KGRmX2FsdHVyYXMkYE1hbGUgSGVpZ2h0IGluIENtYCwgbXUgPSAxNzUsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKQpwcmludCh0X2hvbWJyZXNfZGVyZWNoYSkKYGBgCkNPTkNMVVNJT046IE1lIHRlbmdvIHF1ZSBpciBwb3IgbGEgbnVsYTogTm8gaGF5IHN1ZmljaWVudGUgZXZpZGVuY2lhIHBhcmEgZGVjaXIgcXVlIGxhIG1lZGlhIGVzIG1heW9yIGEgMTc1LgoKIyMjIENPTlRSQVNURVMgUEFSQSBNVUpFUkVTIChSZWZlcmVuY2lhID0gMTYyIGNtKQoKYGBge3J9CnByaW50KCI9PT0gTVVKRVJFUzogUHJ1ZWJhIEJpbGF0ZXJhbCAoRGlmZXJlbnRlIGRlIDE2MikgPT09IikKdF9tdWplcmVzX2JpbGF0ZXJhbCA8LSB0LnRlc3QoZGZfYWx0dXJhcyRgRmVtYWxlIEhlaWdodCBpbiBDbWAsIG11ID0gMTYyLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQpwcmludCh0X211amVyZXNfYmlsYXRlcmFsKQpgYGAKQ09OQ0xVU0lPTjogTWUgdGVuZ28gcXVlIGlyIHBvciBsYSBhbHRlcm5hdGl2YTogSGF5IHN1ZmljaWVudGUgZXZpZGVuY2lhIHBhcmEgZGVjaXIgcXVlIGxhIG1lZGlhIGVzIGRpZmVyZW50ZSBkZSAxNjIKCmBgYHtyfQpwcmludCgiPT09IE1VSkVSRVM6IFBydWViYSBVbmlsYXRlcmFsIEl6cXVpZXJkYSAoTWVub3IgcXVlIDE2MikgPT09IikKdF9tdWplcmVzX2l6cXVpZXJkYSA8LSB0LnRlc3QoZGZfYWx0dXJhcyRgRmVtYWxlIEhlaWdodCBpbiBDbWAsIG11ID0gMTYyLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIikKcHJpbnQodF9tdWplcmVzX2l6cXVpZXJkYSkKYGBgCkNPTkNMVVNJT046IE1lIHRlbmdvIHF1ZSBpciBwb3IgbGEgYWx0ZXJuYXRpdmE6IEhheSBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIGRlY2lyIHF1ZSBsYSBtZWRpYSBlcyBtZW5vciBhIDE2Mg==