Tabla descriptiva
# 📚 Cargar bibliotecas necesarias
library(dplyr)
library(readr)
library(kableExtra)
library(e1071)
# 📌 Cargar el dataset
ruta_archivo <- "D:/UNIVERSIDAD M/QUINTO SEMESTRE/teoria de probabilidades/Avance1/Nacimientos_Hospital_Medellin.csv"
df <- read_delim(ruta_archivo, delim = ";", escape_double = FALSE, trim_ws = TRUE, col_types = cols())
# 📌 Preparar datos
df <- df %>%
mutate(
`NUMERO CONSULTAS PRENATALES` = as.numeric(`NUMERO CONSULTAS PRENATALES`),
`AREA RESIDENCIA` = as.factor(`AREA RESIDENCIA`)
)
# 📊 Calcular medidas estadísticas
tabla_datosobj1 <- df %>%
group_by(`AREA RESIDENCIA`) %>%
summarise(
Mínimo = min(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE),
Máximo = max(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE),
Mediana = median(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE),
Media = round(mean(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE), 2),
`Primer Cuartil` = quantile(`NUMERO CONSULTAS PRENATALES`, 0.25, na.rm = TRUE),
`Tercer Cuartil` = quantile(`NUMERO CONSULTAS PRENATALES`, 0.75, na.rm = TRUE),
`Coef. de Variación` = round((sd(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE) / mean(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE)) * 100, 1),
`Coef. de Asimetría` = round(skewness(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE), 2),
Curtosis = round(kurtosis(`NUMERO CONSULTAS PRENATALES`, na.rm = TRUE), 2),
IQR = `Tercer Cuartil` - `Primer Cuartil`,
Límite_Inferior = `Primer Cuartil` - 1.5 * IQR,
Límite_Superior = `Tercer Cuartil` + 1.5 * IQR,
`% de Atípicos` = round(sum(`NUMERO CONSULTAS PRENATALES` < Límite_Inferior | `NUMERO CONSULTAS PRENATALES` > Límite_Superior, na.rm = TRUE) / n() * 100, 1),
`Intervalo de Atípicos Menores` = ifelse(
sum(`NUMERO CONSULTAS PRENATALES` < Límite_Inferior, na.rm = TRUE) == 0,
"",
paste0("[", paste(range(`NUMERO CONSULTAS PRENATALES`[`NUMERO CONSULTAS PRENATALES` < Límite_Inferior], na.rm = TRUE), collapse = ", "), "]")
),
`Intervalo de Atípicos Mayores` = ifelse(
sum(`NUMERO CONSULTAS PRENATALES` > Límite_Superior, na.rm = TRUE) == 0,
"",
paste0("[", paste(range(`NUMERO CONSULTAS PRENATALES`[`NUMERO CONSULTAS PRENATALES` > Límite_Superior], na.rm = TRUE), collapse = ", "), "]")
)
) %>%
select(-IQR, -Límite_Inferior, -Límite_Superior)
# 📋 Crear tabla formateada
kable(tabla_datosobj1,
col.names = c("Área de Residencia", "Mínimo", "Máximo", "Mediana", "Media",
"Primer Cuartil", "Tercer Cuartil", "Coef. de Variación",
"Coef. de Asimetría", "Curtosis", "% de Atípicos",
"Intervalo de Atípicos Menores", "Intervalo de Atípicos Mayores")) %>%
kable_styling(bootstrap_options = c("striped")) %>%
add_header_above(c(" " = 1, "Número de Consultas Prenatales" = 12))
Área de Residencia | Mínimo | Máximo | Mediana | Media | Primer Cuartil | Tercer Cuartil | Coef. de Variación | Coef. de Asimetría | Curtosis | % de Atípicos | Intervalo de Atípicos Menores | Intervalo de Atípicos Mayores |
---|---|---|---|---|---|---|---|---|---|---|---|---|
CABECERA MUNICIPAL | 0 | 24 | 7 | 6.68 | 5 | 9.00 | 46.9 | 0.13 | 0.60 | 0.6 | [16, 24] | |
CENTRO POBLADO (INSPECCION, CORREGIMIENTO O CASERIO) | 0 | 15 | 6 | 5.91 | 4 | 7.75 | 43.0 | 0.03 | 0.36 | 0.8 | [14, 15] | |
RURAL DISPERSO | 0 | 15 | 7 | 6.16 | 5 | 8.00 | 41.9 | -0.21 | 0.58 | 4.9 | [0, 0] | [13, 15] |
En términos de tendencia central, las áreas de residencia muestran medianas y medias similares en el número de consultas prenatales (medianas entre 6 y 7; medias entre 5,9 y 6,7), lo que indica comportamientos generales parecidos. La cabecera municipal presenta la mayor variabilidad (coeficiente de variación 46,9%) y el rango máximo más amplio (0-24 consultas), aunque con bajo porcentaje de atípicos (0,6%). El área rural dispersa destaca por tener el mayor porcentaje de atípicos (4,9%), principalmente por consultas mínimas (0), lo cual refleja una situación preocupante de acceso limitado a controles prenatales. En resumen, aunque las tendencias centrales son estables en todas las áreas, la combinación de alta variabilidad en cabecera y la crítica ausencia de controles en zona rural apunta a desigualdades en el acceso a salud prenatal.
OJIVAS
# Cargar librerías necesarias
library(ggplot2)
library(dplyr)
library(readr)
library(tidyr)
# Leer los datos
data1 <- read_delim("D:/UNIVERSIDAD M/QUINTO SEMESTRE/teoria de probabilidades/Avance1/Nacimientos_Hospital_Medellin.csv",
delim = ";", col_types = cols())
# Normalizar nombres de columnas
colnames(data1) <- make.names(colnames(data1), unique = TRUE)
# Asegurarse de que AREA.RESIDENCIA es un factor
data1$AREA.RESIDENCIA <- as.factor(data1$AREA.RESIDENCIA)
# Renombrar nivel largo
levels(data1$AREA.RESIDENCIA)[levels(data1$AREA.RESIDENCIA) ==
"CENTRO POBLADO (INSPECCION, CORREGIMIENTO O CASERIO)"] <- "CENTRO POBLADO"
# Definir breaks fijos del 0 al 24
breaks_fixed <- 0:24
# Calcular frecuencias acumuladas por nivel
cumulative_data <- lapply(levels(data1$AREA.RESIDENCIA), function(lvl) {
subset_data <- data1 %>% filter(AREA.RESIDENCIA == lvl)
hist_obj <- hist(subset_data$NUMERO.CONSULTAS.PRENATALES, breaks = breaks_fixed, plot = FALSE)
midpoints <- hist_obj$mids
cum_vals <- cumsum(hist_obj$counts) / sum(hist_obj$counts)
data.frame(
AREA.RESIDENCIA = lvl,
x = midpoints,
cumulative = cum_vals
)
}) %>% bind_rows()
# Seleccionar valores más cercanos a 6, 10 y 15 para cada grupo
porcentajes_clave <- cumulative_data %>%
group_by(AREA.RESIDENCIA) %>%
summarise(
hasta_6 = cumulative[which.min(abs(x - 6))],
hasta_10 = cumulative[which.min(abs(x - 10))],
hasta_15 = cumulative[which.min(abs(x - 15))]
) %>%
mutate(
hasta_6 = round(hasta_6 * 100, 1),
hasta_10 = round(hasta_10 * 100, 1),
hasta_15 = round(hasta_15 * 100, 1)
)
# Crear gráfico con etiquetas individuales y coloreadas
plot_ojivas <- ggplot(cumulative_data, aes(x = x, y = cumulative, color = AREA.RESIDENCIA, group = AREA.RESIDENCIA)) +
geom_step(linewidth = 1.2) +
# Etiquetas "Hasta 6 consultas"
annotate("text", x = 26.5, y = 0.85, label = "Hasta 6 consultas:", hjust = 0, size = 4, fontface = "bold") +
annotate("text", x = 26.5, y = 0.80, label = "44.6%", hjust = 0, size = 4, color = "#1b9e77") +
annotate("text", x = 26.5, y = 0.75, label = "56.6%", hjust = 0, size = 4, color = "#d95f02") +
annotate("text", x = 26.5, y = 0.70, label = "49.9%", hjust = 0, size = 4, color = "#7570b3") +
# Etiquetas "Hasta 10 consultas"
annotate("text", x = 26.5, y = 0.58, label = "Hasta 10 consultas:", hjust = 0, size = 4, fontface = "bold") +
annotate("text", x = 26.5, y = 0.53, label = "90.3%", hjust = 0, size = 4, color = "#1b9e77") +
annotate("text", x = 26.5, y = 0.48, label = "97.3%", hjust = 0, size = 4, color = "#d95f02") +
annotate("text", x = 26.5, y = 0.43, label = "96.9%", hjust = 0, size = 4, color = "#7570b3") +
# Etiquetas "Hasta 15 consultas"
annotate("text", x = 26.5, y = 0.31, label = "Hasta 15 consultas:", hjust = 0, size = 4, fontface = "bold") +
annotate("text", x = 26.5, y = 0.26, label = paste0(porcentajes_clave$hasta_15[porcentajes_clave$AREA.RESIDENCIA == "CABECERA MUNICIPAL"], "%"),
hjust = 0, size = 4, color = "#1b9e77") +
annotate("text", x = 26.5, y = 0.21, label = paste0(porcentajes_clave$hasta_15[porcentajes_clave$AREA.RESIDENCIA == "CENTRO POBLADO"], "%"),
hjust = 0, size = 4, color = "#d95f02") +
annotate("text", x = 26.5, y = 0.16, label = paste0(porcentajes_clave$hasta_15[porcentajes_clave$AREA.RESIDENCIA == "RURAL DISPERSO"], "%"),
hjust = 0, size = 4, color = "#7570b3") +
scale_color_manual(
values = c(
"CABECERA MUNICIPAL" = "#1b9e77",
"CENTRO POBLADO" = "#d95f02",
"RURAL DISPERSO" = "#7570b3"
)
) +
scale_x_continuous(breaks = 0:24, limits = c(0, 32)) +
labs(
title = "Frecuencia acumulada de consultas prenatales por área de residencia",
x = "Número de Consultas Prenatales",
y = "Frecuencia acumulada",
color = "Área de residencia"
) +
theme_minimal() +
theme(
legend.position = "top",
plot.title = element_text(size = 14, face = "bold")
)
# Mostrar gráfico
print(plot_ojivas)
GRAFICO DE BARRAS
# Cargar las bibliotecas necesarias
library(ggplot2)
library(dplyr)
library(tidyr)
library(readr)
# Leer el archivo
data1 <- read_delim("D:/UNIVERSIDAD M/QUINTO SEMESTRE/teoria de probabilidades/Avance1/Nacimientos_Hospital_Medellin.csv", delim = ";", col_types = cols())
# Agrupar consultas prenatales
data1_limpio <- data1 %>%
filter(!is.na(`NUMERO CONSULTAS PRENATALES`), !is.na(`AREA RESIDENCIA`)) %>%
mutate(
CategoriaConsultas = case_when(
`NUMERO CONSULTAS PRENATALES` >= 0 & `NUMERO CONSULTAS PRENATALES` <= 5 ~ "0-5",
`NUMERO CONSULTAS PRENATALES` >= 6 & `NUMERO CONSULTAS PRENATALES` <= 11 ~ "6-11",
`NUMERO CONSULTAS PRENATALES` >= 12 & `NUMERO CONSULTAS PRENATALES` <= 17 ~ "12-17",
`NUMERO CONSULTAS PRENATALES` >= 18 & `NUMERO CONSULTAS PRENATALES` <= 22 ~ "18-22",
TRUE ~ NA_character_
)
) %>%
filter(!is.na(CategoriaConsultas))
# Cambiar la etiqueta larga a solo "CENTRO POBLADO"
data1_limpio$`AREA RESIDENCIA` <- as.factor(data1_limpio$`AREA RESIDENCIA`)
levels(data1_limpio$`AREA RESIDENCIA`)[levels(data1_limpio$`AREA RESIDENCIA`) ==
"CENTRO POBLADO (INSPECCION, CORREGIMIENTO O CASERIO)"] <- "CENTRO POBLADO"
# Tabla cruzada
tabla_cruzada <- as.data.frame(table(
Consultas = data1_limpio$CategoriaConsultas,
Area = data1_limpio$`AREA RESIDENCIA`
))
# Renombrar columnas
colnames(tabla_cruzada) <- c("Consultas", "Área de Residencia", "Frecuencia")
# Calcular porcentajes
tabla_cruzada <- tabla_cruzada %>%
group_by(`Área de Residencia`) %>%
mutate(Porcentaje = Frecuencia / sum(Frecuencia) * 100) %>%
ungroup()
# Gráfico con etiquetas
barplot_consultas <- ggplot(tabla_cruzada, aes(x = `Área de Residencia`, y = Porcentaje, fill = Consultas)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
geom_text(
aes(label = paste0(round(Porcentaje, 1), "%")),
position = position_dodge(width = 0.8),
vjust = -0.3,
size = 3.5
) +
scale_fill_manual(
values = c("#440154FF", "#39568CFF", "#1F968BFF", "#73D055FF"),
breaks = c("0-5", "6-11", "12-17", "18-22")
) +
labs(
x = "Área de Residencia",
y = "Porcentaje",
title = "Distribución de Consultas Prenatales por Área de Residencia"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 10, angle = 45, hjust = 1),
axis.text.y = element_text(size = 12),
axis.title = element_text(size = 13),
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 11)
) +
guides(fill = guide_legend(title = "Consultas Prenatales")) +
scale_y_continuous(labels = function(x) paste0(x, "%"))
# Mostrar gráfico
print(barplot_consultas)
boxplot
# Cargar las bibliotecas necesarias
library(ggplot2)
library(readr)
library(dplyr)
# Leer el archivo
df <- read_delim("D:/UNIVERSIDAD M/QUINTO SEMESTRE/teoria de probabilidades/Avance1/Nacimientos_Hospital_Medellin.csv",
delim = ";",
locale = locale(encoding = "UTF-8"),
trim_ws = TRUE,
col_types = cols(
`NUMERO CONSULTAS PRENATALES` = col_number(),
`AREA RESIDENCIA` = col_character()
)
)
# Normalizar nombres de columnas
colnames(df) <- make.names(colnames(df), unique = TRUE)
# Convertir a factor la variable AREA.RESIDENCIA
df$AREA.RESIDENCIA <- as.factor(df$AREA.RESIDENCIA)
# Cambiar la etiqueta larga a solo "CENTRO POBLADO"
levels(df$AREA.RESIDENCIA)[levels(df$AREA.RESIDENCIA) ==
"CENTRO POBLADO (INSPECCION, CORREGIMIENTO O CASERIO)"] <- "CENTRO POBLADO"
# Crear el boxplot
boxplot_consultas <- ggplot(df, aes(x = AREA.RESIDENCIA, y = NUMERO.CONSULTAS.PRENATALES, fill = AREA.RESIDENCIA)) +
geom_boxplot(outlier.shape = 16, outlier.size = 2, alpha = 0.7) +
scale_fill_manual(values = c(
"CABECERA MUNICIPAL" = "#1b9e77",
"CENTRO POBLADO (INSPECCION, CORREGIMIENTO O CASERIO)" = "#d95f02",
"RURAL DISPERSO" = "#7570b3"
)) +
labs(
x = "Área de Residencia",
y = "Número de Consultas Prenatales",
title = "Distribución del Número de Consultas Prenatales por Área de Residencia"
) +
theme_minimal() +
theme(
legend.position = "none",
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text = element_text(size = 12),
axis.text.x = element_text(angle = 45, hjust = 1), # <-- Esta línea soluciona el problema
axis.title = element_text(size = 13)
)
# Mostrar el gráfico
print(boxplot_consultas)
EL boxplot muestra la distribución del número de consultas prenatales por área de residencia.
En cabecera municipal, el 50% central de las mujeres (entre el primer y tercer cuartil) tiene entre aproximadamente 5 y 9 consultas prenatales, con una mediana de 7. Se observan varios valores atípicos por encima (mayores a 16), lo que indica algunos casos con un número muy alto de consultas.
En centro poblado, el 50% de los casos está entre aproximadamente 4 y 8 consultas, con una mediana de 6. Aquí también hay algunos atípicos altos (mayores a 14), pero en menor cantidad y menos extremos que en cabecera municipal.
En rural disperso, el 50% central está entre aproximadamente 5 y 8 consultas, con una mediana de 7. Sin embargo, hay valores atípicos tanto bajos (cerca de 0) como altos (alrededor de 13-15), mostrando que en esta zona conviven tanto mujeres con muy pocas consultas como otras con un número alto, lo que refleja mayor desigualdad interna.
TABLA MODA
# 📚 Cargar librerías necesarias
library(dplyr)
library(knitr)
library(kableExtra)
# 🔄 Normalizar nombres de columnas
colnames(df) <- make.names(colnames(df), unique = TRUE)
# ✅ Convertir a UTF-8 y limpiar caracteres raros
df <- df %>%
mutate(across(everything(), ~ iconv(., from = "", to = "UTF-8", sub = " "))) %>%
mutate(across(everything(), ~ gsub("[^[:alnum:] [:space:]]", "", .))) %>%
mutate(across(everything(), ~ trimws(.)))
# 🔄 Función para calcular la moda
moda <- function(x) {
x <- na.omit(x)
x <- x[x != ""]
if (length(x) == 0) return("Sin Datos")
tab <- table(x)
max_freq <- max(tab)
modas <- names(tab[tab == max_freq])
return(paste(modas, collapse = ", "))
}
# 📊 Calcular la moda de las variables de interés
moda_area <- moda(df$AREA.RESIDENCIA)
moda_consultas <- moda(df$NUMERO.CONSULTAS.PRENATALES)
# 📋 Crear tabla de resultados
tabla_moda <- data.frame(
Variable = c("Área de Residencia", "Número de Consultas Prenatales"),
Moda = c(moda_area, moda_consultas)
)
# 🖥 Mostrar tabla formateada
kable(tabla_moda, format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "responsive"), full_width = FALSE) %>%
column_spec(1, bold = TRUE)
Variable | Moda |
---|---|
Área de Residencia | CABECERA MUNICIPAL |
Número de Consultas Prenatales | 7 |
CONCLUSION GENERAL DEL OBJETIVO QUE ME TOCO (no me acuerdo cual
es)
En general, se observa que el área de residencia influye de manera
importante en el acceso a los servicios prenatales. Las mujeres que
viven en zonas rurales dispersas enfrentan mayores barreras para recibir
atención adecuada, mientras que en áreas urbanas y centros poblados el
acceso es más uniforme y consistente. Esto evidencia desigualdades en
salud que requieren atención, ya que las condiciones del lugar de
residencia impactan directamente en la oportunidad y calidad del cuidado
prenatal.