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.
# 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.
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.
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
# 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.
# 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).
# 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.
# 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.
# 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.
# 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 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 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_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"
)
| 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.
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"
)
| 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"
)
| 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%.
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.
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.
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.
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.
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.
En todas las pruebas usaremos un nivel de significancia \(\alpha = 0.05\).
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.
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.
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
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
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í.
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.
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.