Introducción

En esta actividad se utiliza la base de datos Smokers Health Data, la cual contiene información clínica de personas adultas, clasificadas segun su hábito de fumar, y a la que se le hará un análisis estadístico con el fin de evaluar algunas hipótesis.

Las variables principales que usaremos son:

  • heart_rate: Frecuencia cardiaca (latidos por minuto, lpm).
  • chol: Nivel de colesterol total en sangre (mg/dL).
  • current_smoker: Indicador de si la persona es fumadora o no.

El objetivo es aplicar algunas pruebas de hipótesis sobre medias y proporciones, utilizando R en RStudio, y presentar los resultados en un documento publicado en RPubs.

ejecución de la actividad

Carga de datos y exploracion inicial

# Cargar la base de datos
datos <- read.csv("smoking_health_data_final.csv")

# Vista rapida
dim(datos) # Se obtiene el tamaño del dataset
## [1] 3900    7
head(datos) # Se muestran las 6 primeras filas del dataset
##   age  sex current_smoker heart_rate blood_pressure cigs_per_day chol
## 1  54 male            yes         95         110/72           NA  219
## 2  45 male            yes         64         121/72           NA  248
## 3  58 male            yes         81       127.5/76           NA  235
## 4  42 male            yes         90       122.5/80           NA  225
## 5  42 male            yes         62         119/80           NA  226
## 6  57 male            yes         62     107.5/72.5           NA  223
str(datos) # Se presentan las estructuras de los datos
## 'data.frame':    3900 obs. of  7 variables:
##  $ age           : int  54 45 58 42 42 57 43 42 37 49 ...
##  $ sex           : chr  "male" "male" "male" "male" ...
##  $ current_smoker: chr  "yes" "yes" "yes" "yes" ...
##  $ heart_rate    : int  95 64 81 90 62 62 75 66 65 93 ...
##  $ blood_pressure: chr  "110/72" "121/72" "127.5/76" "122.5/80" ...
##  $ cigs_per_day  : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ chol          : int  219 248 235 225 226 223 222 196 188 256 ...
colSums(is.na(datos)) # Número de valores NaN por columna
##            age            sex current_smoker     heart_rate blood_pressure 
##              0              0              0              0              0 
##   cigs_per_day           chol 
##             14              7
summary(datos[, c("age", "heart_rate", "cigs_per_day", "chol")]) # Se presenta un resumen estadístico basico de los datos
##       age          heart_rate      cigs_per_day         chol      
##  Min.   :32.00   Min.   : 44.00   Min.   : 0.000   Min.   :113.0  
##  1st Qu.:42.00   1st Qu.: 68.00   1st Qu.: 0.000   1st Qu.:206.0  
##  Median :49.00   Median : 75.00   Median : 0.000   Median :234.0  
##  Mean   :49.54   Mean   : 75.69   Mean   : 9.169   Mean   :236.6  
##  3rd Qu.:56.00   3rd Qu.: 82.00   3rd Qu.:20.000   3rd Qu.:263.0  
##  Max.   :70.00   Max.   :143.00   Max.   :70.000   Max.   :696.0  
##                                   NA's   :14       NA's   :7

En esta etapa se observa que:

  • La base incluye informacion demografica (edad) y clinica (frecuencia cardiaca, colesterol, cigarrillos por dia), diferenciando entre fumadores y no fumadores.

  • 3900 personas hicieron parte del estudio del cual se tomó el dataset, en el cual se evaluaron 7 variables por cada una.

  • Los valores de frecuencia cardiaca se encuentran principalmente en rangos de frecuencia normal, aunque con ciertas personas con valores mas altos.

  • El colesterol presenta una media situada por encima de los 200 mg/dL, lo que nos permite idetificar que ya existe un riesgo cardiobascular entre los participantes.

  • El numero de valores Nulos/NaN es bajo, por lo que no se requieren estrategias complejas de limpieza.

Tras esta exploracion, se procede a crear variables derivadas, como colesterol alto, taquicardia y factor de fumador, que permitiran formular y contrastar las pruebas de hipótesis en las siguientes secciones.

Limpieza y creacion de variables derivadas

Para crear las variables derivadas, con las cuales se van a hacer análisis posteriores, se requiere establecer lo siguiente en relación con definiciones médicas:

  • Colesterol: Los valores deseables estan por debajo de \(200\) mg/dL. El limite superio está entre \(200-239\) mg/dL. Valores iguales o por encima de \(240\) mg/dL se considera colesterol alto.

  • Frecuencia cardiaca: Se considera normal en reposo cuando sus valores se encuentran entre 60 y 100 latidos por minuto en un adulto sano. Valores por encima de los 100 latidos por minuto en reposo se considera como Taquicardia.

# Variable de colesterol alto: valor > 240 mg/dL
datos <- datos |>
  mutate( # Se crea una tabla nueva
    colesterol_alto = if_else(chol > 240, 1L, 0L, missing = 0L), # Para colesterol mayor a 240, se marca a la persona como "colesterol alto", y para los demas como "Colesterol bajo". A toda fila que tenga un valor NaN/Null se le marca como "Colesterol bajo" para así mo dejar personas sin clasificar
    factor_colesterol_alto = factor(colesterol_alto, levels = c(0, 1), # Se convierten la variable en etiquetas
                              labels = c("No alto", "Alto"))
  )

