##########################################
# 1. Cargar paquetes necesarios
##########################################
library(readr)
library(dplyr)
library(ggplot2)
library(stringr)
library(tidyr)
library(BSDA)
library(estadistica)
##########################################
# 2. Cargar y preparar la base de datos
##########################################
insurance <- read_csv("smoking_health_data_final.csv")
insurance <- as.data.frame(unclass(insurance),
stringsAsFactors = TRUE)
str(insurance)
## 'data.frame': 3900 obs. of 7 variables:
## $ age : num 54 45 58 42 42 57 43 42 37 49 ...
## $ sex : Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...
## $ current_smoker: Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ heart_rate : num 95 64 81 90 62 62 75 66 65 93 ...
## $ blood_pressure: Factor w/ 2317 levels "100.5/62","100.5/66",..: 230 642 869 671 572 143 198 723 709 874 ...
## $ cigs_per_day : num NA NA NA NA NA NA NA NA NA NA ...
## $ chol : num 219 248 235 225 226 223 222 196 188 256 ...
dim(insurance)
## [1] 3900 7
summary(insurance)
## age sex current_smoker heart_rate blood_pressure
## Min. :32.00 female:2081 no :1968 Min. : 44.00 130/80 : 18
## 1st Qu.:42.00 male :1819 yes:1932 1st Qu.: 68.00 120/80 : 17
## Median :49.00 Median : 75.00 110/70 : 15
## Mean :49.54 Mean : 75.69 125/80 : 15
## 3rd Qu.:56.00 3rd Qu.: 82.00 105/70 : 9
## Max. :70.00 Max. :143.00 107/73 : 9
## (Other):3817
## cigs_per_day chol
## Min. : 0.000 Min. :113.0
## 1st Qu.: 0.000 1st Qu.:206.0
## 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
# Prueba de hipótesis
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.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
Estadístico de prueba (z = 3.5809): Indica que la media observada (75.68897) está 3.58 desviaciones estándar por encima de 75. Esto es una diferencia significativa, ya que valores de ∣z∣>1.96∣z∣>1.96 (para α = 0.05) son considerados estadísticamente significativos.
Decisión: Dado que el p-valor (0.00034) es mucho menor que el nivel de significancia α = 0.05, rechazamos la hipótesis nula (H₀). Esto significa que hay evidencia estadística suficiente para afirmar que la frecuencia cardíaca promedio no es igual a 75 lat/min en la población estudiada.
El p-valor (p-value = 0.0003423) es la probabilidad de obtener una media muestral tan extrema como 75.68897 (o más) si la verdadera media poblacional fuera 75.
En este caso, 0.00034 implica que hay solo un 0.034% de probabilidad de que la media muestral difiera de 75 por casualidad.
La evidencia en contra de H₀ es muy fuerte. La frecuencia cardíaca promedio en la población es estadísticamente diferente de 75 lat/min, y el intervalo de confianza (75.31, 76.07) confirma que la verdadera media está por encima de 75.
# Prueba de hipótesis
z.test(x = insurance$chol,
sigma.x = sd(insurance$chol),
mu = 200,
alternative = "greater")
##
## One-sample z-Test
##
## data: insurance$chol
## z = NA, p-value = NA
## alternative hypothesis: true mean is greater than 200
## 95 percent confidence interval:
## NA NA
## sample estimates:
## mean of x
## 236.5959
summary(insurance$chol)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 113.0 206.0 234.0 236.6 263.0 696.0 7
is.numeric(insurance$chol) # Debe ser TRUE
## [1] TRUE
any(is.infinite(insurance$chol)) # Debe ser FALSE
## [1] FALSE
mean_chol <- mean(insurance$chol, na.rm = TRUE) # Media ignorando NA
insurance$chol_imputed <- ifelse(is.na(insurance$chol), mean_chol, insurance$chol)
# Imputar con la media
insurance$chol_imputed <- ifelse(is.na(insurance$chol), mean(insurance$chol, na.rm = TRUE), insurance$chol)
t.test(insurance$chol_imputed, mu = 200, alternative = "greater")
##
## One Sample t-test
##
## data: insurance$chol_imputed
## t = 51.548, df = 3899, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 200
## 95 percent confidence interval:
## 235.4279 Inf
## sample estimates:
## mean of x
## 236.5959
Estadístico t (t = 51.548): Indica que la media observada (236.5959) está 51.55 errores estándar por encima del valor hipotético (200). Un valor tan extremo confirma que la diferencia es altamente significativa.
Grados de libertad (df = 3899): Muestra un tamaño de muestra muy grande (n ≈ 3900), lo que hace que la prueba t sea prácticamente equivalente a una prueba z.
p-valor (< 2.2e-16): Este valor es prácticamente 0 (el límite inferior de cálculo en R). Significa que la probabilidad de observar una media ≥ 236.5959 mg/dL si H₀ fuera cierta (μ ≤ 200) es casi nula. Decisión estadística: Como p-valor < α (0.05), se rechaza H₀ con evidencia extremadamente fuerte. Conclusión: El nivel medio de colesterol en la población es significativamente mayor a 200 mg/dL.
Con un 95% de confianza, la verdadera media poblacional es al menos 235.43 mg/dL, lo que supera claramente el umbral de 200 mg/dL.
insurance$Z <- ifelse (insurance$chol > 240, 1, 0)
n <- length(insurance$Z) # Tamaño de muestra
sum_Z <- sum(insurance$Z) # Número de personas con colesterol alto
p_hat <- sum_Z / n # Proporción muestral
print(n)
## [1] 3900
print(sum_Z)
## [1] NA
print(p_hat)
## [1] NA
sum(is.na(insurance$Z)) # Cuenta cuántos NA hay
## [1] 7
# Reemplazar NA con 0 (asumiendo que NA = colesterol normal)
insurance$Z_imputed <- ifelse(is.na(insurance$Z), 0, insurance$Z)
sum_Z <- sum(insurance$Z_imputed) # Suma de Z con NA = 0
n <- length(insurance$Z_imputed) # Tamaño de muestra original
resultado <- prop.test(
x = sum_Z,
n = n,
p = 0.20,
alternative = "greater",
conf.level = 0.95,
correct = FALSE
)
print(resultado)
##
## 1-sample proportions test without continuity correction
##
## data: sum_Z out of n, null probability 0.2
## X-squared = 1266.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
## 0.4149712 1.0000000
## sample estimates:
## p
## 0.4279487
Proporción observada en la muestra (p): 42.79% (0.4279) de los individuos tienen colesterol alto (>240 mg/dL). Hipótesis nula (H₀): Proporción poblacional = 20% (0.20). Hipótesis alternativa (H₁): Proporción poblacional > 20% (prueba unilateral). Estadístico de prueba (X-squared): 1266.5 (equivalente a un valor z muy alto). p-valor: < 2.2e-16 (prácticamente 0). Intervalo de confianza del 95%: (41.50%, 100%).
La proporción real de personas con colesterol alto en la población es significativamente mayor al 20%.
insurance$W <- ifelse(insurance$heart_rate > 100, 1, 0)
n <- length(insurance$W) # Tamaño de muestra
sum_W <- sum(insurance$W, na.rm = TRUE) # Personas con taquicardia (ignorando NA)
p_hat <- sum_W / n # Proporción observada
resultado <- prop.test(
x = sum_W, # Número de "éxitos" (W = 1)
n = n, # Tamaño de muestra
p = 0.05, # Proporción bajo H₀
alternative = "two.sided", # Prueba bilateral (H₁: p ≠ 0.05)
conf.level = 0.95,
correct = FALSE # Sin corrección de Yates (muestra grande)
)
print(resultado)
##
## 1-sample proportions test without continuity correction
##
## data: sum_W out of n, 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
Proporción observada en la muestra (p): 2.38% (0.0238) de los individuos presentan taquicardia (frecuencia cardíaca > 100 lpm). Hipótesis nula (H₀): Proporción poblacional = 5% (0.05). Hipótesis alternativa (H₁): Proporción poblacional ≠ 5% (prueba bilateral). Estadístico de prueba (X-squared): 56.162. p-valor: 6.674e-14 (≈ 0.00000000000006674). Intervalo de confianza del 95%: (1.95%, 2.91%).
La proporción real de taquicardia en la población es significativamente diferente del 5%.
# Filtrar datos
colesterol_fumadores <- insurance$chol[insurance$current_smoker == "yes"]
colesterol_no_fumadores <- insurance$chol[insurance$current_smoker == "no"]
# Resumen estadístico
summary(colesterol_fumadores)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 113.0 204.0 232.0 234.5 260.0 696.0 4
summary(colesterol_no_fumadores)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 124.0 208.0 235.0 238.6 266.0 600.0 3
# Verificar normalidad (opcional, para muestras pequeñas)
shapiro.test(colesterol_fumadores) # Si p > 0.05, distribución normal
##
## Shapiro-Wilk normality test
##
## data: colesterol_fumadores
## W = 0.95785, p-value < 2.2e-16
shapiro.test(colesterol_no_fumadores)
##
## Shapiro-Wilk normality test
##
## data: colesterol_no_fumadores
## W = 0.97497, p-value < 2.2e-16
# Prueba t de Student (asumiendo varianzas iguales)
resultado_t <- t.test(chol ~ current_smoker, data = insurance, var.equal = TRUE)
# Prueba t de Welch (varianzas desiguales)
resultado_welch <- t.test(chol ~ current_smoker, data = insurance, var.equal = FALSE)
# Prueba no paramétrica (Wilcoxon)
resultado_wilcox <- wilcox.test(chol ~ current_smoker, data = insurance)
print(resultado_welch)
##
## Welch Two Sample t-test
##
## data: chol by current_smoker
## t = 2.9119, df = 3884.8, p-value = 0.003612
## alternative hypothesis: true difference in means between group no and group yes is not equal to 0
## 95 percent confidence interval:
## 1.352281 6.925837
## sample estimates:
## mean in group no mean in group yes
## 238.6458 234.5067
Medias de colesterol observadas: No fumadores (grupo “no”): 238.65 mg/dL. Fumadores (grupo “yes”): 234.51 mg/dL. Diferencia de medias: 4.14 mg/dL (los no fumadores tienen niveles ligeramente más altos). Estadístico t: 2.9119. p-valor: 0.003612. Intervalo de confianza del 95% (IC): (1.35, 6.93) mg/dL.
Existe una diferencia significativa en los niveles medios de colesterol entre fumadores y no fumadores. Contrario a lo esperado, los no fumadores tienen en promedio 4.14 mg/dL más de colesterol que los fumadores (IC95%: 1.35 a 6.93 mg/dL).
# Filtrar datos
heartrate_fumadores <- insurance$heart_rate[insurance$current_smoker == "yes"]
heartrate_no_fumadores <- insurance$heart_rate[insurance$current_smoker == "no"]
# Verificar normalidad (opcional, para muestras pequeñas)
shapiro.test(heartrate_fumadores) # Si p > 0.05, distribución normal
##
## Shapiro-Wilk normality test
##
## data: heartrate_fumadores
## W = 0.97775, p-value < 2.2e-16
shapiro.test(heartrate_no_fumadores)
##
## Shapiro-Wilk normality test
##
## data: heartrate_no_fumadores
## W = 0.96767, p-value < 2.2e-16
# Prueba t de Welch (asumiendo varianzas desiguales)
resultado <- t.test(
heartrate_fumadores,
heartrate_no_fumadores,
alternative = "greater", # Prueba unilateral (H₁: μ_fumadores > μ_no_fumadores)
conf.level = 0.95
)
# Mostrar resultados
print(resultado)
##
## Welch Two Sample t-test
##
## data: heartrate_fumadores and heartrate_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
Medias Observadas: Fumadores: 76.38 lpm. No fumadores: 75.01 lpm. Diferencia de Medias: +1.37 lpm (los fumadores tienen una frecuencia cardíaca más alta). Estadístico t: 3.5809. p-valor (unilateral): 0.0001733 (≈ 0.00017). Intervalo de Confianza del 95% (IC): (0.74, Inf) lpm.
La frecuencia cardíaca promedio es significativamente mayor en fumadores que en no fumadores (p < 0.001). Los fumadores tienen en promedio 1.37 lpm más que los no fumadores (IC95%: desde +0.74 lpm).
insurance$Z <- ifelse(insurance$chol > 240, 1, 0)
# Número de personas con colesterol alto en cada grupo
sum_fumadores <- sum(insurance$Z[insurance$current_smoker == "yes"], na.rm = TRUE)
sum_no_fumadores <- sum(insurance$Z[insurance$current_smoker == "no"], na.rm = TRUE)
# Tamaño de cada grupo
n_fumadores <- sum(insurance$current_smoker == "yes", na.rm = TRUE)
n_no_fumadores <- sum(insurance$current_smoker == "no", na.rm = TRUE)
# Proporciones
p_fumadores <- sum_fumadores / n_fumadores
p_no_fumadores <- sum_no_fumadores / n_no_fumadores
resultado <- prop.test(
x = c(sum_fumadores, sum_no_fumadores), # Éxitos (Z = 1) en cada grupo
n = c(n_fumadores, n_no_fumadores), # Tamaños de grupo
alternative = "two.sided", # Prueba bilateral
conf.level = 0.95,
correct = FALSE # Sin corrección de Yates
)
print(resultado)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: c(sum_fumadores, sum_no_fumadores) out of c(n_fumadores, n_no_fumadores)
## 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
Proporciones observadas: Fumadores (prop 1): 40.89% con colesterol alto. No fumadores (prop 2): 44.66% con colesterol alto. Diferencia: -3.77% (los fumadores tienen una proporción menor de colesterol alto). Estadístico de prueba (X-squared): 5.6732. p-valor: 0.01723 (< 0.05). Intervalo de confianza del 95% (IC): (-6.88%, -0.67%).
Existe una diferencia significativa en la proporción de colesterol alto entre fumadores y no fumadores.