Resumen Ejecutivo

El conjunto de datos Smokers Health Data permite examinar la relación entre el tabaquismo y múltiples variables fisiológicas en adultos. Se trabajó con variables como colesterol, frecuencia cardíaca, presión arterial, entre otras, y se aplicaron pruebas estadísticas inferenciales para evaluar diferencias significativas entre grupos de fumadores y no fumadores.

1. Descarga e Instalación de Librerías

Antes de iniciar el análisis, se instalaron y cargaron los siguientes paquetes necesarios para el procesamiento, análisis y visualización de datos:

# Carga de paquetes necesarios

library(readr)
library(dplyr)
library(ggplot2)
library(stringr)
library(tidyr)
library(BSDA)
library(estadistica)
if (!require("remotes")) install.packages("remotes")
remotes::install_github("homerhanumat/tigerstats")  
library(tigerstats)
# Cargar y preparar la base de datos

insurance <- read_csv("smoking_health_data_final.csv")
insurance <- as.data.frame(unclass(insurance),
                           stringsAsFactors = TRUE)
View(insurance)

2. Preparación y Limpieza de Datos

Se eliminaron duplicados y columnas irrelevantes (e.g., cigs_per_day), Se generaron variables adicionales como:

  • colesterol_alto: si chol > 240.

  • taquicardia: si heart_rate > 100.

También se descompuso la presión arterial en valores numéricos de sistólica y diastólica.

# Eliminar duplicados y columnas sin informacion
insurance <- insurance %>% distinct()
insurance <- insurance %>% select(-cigs_per_day)

# Conteo de valores faltantes por columna
colSums(is.na(insurance))
##            age            sex current_smoker     heart_rate blood_pressure 
##              0              0              0              0              0 
##           chol 
##              7
#Eliminar filas con valores faltantes
insurance <- insurance %>% drop_na(chol)

# Valores únicos por categoría
unique(insurance$sex)
## [1] male   female
## Levels: female male
unique(insurance$current_smoker)
## [1] yes no 
## Levels: no yes
age_sex <- insurance %>% arrange(age, sex)

# Enriquecer la base con nuevas variables

insurance <- insurance %>%
  mutate(niveles_colesterol = ifelse(chol > 240, "Colesterol Alto", "Normal"))

insurance <- insurance %>%
  mutate(taquicardia = ifelse(heart_rate > 100, "Taquicardia", "Normal"))

# Separar presión arterial en dos columnas

# Separar presión arterial en sistólica y diastólica
insurance <- insurance %>%
  separate(blood_pressure, into = c("systolic", "diastolic"), sep = "/", convert = TRUE)

# Resumen estadístico
summary(insurance)
##       age            sex       current_smoker   heart_rate       systolic    
##  Min.   :32.00   female:2081   no :1965       Min.   : 44.0   Min.   : 83.5  
##  1st Qu.:42.00   male  :1812   yes:1928       1st Qu.: 68.0   1st Qu.:117.0  
##  Median :49.00                                Median : 75.0   Median :128.0  
##  Mean   :49.53                                Mean   : 75.7   Mean   :132.4  
##  3rd Qu.:56.00                                3rd Qu.: 82.0   3rd Qu.:144.0  
##  Max.   :70.00                                Max.   :143.0   Max.   :295.0  
##    diastolic           chol       niveles_colesterol taquicardia       
##  Min.   : 48.00   Min.   :113.0   Length:3893        Length:3893       
##  1st Qu.: 75.00   1st Qu.:206.0   Class :character   Class :character  
##  Median : 82.00   Median :234.0   Mode  :character   Mode  :character  
##  Mean   : 82.98   Mean   :236.6                                        
##  3rd Qu.: 90.00   3rd Qu.:263.0                                        
##  Max.   :142.50   Max.   :696.0

3. Visualización exploratoria

Se generó un heatmap que muestra cómo el colesterol promedio varía según grupos de edad y frecuencia cardíaca. Se observan mayores niveles de colesterol en adultos mayores con frecuencia cardíaca más elevada.