# Variable de taquicardia: frecuencia cardiaca > 100 lpm
datos <- datos |>
  mutate(
    taquicardia = if_else(heart_rate > 100, 1L, 0L, missing = 0L), # Para frencuencias cardiacas mayores a 100 latidos por minuto se marca como "Taquicandia", y para el resto (incluyendo filas con valores NaN/Null) como "No taquicardia"
    tachy_factor = factor(taquicardia, levels = c(0, 1),
                          labels = c("No taquicardia", "Taquicardia"))
  )

# Variable fumador como factor
datos <- datos |>
  mutate(
    current_smoker = factor(current_smoker,
                            levels = c("no", "yes"),
                            labels = c("No fumador", "Fumador")) # Se crean etiquetas para indicar si una persona es o no fumadora
  )

# Resumen de las nuevas variables
summary(datos[, c("heart_rate", "chol", "colesterol_alto", "taquicardia")])
##    heart_rate          chol       colesterol_alto   taquicardia     
##  Min.   : 44.00   Min.   :113.0   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.: 68.00   1st Qu.:206.0   1st Qu.:0.0000   1st Qu.:0.00000  
##  Median : 75.00   Median :234.0   Median :0.0000   Median :0.00000  
##  Mean   : 75.69   Mean   :236.6   Mean   :0.4279   Mean   :0.02385  
##  3rd Qu.: 82.00   3rd Qu.:263.0   3rd Qu.:1.0000   3rd Qu.:0.00000  
##  Max.   :143.00   Max.   :696.0   Max.   :1.0000   Max.   :1.00000  
##                   NA's   :7
table(datos$current_smoker)
## 
## No fumador    Fumador 
##       1968       1932

De los datos anteriores podemos identificar que la división entre fumadores y no fumadores está equilibrado.

Esquema de colores

Para generar gráficos mas agradables, se crea un tema y paleta de colores.

tema_graficos <- theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", color = "#333333", hjust = 0.5),
    axis.title = element_text(face = "bold", color = "#444444"),
    axis.text  = element_text(color = "#555555"),
    legend.title = element_text(face = "bold"),
    panel.grid.minor = element_blank()
  )

colores_grupos <- c("No fumador" = "#1f78b4",   # azul
                    "Fumador"    = "#e31a1c")   # rojo

colores_binarias <- c("No alto" = "#33a02c",    # verde
                      "Alto"    = "#ff7f00")    # naranja

Análisis

Exploración de datos

Frecuencia cardiaca

# Histograma de frecuencia cardiaca con lineas de referencia
ggplot(datos, aes(x = heart_rate)) +
  geom_histogram(bins = 20, color = "white", fill = "#a6cee3") +
  geom_vline(aes(xintercept = mean(heart_rate, na.rm = TRUE)),
             linetype = "dashed", color = "#1f78b4", size = 1) +
  geom_vline(xintercept = 75, linetype = "dotted", color = "#e31a1c", size = 1) +
  labs(title = "Distribucion de la frecuencia cardiaca",
       x = "Frecuencia cardiaca (lpm)",
       y = "Frecuencia") +
  tema_graficos

  • Del grafico de frecuencia cardiaca, se identifica que la mayor parte de los valores se agrupan entre 65 y 85 lpm. Esta es la zona donde se espera que esté la frecuencia cardíaca de una persona adulta en reposo. Lo que nos indica que no hay afectaciones graven en cuanto a la frecuencia en reposo.

  • En el gráfico, la línea roja es la media real ≈ 75.7 lpm, y la línea azul representa un valor de referencia ≈ 75 lpm. Esta media (Linea roja), que está ligeramente por encima del valor de referencia clinico podría indicar que hay una tendencia hacia un ritmo cardíaco basal más alto de lo esperado.

  • La presencia de pocos valores extremos hacia la derecha (100–140 lpm) indica que la taquicardia es poco frecuente en esta población, lo cual tien sentido en relación con el bajo porcentaje de casos detectados en el análisis descriptivo.

colesterol

# Histograma de colesterol con lineas de referencia
ggplot(datos, aes(x = chol)) +
  geom_histogram(bins = 20, color = "white", fill = "#fb9a99") +
  geom_vline(aes(xintercept = mean(chol, na.rm = TRUE)),
             linetype = "dashed", color = "#b15928", size = 1) +
  geom_vline(xintercept = 200, linetype = "dotted", color = "#1f78b4", size = 1) +
  labs(title = "Distribucion del colesterol",
       x = "Colesterol (mg/dL)",
       y = "Frecuencia") +
  tema_graficos

  • El histograma anterior muestra una distribución asimétrica con valores entre 200 y 260 mg/dL, lo que es señal de una tendencia elevada de colesterol alto en la población.

  • La media observada (≈236 mg/dL) se encuentra por encima del valor recomendado de 200 mg/dL, lo cual indica un riesgo cardiobascular importante.

  • La cola derecha de la distribución revela la presencia de casos con niveles extremadamente altos (350–700 mg/dL).

