INTRODUCCION

En esta actividad se realiza diferentes analisis de pruebas de Hipotesis para Smokers Health Data

Desarrollo de la actividad

##########################################
# 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.

Revision de los Datos

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))

Limpieza de Datos

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
  1. Prueba de hipótesis para la frecuencia cardíaca promedio

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.

  1. Prueba de hipótesis para niveles de colesterol

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}\)

  1. Prueba de proporción para colesterol alto

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%.

  1. Prueba de proporción para taquicardia

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%.

  1. Diferencia de medias de colesterol entre fumadores y no fumadores

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.

  1. Diferencia de medias de frecuencia cardíaca 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.

CONCLUSION

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.