knitr::opts_chunk$set(
echo = TRUE,
warning = FALSE,
message = FALSE,
fig.align = "center",
fig.width = 10,
fig.height = 5
)
options(scipen = 999)
library(tidyverse)
library(gridExtra)
# Carga del archivo CSV con delimitador correcto (;)
if(file.exists("EDF_2024.csv")){
# read_csv2 es para archivos con punto y coma
df_eval <- read_csv2("EDF_2024.csv", show_col_types = FALSE)
names(df_eval) <- toupper(trimws(names(df_eval)))
} else {
set.seed(2026)
df_eval <- data.frame(
PESO = rnorm(1000, 3150, 450),
SEXO = sample(c("Hombre", "Mujer"), 1000, replace = TRUE)
)
}
#Introducción El análisis de datos demográficos y de salud pública es fundamental para la toma de decisiones informadas. En este informe, se aborda el estudio de la base de datos de Nacidos Vivos y Defunciones del INEC.
#Parte 1: Modelado de Distribución Discreta (Binomial)
# Definición: X = número de registros de SEXO "Hombre" en n = 15 casos.
p_exito <- mean(df_eval$SEXO == "Hombre", na.rm = TRUE)
n_ensayos <- 15
# Probabilidades
prob_exacta <- dbinom(8, size = n_ensayos, prob = p_exito)
prob_acumulada <- pbinom(5, size = n_ensayos, prob = p_exito)
# Dataframe para gráficos
df_bin <- data.frame(k = 0:n_ensayos) %>%
mutate(
fmp = dbinom(k, n_ensayos, p_exito),
fda = pbinom(k, n_ensayos, p_exito)
)
g1 <- ggplot(df_bin, aes(x = k, y = fmp)) +
geom_col(fill = "steelblue", alpha = 0.8) +
labs(title = "FMP: Probabilidad Puntual", x = "Hombres (X)", y = "P(X=k)") +
theme_light()
g2 <- ggplot(df_bin, aes(x = k, y = fda)) +
geom_step(color = "firebrick", size = 1) +
labs(title = "FDA: Probabilidad Acumulada", x = "Hombres (X)", y = "P(X<=k)") +
theme_light()
grid.arrange(g1, g2, ncol = 2)
#Interpretación: La probabilidad de que exactamente 8 de los 15
registros sean hombres es 0.1993. Existe una probabilidad de 0.0682 de
encontrar 5 o menos hombres en la muestra. Binomial (Discreta): Usas
barras (geom_col) porque no existen “7.5 hombres”, los valores saltan de
uno en uno.
Normal (Continua): Usas una curva suave (geom_line) porque el peso puede ser cualquier número decimal (ej. 1725.56g).
#Parte 2: Modelado de Distribución Continua (Normal)
# 1. Limpieza de datos: Convertimos a numérico y filtramos
# Usamos as.numeric para que "Sin información" pase a ser NA
df_eval$PESO_NUM <- as.numeric(as.character(df_eval$PESO))
v_peso <- df_eval$PESO_NUM[df_eval$PESO_NUM > 500 & df_eval$PESO_NUM < 5000]
# 2. Momentos Estadísticos (Asegúrate de que todo sea minúscula)
esperanza <- mean(v_peso, na.rm = TRUE)
desviacion <- sd(v_peso, na.rm = TRUE)
varianza <- var(v_peso, na.rm = TRUE) # AQUÍ ESTABA EL ERROR
# 3. Cálculo de Probabilidad P(X < 2500)
prob_bajo_peso <- pnorm(2500, mean = esperanza, sd = desviacion)
cat(sprintf("Esperanza (Peso): %.2f g\nProbabilidad < 2500g: %.4f\n",
esperanza, prob_bajo_peso))
## Esperanza (Peso): 1725.56 g
## Probabilidad < 2500g: 0.7832
# 4. Representación Gráfica
x_vals <- seq(esperanza - 3*desviacion, esperanza + 3*desviacion, length.out = 100)
df_norm <- data.frame(x = x_vals) %>%
mutate(fdp = dnorm(x, esperanza, desviacion),
fda = pnorm(x, esperanza, desviacion))
g3 <- ggplot(df_norm, aes(x = x, y = fdp)) +
geom_line(color = "darkgreen", size = 1) +
geom_area(fill = "darkgreen", alpha = 0.2) +
labs(title = "FDP: Densidad de Peso", x = "Peso (g)", y = "Densidad") +
theme_minimal()
g4 <- ggplot(df_norm, aes(x = x, y = fda)) +
geom_line(color = "darkorange", size = 1) +
labs(title = "FDA: Probabilidad Acumulada", x = "Peso (g)", y = "Probabilidad") +
theme_minimal()
grid.arrange(g3, g4, ncol = 2)
#Interpretación: La Esperanza Matemática del peso es de 1725.56 g, con una Varianza de 978097.65. La probabilidad de bajo peso (menos de 2500g) es del 78.32% * Distribución Binomial: Representa eventos discretos (conteo de personas).