Colesterol alto

# Distribucion de colesterol alto
ggplot(datos, aes(x = factor_colesterol_alto, fill = factor_colesterol_alto)) +
  geom_bar(color = "white") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.3) +
  scale_fill_manual(values = colores_binarias) +
  labs(title = "Colesterol alto (> 240 mg/dL)",
       x = "Categoria",
       y = "Conteo",
       fill = "Colesterol alto") +
  tema_graficos

La gráfica sobre colesterol muestra que el 42.8% de la población supera los 240 mg/dL, valor umbral asociado a mayor riesgo de enfermedad cardiovascular. Aunque el grupo “No alto” es mayoritario (57.2%), la proporción de individuos con colesterol elevado es considerablemente alta.

Taquicardia

# Distribucion de taquicardia
ggplot(datos, aes(x = tachy_factor, fill = tachy_factor)) +
  geom_bar(color = "white") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.3) +
  scale_fill_manual(values = c("No taquicardia" = "#a6cee3",
                               "Taquicardia"    = "#e31a1c")) +
  labs(title = "Taquicardia (frecuencia cardiaca > 100 lpm)",
       x = "Categoria",
       y = "Conteo",
       fill = "Taquicardia") +
  tema_graficos

En cuanto a la taquicardia, tal como se mencionó anteriormente, son muy pocas las personas que reportan taquicardia dentro de los participantes del estudio, pues se observa que solo el 2.4% de la población presenta taquicardia en reposo, lo que revela que la frecuencia cardíaca elevada es una situación poco frecuente. La gran mayoría de las personas mantiene valores normales, lo cual contrasta con lo encontrado en cuanto a los niveles elevados de colesterol. Esto puede indicar que el riesgo cardiovascular observado anteriormente puede está más relacionado con factores metabólicos que con afectaciones cardiacas.

Análisis según el hábito de fumar

Colesterol

# Boxplot de colesterol por habito de fumar
ggplot(datos, aes(x = current_smoker, y = chol, fill = current_smoker)) +
  geom_boxplot(alpha = 0.8, color = "#444444", outlier.color = "#ff7f00") +
  scale_fill_manual(values = colores_grupos) +
  labs(title = "Colesterol por habito de fumar",
       x = "Habito de fumar",
       y = "Colesterol (mg/dL)",
       fill = "Grupo") +
  tema_graficos

El boxplot de colesterol según el hábito de fumar revela que las distribuciones de ambos grupos son muy similares, con medianas casi equivalentes. Aunque los no fumadores muestran una mediana ligeramente mayor, esta diferencia es mínima y no refleja una variación significativa. Tambien se observa que ambos grupos presentan múltiples valores extremos, lo que indica que el colesterol alto en la sangre afecta de forma transversal a la población, sin una asociación aparente con el hábito de fumar.

Frecuencia cardiaca

# Boxplot de frecuencia cardiaca por habito de fumar
ggplot(datos, aes(x = current_smoker, y = heart_rate, fill = current_smoker)) +
  geom_boxplot(alpha = 0.8, color = "#444444", outlier.color = "#ff7f00") +
  scale_fill_manual(values = colores_grupos) +
  labs(title = "Frecuencia cardiaca por habito de fumar",
       x = "Habito de fumar",
       y = "Frecuencia cardiaca (lpm)",
       fill = "Grupo") +
  tema_graficos

El boxplot anterior nos muestra que los fumadores tienen una frecuencia cardíaca ligeramente superior a la de los no fumadores, lo que se concluye debido al desplazamiento ascendente de la mediana y de la caja. Sin embargo, las distribuciones de ambos grupos presentan rangos intercuartílicos similares y comparten valores extremos, lo cual indica que las variaciones de frecuencia cardíaca no son drásticamente distintas entre fumadores y no fumadores.

Densidad de colesterol

# Densidad de colesterol por habito de fumar
ggplot(datos, aes(x = chol, fill = current_smoker, color = current_smoker)) +
  geom_density(alpha = 0.25, size = 0.8) +
  scale_fill_manual(values = colores_grupos) +
  scale_color_manual(values = colores_grupos) +
  geom_vline(aes(xintercept = mean(chol, na.rm = TRUE)),
             linetype = "dashed", color = "#333333") +
  facet_wrap(. ~ current_smoker) +
  labs(title = "Distribucion del colesterol por habito de fumar",
       x = "Colesterol (mg/dL)",
       y = "Densidad",
       fill = "Grupo",
       color = "Grupo") +
  tema_graficos

La distribución del colesterol según el hábito de fumar muestra que los fumadores y los no fumadores presentan patrones muy similares. De las diferencias importantes, se observa que la cola derecha es más extensa en los fumadores, indicando la presencia de casos severos de colesterol alto en este grupo.

Densidad de frecuencia cardiaca