resumen_heatmap <- insurance %>%
  mutate(
    age_group = cut(age, breaks = seq(30, 80, by = 5), right = FALSE),
    hr_group = cut(heart_rate, breaks = seq(50, 130, by = 5), right = FALSE)
  ) %>%
  group_by(age_group, hr_group) %>%
  summarise(promedio_chol = mean(chol, na.rm = TRUE), .groups = "drop")

ggplot(resumen_heatmap, aes(x = age_group, 
                            y = hr_group, 
                            fill = promedio_chol)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(promedio_chol, 0)), size = 3) +
  scale_fill_gradient(low = "lightblue", high = "darkred") +
  labs(
    title = "Promedio de colesterol por grupo de edad y frecuencia cardiaca",
    x = "Grupo de Edad",
    y = "Grupo de Frecuencia Cardiaca",
    fill = "Colesterol"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

4. Estadísticas descriptivas adicionales

Se presentan a continuacion las estadisticas descriptivas adicionales

# Función para calcular la moda 

moda <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

# Estadísticas descriptivas para colesterol (chol)

insurance %>% 
  summarise(media_col = mean(chol, na.rm = TRUE), 
            sd_col = sd(chol, na.rm = TRUE),
            mediana_col = median(chol, na.rm = TRUE), 
            moda_col = moda(chol))
##   media_col   sd_col mediana_col moda_col
## 1  236.5959 44.37537         234      240
# Estadísticas por sexo
insurance %>% 
  group_by(sex) %>% 
  summarise(media_col = mean(chol, na.rm = TRUE), 
            sd_col = sd(chol, na.rm = TRUE))
## # A tibble: 2 × 3
##   sex    media_col sd_col
##   <fct>      <dbl>  <dbl>
## 1 female      240.   46.0
## 2 male        233.   42.1
# Estadísticas por sexo y condición de fumador
insurance %>% 
  group_by(sex, current_smoker) %>% 
  summarise(media_col = mean(chol, na.rm = TRUE), 
            sd_col = sd(chol, na.rm = TRUE),
            media_heart = mean(heart_rate, na.rm = TRUE),
            sd_heart = sd(heart_rate, na.rm = TRUE))
## `summarise()` has grouped output by 'sex'. You can override using the `.groups`
## argument.
## # A tibble: 4 × 6
## # Groups:   sex [2]
##   sex    current_smoker media_col sd_col media_heart sd_heart
##   <fct>  <fct>              <dbl>  <dbl>       <dbl>    <dbl>
## 1 female no                  243.   45.8        76.6     12.2
## 2 female yes                 234.   45.9        77.5     12.0
## 3 male   no                  231.   39.1        72.3     11.8
## 4 male   yes                 235.   44.0        75.6     11.6

6. Estadística inferencial

Se utilizó una función personalizada en R para calcular intervalos de confianza del 95% para la media de las variables frecuencia cardíaca (heart_rate) y colesterol (chol). Estos intervalos permiten estimar el rango en el cual es probable que se encuentre la media poblacional, con base en la muestra analizada.

intervalo_confianza_media <- function(data, variable, alpha = 0.05) {
  x <- data[[variable]]
  media_x <- mean(x, na.rm = TRUE)
  sd_x <- sd(x, na.rm = TRUE)
  n <- sum(!is.na(x))
  z <- qnorm(1 - alpha / 2)
  inf <- media_x - z * (sd_x / sqrt(n))
  sup <- media_x + z * (sd_x / sqrt(n))
  data.frame(Variable = variable, Media = media_x, Desviacion = sd_x,
             n = n, Z = z, Limite_Inferior = inf, Limite_Superior = sup)
}

intervalo_confianza_media(insurance, "heart_rate")
##     Variable    Media Desviacion    n        Z Limite_Inferior Limite_Superior
## 1 heart_rate 75.69638   12.02395 3893 1.959964        75.31867        76.07408
intervalo_confianza_media(insurance, "chol")
##   Variable    Media Desviacion    n        Z Limite_Inferior Limite_Superior
## 1     chol 236.5959   44.37537 3893 1.959964         235.202        237.9899

5. Pruebas de Hipótesis

5.1. Frecuencia cardíaca promedio = 75 lpm

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.

H₀: μ₁ = μ₂

H₁: μ₁ ≠ μ₂

z.test(x = insurance$heart_rate, 
       sigma.x = sd(insurance$heart_rate), 
       mu = 75, 
       alternative = "two.sided", 
       conf.level = 0.95)
## 
##  One-sample z-Test
## 
## data:  insurance$heart_rate
## z = 3.6136, p-value = 0.000302
## alternative hypothesis: true mean is not equal to 75
## 95 percent confidence interval:
##  75.31867 76.07408
## sample estimates:
## mean of x 
##  75.69638

Se rechaza la hipotesis en la frecuencia cardiaca promedio esta en 75 latidos por minutos, ya que como se observa en el resultado la frecuencia cardia esta en promedio entre 75.31867 y 76.07408

El p-value tiene un valor de probabilidad de resultado de 0.000302, es decir casi cero, lo que significa tambien que se recha la hipotesis

5.2. Colesterol promedio > 200 mg/dL

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.

H₀: μ ≤ 200

H₁: μ > 200

z.test(x = insurance$chol, 
       sigma.x = sd(insurance$chol),
       mu = 200,
       alternative = "greater", 
       conf.level = 0.95)
## 
##  One-sample z-Test
## 
## data:  insurance$chol
## z = 51.456, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 200
## 95 percent confidence interval:
##  235.4261       NA
## sample estimates:
## mean of x 
##  236.5959

La probabilidad de observar una media ≥ 236.5959 si H₀ fuera cierta (μ ≤ 200) es casi nula. Se rechaza H₀ (p-value < α)

El límite inferior (235.4261) confirma que la verdadera media es mayor a 235.43 con 95% de confianza.

5.3 Proporción con colesterol alto (>240 mg/dL) > 20%

Se considera que una persona tiene colesterol alto si su nivel es mayor a 240 mg/dL (según criterios médicos comunes).

H₀: p = 0.20

H₁: p > 0.20

# Variable binaria (colesterol alto)
insurance <- insurance %>% 
  mutate(colesterol_alto = ifelse(chol > 240, 1, 0))

# Estadísticos descriptivos
n <- nrow(insurance)                     # Tamaño de muestra
exitos <- sum(insurance$colesterol_alto) # Casos con colesterol alto
p_muestral <- exitos/n                   # Proporción muestral
p_hipotesis <- 0.20                      # Proporción bajo H₀

# Resumen descriptivo
cat(" RESUMEN DESCRIPTIVO ")
##  RESUMEN DESCRIPTIVO
cat("Muestra (n):", n, "\n")
## Muestra (n): 3893
cat("Personas con colesterol > 240:", exitos, "\n")
## Personas con colesterol > 240: 1669
cat("Proporcion muestral:", round(p_muestral, 4), "(", round(p_muestral*100, 1), "% )\n")
## Proporcion muestral: 0.4287 ( 42.9 % )
# Verificar condiciones para prueba Z de proporción
#    - np ≥ 10 y n(1-p) ≥ 10
condicion1 <- n * p_hipotesis >= 10
condicion2 <- n * (1 - p_hipotesis) >= 10

cat("\n--- VERIFICACION DE SUPUESTOS ---\n")
## 
## --- VERIFICACION DE SUPUESTOS ---
cat("¿np ≥ 10?", condicion1, "\n")
## ¿np ≥ 10? TRUE
cat("¿n(1-p) ≥ 10?", condicion2, "\n")
## ¿n(1-p) ≥ 10? TRUE
if (!condicion1 | !condicion2) {
  warning("Las condiciones para la prueba Z no se cumplen. Considerar prueba exacta de binomial.")
}

# Prueba de proporciones (prueba Z)
prueba_prop <- prop.test(
  x = exitos,
  n = n,
  p = p_hipotesis,
  alternative = "greater",  # Prueba unilateral derecha (H₁: p > 0.20)
  conf.level = 0.95,
  correct = FALSE          # Sin corrección de continuidad de Yates
)

# Resultados de la prueba
cat("\n--- RESULTADOS DE LA PRUEBA DE HIPOTESIS ---\n")
## 
## --- RESULTADOS DE LA PRUEBA DE HIPOTESIS ---
print(prueba_prop)
## 
##  1-sample proportions test without continuity correction
## 
## data:  exitos out of n
## 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
# Interpretación de resultados
cat("\n--- INTERPRETACION ---\n")
## 
## --- INTERPRETACION ---
if (prueba_prop$p.value < 0.05) {
  cat("Con un valor-p de", format.pval(prueba_prop$p.value, digits = 4), 
      "rechazamos la hipótesis nula (H₀).\n")
  cat("Existe evidencia estadística (α = 0.05) de que la proporción de personas\n")
  cat("con colesterol alto (>240 mg/dL) es MAYOR al 20%.\n")
  cat("Estimacion puntual:", round(p_muestral*100, 1), "%\n")
  cat("IC95% unilateral inferior:", round(prueba_prop$conf.int[1]*100, 1), "% o mas\n")
} else {
  cat("Con un valor-p de", format.pval(prueba_prop$p.value, digits = 4), 
      "NO rechazamos la hipótesis nula (H₀).\n")
  cat("No hay evidencia suficiente (α = 0.05) para afirmar que la proporción\n")
  cat("de personas con colesterol alto (>240 mg/dL) sea mayor al 20%.\n")
}
## Con un valor-p de < 2.2e-16 rechazamos la hipótesis nula (H₀).
## Existe evidencia estadística (α = 0.05) de que la proporción de personas
## con colesterol alto (>240 mg/dL) es MAYOR al 20%.
## Estimacion puntual: 42.9 %
## IC95% unilateral inferior: 41.6 % o mas

5.4 Proporción con taquicardia (>100 lpm) ≠ 5%

Se considera que una persona tiene taquicardia si su frecuencia cardíaca es mayor a 100 lpm (según criterios clínicos).

H₀: p = 0.05

H₁: p ≠ 0.05

# Variable binaria (taquicardia)
insurance <- insurance %>% 
  mutate(taquicardia = ifelse(heart_rate > 100, 1, 0))

# Estadísticos descriptivos
n <- nrow(insurance)                     # Tamaño de muestra
exitos <- sum(insurance$taquicardia) # Casos con colesterol alto
p_muestral <- exitos/n                   # Proporción muestral
p_hipotesis <- 0.05                      # Proporción bajo H₀

# Resumen descriptivo
cat("\n--- RESUMEN DESCRIPTIVO ---\n")
## 
## --- RESUMEN DESCRIPTIVO ---
cat("Muestra (n):", n, "\n")
## Muestra (n): 3893
cat("Personas con taquicardia > 100:", exitos, "\n")
## Personas con taquicardia > 100: 93
cat("Proporcion muestral:", round(p_muestral, 4), "(", round(p_muestral*100, 1), "% )\n")
## Proporcion muestral: 0.0239 ( 2.4 % )
# Verificar condiciones para prueba Z de proporción
#    - np ≥ 10 y n(1-p) ≥ 10
condicion1 <- n * p_hipotesis >= 10
condicion2 <- n * (1 - p_hipotesis) >= 10

cat("\n--- VERIFICACION DE SUPUESTOS ---\n")
## 
## --- VERIFICACION DE SUPUESTOS ---
cat("¿np ≥ 10?", condicion1, "\n")
## ¿np ≥ 10? TRUE
cat("¿n(1-p) ≥ 10?", condicion2, "\n")
## ¿n(1-p) ≥ 10? TRUE
if (!condicion1 | !condicion2) {
  warning("Las condiciones para la prueba Z no se cumplen. Considerar prueba exacta de binomial.")
}

# Prueba de proporciones (prueba Z)
prueba_prop <- prop.test(
  x = exitos,
  n = n,
  p = p_hipotesis,
  alternative = "greater",  # Prueba unilateral derecha (H₁: p > 0.05)
  conf.level = 0.95,
  correct = FALSE          # Sin corrección de continuidad de Yates
)

# Resultados de la prueba
cat("\n--- RESULTADOS DE LA PRUEBA DE HIPOTESIS ---\n")
## 
## --- RESULTADOS DE LA PRUEBA DE HIPOTESIS ---
print(prueba_prop)
## 
##  1-sample proportions test without continuity correction
## 
## data:  exitos out of n
## X-squared = 55.877, df = 1, p-value = 1
## alternative hypothesis: true p is greater than 0.05
## 95 percent confidence interval:
##  0.02018189 1.00000000
## sample estimates:
##          p 
## 0.02388903
# Interpretacion de resultados
cat("\n--- INTERPRETACION ---\n")
## 
## --- INTERPRETACION ---
if (prueba_prop$p.value < 0.05) {
  cat("Con un valor-p de", format.pval(prueba_prop$p.value, digits = 4), 
      "rechazamos la hipótesis nula (H₀).\n")
  cat("Existe evidencia estadística (α = 0.05) de que la proporción de personas\n")
  cat("con taquicardia (>100 lmp) es MAYOR al 5%.\n")
  cat("Estimación puntual:", round(p_muestral*100, 1), "%\n")
  cat("IC95% unilateral inferior:", round(prueba_prop$conf.int[1]*100, 1), "% o más\n")
} else {
  cat("Con un valor-p de", format.pval(prueba_prop$p.value, digits = 4), 
      "NO rechazamos la hipótesis nula (H₀).\n")
  cat("No hay evidencia suficiente (α = 0.05) para afirmar que la proporción\n")
  cat("de personas con taquicardia (>100 lmp) sea mayor al 5%.\n")
}
## Con un valor-p de 1 NO rechazamos la hipótesis nula (H₀).
## No hay evidencia suficiente (α = 0.05) para afirmar que la proporción
## de personas con taquicardia (>100 lmp) sea mayor al 5%.

5.5. Diferencia de medias de colesterol: fumadores vs no fumadores

Se desea evaluar si existen diferencias significativas en los niveles promedio de colesterol entre personas fumadoras y no fumadoras.

H₀: μ₁ = μ₂

H₁: μ₁ ≠ μ₂

chol.current_smoker <- split(insurance, insurance$current_smoker)

z.test(x = chol.current_smoker$yes$chol,
       y = chol.current_smoker$no$chol,
       sigma.x = sd(chol.current_smoker$yes$chol),
       sigma.y = sd(chol.current_smoker$no$chol),
       mu = 0,
       alternative = "two.sided",
       conf.level = 0.95)
## 
##  Two-sample z-Test
## 
## data:  chol.current_smoker$yes$chol and chol.current_smoker$no$chol
## z = -2.9119, p-value = 0.003592
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6.924969 -1.353149
## sample estimates:
## mean of x mean of y 
##  234.5067  238.6458

El valor-p de 0.0036 es menor que el nivel de significancia convencional de 0.05. Se rechaza la hipótesis nula (H₀). Existe evidencia estadísticamente significativa de una diferencia en los niveles medios de colesterol entre fumadores y no fumadores.

Los fumadores presentan en promedio niveles de colesterol más bajos (234.51 mg/dL) que los no fumadores (238.65 mg/dL).

Esta diferencia es estadísticamente significativa pero clínicamente pequeña (4.14 mg/dL).

El intervalo de confianza no incluye el cero (desde -6.92 hasta -1.35 mg/dL), confirmando la significancia.

La diferencia real en la población probablemente está entre 1.35 y 6.92 mg/dL.

5.6. Diferencia de medias de frecuencia cardíaca: fumadores vs no fumadores

Se analiza si la frecuencia cardíaca promedio difiere entre quienes fuman y quienes no.

H₀: μ₁ = μ₂

H₁: μ₁ > μ₂

heart_rate.current_smoker <- split(insurance, insurance$current_smoker)

z.test(x = heart_rate.current_smoker$yes$heart_rate,
       y = heart_rate.current_smoker$no$heart_rate,
       sigma.x = sd(heart_rate.current_smoker$yes$heart_rate),
       sigma.y = sd(heart_rate.current_smoker$no$heart_rate),
       mu = 0,
       alternative = "two.sided",
       conf.level = 0.95)
## 
##  Two-sample z-Test
## 
## data:  heart_rate.current_smoker$yes$heart_rate and heart_rate.current_smoker$no$heart_rate
## z = 3.5748, p-value = 0.0003505
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.6212624 2.1293235
## sample estimates:
## mean of x mean of y 
##  76.39056  75.01527

Existe evidencia estadísticamente significativa (p < 0.001) de que los fumadores presentan mayor frecuencia cardíaca promedio que los no fumadores, con una diferencia estimada de +1.38 lpm (IC95%: +0.62 a +2.13 lpm). Estos resultados apoyan la hipótesis de que el tabaquismo se asocia con elevación de la frecuencia cardíaca en reposo.

5.7. Diferencia en proporciones de colesterol alto entre fumadores y no fumadores

Determinar si la proporción de individuos con colesterol elevado difiere entre quienes fuman y quienes no lo hacen.

H₀: p₁ = p₂

H₁: p₁ ≠ p₂

# Variable binaria de colesterol alto (>240 mg/dL)

insurance <- insurance %>%
  mutate(colesterol_alto = ifelse(chol > 240, 1, 0))

# Estadísticos descriptivos

tabla_resumen <- insurance %>%
  group_by(current_smoker) %>%
  summarise(
    n = n(),
    n_col_alto = sum(colesterol_alto),
    prop_col_alto = mean(colesterol_alto)
  ) %>%
  mutate(grupo = ifelse(current_smoker == "yes", "Fumadores", "No Fumadores"))

cat("\n--- RESUMEN DESCRIPTIVO ---\n")
## 
## --- RESUMEN DESCRIPTIVO ---
print(tabla_resumen)
## # A tibble: 2 × 5
##   current_smoker     n n_col_alto prop_col_alto grupo       
##   <fct>          <int>      <dbl>         <dbl> <chr>       
## 1 no              1965        879         0.447 No Fumadores
## 2 yes             1928        790         0.410 Fumadores
# Verificación de supuestos
# Condiciones para prueba Z de dos proporciones:
# - n*p ≥ 5 y n*(1-p) ≥ 5 para ambos grupos

condiciones <- tabla_resumen %>%
  mutate(
    condicion1 = n * prop_col_alto >= 5,
    condicion2 = n * (1 - prop_col_alto) >= 5
  )

cat("\n--- VERIFICACIÓN DE SUPUESTOS ---\n")
## 
## --- VERIFICACIÓN DE SUPUESTOS ---
print(condiciones[, c("grupo", "condicion1", "condicion2")])
## # A tibble: 2 × 3
##   grupo        condicion1 condicion2
##   <chr>        <lgl>      <lgl>     
## 1 No Fumadores TRUE       TRUE      
## 2 Fumadores    TRUE       TRUE
if (any(!condiciones$condicion1) | any(!condiciones$condicion2)) {
  warning("No se cumplen los supuestos para prueba Z. Considerar prueba exacta de Fisher.")
}

# Prueba de hipótesis para dos proporciones (prueba Z)

prueba_prop <- prop.test(
  x = c(tabla_resumen$n_col_alto[1], tabla_resumen$n_col_alto[2]),
  n = c(tabla_resumen$n[1], tabla_resumen$n[2]),
  alternative = "two.sided",  # Prueba bilateral (H₁: p1 ≠ p2)
  conf.level = 0.95,
  correct = FALSE            # Sin corrección de continuidad de Yates
)

# Resultados de la prueba
cat("\n--- RESULTADOS DE LA PRUEBA ---\n")
## 
## --- RESULTADOS DE LA PRUEBA ---
print(prueba_prop)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c out of ctabla_resumen$n_col_alto[1] out of tabla_resumen$n[1]tabla_resumen$n_col_alto[2] out of tabla_resumen$n[2]
## X-squared = 5.6106, df = 1, p-value = 0.01785
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.006509575 0.068644839
## sample estimates:
##    prop 1    prop 2 
## 0.4473282 0.4097510
# Interpretación de resultados

cat("\n--- INTERPRETACIÓN ---\n")
## 
## --- INTERPRETACIÓN ---
if (prueba_prop$p.value < 0.05) {
  cat("Con un valor-p de", format.pval(prueba_prop$p.value, digits = 4), 
      "rechazamos la hipótesis nula (H₀).\n")
  cat("Existe evidencia estadística (α = 0.05) de que la proporción de personas\n")
  cat("con colesterol alto (>240 mg/dL) es DIFERENTE entre fumadores y no fumadores.\n\n")
  
  # Dirección de la diferencia
  dif_prop <- tabla_resumen$prop_col_alto[1] - tabla_resumen$prop_col_alto[2]
  if (dif_prop > 0) {
    cat("Los fumadores tienen mayor proporción de colesterol alto (diferencia =", 
        round(abs(dif_prop)*100, 1), "%)\n")
  } else {
    cat("Los no fumadores tienen mayor proporción de colesterol alto (diferencia =", 
        round(abs(dif_prop)*100, 1), "%)\n")
  }
  
  cat("Intervalo de confianza 95% para la diferencia: [", 
      round(prueba_prop$conf.int[1]*100, 1), "%, ", 
      round(prueba_prop$conf.int[2]*100, 1), "%]\n")
} else {
  cat("Con un valor-p de", format.pval(prueba_prop$p.value, digits = 4), 
      "NO rechazamos la hipótesis nula (H₀).\n")
  cat("No hay evidencia suficiente (α = 0.05) para afirmar que la proporción\n")
  cat("de personas con colesterol alto difiera entre fumadores y no fumadores.\n")
}
## Con un valor-p de 0.01785 rechazamos la hipótesis nula (H₀).
## Existe evidencia estadística (α = 0.05) de que la proporción de personas
## con colesterol alto (>240 mg/dL) es DIFERENTE entre fumadores y no fumadores.
## 
## Los fumadores tienen mayor proporción de colesterol alto (diferencia = 3.8 %)
## Intervalo de confianza 95% para la diferencia: [ 0.7 %,  6.9 %]
# Visualización de resultados
grafico <- ggplot(tabla_resumen, aes(x = grupo, y = prop_col_alto, fill = grupo)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(prop_col_alto*100, 1), "%")), 
            vjust = -0.5, size = 5) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 0.5)) +
  labs(title = "Proporcion de colesterol alto (>240 mg/dL)",
       subtitle = "Comparacion entre fumadores y no fumadores",
       x = "",
       y = "Proporcion",
       fill = "Grupo") +
  theme_minimal(base_size = 14) +
  theme(legend.position = "top")

print(grafico)

6. Conclusiones

  • El tabaquismo tiene un impacto estadísticamente significativo en la frecuencia cardíaca y los niveles de colesterol.

  • Aunque algunas diferencias son pequeñas en magnitud, su significancia sugiere posibles riesgos cardiovasculares asociados al hábito de fumar.

  • Se recomienda utilizar estos hallazgos para fortalecer campañas de salud pública orientadas a reducir el tabaquismo y monitorear sus efectos.