En esta actividad se realiza diferentes analisis de pruebas de Hipotesis para Smokers Health Data
##########################################
# Cargar paquetes necesarios
##########################################
library(readr)
library(dplyr)
library(ggplot2)
library(stringr)
library(tidyr)
library(tigerstats)
library(BSDA)
##########################################
# Cargar y preparar la base de datos
##########################################
healthdata <- read_csv("smoking_health_data_final.csv")
## Rows: 3900 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): sex, current_smoker, blood_pressure
## dbl (4): age, heart_rate, cigs_per_day, chol
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(healthdata)
## spc_tbl_ [3,900 × 7] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ age : num [1:3900] 54 45 58 42 42 57 43 42 37 49 ...
## $ sex : chr [1:3900] "male" "male" "male" "male" ...
## $ current_smoker: chr [1:3900] "yes" "yes" "yes" "yes" ...
## $ heart_rate : num [1:3900] 95 64 81 90 62 62 75 66 65 93 ...
## $ blood_pressure: chr [1:3900] "110/72" "121/72" "127.5/76" "122.5/80" ...
## $ cigs_per_day : num [1:3900] NA NA NA NA NA NA NA NA NA NA ...
## $ chol : num [1:3900] 219 248 235 225 226 223 222 196 188 256 ...
## - attr(*, "spec")=
## .. cols(
## .. age = col_double(),
## .. sex = col_character(),
## .. current_smoker = col_character(),
## .. heart_rate = col_double(),
## .. blood_pressure = col_character(),
## .. cigs_per_day = col_double(),
## .. chol = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
dim(healthdata)
## [1] 3900 7
names(healthdata)
## [1] "age" "sex" "current_smoker" "heart_rate"
## [5] "blood_pressure" "cigs_per_day" "chol"
Como se vizualiza la variable blood_pressure la toma como caracter, pero en realidad son dos valores numericos separados, por lo cual realizo la separacion de blood_pressure en systolic y diastolic
# Separo blood_pressure en systolic y diastolic usando stringr y tidyr
healthdata <- healthdata %>%
separate(blood_pressure, into = c("systolic_bp", "diastolic_bp"), sep = "/") %>%
mutate(systolic_bp = as.numeric(str_trim(systolic_bp)),
diastolic_bp = as.numeric(str_trim(diastolic_bp)))
glimpse(healthdata)
## Rows: 3,900
## Columns: 8
## $ age <dbl> 54, 45, 58, 42, 42, 57, 43, 42, 37, 49, 55, 39, 53, 45,…
## $ sex <chr> "male", "male", "male", "male", "male", "male", "male",…
## $ current_smoker <chr> "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes",…
## $ heart_rate <dbl> 95, 64, 81, 90, 62, 62, 75, 66, 65, 93, 70, 85, 58, 83,…
## $ systolic_bp <dbl> 110.0, 121.0, 127.5, 122.5, 119.0, 107.5, 109.5, 123.0,…
## $ diastolic_bp <dbl> 72.0, 72.0, 76.0, 80.0, 80.0, 72.5, 69.0, 73.0, 77.0, 8…
## $ cigs_per_day <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ chol <dbl> 219, 248, 235, 225, 226, 223, 222, 196, 188, 256, 214, …
Convierto las variables que son caracteres en factor ya que son variables categoricas
healthdata <- healthdata %>%
mutate(sex = as.factor(sex),
current_smoker = as.factor(current_smoker))
colSums(is.na(healthdata))
## age sex current_smoker heart_rate systolic_bp
## 0 0 0 0 0
## diastolic_bp cigs_per_day chol
## 0 14 7
# Lleno los valores NA, para no fumadores la cantidad seria 0 y para los fumadores la opcion seria la mediana
healthdata <- healthdata %>%
mutate(cigs_per_day = case_when(
is.na(cigs_per_day) & current_smoker == "no" ~ 0,
is.na(cigs_per_day) & current_smoker == "yes" ~ median(cigs_per_day[current_smoker == "yes"], na.rm = TRUE),
TRUE ~ cigs_per_day
))
# Lleno los valores NA en chol (colesterol) con la mediana por grupo de edad
healthdata <- healthdata %>%
group_by(age) %>%
mutate(chol = ifelse(is.na(chol), median(chol, na.rm = TRUE), chol)) %>%
ungroup()
summary(healthdata)
## age sex current_smoker heart_rate systolic_bp
## Min. :32.00 female:2081 no :1968 Min. : 44.00 Min. : 83.5
## 1st Qu.:42.00 male :1819 yes:1932 1st Qu.: 68.00 1st Qu.:117.0
## Median :49.00 Median : 75.00 Median :128.0
## Mean :49.54 Mean : 75.69 Mean :132.4
## 3rd Qu.:56.00 3rd Qu.: 82.00 3rd Qu.:144.0
## Max. :70.00 Max. :143.00 Max. :295.0
## diastolic_bp cigs_per_day chol
## Min. : 48.00 Min. : 0.000 Min. :113.0
## 1st Qu.: 75.00 1st Qu.: 0.000 1st Qu.:206.0
## Median : 82.00 Median : 0.000 Median :234.0
## Mean : 82.99 Mean : 9.207 Mean :236.6
## 3rd Qu.: 90.00 3rd Qu.:20.000 3rd Qu.:263.0
## Max. :142.50 Max. :70.000 Max. :696.0
unique(healthdata$sex)
## [1] male female
## Levels: female male
unique(healthdata$current_smoker)
## [1] yes no
## Levels: no yes
Con base en el dataset Se desea comprobar si la frecuencia cardíaca promedio de los individuos en la muestra es igual a 75 latidos por minuto, valor que podría considerarse una referencia general para adultos sanos en reposo.
Hipótesis: \[ \begin{matrix} H_0: \mu = 75\ \text{lpm} \\ H_1: \mu \neq 75\ \text{lpm} \\ \end{matrix} \] El resultado de la prueba de hipotesis:
z.test(x = healthdata$heart_rate,
sigma.x = sd(healthdata$heart_rate),
mu = 75,
alternative = "two.sided",
conf.level = 0.95)
##
## One-sample z-Test
##
## data: healthdata$heart_rate
## z = 3.5809, p-value = 0.0003423
## alternative hypothesis: true mean is not equal to 75
## 95 percent confidence interval:
## 75.31188 76.06607
## sample estimates:
## mean of x
## 75.68897
Lo anterior nos indica que con una Z estadistica de 3.5809 obtenemos un P-value de 0.0003423, En este caso el P-value es menor 0.05, por lo cual rechazamos la \(H_0\), sugiriendo que la frecuencia cardíaca promedio es significativamente diferente de 75 lpm.
Se quiere evaluar si los niveles medios de colesterol en la muestra superan el valor umbral de 200 \({mg/dL}\), punto a partir del cual se considera que existe hipercolesterolemia.
Hipótesis:
\[ \begin{matrix} H_0&: \mu \leq 200\ \text{mg/dL} \\ H_1&: \mu > 200\ \text{mg/dL} \\ \end{matrix} \]
El resultado de la prueba de hipotesis:
z.test(x = healthdata$chol,
sigma.x = sd(healthdata$chol),
mu = 200,
alternative = "greater",
conf.level = 0.95)
##
## One-sample z-Test
##
## data: healthdata$chol
## z = 51.545, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 200
## 95 percent confidence interval:
## 235.4269 NA
## sample estimates:
## mean of x
## 236.5946
Lo anterior nos indica que con una Z estadistica de 51.545 obtenemos un P-value de < 2.2e-16,lo anterior nos indica que hay evidencia estadística de que el colesterol promedio es mayor a 200 \({mg/dL}\)
Se considera que una persona tiene colesterol alto si su nivel es mayor a 240 mg/dL (según criterios médicos comunes).
Nueva variable binaria:
\[ Z = \begin{cases} 1 & \text{si } \text{chol} > 240 \\ 0 & \text{si } \text{chol} \leq 240 \end{cases} \]
Hipotesis:
\[ \begin{aligned} H_0&: p = 0.20 \\ H_1&: p > 0.20 \\ \end{aligned} \]
El resultado de la prueba de hipotesis:
# Creacion variable binaria
healthdata$high_chol <- ifelse(healthdata$chol > 240, 1, 0)
# Prueba de proporción
prop.test(x = sum(healthdata$high_chol),
n = nrow(healthdata),
p = 0.20,
alternative = "greater",
conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: sum out of nrowhealthdata$high_chol out of healthdata
## X-squared = 1268, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
## 0.4150988 1.0000000
## sample estimates:
## p
## 0.4282051
En ese caso con un P-value de < 2.2e-16 la proporción de personas con colesterol alto es significativamente mayor al 20%.
Se considera que una persona tiene taquicardia si su frecuencia cardíaca es mayor a 100 lpm (según criterios clínicos).
Nueva variable binaria:
\[ W = \begin{cases} 1 & \text{si } {heart\_rate} > 100 \\ 0 & \text{si } {heart\_rate} \leq 100 \end{cases} \]
Hipotesis:
\[ \begin{aligned} H_0&\colon p = 0.05 \\ H_1&\colon p \neq 0.05 \end{aligned} \]
El resultado de la prueba de hipotesis:
# Crear variable binaria
healthdata$tachycardia <- ifelse(healthdata$heart_rate > 100, 1, 0)
# Prueba de proporción
prop.test(x = sum(healthdata$tachycardia),
n = nrow(healthdata),
p = 0.05,
alternative = "two.sided",
conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: sum out of nrowhealthdata$tachycardia out of healthdata
## 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
En este caso p-value es 8.825e-14, La que muestra estadisticamente que proporción de personas con taquicardia difiere significativamente del 5%.
Se desea evaluar si existen diferencias significativas en los niveles promedio de colesterol entre personas fumadoras y no fumadoras.
Hipotesis:
\[ \begin{aligned} H_0&\colon \mu_{\text{fumadores}} = \mu_{\text{no\_fumadores}} \\ H_1&\colon \mu_{\text{fumadores}} \neq \mu_{\text{no\_fumadores}} \end{aligned} \]
El resultado de la prueba de Hipotesis:
# Dividir los datos por estado de fumador
smoker.chol <- split(healthdata, healthdata$current_smoker)
# Prueba z para dos muestras independientes
z.test(x = smoker.chol$`yes`$chol, # Datos de fumadores
y = smoker.chol$`no`$chol, # Datos de no fumadores
sigma.x = sd(smoker.chol$`yes`$chol),
sigma.y = sd(smoker.chol$`no`$chol),
mu = 0, # Diferencia hipotética bajo H0
alternative = "two.sided",
conf.level = 0.95)
##
## Two-sample z-Test
##
## data: smoker.chol$yes$chol and smoker.chol$no$chol
## z = -2.9179, p-value = 0.003524
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -6.921069 -1.359220
## sample estimates:
## mean of x mean of y
## 234.5054 238.6456
con un Z estadístico Z de -2.9179, El valor negativo indica que la media del grupo de fumadores (234.50 mg/dL) es inferior a la de no fumadores (238.65 mg/dL). y con un p-value de 0.003524 que es my inferior a 0.05, se rechaza \(H_0\) lo que indica que existe evidencia suficiente para afirmar que hay una diferencia significativa en los niveles medios de colesterol entre fumadores y no fumadores.
Se analiza si la frecuencia cardíaca promedio difiere entre quienes fuman y quienes no.
Hipotesis:
\[ \begin{aligned} H_0&\colon \mu_{\text{fumadores}} = \mu_{\text{no\_fumadores}} \\ H_1&\colon \mu_{\text{fumadores}} > \mu_{\text{no\_fumadores}} \end{aligned} \]
El resultado de la prubea de Hipotesis:
# Dividir los datos por estado de fumador
smoker.hr <- split(healthdata, healthdata$current_smoker)
# Prueba z unilateral
z.test(x = smoker.hr$`yes`$heart_rate,
y = smoker.hr$`no`$heart_rate,
sigma.x = sd(smoker.hr$`yes`$heart_rate),
sigma.y = sd(smoker.hr$`no`$heart_rate),
mu = 0,
alternative = "greater", # Prueba unilateral derecha
conf.level = 0.95)
##
## Two-sample z-Test
##
## data: smoker.hr$yes$heart_rate and smoker.hr$no$heart_rate
## z = 3.5809, p-value = 0.0001712
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 0.7436161 NA
## sample estimates:
## mean of x mean of y
## 76.38302 75.00762
Con un Z estadístico de 3.5809, el Valor positivonos indica que la frecuencia cardíaca promedio en fumadores (76.38 lpm) es mayor que en no fumadores (75.01 lpm). y el p-value de 0.0001712, se rechaza \(H_0\) lo que indica que existe evidencia sólida para afirmar que los fumadores tienen una frecuencia cardíaca promedio significativamente mayor que los no fumadores.
7.Diferencia de Proporciones de Colesterol Alto entre Fumadores y No Fumadores
Realizar una prueba de hipótesis que permita determinar si la proporción de individuos con colesterol elevado difiere entre quienes fuman y quienes no lo hacen.
Nueva variable binaria: \[ Z = \begin{cases} 1 & \text{si } chol > 240 \, mg/dL \quad \text{(colesterol alto)} \\ 0 & \text{si } chol \leq 240 \, mg/dL \quad \text{(colesterol normal)} \end{cases} \] Hipotesis:
\[ \begin{aligned} H_0&\colon p_{\text{fumadores}} = p_{\text{no\_fumadores}} \\ H_1&\colon p_{\text{fumadores}} \neq p_{\text{no\_fumadores}} \end{aligned} \]
El resultado de la prueba de hipotesis
#. Crear variable binaria para colesterol alto (chol > 240)
healthdata$colesterol_alto <- ifelse(healthdata$chol > 240, 1, 0)
# Verificar la estructura de current_smoker
table(healthdata$current_smoker) # Debería mostrar "yes" y "no"
##
## no yes
## 1968 1932
# Prueba de proporciones para dos muestras independientes
prop.test(x = c(sum(healthdata$colesterol_alto[healthdata$current_smoker == "yes"]),
sum(healthdata$colesterol_alto[healthdata$current_smoker == "no"])),
n = c(sum(healthdata$current_smoker == "yes"),
sum(healthdata$current_smoker == "no")),
alternative = "two.sided",
conf.level = 0.95)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c out of csum(healthdata$colesterol_alto[healthdata$current_smoker == "yes"]) out of sum(healthdata$current_smoker == "yes")sum(healthdata$colesterol_alto[healthdata$current_smoker == "no"]) out of sum(healthdata$current_smoker == "no")
## X-squared = 5.6709, df = 1, p-value = 0.01725
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.069798845 -0.006704715
## sample estimates:
## prop 1 prop 2
## 0.4089027 0.4471545
p-value de 0.0172 el cual es menor que α = 0.05, se rechaza \(H_0\), lo qu eindica que hay evidencia suficiente para afirmar que la proporción de personas con colesterol alto difiere significativamente entre fumadores y no fumadores.
Estas pruebas permiten determinar con fundamento estadístico si existen diferencias significativas en los indicadores de salud entre fumadores y no fumadores, así como comparar estos indicadores con valores de referencia médicos. La interpretación adecuada del p-valor (considerando α=0.05) es crucial para tomar decisiones informadas en contextos médicos y de salud pública.