# Densidad de frecuencia cardiaca por habito de fumar
ggplot(datos, aes(x = heart_rate, fill = current_smoker, color = current_smoker)) +
  geom_density(alpha = 0.25, size = 0.8) +
  scale_fill_manual(values = colores_grupos) +
  scale_color_manual(values = colores_grupos) +
  geom_vline(aes(xintercept = mean(heart_rate, na.rm = TRUE)),
             linetype = "dashed", color = "#333333") +
  facet_wrap(. ~ current_smoker) +
  labs(title = "Distribucion de la frecuencia cardiaca por habito de fumar",
       x = "Frecuencia cardiaca (lpm)",
       y = "Densidad",
       fill = "Grupo",
       color = "Grupo") +
  tema_graficos

La comparación de las distribuciones de frecuencia cardíaca entre fumadores y no fumadores muestra patrones prácticamente idénticos en ambos grupos. Aunque los fumadores muestran una media ligeramente mayor, la diferencia es mínima y no se ven incrementos importantes en la dispersión o en valores extremos. Lo anterior sugiere que el efecto del hábito de fumar sobre la frecuencia cardíaca en esta población es leve y no altera de forma significativa su comportamiento general, lo cual es coherente con la baja proporción de taquicardia observada previamente.

Resumen

resumen_por_grupo <- datos |>
  group_by(current_smoker) |>
  summarise(
    n = n(),
    edad_media = mean(age, na.rm = TRUE),
    hr_media = mean(heart_rate, na.rm = TRUE),
    chol_media = mean(chol, na.rm = TRUE),
    prop_colesterol_alto = mean(colesterol_alto, na.rm = TRUE),
    prop_taquicardia = mean(taquicardia, na.rm = TRUE)
  )

knitr::kable(
  resumen_por_grupo,
  digits = 2,
  caption = "Resumen descriptivo por habito de fumar"
)
Resumen descriptivo por habito de fumar
current_smoker n edad_media hr_media chol_media prop_colesterol_alto prop_taquicardia
No fumador 1968 51.38 75.01 238.65 0.45 0.02
Fumador 1932 47.66 76.38 234.51 0.41 0.03

El análisis anterior nos presenta que los no fumadores tienden a ser, en promedio, casi cuatro años mayores que los fumadores, lo cual influye directamente en su mayor nivel de colesterol total y en una mayor proporción de casos de colesterol alto. Por otro lado, los fumadores presentan una frecuencia cardíaca ligeramente superior y una mayor proporción de taquicardia, lo cual es coherente con el efecto que ocasiona el consumo de nicotina sobre el sistema cardiovascular. A pesar de estas diferencias, ambos grupos muestran una elevada prevalencia de colesterol alto, lo que indica que el riesgo cardiovascular en esta población puede nor estar relacionado con fumar.

Análisis con base en el sexo

resumen_por_sexo <- datos |>
  group_by(sex) |>
  summarise(
    n = n(),
    edad_media = mean(age, na.rm = TRUE),
    hr_media = mean(heart_rate, na.rm = TRUE),
    chol_media = mean(chol, na.rm = TRUE),
    prop_colesterol_alto = mean(colesterol_alto, na.rm = TRUE),
    prop_taquicardia = mean(taquicardia, na.rm = TRUE)
  )

knitr::kable(
  resumen_por_sexo,
  digits = 2,
  caption = "Resumen descriptivo por sexo"
)
Resumen descriptivo por sexo
sex n edad_media hr_media chol_media prop_colesterol_alto prop_taquicardia
female 2081 49.76 76.94 239.63 0.46 0.03
male 1819 49.29 74.26 233.11 0.39 0.02

El análisis por sexo revela diferencias importantes en cuando a la salud cardiovascular. Aunque hombres y mujeres poseen edades promedio prácticamente idénticas, las mujeres presentan una frecuencia cardíaca mayor, una proporción superior de taquicardia y niveles más elevados de colesterol total. En particular, el 46% de las mujeres supera el umbral clínico de 240 mg/dL, frente al 39% de los hombres, lo cual puede sugerir una mayor prescencia de riesgo metabólico en las muejeres.

resumen_por_sexo_fumar <- datos |>
  group_by(sex, current_smoker) |>
  summarise(
    n = n(),
    edad_media = mean(age, na.rm = TRUE),
    hr_media = mean(heart_rate, na.rm = TRUE),
    chol_media = mean(chol, na.rm = TRUE),
    prop_colesterol_alto = mean(colesterol_alto, na.rm = TRUE),
    prop_taquicardia = mean(taquicardia, na.rm = TRUE),
    .groups = "drop"
  )

knitr::kable(
  resumen_por_sexo_fumar,
  digits = 2,
  caption = "Resumen descriptivo combinado por sexo y habito de fumar"
)
Resumen descriptivo combinado por sexo y habito de fumar
sex current_smoker n edad_media hr_media chol_media prop_colesterol_alto prop_taquicardia
female No fumador 1254 51.64 76.58 243.14 0.49 0.03
female Fumador 827 46.90 77.48 234.30 0.42 0.03
male No fumador 714 50.92 72.24 230.71 0.37 0.02
male Fumador 1105 48.23 75.56 234.66 0.40 0.02

El análisis combinado por sexo y hábito de fumar revela que en las mujeres, las no fumadoras presentan mayores niveles de colesterol y un porcentaje más elevado de colesterol alto, resultado influido en gran parte por su mayor edad promedio. En cambio, en los hombres, el fumar sí se asocia a un incremento en el colesterol, la frecuencia cardíaca y la proporción de casos con colesterol alto. La frecuencia de taquicardia se mantiene baja en todos los grupos, oscilando entre el 2% y 3%.

