El presente análisis tiene como finalidad aplicar distintas pruebas de hipótesis utilizando el lenguaje de programación R, tomando como base el dataset Smokers Health Data. Esta base contiene información clínica y fisiológica de personas fumadoras y no fumadoras, lo que permite comparar medias y proporciones asociadas a variables de salud como la frecuencia cardíaca y el nivel de colesterol.
# Cargar librerías necesarias
library(ggplot2)
library(dplyr)
library(gridExtra)
library(knitr)
library(broom)
# Cargar los datos
data <- read.csv("smoking_health_data_final.csv")
# Exploración inicial de los datos
head(data)## 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
## age sex current_smoker heart_rate
## Min. :32.00 Length:3900 Length:3900 Min. : 44.00
## 1st Qu.:42.00 Class :character Class :character 1st Qu.: 68.00
## Median :49.00 Mode :character Mode :character Median : 75.00
## Mean :49.54 Mean : 75.69
## 3rd Qu.:56.00 3rd Qu.: 82.00
## Max. :70.00 Max. :143.00
##
## blood_pressure cigs_per_day chol
## Length:3900 Min. : 0.000 Min. :113.0
## Class :character 1st Qu.: 0.000 1st Qu.:206.0
## Mode :character Median : 0.000 Median :234.0
## Mean : 9.169 Mean :236.6
## 3rd Qu.:20.000 3rd Qu.:263.0
## Max. :70.000 Max. :696.0
## NA's :14 NA's :7
## '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 ...
## Distribución de fumadores:
##
## no yes
## 1968 1932
##
## Estadísticas de frecuencia cardíaca:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 44.00 68.00 75.00 75.69 82.00 143.00
##
## Estadísticas de colesterol:
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 113.0 206.0 234.0 236.6 263.0 696.0 7
Objetivo: Comprobar si la frecuencia cardíaca promedio de los individuos en la muestra es igual a 75 latidos por minuto.
Hipótesis: - H₀: μ = 75 (La media poblacional de frecuencia cardíaca es igual a 75) - H₁: μ ≠ 75 (La media poblacional de frecuencia cardíaca es diferente de 75)
# Prueba t de una muestra para frecuencia cardíaca
test1 <- t.test(data$heart_rate, mu = 75)
print(test1)##
## One Sample t-test
##
## data: data$heart_rate
## 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
# Estadísticas descriptivas
mean_hr <- mean(data$heart_rate, na.rm = TRUE)
sd_hr <- sd(data$heart_rate, na.rm = TRUE)
cat(sprintf("Media muestral: %.2f lpm\n", mean_hr))## Media muestral: 75.69 lpm
## Desviación estándar: 12.02 lpm
# Visualización
p1 <- ggplot(data, aes(x = heart_rate)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", alpha = 0.7, color = "black") +
geom_density(color = "red", size = 1) +
geom_vline(xintercept = 75, color = "blue", linetype = "dashed", size = 1.2) +
geom_vline(xintercept = mean_hr, color = "red", linetype = "solid", size = 1.2) +
labs(title = "Distribución de Frecuencia Cardíaca",
subtitle = paste("Línea azul: Valor de referencia (75 lpm)\nLínea roja: Media muestral (", round(mean_hr, 1), "lpm)"),
x = "Frecuencia Cardíaca (lpm)", y = "Densidad") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
print(p1)Interpretación del resultado: Con un p-valor de 3.47^{-4}, que es menor que α = 0.05, rechazamos la hipótesis nula. Existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de la población es significativamente diferente de 75 lpm.
Objetivo: Evaluar si los niveles medios de colesterol en la muestra superan el valor umbral de 200 mg/dL.
Hipótesis: - H₀: μ ≤ 200 (El nivel medio de colesterol es menor o igual a 200) - H₁: μ > 200 (El nivel medio de colesterol es mayor a 200)
# Prueba t de una muestra para colesterol (cola derecha)
test2 <- t.test(data$chol, mu = 200, alternative = "greater")
print(test2)##
## One Sample t-test
##
## data: 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
# Estadísticas descriptivas
mean_chol <- mean(data$chol, na.rm = TRUE)
sd_chol <- sd(data$chol, na.rm = TRUE)
cat(sprintf("Media muestral: %.2f mg/dL\n", mean_chol))## Media muestral: 236.60 mg/dL
## Desviación estándar: 44.38 mg/dL
# Visualización
p2 <- ggplot(data, aes(x = chol)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "lightgreen", alpha = 0.7, color = "black") +
geom_density(color = "red", size = 1) +
geom_vline(xintercept = 200, color = "blue", linetype = "dashed", size = 1.2) +
geom_vline(xintercept = mean_chol, color = "red", linetype = "solid", size = 1.2) +
labs(title = "Distribución de Niveles de Colesterol",
subtitle = paste("Línea azul: Valor umbral (200 mg/dL)\nLínea roja: Media muestral (", round(mean_chol, 1), "mg/dL)"),
x = "Colesterol (mg/dL)", y = "Densidad") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
print(p2)Interpretación del resultado: Con un p-valor de 0, que es menor que α = 0.05, rechazamos la hipótesis nula. Existe evidencia estadística suficiente para concluir que el nivel medio de colesterol en la población es significativamente mayor a 200 mg/dL.
Objetivo: Evaluar si la proporción de personas con colesterol alto es mayor al 20%.
# Crear variable binaria para colesterol alto
data$chol_alto <- ifelse(data$chol > 240, 1, 0)
# Calcular proporción observada
prop_chol_alto <- mean(data$chol_alto, na.rm = TRUE)
n_chol_alto <- sum(data$chol_alto, na.rm = TRUE)
n_total <- length(data$chol_alto[!is.na(data$chol_alto)])
cat(sprintf("Proporción observada: %.4f (%.2f%%)\n", prop_chol_alto, prop_chol_alto*100))## Proporción observada: 0.4287 (42.87%)
## Casos con colesterol alto: 1669 de 3893
# Prueba de proporción (cola derecha)
test3 <- prop.test(n_chol_alto, n_total, p = 0.20, alternative = "greater")
print(test3)##
## 1-sample proportions test with continuity correction
##
## data: n_chol_alto out of n_total, null probability 0.2
## X-squared = 1271.4, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
## 0.4155977 1.0000000
## sample estimates:
## p
## 0.4287182
# Visualización
prop_data <- data.frame(
Categoria = c("Normal/Saludable (≤240)", "Alto (>240)"),
Frecuencia = c(n_total - n_chol_alto, n_chol_alto),
Proporcion = c(1 - prop_chol_alto, prop_chol_alto)
)
p3 <- ggplot(prop_data, aes(x = Categoria, y = Proporcion, fill = Categoria)) +
geom_bar(stat = "identity", alpha = 0.7, color = "black") +
geom_hline(yintercept = 0.20, color = "red", linetype = "dashed", size = 1.2) +
geom_text(aes(label = paste0(round(Proporcion*100, 1), "%")),
vjust = -0.5, size = 4, fontface = "bold") +
scale_fill_manual(values = c("lightblue", "orange")) +
labs(title = "Proporción de Personas con Colesterol Alto",
subtitle = "Línea roja: Valor de referencia (20%)",
x = "Nivel de Colesterol", y = "Proporción", fill = "Categoría") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
legend.position = "none")
print(p3)Interpretación: Con un p-valor de 0, que es menor que α = 0.05, rechazamos la hipótesis nula. La proporción de personas con colesterol alto es significativamente mayor al 20%.
Objetivo: Evaluar si la proporción de personas con taquicardia es diferente del 5%.
# Crear variable binaria para taquicardia
data$taquicardia <- ifelse(data$heart_rate > 100, 1, 0)
# Calcular proporción observada
prop_taqui <- mean(data$taquicardia, na.rm = TRUE)
n_taqui <- sum(data$taquicardia, na.rm = TRUE)
n_total_hr <- length(data$taquicardia[!is.na(data$taquicardia)])
cat(sprintf("Proporción observada: %.4f (%.2f%%)\n", prop_taqui, prop_taqui*100))## Proporción observada: 0.0238 (2.38%)
## Casos con taquicardia: 93 de 3900
# Prueba de proporción (dos colas)
test4 <- prop.test(n_taqui, n_total_hr, p = 0.05, alternative = "two.sided")
print(test4)##
## 1-sample proportions test with continuity correction
##
## data: n_taqui out of n_total_hr, null probability 0.05
## X-squared = 55.613, df = 1, p-value = 8.825e-14
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
## 0.01939026 0.02926409
## sample estimates:
## p
## 0.02384615
# Visualización
taqi_data <- data.frame(
Categoria = c("Normal (≤100)", "Taquicardia (>100)"),
Frecuencia = c(n_total_hr - n_taqui, n_taqui),
Proporcion = c(1 - prop_taqui, prop_taqui)
)
p4 <- ggplot(taqi_data, aes(x = Categoria, y = Proporcion, fill = Categoria)) +
geom_bar(stat = "identity", alpha = 0.7, color = "black") +
geom_hline(yintercept = 0.05, color = "red", linetype = "dashed", size = 1.2) +
geom_text(aes(label = paste0(round(Proporcion*100, 1), "%")),
vjust = -0.5, size = 4, fontface = "bold") +
scale_fill_manual(values = c("lightgreen", "red")) +
labs(title = "Proporción de Personas con Taquicardia",
subtitle = "Línea roja: Valor de referencia (5%)",
x = "Frecuencia Cardíaca", y = "Proporción", fill = "Categoría") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
legend.position = "none")
print(p4)Interpretación: Con un p-valor de 0, que es mayor que α = 0.05, no rechazamos la hipótesis nula. No hay evidencia suficiente para concluir que la proporción de personas con taquicardia sea diferente del 5%.
Objetivo: Evaluar si existen diferencias significativas en los niveles promedio de colesterol entre fumadores y no fumadores.
# Separar datos por grupo
fumadores <- data$chol[data$current_smoker == "yes"]
no_fumadores <- data$chol[data$current_smoker == "no"]
# Estadísticas descriptivas por grupo
stats_by_group <- data %>%
group_by(current_smoker) %>%
summarise(
n = n(),
media = mean(chol, na.rm = TRUE),
sd = sd(chol, na.rm = TRUE),
.groups = 'drop'
)
print(stats_by_group)## # A tibble: 2 × 4
## current_smoker n media sd
## <chr> <int> <dbl> <dbl>
## 1 no 1968 239. 43.9
## 2 yes 1932 235. 44.8
# Prueba t de dos muestras independientes
test5 <- t.test(fumadores, no_fumadores, var.equal = FALSE)
print(test5)##
## Welch Two Sample t-test
##
## data: fumadores and no_fumadores
## 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
# Visualización comparativa
p5a <- ggplot(data, aes(x = current_smoker, y = chol, fill = current_smoker)) +
geom_boxplot(alpha = 0.7, outlier.alpha = 0.5) +
geom_jitter(width = 0.2, alpha = 0.3, size = 0.8) +
stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "red") +
scale_fill_manual(values = c("lightblue", "orange")) +
labs(title = "Distribución de Colesterol por Grupo",
subtitle = "Rombo rojo indica la media",
x = "Grupo", y = "Colesterol (mg/dL)", fill = "Fumador") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
p5b <- ggplot(data, aes(x = chol, fill = current_smoker)) +
geom_density(alpha = 0.6) +
scale_fill_manual(values = c("lightblue", "orange")) +
labs(title = "Densidad de Colesterol por Grupo",
x = "Colesterol (mg/dL)", y = "Densidad", fill = "Fumador") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
grid.arrange(p5a, p5b, ncol = 2)Interpretación: Con un p-valor de 0.003612, que es menor que α = 0.05, rechazamos la hipótesis nula. Existe evidencia estadística significativa de que los niveles medios de colesterol difieren entre fumadores y no fumadores.
Objetivo: Analizar si la frecuencia cardíaca promedio difiere entre fumadores y no fumadores.
# Separar datos por grupo
hr_fumadores <- data$heart_rate[data$current_smoker == "yes"]
hr_no_fumadores <- data$heart_rate[data$current_smoker == "no"]
# Estadísticas descriptivas por grupo
stats_hr_by_group <- data %>%
group_by(current_smoker) %>%
summarise(
n = n(),
media = mean(heart_rate, na.rm = TRUE),
sd = sd(heart_rate, na.rm = TRUE),
.groups = 'drop'
)
print(stats_hr_by_group)## # A tibble: 2 × 4
## current_smoker n media sd
## <chr> <int> <dbl> <dbl>
## 1 no 1968 75.0 12.2
## 2 yes 1932 76.4 11.8
# Prueba t de dos muestras (cola derecha: fumadores > no fumadores)
test6 <- t.test(hr_fumadores, hr_no_fumadores, alternative = "greater")
print(test6)##
## Welch Two Sample t-test
##
## data: hr_fumadores and hr_no_fumadores
## 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
# Visualización comparativa
p6a <- ggplot(data, aes(x = current_smoker, y = heart_rate, fill = current_smoker)) +
geom_boxplot(alpha = 0.7, outlier.alpha = 0.5) +
geom_jitter(width = 0.2, alpha = 0.3, size = 0.8) +
stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "red") +
scale_fill_manual(values = c("lightgreen", "salmon")) +
labs(title = "Distribución de Frecuencia Cardíaca por Grupo",
subtitle = "Rombo rojo indica la media",
x = "Grupo", y = "Frecuencia Cardíaca (lpm)", fill = "Fumador") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
p6b <- ggplot(data, aes(x = heart_rate, fill = current_smoker)) +
geom_density(alpha = 0.6) +
scale_fill_manual(values = c("lightgreen", "salmon")) +
labs(title = "Densidad de Frecuencia Cardíaca por Grupo",
x = "Frecuencia Cardíaca (lpm)", y = "Densidad", fill = "Fumador") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
grid.arrange(p6a, p6b, ncol = 2)Interpretación: Con un p-valor de 1.73^{-4}, que es menor que α = 0.05, rechazamos la hipótesis nula. Existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los fumadores es significativamente mayor que la de los no fumadores.
Objetivo: Determinar si la proporción de personas con colesterol alto difiere entre fumadores y no fumadores.
# Crear tabla de contingencia
tabla_contingencia <- table(data$current_smoker, data$chol_alto)
print("Tabla de Contingencia:")## [1] "Tabla de Contingencia:"
##
## 0 1
## no 1086 879
## yes 1138 790
# Calcular proporciones por grupo
prop_by_group <- data %>%
filter(!is.na(chol_alto)) %>%
group_by(current_smoker) %>%
summarise(
n_total = n(),
n_alto = sum(chol_alto),
prop_alto = mean(chol_alto),
.groups = 'drop'
)
print(prop_by_group)## # A tibble: 2 × 4
## current_smoker n_total n_alto prop_alto
## <chr> <int> <dbl> <dbl>
## 1 no 1965 879 0.447
## 2 yes 1928 790 0.410
# Prueba de proporciones de dos muestras
test7 <- prop.test(tabla_contingencia[, 2], rowSums(tabla_contingencia))
print(test7)##
## 2-sample test for equality of proportions with continuity correction
##
## data: tabla_contingencia[, 2] out of rowSums(tabla_contingencia)
## X-squared = 5.4583, df = 1, p-value = 0.01948
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.005995786 0.069158628
## sample estimates:
## prop 1 prop 2
## 0.4473282 0.4097510
# Visualización de proporciones por grupo
p7 <- ggplot(prop_by_group, aes(x = current_smoker, y = prop_alto, fill = current_smoker)) +
geom_bar(stat = "identity", alpha = 0.7, color = "black") +
geom_text(aes(label = paste0(round(prop_alto*100, 1), "%")),
vjust = -0.5, size = 5, fontface = "bold") +
scale_fill_manual(values = c("lightcyan", "lightcoral")) +
labs(title = "Proporción de Colesterol Alto por Grupo",
subtitle = "Comparación entre fumadores y no fumadores",
x = "Grupo", y = "Proporción con Colesterol Alto", fill = "Fumador") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
legend.position = "none")
print(p7)Interpretación: Con un p-valor de 0.019476, que es mayor que α = 0.05, no rechazamos la hipótesis nula. No hay evidencia estadística suficiente para concluir que la proporción de personas con colesterol alto sea diferente entre fumadores y no fumadores.
# Crear tabla resumen de todas las pruebas
resultados <- data.frame(
Prueba = c("1. FC vs 75 lpm",
"2. Colesterol vs 200 mg/dL",
"3. Prop. colesterol alto vs 20%",
"4. Prop. taquicardia vs 5%",
"5. Colesterol: fumadores vs no fumadores",
"6. FC: fumadores vs no fumadores",
"7. Prop. colesterol alto: grupos"),
Tipo = c("t-test una muestra",
"t-test una muestra",
"prop.test una muestra",
"prop.test una muestra",
"t-test dos muestras",
"t-test dos muestras",
"prop.test dos muestras"),
P_valor = c(round(test1$p.value, 6),
round(test2$p.value, 6),
round(test3$p.value, 6),
round(test4$p.value, 6),
round(test5$p.value, 6),
round(test6$p.value, 6),
round(test7$p.value, 6)),
Significativo = c(test1$p.value < 0.05,
test2$p.value < 0.05,
test3$p.value < 0.05,
test4$p.value < 0.05,
test5$p.value < 0.05,
test6$p.value < 0.05,
test7$p.value < 0.05),
Decision = c("Rechazar H₀", "Rechazar H₀", "Rechazar H₀", "No rechazar H₀",
"Rechazar H₀", "Rechazar H₀", "No rechazar H₀")
)
kable(resultados, caption = "Resumen de Pruebas de Hipótesis (α = 0.05)")| Prueba | Tipo | P_valor | Significativo | Decision |
|---|---|---|---|---|
| 1. FC vs 75 lpm | t-test una muestra | 0.000347 | TRUE | Rechazar H₀ |
| 2. Colesterol vs 200 mg/dL | t-test una muestra | 0.000000 | TRUE | Rechazar H₀ |
| 3. Prop. colesterol alto vs 20% | prop.test una muestra | 0.000000 | TRUE | Rechazar H₀ |
| 4. Prop. taquicardia vs 5% | prop.test una muestra | 0.000000 | TRUE | No rechazar H₀ |
| 5. Colesterol: fumadores vs no fumadores | t-test dos muestras | 0.003612 | TRUE | Rechazar H₀ |
| 6. FC: fumadores vs no fumadores | t-test dos muestras | 0.000173 | TRUE | Rechazar H₀ |
| 7. Prop. colesterol alto: grupos | prop.test dos muestras | 0.019476 | TRUE | No rechazar H₀ |
Los resultados sugieren que el tabaquismo tiene un efecto significativo en la frecuencia cardíaca pero no necesariamente en la prevalencia de colesterol alto. Esto indica que los efectos cardiovasculares del tabaquismo pueden manifestarse de diferentes maneras en distintos biomarcadores.
-Final del informe-