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))
Número de Consultas Prenatales
Á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)

  • Al observar los porcentajes acumulados, se evidencia que la cabecera municipal presenta un mejor comportamiento en la atención prenatal, ya que solo el 44.6% de las mujeres tuvo hasta 6 consultas y el 90.3% hasta 10, siendo estos los porcentajes más bajos entre las tres áreas. Esto indica que un mayor número de mujeres logró superar estos niveles mínimos de atención. En contraste, el centro poblado y el rural disperso presentan porcentajes más altos en estos rangos, lo que refleja que una mayor proporción de mujeres se quedó en niveles bajos o intermedios de consultas. Aunque a los 15 controles las tres áreas están casi igualadas, el análisis de los primeros tramos permite concluir que en cabecera municipal hay un mayor acceso o seguimiento más constante al control prenatal.

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)

  • Este gráfico resalta una concentración significativa de mujeres con un número adecuado de consultas prenatales (entre 6 y 11), especialmente en el área rural dispersa (63.1%) y en la cabecera municipal (62.3%). Sin embargo, se observa que el centro poblado tiene un porcentaje elevado de mujeres que realizaron pocas consultas (0–5), con un 41.5%, lo cual podría reflejar dificultades de acceso a los servicios, falta de información o barreras económicas. Además, el rango de consultas excesivas (12 o más) es bajo en todas las áreas, lo que indica que, si bien hay mujeres que superan el número estándar, no es un patrón frecuente, sin embargo el porcentaje más alto se da en la cabecera municipal (6%).

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
  • La moda muestra que la mayoría de los nacimientos provienen de mujeres que viven en la cabecera municipal, lo que indica una mayor concentración poblacional y mejor acceso a servicios de salud en áreas urbanas. Además, el número más frecuente de consultas prenatales es 7, lo que sugiere un seguimiento adecuado en la mayoría de los casos, alineado con las recomendaciones mínimas de salud. La coincidencia de estas dos modas refuerza la idea de que las mujeres en zonas urbanas tienen mejor acceso a atención prenatal, probablemente debido a la disponibilidad de centros de salud y programas de seguimiento.

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.