Colesterol

ggplot(datos, aes(x = sex, y = chol, fill = sex)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_manual(values = c("male" = "#1f78b4", "female" = "#e31a1c")) +
  labs(title = "Colesterol por sexo",
       x = "Sexo",
       y = "Colesterol (mg/dL)",
       fill = "Sexo") +
  tema_graficos

El análisis gráfico del colesterol por sexo muestra diferencias claras entre hombres y mujeres. La mediana de colesterol es mayor en mujeres, mostrando un porcentaje mayor de casos de colesterol alto. Ambos sexos presentan valores extremos muy elevados, pero estos son ligeramente más frecuentes en mujeres.

Frecuencia cardiaca

ggplot(datos, aes(x = sex, y = heart_rate, fill = sex)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_manual(values = c("male" = "#1f78b4", "female" = "#e31a1c")) +
  labs(title = "Frecuencia cardiaca por sexo",
       x = "Sexo",
       y = "Frecuencia cardiaca (lpm)",
       fill = "Sexo") +
  tema_graficos

La frecuencia cardíaca presenta diferencias claras entre hombres y mujeres. Las mujeres exhiben una mediana más alta y una mayor concentración de valores en el rango superior. Los hombres muestran valores más bajos en el extremo inferior. Aunque se observan valores extremos en ambos grupos, la proporción de taquicardia se mantiene baja. Este patrón respalda los resultados del resumen descriptivo, indicando que, si bien ambos sexos tienen una distribución similar, las mujeres tienden a presentar frecuencias cardíacas ligeramente más elevadas.

Proporcion de colesterol alto

tabla_chol_sexo <- datos |>
  count(sex, factor_colesterol_alto) |>
  group_by(sex) |>
  mutate(prop = n / sum(n))

ggplot(tabla_chol_sexo,
       aes(x = sex, y = prop, fill = factor_colesterol_alto)) +
  geom_col(color = "white", position = "fill") +
  scale_fill_manual(values = colores_binarias) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(title = "Proporcion de colesterol alto por sexo",
       x = "Sexo",
       y = "Proporcion",
       fill = "Colesterol alto") +
  tema_graficos

La proporción de colesterol alto según el sexo revela que mientras que el 39% de los hombres supera el umbral de 240 mg/dL, en las mujeres esta proporción asciende al 46%, lo que indica un riesgo relativo aproximadamente un 18% mayor en el grupo de mujeres Esta tendencia puede indicar que las mujeres que participaron en el estudio presentan un perfil lipídico menos favorable.

Pruebas de hipótesis

Pruebas por sexo

Medias de colesterol

t.test(chol ~ sex, data = datos)
## 
##  Welch Two Sample t-test
## 
## data:  chol by sex
## t = 4.6099, df = 3881.1, p-value = 4.159e-06
## alternative hypothesis: true difference in means between group female and group male is not equal to 0
## 95 percent confidence interval:
##  3.744999 9.287884
## sample estimates:
## mean in group female   mean in group male 
##             239.6290             233.1126

La prueba anterior detectó una diferencia significativa entre los valores de colesterol en hombres y mujeres (p = 4.159e-06). Las mujeres presentan un colesterol promedio significativamente superior (239.63 mg/dL) en comparación con los hombres (233.11 mg/dL). El intervalo de confianza del 95% (3.74 a 9.29 mg/dL) indica que esta diferencia es consistente y no fue al azar.

frecuencia cardiaca

t.test(heart_rate ~ sex, data = datos)
## 
##  Welch Two Sample t-test
## 
## data:  heart_rate by sex
## t = 7.0142, df = 3856.3, p-value = 2.719e-12
## alternative hypothesis: true difference in means between group female and group male is not equal to 0
## 95 percent confidence interval:
##  1.933153 3.433106
## sample estimates:
## mean in group female   mean in group male 
##             76.94041             74.25728

La prueba nos mostró que hay una diferencia importante entre la frecuencia cardíaca promedio de hombres y mujeres (t = 7.014, p = 2.7e-12). Las mujeres presentan una frecuencia cardíaca media de 76.94 lpm, mientras que los hombres muestran un valor promedio de 74.26 lpm. El intervalo de confianza del 95% para la diferencia (1.93 a 3.43 lpm) nos confirma lo acertado de esta conclución.

Pruebas para una media

En todas las pruebas usaremos un nivel de significancia \(\alpha = 0.05\).

Frecuencia cardiaca promedio vs 75 lpm

hr <- na.omit(datos$heart_rate)

prueba_hr <- t.test(hr, mu = 75, alternative = "two.sided")
prueba_hr
## 
##  One Sample t-test
## 
## data:  hr
## t = 3.5809, df = 3899, p-value = 0.0003465
## alternative hypothesis: true mean is not equal to 75
## 95 percent confidence interval:
##  75.31176 76.06619
## sample estimates:
## mean of x 
##  75.68897
mean(hr); sd(hr); length(hr)
## [1] 75.68897
## [1] 12.01538
## [1] 3900

La prueba de una muestra aplicada a la frecuencia cardíaca nos presenta que la media poblacional (75.69 lpm) es significativamente diferente del valor de referencia de 75 lpm (p = 0.0003465), por lo que se rechaza la hipótesis nula. El intervalo de confianza al 95% (75.31–76.07 lpm) se sitúa completamente por encima del valor de referencia, sugiriendo que la frecuencia cardíaca de las personas que participaron en el estudio tiende a ser ligeramente mayor que la de un adulto promedio en reposo.

Colesterol medio vs 200 mg/dL

chol <- na.omit(datos$chol)

prueba_chol_200 <- t.test(chol, mu = 200, alternative = "greater")
prueba_chol_200
## 
##  One Sample t-test
## 
## data:  chol
## t = 51.456, df = 3892, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 200
## 95 percent confidence interval:
##  235.4258      Inf
## sample estimates:
## mean of x 
##  236.5959
mean(chol); sd(chol); length(chol)
## [1] 236.5959
## [1] 44.37537
## [1] 3893

La prueba sobre niveles de colesterol evidencia que la media poblacional (236.6 mg/dL) es drasticamente mayor que el valor de referencia de 200 mg/dL (t = 51.456, p < 2.2e-16). El intervalo de confianza del 95% (235.4 mg/dL, ∞) confirma que el colesterol promedio se encuentra por encima del rango saludable, lo que indica una alteración de grasa en la sangre relevante. Finalmente, el valor p es prácticamente cero, lo que significa que la evidencia estadística es extremadamente fuerte para rechazar la hipótesis nula.

Pruebas para una proporcion

Proporcion de personas con colesterol alto (> 240 mg/dL)

x_high_chol <- sum(datos$colesterol_alto == 1, na.rm = TRUE)
n_high_chol <- sum(!is.na(datos$chol))

x_high_chol
## [1] 1669
n_high_chol
## [1] 3893
x_high_chol / n_high_chol
## [1] 0.4287182
prueba_prop_high_chol <- prop.test(
  x = x_high_chol,
  n = n_high_chol,
  p = 0.20,
  alternative = "greater",
  correct = FALSE
)
prueba_prop_high_chol
## 
##  1-sample proportions test without continuity correction
## 
## data:  x_high_chol out of n_high_chol, null probability 0.2
## X-squared = 1272.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
##  0.4157256 1.0000000
## sample estimates:
##         p 
## 0.4287182

La prueba sobre la proporción de personas con colesterol alto muestra un resultado importante: cerca del 43% de la población supera los 240 mg/dL, más del doble de lo que normalmente se esperaría (20%). El intervalo de confianza confirma que este porcentaje no es casualidad y que, como mínimo, ronda el 41%. Esto se puede representar en la siguiente gráfica.

tabla_high <- datos |>
  count(factor_colesterol_alto) |>
  mutate(prop = n / sum(n))

ggplot(tabla_high, aes(x = factor_colesterol_alto, y = prop, fill = factor_colesterol_alto)) +
  geom_col(color = "white") +
  scale_fill_manual(values = colores_binarias) +
  geom_hline(yintercept = 0.20, linetype = "dashed", color = "#1f78b4") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(title = "Proporcion de personas con colesterol alto",
       x = "Colesterol alto",
       y = "Proporcion",
       fill = "Categoria") +
  tema_graficos

Proporcion de personas con taquicardia (HR > 100 lpm)

x_tachy <- sum(datos$taquicardia == 1, na.rm = TRUE)
n_tachy <- sum(!is.na(datos$heart_rate))

x_tachy
## [1] 93
n_tachy
## [1] 3900
x_tachy / n_tachy
## [1] 0.02384615
prueba_prop_tachy <- prop.test(
  x = x_tachy,
  n = n_tachy,
  p = 0.05,
  alternative = "two.sided",
  correct = FALSE
)
prueba_prop_tachy
## 
##  1-sample proportions test without continuity correction
## 
## data:  x_tachy out of n_tachy, null probability 0.05
## X-squared = 56.162, df = 1, p-value = 6.674e-14
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
##  0.01950584 0.02912355
## sample estimates:
##          p 
## 0.02384615

Los resultados muestran que solo el 2.38% de las personas presentan taquicardia (frecuencia cardíaca mayor a 100 lpm). Esta proporción es mucho más baja que el 5% que se tomó como referencia. La prueba confirma que la diferencia no es casualidad: el valor p es extremadamente pequeño, así que queda claro que la taquicardia es menos común de lo que se esperaba.

El intervalo de confianza también va en la misma línea, pues indica que, incluso en el peor de los casos, la proporción real de taquicardia no llega ni al 3%. En otras palabras, la presencia de taquicardia en esta población es baja y no parece ser un problema frecuente ni generalizado. Esto también encaja con los análisis previos, donde la mayoría de personas tenía frecuencias cardíacas dentro de rangos normales.

tabla_tachy <- datos |>
  count(tachy_factor) |>
  mutate(prop = n / sum(n))

ggplot(tabla_tachy, aes(x = tachy_factor, y = prop, fill = tachy_factor)) +
  geom_col(color = "white") +
  scale_fill_manual(values = c("No taquicardia" = "#a6cee3",
                               "Taquicardia"    = "#e31a1c")) +
  geom_hline(yintercept = 0.05, linetype = "dashed", color = "#1f78b4") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(title = "Proporcion de personas con taquicardia",
       x = "Taquicardia",
       y = "Proporcion",
       fill = "Categoria") +
  tema_graficos

Pruebas para diferencia de medias

Colesterol medio: fumadores vs no fumadores

resumen_chol <- datos |>
  group_by(current_smoker) |>
  summarise(
    n = n(),
    media_chol = mean(chol, na.rm = TRUE),
    sd_chol = sd(chol, na.rm = TRUE)
  )
resumen_chol
## # A tibble: 2 × 4
##   current_smoker     n media_chol sd_chol
##   <fct>          <int>      <dbl>   <dbl>
## 1 No fumador      1968       239.    43.9
## 2 Fumador         1932       235.    44.8
chol_fumador    <- datos$chol[datos$current_smoker == "Fumador"]
chol_no_fumador <- datos$chol[datos$current_smoker == "No fumador"]

prueba_chol_smoker <- t.test(
  chol_fumador,
  chol_no_fumador,
  alternative = "two.sided",
  var.equal = FALSE
)
prueba_chol_smoker
## 
##  Welch Two Sample t-test
## 
## data:  chol_fumador and chol_no_fumador
## t = -2.9119, df = 3884.8, p-value = 0.003612
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6.925837 -1.352281
## sample estimates:
## mean of x mean of y 
##  234.5067  238.6458
media_fum <- mean(chol_fumador, na.rm = TRUE)
media_no  <- mean(chol_no_fumador, na.rm = TRUE)
sd_fum    <- sd(chol_fumador, na.rm = TRUE)
sd_no     <- sd(chol_no_fumador, na.rm = TRUE)
n_fum     <- sum(!is.na(chol_fumador))
n_no      <- sum(!is.na(chol_no_fumador))

sd_pooled_chol <- sqrt(((n_fum - 1) * sd_fum^2 + (n_no - 1) * sd_no^2) /
                         (n_fum + n_no - 2))

d_chol <- (media_fum - media_no) / sd_pooled_chol
d_chol
## [1] -0.09336342

Al comparar los niveles de colesterol entre fumadores y no fumadores, se ve que la diferencia entre ambos grupos es pequeña. Los no fumadores tienen en promedio 238.6 mg/dL, mientras que los fumadores están un poco más abajo, con 234.5 mg/dL. Esto ya daba la idea de que, aunque hay una diferencia, no es muy grande.

Con la prueba anterior se confirma que la diferencia es estadísticamente significativa (p ≈ 0.0036), pero el tamaño del efecto es muy pequeño. El intervalo de confianza también lo deja claro, pues los fumadores tienen entre 1.35 y 6.93 mg/dL menos colesterol que los no fumadores, una diferencia bastante reducida si la comparamos con la variabilidad general del colesterol en la población (las desviaciones estándar rondan los 44 mg/dL).

El cálculo del tamaño del efecto (d aproximadamente = -0.093) sugiere que esta diferencia, aunque detectable con una muestra tan grande, prácticamente no tiene impacto. Es decir, la diferencia existe, pero es mínima, y no sugiere que fumar esté “protegiendo” a nadie del colesterol alto. Lo más probable es que esta pequeña diferencia esté influenciada por otros factores, como la edad (los no fumadores eran ligeramente mayores), y no por el hábito de fumar en sí.

Frecuencia cardiaca: fumadores vs no fumadores

resumen_hr <- datos |>
  group_by(current_smoker) |>
  summarise(
    n = n(),
    media_hr = mean(heart_rate, na.rm = TRUE),
    sd_hr = sd(heart_rate, na.rm = TRUE)
  )
resumen_hr
## # A tibble: 2 × 4
##   current_smoker     n media_hr sd_hr
##   <fct>          <int>    <dbl> <dbl>
## 1 No fumador      1968     75.0  12.2
## 2 Fumador         1932     76.4  11.8
hr_fumador    <- datos$heart_rate[datos$current_smoker == "Fumador"]
hr_no_fumador <- datos$heart_rate[datos$current_smoker == "No fumador"]

prueba_hr_smoker <- t.test(
  hr_fumador,
  hr_no_fumador,
  alternative = "greater",
  var.equal = FALSE
)
prueba_hr_smoker
## 
##  Welch Two Sample t-test
## 
## data:  hr_fumador and hr_no_fumador
## t = 3.5809, df = 3896.4, p-value = 0.0001733
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  0.7434658       Inf
## sample estimates:
## mean of x mean of y 
##  76.38302  75.00762
media_hr_fum <- mean(hr_fumador, na.rm = TRUE)
media_hr_no  <- mean(hr_no_fumador, na.rm = TRUE)
sd_hr_fum    <- sd(hr_fumador, na.rm = TRUE)
sd_hr_no     <- sd(hr_no_fumador, na.rm = TRUE)
n_hr_fum     <- sum(!is.na(hr_fumador))
n_hr_no      <- sum(!is.na(hr_no_fumador))

sd_pooled_hr <- sqrt(((n_hr_fum - 1) * sd_hr_fum^2 + (n_hr_no - 1) * sd_hr_no^2) /
                       (n_hr_fum + n_hr_no - 2))

d_hr <- (media_hr_fum - media_hr_no) / sd_pooled_hr
d_hr
## [1] 0.1146433

Cuando comparamos la frecuencia cardíaca entre fumadores y no fumadores, vemos que los fumadores tienen un valor promedio un poco más alto (76.4 lpm) en comparación con los no fumadores (75.0 lpm). Aunque la diferencia es pequeña (alrededor de 1.4 latidos por minuto), la prueba nos muestra que sí es importante (p = 0.00017). El intervalo de confianza indica que, en promedio, los fumadores laten al menos 0.74 lpm más rápido que los no fumadores. Sin embargo, al igual que pasó con el colesterol, el tamaño del efecto es muy pequeño (d = 0.11), lo cual significa que, aunque la diferencia existe, no es grande. Lo que nos lleva a concluir que fumar sí parece acelerar un poco la frecuencia cardíaca, algo que se sabe es efecto del consumo nicotina. Pero la diferencia es tan leve que no cambia drásticamente el comportamiento general de la población. La mayoría de personas, tanto fumadoras como no fumadoras, siguen teniendo valores dentro de rangos normales.

Prueba para diferencia de proporciones

Colesterol alto: fumadores vs no fumadores

tabla_chol_smoker <- datos |>
  count(current_smoker, factor_colesterol_alto) |>
  group_by(current_smoker) |>
  mutate(prop = n / sum(n))

tabla_chol_smoker
## # A tibble: 4 × 4
## # Groups:   current_smoker [2]
##   current_smoker factor_colesterol_alto     n  prop
##   <fct>          <fct>                  <int> <dbl>
## 1 No fumador     No alto                 1089 0.553
## 2 No fumador     Alto                     879 0.447
## 3 Fumador        No alto                 1142 0.591
## 4 Fumador        Alto                     790 0.409
x_fumador    <- sum(datos$colesterol_alto == 1 & datos$current_smoker == "Fumador", na.rm = TRUE)
n_fumador    <- sum(datos$current_smoker == "Fumador"    & !is.na(datos$colesterol_alto))
x_no_fumador <- sum(datos$colesterol_alto == 1 & datos$current_smoker == "No fumador", na.rm = TRUE)
n_no_fumador <- sum(datos$current_smoker == "No fumador" & !is.na(datos$colesterol_alto))

prueba_prop_chol_smoker <- prop.test(
  x = c(x_fumador, x_no_fumador),
  n = c(n_fumador, n_no_fumador),
  alternative = "two.sided",
  correct = FALSE
)
prueba_prop_chol_smoker
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(x_fumador, x_no_fumador) out of c(n_fumador, n_no_fumador)
## X-squared = 5.6732, df = 1, p-value = 0.01723
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.068776154 -0.006711146
## sample estimates:
##    prop 1    prop 2 
## 0.4089027 0.4466463
tabla_2x2 <- table(datos$current_smoker, datos$factor_colesterol_alto)
tabla_2x2
##             
##              No alto Alto
##   No fumador    1089  879
##   Fumador       1142  790
a <- tabla_2x2["Fumador", "Alto"]
b <- tabla_2x2["Fumador", "No alto"]
c <- tabla_2x2["No fumador", "Alto"]
d <- tabla_2x2["No fumador", "No alto"]

riesgo_fumador    <- a / (a + b)
riesgo_no_fumador <- c / (c + d)

riesgo_relativo <- riesgo_fumador / riesgo_no_fumador
odds_ratio      <- (a * d) / (b * c)

riesgo_fumador
## [1] 0.4089027
riesgo_no_fumador
## [1] 0.4466463
riesgo_relativo
## [1] 0.9154954
odds_ratio
## [1] 0.8570378

Al comparar el colesterol alto entre fumadores y no fumadores, se ve que los porcentajes son parecidos, pero con una pequeña diferencia: los no fumadores tienen una proporción un poco mayor de personas con colesterol alto. Entre los no fumadores, el 44.7% supera los 240 mg/dL, mientras que entre los fumadores ese valor baja a 40.9%.

La prueba anterior confirma que esta diferencia, aunque no es enorme, sí es real (p ≈ 0.017). El intervalo de confianza también muestra que la proporción de colesterol alto en fumadores es entre 0.7% y 6.8% menor que en los no fumadores.

Cuando calculamos el riesgo directamente, se ve lo mismo. El “riesgo” de tener colesterol alto es:

  • 40.9% para fumadores

  • 44.7% para no fumadores

El riesgo relativo (≈0.91) muestra que los fumadores tienen un 9% menos de riesgo, aunque esto no quiere decir que fumar “proteja” de algo. Lo más probable es que esta diferencia esté influenciada por otros factores, sobre todo la edad, porque los no fumadores eran un poco mayores en promedio.

El odds ratio (≈0.86) también va en la misma dirección, en donde los no fumadores tienen una ligera mayor probabilidad de aparecer en la categoría de colesterol alto.