Equipo: Andrea Bernal, Karina Alfonso, Leyson Celis
Delegación de responsabilidades:
Limpieza y preparación de
los datos (Karina Alfonso) | Análisis exploratorio y estadístico
(Andrea Bernal) | Visualización y Conclusiones (Leyson Celis)
El acceso a servicios de salud para la población migrante es un tema de creciente relevancia social y política. En particular, las desigualdades de género en el acceso, uso y costo de los servicios de salud entre la población migrante pueden tener un impacto significativo en la equidad y eficiencia del sistema sanitario.
La población migrante enfrenta barreras únicas en el acceso a servicios de salud, las cuales pueden variar significativamente según el género. Estudios previos sugieren que las mujeres migrantes utilizan más los servicios de salud que los hombres, pero existen pocos análisis que comparen específicamente qué tipos de servicios son más demandados por cada grupo y a qué costo.
Esta información es crucial para: - Identificar desigualdades en el acceso a la salud entre hombres y mujeres migrantes. - Optimizar recursos en políticas públicas, asegurando que las necesidades específicas de cada grupo sean cubiertas. - Reducir costos innecesarios en el sistema de salud, asignando presupuestos de manera más eficiente.
La población migrante enfrenta barreras únicas en el acceso a servicios de salud, las cuales pueden variar significativamente según el género. Para responder a estas preguntas, se analizará el dataset “17. Atenciones en Salud a Población Migrante” del Ministerio de Salud y Protección Social, que describe el número de usuarios migrantes atendidos en el primer nivel de complejidad del municipio y los principales motivos de consulta, desagregado por mes, año, diagnóstico y costos, para el periodo comprendido entre octubre de 2014 y diciembre de 2022.
El dataset contiene aproximadamente 234,000 registros y variables clave como:
Para abordar el problema se emplearán las siguientes técnicas:
Este análisis permitirá:
Fuente:
Los datos fueron obtenidos de Atenciones
en Salud a Población Migrante del Ministerio de Salud y Protección
Social.
Propósito original de los datos:
El conjunto de datos fue creado con el objetivo de registrar y hacer
seguimiento a las atenciones en salud prestadas a población migrante,
especialmente en el contexto de la migración proveniente de Venezuela.
El propósito principal es monitorear el acceso a los servicios de salud
por parte de esta población en Colombia y apoyar la toma de decisiones
en política pública y gestión en el sector salud.
Período de recopilación:
Los datos abarcan el período comprendido entre octubre de 2014 y marzo
de 2022, permitiendo un análisis temporal de la evolución de las
atenciones médicas brindadas a la población migrante durante esos
años.
Cantidad y tipo de variables originales:
El conjunto incluye 9 variables principales:
Peculiaridades sobre los datos:
Importación y limpieza de datos:
A continuación, se describen los pasos de importación y limpieza realizados para garantizar la calidad y utilidad del análisis:
read_csv(), lo que permite cargar el dataset completo en R
para su posterior procesamiento.## Rows: 234924 Columns: 11
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): MES, tipo_de_servicio, SERVICIO, ESPECIALIDAD, LUGAR, Curso de vid...
## dbl (3): AÑO, CANTIDAD, VALOR_SERVICIO
## dttm (1): FECHA_CARGO
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 6 × 11
## MES AÑO FECHA_CARGO tipo_de_servicio SERVICIO ESPECIALIDAD
## <chr> <dbl> <dttm> <chr> <chr> <chr>
## 1 12. Diciembre 2017 2017-04-12 00:00:00 Laboratorio 37105 M… IMAGENOLOGI…
## 2 12. Diciembre 2017 2017-04-12 00:00:00 Laboratorio 37105 M… IMAGENOLOGI…
## 3 07. Julio 2017 2017-07-20 00:00:00 Laboratorio 37105 M… IMAGENOLOGI…
## 4 07. Julio 2017 2017-07-20 00:00:00 Laboratorio 37105 M… IMAGENOLOGI…
## 5 08. Agosto 2017 2017-10-08 00:00:00 Laboratorio 37105 M… IMAGENOLOGI…
## 6 08. Agosto 2017 2017-10-08 00:00:00 Laboratorio 37105 M… IMAGENOLOGI…
## # ℹ 5 more variables: CANTIDAD <dbl>, VALOR_SERVICIO <dbl>, LUGAR <chr>,
## # `Curso de vida` <chr>, Sexo <chr>
clean_names() del paquete
janitor para convertir todos los nombres de las columnas a
minúsculas y formato snake_case. Esto facilita la manipulación y evita
errores por diferencias de mayúsculas/minúsculas o espacios.## [1] "mes" "ano" "fecha_cargo" "tipo_de_servicio"
## [5] "servicio" "especialidad" "cantidad" "valor_servicio"
## [9] "lugar" "curso_de_vida" "sexo"
a_o a
partir de la columna original ano y luego se elimina la
columna redundante. datos <- datos %>%
mutate(
mes = str_trim(str_extract(mes, "(?<=\\.)\\s*\\w+")),
mes = tolower(mes),
mes = str_replace_all(mes, "é", "e"),
mes = case_when(
mes %in% c("enero", "febrero", "marzo", "abril", "mayo", "junio",
"julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre") ~ mes,
TRUE ~ NA_character_
),
mes = factor(mes,
levels = c("enero", "febrero", "marzo", "abril", "mayo", "junio",
"julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"),
ordered = TRUE),
fecha_cargo = parse_date_time(fecha_cargo, orders = c("dmy", "ymd", "mdy")),
cantidad = as.numeric(cantidad),
valor_servicio = as.numeric(valor_servicio),
a_o = as.integer(ano),
sexo = as.factor(sexo),
curso_de_vida = as.factor(curso_de_vida),
tipo_de_servicio = as.factor(tipo_de_servicio),
servicio = as.factor(servicio),
especialidad = as.factor(especialidad),
lugar = as.factor(lugar)
)%>%
select(-ano)NA), vacíos o negativos en las variables clave. Esto es
fundamental para evitar sesgos y asegurar que los resultados sean
representativos y confiables. datos <- datos %>%
filter(
!is.na(mes) & mes != "",
!is.na(fecha_cargo),
!is.na(cantidad) & cantidad != "" & cantidad >= 0,
!is.na(valor_servicio) & valor_servicio != "" & valor_servicio >= 0,
!is.na(a_o) & a_o != "",
!is.na(sexo) & sexo != "",
!is.na(curso_de_vida) & curso_de_vida != "",
!is.na(tipo_de_servicio) & tipo_de_servicio != "",
!is.na(servicio) & servicio != "",
!is.na(especialidad) & especialidad != "",
!is.na(lugar) & lugar != ""
)
cat("Filas restantes después de limpiar los datos:", nrow(datos), "\n")## Filas restantes después de limpiar los datos: 234917
Cada uno de estos pasos es esencial para garantizar que el análisis posterior se realice sobre datos limpios, consistentes y listos para responder a las preguntas de investigación planteadas.
Vista del conjunto final:
| mes | fecha_cargo | tipo_de_servicio | servicio | especialidad | cantidad | valor_servicio | lugar | curso_de_vida | sexo | a_o |
|---|---|---|---|---|---|---|---|---|---|---|
| diciembre | 2017-04-12 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 29 a 59 años | Femenino | 2017 |
| diciembre | 2017-04-12 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 29 a 59 años | Femenino | 2017 |
| julio | 2017-07-20 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| julio | 2017-07-20 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| agosto | 2017-10-08 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| agosto | 2017-10-08 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| agosto | 2017-08-13 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| agosto | 2017-08-13 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| septiembre | 2017-01-09 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
| septiembre | 2017-01-09 | Laboratorio | 37105 MONITOREO FETAL | IMAGENOLOGIA NIVEL 1 | 1 | 22100 | UIMIST | 18 a 28 años | Femenino | 2017 |
## Total de filas en el conjunto de datos limpio: 234917
# Resumen de valores únicos por variable clave
resumen_unicos <- datos %>%
summarise(
Meses = n_distinct(mes),
An_os = n_distinct(a_o),
Servicios = n_distinct(servicio),
Especialidades = n_distinct(especialidad),
Lugares = n_distinct(lugar),
Cursos_de_vida = n_distinct(curso_de_vida),
Sexos = n_distinct(sexo)
)
knitr::kable(resumen_unicos, caption = "Cantidad de valores únicos por variable clave")| Meses | An_os | Servicios | Especialidades | Lugares | Cursos_de_vida | Sexos |
|---|---|---|---|---|---|---|
| 12 | 9 | 1268 | 106 | 28 | 6 | 2 |
# Tabla de frecuencias por sexo
tabla_sexo <- datos %>%
count(sexo, name = "Frecuencia") %>%
mutate(Porcentaje = round(100 * Frecuencia / sum(Frecuencia), 1))
knitr::kable(tabla_sexo, caption = "Distribución por sexo")| sexo | Frecuencia | Porcentaje |
|---|---|---|
| Femenino | 180990 | 77 |
| Masculino | 53927 | 23 |
Resumen de las variables clave del conjunto de datos limpio:
El conjunto de datos final contiene información detallada sobre las atenciones en salud a población migrante, permitiendo analizar diferencias por sexo, tipo de servicio, especialidad, lugar y valor económico de las atenciones. A continuación, se presenta una tabla resumen de las variables más relevantes para nuestro análisis:
| Variable | Descripción | Tipo/Categorías principales | Resumen estadístico o categorías |
|---|---|---|---|
| mes | Mes de la atención (enero-diciembre) | Factor (12 niveles) | Enero-Diciembre |
| a_o | Año de la atención | Entero | 2014 - 2022 |
| sexo | Sexo del paciente | Femenino, Masculino | Femenino, Masculino |
| tipo_de_servicio | Tipo de servicio prestado | Ej: Consulta, Vacunas, Laboratorio | Laboratorio, CONSULTA, PROCEDIMIENTO, OTROS SERVICIOS, PROC QUIRURGICO, VACUNACION, Otros servicios, Consulta, Interconsulta, Vacunas, Otro procedimiento, Imagenologia, Derecho de Sala, Estancia, Honorario, Quirurgico |
| servicio | Código y nombre del servicio | >10 servicios distintos | 1268 servicios |
| especialidad | Especialidad médica | Ej: Medicina General, Imagenología, Anestesiología | IMAGENOLOGIA NIVEL 1, IMAGENOLOGIA NIVEL II, MEDICINA GENERAL, AUX DE ENFERMERIA, ENFERMERA PYP, LABORATORIO NIVEL I, ENFERMERA JEFE, MEDICO PYP, PEDIATRIA, TERAPIA FISICA Y REHABILITACION |
| cantidad | Número de atenciones registradas | Numérico | Promedio: 1 Mín: 1 Máx: 120 |
| valor_servicio | Valor económico del servicio | Numérico ($) | Promedio: $3.52035^{4} Mín: $0 Máx: $6.2505^{6} |
| lugar | Lugar donde se prestó el servicio | Ej: UIMIST, otros | UIMIST, C.S ROSARIO, C.S REGADEROS, C.S GIRARDOT, C.S LA JOYA, C.S PABLO VI, C.S TOLEDO PLATA, C.S LIBERTAD, HOSPITAL LOCAL NORTE, C.S KENNEDY, C.S GAITAN, C.S CAMPO HERMOSO, C.S MUTIS, EQUIPO EXTRAMURAL, C.S IPC, C.S CAFE MADRID, C.S SAN RAFAEL, C.S COMUNEROS, C.S COLORADOS, C.S MORRORICO, C.S BUCARAMANGA, C.S SANTANDER, C.S CRISTAL, C.S CONCORDIA, C.S VILLA ROSA, SEDE UIMIST, SEDE HOSPITAL LOCAL NORTE, EXTRAMURAL |
| curso_de_vida | Grupo etario del paciente | Ej: 18 a 28 años, 29 a 59 años | 29 a 59 años, 18 a 28 años, 12 a 17 años, 0 a 6 años, 7 a 11 años, >60 años |
Esta tabla permite visualizar de forma condensada la estructura y diversidad de los datos, facilitando la interpretación y el análisis posterior.
Análisis de servicios más utilizados por sexo
Primero, analicemos los 3 servicios más utilizados por cada sexo y comparemos sus costos:
# Encontrar los servicios más frecuentes por sexo y crear la tabla primero
servicios_tabla <- datos %>%
group_by(sexo, servicio) %>%
summarise(
total_atenciones = sum(cantidad),
costo_promedio = mean(valor_servicio)
) %>%
arrange(sexo, desc(total_atenciones)) %>%
group_by(sexo) %>%
slice_head(n = 3) %>% # Reducir a los 3 principales para mayor claridad
ungroup() %>%
# Crear etiquetas más cortas (asegura que no hay NA)
mutate(servicio_corto = ifelse(is.na(servicio), "No especificado",
substr(as.character(servicio), 1, 25)))
# Mostrar la tabla para verificar que los datos son correctos
knitr::kable(servicios_tabla %>%
mutate(costo_promedio = round(costo_promedio, 2)),
caption = "Comparación de los 3 servicios más utilizados por sexo y su costo promedio",
col.names = c("Sexo", "Servicio", "Total Atenciones", "Costo Promedio ($)", "Servicio (abreviado)"))| Sexo | Servicio | Total Atenciones | Costo Promedio ($) | Servicio (abreviado) |
|---|---|---|---|---|
| Femenino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 7110 | 21065.95 | HEMOGRAMA IV [HEMOGLOBINA |
| Femenino | UROANALISIS CON SEDIMENTO Y DENSIDAD URINARIA | 4450 | 13300.24 | UROANALISIS CON SEDIMENTO |
| Femenino | 890701 CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 4076 | 53158.20 | 890701 CONSULTA DE URGENC |
| Masculino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 2466 | 52472.19 | CONSULTA DE URGENCIAS POR |
| Masculino | 939402 NEBULIZACION | 2222 | 13599.83 | 939402 NEBULIZACION |
| Masculino | CONSULTA DE PRIMERA VEZ POR MEDICINA GENERAL | 1987 | 28898.40 | CONSULTA DE PRIMERA VEZ P |
# Gráfico de barras para total de atenciones (con etiquetas verificadas)
ggplot(servicios_tabla, aes(x = reorder(servicio_corto, total_atenciones), y = total_atenciones, fill = sexo)) +
geom_col() +
coord_flip() +
labs(
title = "3 Servicios de salud más utilizados por sexo",
subtitle = "Comparación entre población migrante femenina y masculina",
x = "Servicio",
y = "Total de atenciones",
fill = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank(),
axis.text.y = element_text(size = 11),
plot.title = element_text(face = "bold")
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF"))# Gráfico de barras para costo promedio (con etiquetas verificadas)
ggplot(servicios_tabla, aes(x = reorder(servicio_corto, costo_promedio), y = costo_promedio, fill = sexo)) +
geom_col(position = "dodge") +
coord_flip() +
labs(
title = "Costo promedio de los 3 servicios más utilizados por sexo",
subtitle = "Comparación de costos entre población migrante femenina y masculina",
x = "Servicio",
y = "Costo promedio ($)",
fill = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank(),
axis.text.y = element_text(size = 11),
plot.title = element_text(face = "bold")
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF")) +
scale_y_continuous(labels = scales::dollar_format())Interpretación
De los gráficos se evidencia que:
Las mujeres migrantes utilizan significativamente más servicios de salud que los hombres, especialmente en áreas de prevención y diagnóstico, como:
Por el contrario, los hombres migrantes priorizan servicios más reactivos, como:
A pesar de que los costos unitarios por servicio son similares entre ambos géneros, el volumen de atenciones femeninas genera un mayor gasto acumulado. Esto puede estar asociado a necesidades reproductivas, controles prenatales y una mayor adherencia al sistema de salud por parte de las mujeres.
Análisis por género y edad en servicios de urgencias
Vamos a analizar específicamente por qué las mujeres acuden más a los servicios de urgencias, enfocándonos en la distribución por edad y género:
# Filtrar datos de urgencias y crear un dataset específico
datos_urgencias <- datos %>%
filter(str_detect(servicio, "URGENCIAS") |
str_detect(tipo_de_servicio, "CONSULTA") &
str_detect(servicio, "39145")) %>%
mutate(
# Corregir formato de grupos etarios
curso_de_vida = str_replace_all(curso_de_vida, "años", "años")
)
# Resumen de urgencias por sexo y grupo etario
resumen_urgencias <- datos_urgencias %>%
group_by(sexo, curso_de_vida) %>%
summarise(
total = sum(cantidad),
costo_total = sum(valor_servicio * cantidad),
costo_promedio = mean(valor_servicio),
.groups = "drop"
) %>%
mutate(curso_de_vida = factor(
curso_de_vida,
levels = c("0 a 6 años", "7 a 11 años", "12 a 17 años",
"18 a 28 años", "29 a 59 años", ">60 años")
)) %>%
arrange(curso_de_vida)
# Tabla comparativa con razón de urgencias mujer:hombre por grupo de edad
tabla_comparativa <- resumen_urgencias %>%
select(sexo, curso_de_vida, total) %>%
pivot_wider(
names_from = sexo,
values_from = total
) %>%
mutate(
total = Femenino + Masculino,
proporcion_femenino = Femenino / total * 100,
proporcion_masculino = Masculino / total * 100,
razon_f_m = round(Femenino / Masculino, 2)
)
knitr::kable(tabla_comparativa,
caption = "Comparación de atenciones de urgencias por sexo y grupo etario",
col.names = c("Grupo etario", "Mujeres", "Hombres", "Total",
"% Mujeres", "% Hombres", "Razón M:H"))| Grupo etario | Mujeres | Hombres | Total | % Mujeres | % Hombres | Razón M:H |
|---|---|---|---|---|---|---|
| 0 a 6 años | 1445 | 1746 | 3191 | 45.28361 | 54.71639 | 0.83 |
| 7 a 11 años | 445 | 511 | 956 | 46.54812 | 53.45188 | 0.87 |
| 12 a 17 años | 762 | 293 | 1055 | 72.22749 | 27.77251 | 2.60 |
| 18 a 28 años | 6328 | 1381 | 7709 | 82.08587 | 17.91413 | 4.58 |
| 29 a 59 años | 3036 | 1376 | 4412 | 68.81233 | 31.18767 | 2.21 |
| >60 años | 208 | 150 | 358 | 58.10056 | 41.89944 | 1.39 |
# Gráfico 1: Barras comparativas de atenciones de urgencias por grupo etario y sexo
ggplot(resumen_urgencias, aes(x = curso_de_vida, y = total, fill = sexo)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Distribución de atenciones de urgencias por grupo etario y sexo",
subtitle = "Análisis comparativo entre población migrante femenina y masculina",
x = "Grupo etario",
y = "Total de atenciones",
fill = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom",
plot.title = element_text(face = "bold")
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF"))# Gráfico 2: Proporción de urgencias por sexo en cada grupo etario
proporciones <- datos_urgencias %>%
group_by(curso_de_vida) %>%
mutate(curso_de_vida = factor(
curso_de_vida,
levels = c("0 a 6 años", "7 a 11 años", "12 a 17 años",
"18 a 28 años", "29 a 59 años", ">60 años")
)) %>%
count(sexo, wt = cantidad) %>%
mutate(porcentaje = n / sum(n) * 100)
ggplot(proporciones, aes(x = curso_de_vida, y = porcentaje, fill = sexo)) +
geom_col() +
coord_flip() +
labs(
title = "Proporción de atenciones de urgencias por sexo en cada grupo etario",
x = "Grupo etario",
y = "Porcentaje de atenciones (%)",
fill = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank()
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF")) +
scale_y_continuous(labels = scales::percent_format(scale = 1))# Gráfico 3: Razones específicas de consulta de urgencias para mujeres
razones_mujeres <- datos_urgencias %>%
filter(sexo == "Femenino") %>%
group_by(especialidad) %>%
summarise(total = sum(cantidad)) %>%
arrange(desc(total)) %>%
slice_head(n = 8) %>%
mutate(especialidad = reorder(especialidad, total))
ggplot(razones_mujeres, aes(x = especialidad, y = total)) +
geom_bar(stat = "identity", fill = "#FF9AA2") +
coord_flip() +
labs(
title = "Principales especialidades en atenciones de urgencias para mujeres migrantes",
x = "Especialidad médica",
y = "Total de atenciones"
) +
theme_minimal(base_size = 12)Interpretación
Del análisis gráfico se identifican patrones claros en el uso del servicio de urgencias según sexo y edad:
Mapa de calor de atenciones por lugar y sexo
Veamos cómo se distribuyen geográficamente las atenciones:
# Agrupar por lugar y sexo, sumar la cantidad de atenciones
resumen_lugar_sexo <- datos %>%
group_by(lugar, sexo) %>%
summarise(Atenciones = sum(cantidad, na.rm = TRUE)) %>%
ungroup()
# Obtener los 10 lugares con más atenciones
lugares_top <- resumen_lugar_sexo %>%
group_by(lugar) %>%
summarise(total = sum(Atenciones)) %>%
arrange(desc(total)) %>%
slice_head(n = 10) %>%
pull(lugar)
# Filtrar para mostrar solo los lugares top
resumen_lugar_filtrado <- resumen_lugar_sexo %>%
filter(lugar %in% lugares_top)
# Convertir a formato ancho para calcular la proporción de género
prop_lugar <- resumen_lugar_filtrado %>%
pivot_wider(names_from = sexo, values_from = Atenciones, values_fill = 0) %>%
mutate(
Total = Femenino + Masculino,
Proporcion_F = Femenino / Total,
Proporcion_M = Masculino / Total
) %>%
arrange(desc(Total))
# Tabla con proporciones
knitr::kable(prop_lugar %>%
select(lugar, Femenino, Masculino, Total, Proporcion_F, Proporcion_M) %>%
mutate(
Proporcion_F = scales::percent(Proporcion_F, accuracy = 0.1),
Proporcion_M = scales::percent(Proporcion_M, accuracy = 0.1)
),
caption = "Distribución de atenciones por lugar y proporción de género",
col.names = c("Lugar", "Mujeres", "Hombres", "Total", "% Mujeres", "% Hombres"))| Lugar | Mujeres | Hombres | Total | % Mujeres | % Hombres |
|---|---|---|---|---|---|
| HOSPITAL LOCAL NORTE | 55324 | 20671 | 75995 | 72.8% | 27.2% |
| UIMIST | 39478 | 10997 | 50475 | 78.2% | 21.8% |
| C.S COMUNEROS | 21015 | 1552 | 22567 | 93.1% | 6.9% |
| C.S TOLEDO PLATA | 10980 | 2556 | 13536 | 81.1% | 18.9% |
| C.S MORRORICO | 5458 | 3591 | 9049 | 60.3% | 39.7% |
| C.S GIRARDOT | 7237 | 1755 | 8992 | 80.5% | 19.5% |
| C.S ROSARIO | 6021 | 2547 | 8568 | 70.3% | 29.7% |
| EQUIPO EXTRAMURAL | 4127 | 3374 | 7501 | 55.0% | 45.0% |
| C.S CAFE MADRID | 4218 | 1356 | 5574 | 75.7% | 24.3% |
| C.S MUTIS | 3664 | 1677 | 5341 | 68.6% | 31.4% |
# Mapa de calor
ggplot(resumen_lugar_filtrado, aes(x = sexo, y = reorder(lugar, Atenciones), fill = Atenciones)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "#E3EAF7", high = "#337AB7") +
labs(
title = "Mapa de calor: Atenciones por lugar y sexo",
subtitle = "Top 10 lugares con mayor número de atenciones",
x = "Sexo",
y = "Lugar de atención",
fill = "Número de\natenciones"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.y = element_text(size = 10),
panel.grid = element_blank(),
legend.position = "right"
)# Gráfico de barras de proporciones por género en cada lugar
ggplot(prop_lugar, aes(x = reorder(lugar, Total), y = Total)) +
geom_col(aes(fill = "Total")) +
geom_col(aes(y = Femenino, fill = "Femenino")) +
coord_flip() +
scale_fill_manual(values = c("Total" = "#E3EAF7", "Femenino" = "#FF9AA2")) +
labs(
title = "Proporción de atenciones por género en cada lugar",
x = "Lugar de atención",
y = "Número de atenciones",
fill = ""
) +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")Interpretación
Los datos revelan patrones interesantes de uso del sistema según la ubicación geográfica de los centros de atención:
Este análisis espacial complementa la dimensión demográfica y de género, ayudando a visualizar dónde se concentran las brechas de uso del sistema de salud, y reforzando la idea de que el acceso a los servicios no solo depende del sexo o la edad, sino también del lugar de atención y su oferta específica.
Análisis de tendencias temporales
Veamos cómo ha evolucionado la atención a lo largo del tiempo:
# Definir vector de nombres de meses en español
meses_espanol <- c("enero", "febrero", "marzo", "abril", "mayo", "junio",
"julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre")
# Agregar datos por mes, año y sexo
tendencias <- datos %>%
mutate(mes_num = match(mes, meses_espanol), # Convertir nombre del mes a número
fecha = ymd(paste(a_o, mes_num, 15))) %>% # Crear fecha con el número del mes
group_by(fecha, sexo) %>%
summarise(
total_atenciones = sum(cantidad),
costo_total = sum(valor_servicio * cantidad)
) %>%
ungroup()
# Gráfico de tendencia temporal
ggplot(tendencias, aes(x = fecha, y = total_atenciones, color = sexo, group = sexo)) +
geom_line(size = 1) +
geom_point(alpha = 0.6) +
scale_color_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF")) +
labs(
title = "Evolución temporal de atenciones por sexo",
subtitle = "Período 2014-2022",
x = "Fecha",
y = "Número de atenciones",
color = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank()
) +
scale_x_date(date_breaks = "6 months", date_labels = "%b %Y") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))# Crear una variable nueva: costo por atención
costo_por_atencion <- tendencias %>%
mutate(costo_por_atencion = costo_total / total_atenciones)
# Gráfico de evolución del costo promedio por atención
ggplot(costo_por_atencion, aes(x = fecha, y = costo_por_atencion, color = sexo, group = sexo)) +
geom_line(size = 1) +
geom_point(alpha = 0.6) +
scale_color_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF")) +
scale_y_continuous(labels = scales::dollar_format()) +
labs(
title = "Evolución del costo promedio por atención y sexo",
subtitle = "Período 2014-2022",
x = "Fecha",
y = "Costo promedio por atención ($)",
color = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank()
) +
scale_x_date(date_breaks = "6 months", date_labels = "%b %Y") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))# Crear una vista mensual más detallada con desagregación por tipo de servicio
tendencias_detalladas <- datos %>%
mutate(mes_num = match(mes, meses_espanol), # Convertir nombre del mes a número
fecha = ymd(paste(a_o, mes_num, 15)), # Crear fecha con el día 15 del mes
año_mes = format(fecha, "%Y-%m")) %>% # Crear variable año-mes para agrupación
group_by(año_mes, fecha, sexo, tipo_de_servicio) %>%
summarise(
total_atenciones = sum(cantidad),
costo_total = sum(valor_servicio * cantidad),
costo_promedio = costo_total / total_atenciones
) %>%
ungroup()
# 2. Análisis de picos en atenciones con separación por tipo de servicio
ggplot(tendencias_detalladas, aes(x = fecha, y = total_atenciones, fill = tipo_de_servicio)) +
geom_area(alpha = 0.7, position = "stack") +
facet_wrap(~ sexo, ncol = 1) +
labs(
title = "Evolución de atenciones por tipo de servicio y sexo",
subtitle = "Identificación de servicios que generaron picos de atención",
x = "Fecha",
y = "Número de atenciones",
fill = "Tipo de servicio"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank()
) +
scale_x_date(date_breaks = "6 months", date_labels = "%b %Y") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3") +
# Resaltar período COVID (2020-2021)
annotate("rect", xmin = as.Date("2020-03-15"), xmax = as.Date("2021-12-15"),
ymin = 0, ymax = Inf, alpha = 0.1, fill = "gray", data = . %>% filter(sexo == "Femenino"))# 3. Análisis de especialidades médicas durante períodos de pico
# Primero para el pico de Marzo 2017 (hombres)
pico_marzo_2017 <- datos %>%
mutate(mes_num = match(mes, meses_espanol),
fecha = ymd(paste(a_o, mes_num, 15))) %>%
filter(a_o == 2017, mes %in% c("marzo"),
sexo == "Masculino") %>%
group_by(especialidad) %>%
summarise(
total_atenciones = sum(cantidad),
costo_total = sum(valor_servicio * cantidad),
costo_promedio = costo_total / total_atenciones
) %>%
arrange(desc(costo_total)) %>%
slice_head(n = 10)
# Después para el pico de mediados de 2018 (ambos sexos)
pico_2018 <- datos %>%
mutate(mes_num = match(mes, meses_espanol),
fecha = ymd(paste(a_o, mes_num, 15))) %>%
filter(a_o == 2018, mes %in% c("mayo", "junio", "julio")) %>%
group_by(sexo, especialidad) %>%
summarise(
total_atenciones = sum(cantidad),
costo_total = sum(valor_servicio * cantidad),
costo_promedio = costo_total / total_atenciones
) %>%
arrange(sexo, desc(costo_total)) %>%
group_by(sexo) %>%
slice_head(n = 10)
# 5. Tabla resumen de posibles explicaciones para los picos identificados
explicaciones <- data.frame(
Periodo = c("Marzo 2017 (Hombres)",
"Junio 2018 (Hombres)",
"Junio-Dic 2018 (Mujeres)",
"2020-2021 (General)"),
Posible_Explicacion = c(
"Inicio de ola migratoria venezolana y primeras medidas de regularización",
"Implementación del Permiso Especial de Permanencia (PEP) en Colombia",
"Mayor acceso de mujeres migrantes a servicios de salud reproductiva tras regularización",
"Pandemia COVID-19 con aumento en servicios relacionados a enfermedades respiratorias"
),
Servicios_Destacados = c(
paste(pico_marzo_2017$especialidad[1:3], collapse=", "),
paste(pico_2018 %>% filter(sexo == "Masculino") %>% pull(especialidad) %>% head(3), collapse=", "),
paste(pico_2018 %>% filter(sexo == "Femenino") %>% pull(especialidad) %>% head(3), collapse=", "),
"Servicios respiratorios, urgencias, hospitalización por COVID"
)
)
knitr::kable(explicaciones,
caption = "Posibles explicaciones para los picos de atenciones y costos identificados",
col.names = c("Período", "Posible explicación", "Servicios destacados"))| Período | Posible explicación | Servicios destacados |
|---|---|---|
| Marzo 2017 (Hombres) | Inicio de ola migratoria venezolana y primeras medidas de regularización | IMAGENOLOGIA NIVEL II, LABORATORIO NIVEL I, MEDICINA GENERAL |
| Junio 2018 (Hombres) | Implementación del Permiso Especial de Permanencia (PEP) en Colombia | MEDICINA GENERAL, PEDIATRIA, MEDICINA INTERNA |
| Junio-Dic 2018 (Mujeres) | Mayor acceso de mujeres migrantes a servicios de salud reproductiva tras regularización | MEDICINA GENERAL, GINECOLOGIA Y OBSTETRICIA, LABORATORIOS NIVEL II |
| 2020-2021 (General) | Pandemia COVID-19 con aumento en servicios relacionados a enfermedades respiratorias | Servicios respiratorios, urgencias, hospitalización por COVID |
Interpretación general
Estas gráficas, analizadas en conjunto, revelan los siguientes hallazgos clave:
Tendencias de atención
Costos promedio
Tipos de servicio y picos
Análisis de servicios específicos por grupo etario
Analicemos servicios específicos según grupos de edad:
# Reordenar los niveles del curso de vida
datos$curso_de_vida <- factor(
datos$curso_de_vida,
levels = c("0 a 6 años", "7 a 11 años", "12 a 17 años",
"18 a 28 años", "29 a 59 años", ">60 años")
)
# Limpiar formato de años en curso de vida
datos <- datos %>%
mutate(curso_de_vida_clean = str_replace_all(curso_de_vida, "años", "años"))
# Encontrar servicios principales por grupo etario y sexo
servicios_edad <- datos %>%
group_by(curso_de_vida_clean, sexo, servicio) %>%
summarise(total = sum(cantidad)) %>%
arrange(desc(total)) %>%
group_by(curso_de_vida_clean, sexo) %>%
slice_head(n = 3) %>%
ungroup() %>%
arrange(curso_de_vida_clean, sexo, desc(total))
# Crear tabla primero para verificar los datos
knitr::kable(servicios_edad %>%
select(curso_de_vida_clean, sexo, servicio, total),
caption = "Top 3 servicios más utilizados por grupo etario y sexo",
col.names = c("Grupo etario", "Sexo", "Servicio", "Total atenciones"))| Grupo etario | Sexo | Servicio | Total atenciones |
|---|---|---|---|
| 0 a 6 años | Femenino | 939402 NEBULIZACION | 1033 |
| 0 a 6 años | Femenino | VACUNACION COMBINADA CONTRA DIFTERIATETANOS Y TOS FERINA (DPT) | 776 |
| 0 a 6 años | Femenino | VACUNACION CONTRA VARICELA | 742 |
| 0 a 6 años | Masculino | 939402 NEBULIZACION | 1522 |
| 0 a 6 años | Masculino | VACUNACION COMBINADA CONTRA DIFTERIATETANOS Y TOS FERINA (DPT) | 884 |
| 0 a 6 años | Masculino | VACUNACION CONTRA VARICELA | 817 |
| 12 a 17 años | Femenino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 464 |
| 12 a 17 años | Femenino | UROANALISIS CON SEDIMENTO Y DENSIDAD URINARIA | 295 |
| 12 a 17 años | Femenino | 890701 CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 271 |
| 12 a 17 años | Masculino | CONSULTA DE PRIMERA VEZ POR MEDICINA GENERAL | 175 |
| 12 a 17 años | Masculino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 162 |
| 12 a 17 años | Masculino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 118 |
| 18 a 28 años | Femenino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 3947 |
| 18 a 28 años | Femenino | UROANALISIS CON SEDIMENTO Y DENSIDAD URINARIA | 2546 |
| 18 a 28 años | Femenino | VIH 1 Y 2 ANTICUERPOS | 2461 |
| 18 a 28 años | Masculino | CONSULTA DE PRIMERA VEZ POR MEDICINA GENERAL | 765 |
| 18 a 28 años | Masculino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 669 |
| 18 a 28 años | Masculino | 890701 CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 399 |
| 29 a 59 años | Femenino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 1951 |
| 29 a 59 años | Femenino | UROANALISIS CON SEDIMENTO Y DENSIDAD URINARIA | 1196 |
| 29 a 59 años | Femenino | CONSULTA DE CONTROL O DE SEGUIMIENTO POR MEDICINA GENERAL | 1118 |
| 29 a 59 años | Masculino | CONSULTA DE PRIMERA VEZ POR MEDICINA GENERAL | 757 |
| 29 a 59 años | Masculino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 744 |
| 29 a 59 años | Masculino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 499 |
| 7 a 11 años | Femenino | VACUNACION COMBINADA CONTRA SARAMPION Y RUBEOLA [SR] (DOBLE VIRAL) | 343 |
| 7 a 11 años | Femenino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 182 |
| 7 a 11 años | Femenino | VACUNACION CONTRA VIRUS PAPILOMA HUMANO [VPH] | 171 |
| 7 a 11 años | Masculino | VACUNACION COMBINADA CONTRA SARAMPION Y RUBEOLA [SR] (DOBLE VIRAL) | 304 |
| 7 a 11 años | Masculino | 939402 NEBULIZACION | 296 |
| 7 a 11 años | Masculino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 225 |
| >60 años | Femenino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 159 |
| >60 años | Femenino | CONSULTA DE CONTROL O DE SEGUIMIENTO POR MEDICINA GENERAL | 115 |
| >60 años | Femenino | CUIDADO (MANEJ O) INTRAHOSPITALARIO POR MEDICINA ESPECIALIZADA | 109 |
| >60 años | Masculino | HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 124 |
| >60 años | Masculino | CONSULTA DE CONTROL O DE SEGUIMIENTO POR MEDICINA GENERAL | 113 |
| >60 años | Masculino | CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 77 |
# Crear etiquetas más cortas para los servicios (asegurando que no haya NA)
servicios_edad <- servicios_edad %>%
mutate(servicio_corto = ifelse(is.na(servicio),
"No especificado",
substr(as.character(servicio), 1, 25)))
# Visualizar los 3 servicios principales por grupo etario y sexo
ggplot(servicios_edad, aes(x = reorder(servicio_corto, total), y = total, fill = sexo)) +
geom_col() +
facet_grid(curso_de_vida_clean ~ sexo, scales = "free_y") +
coord_flip() +
labs(
title = "Top 3 servicios más utilizados por grupo etario y sexo",
x = "Servicio",
y = "Total de atenciones",
fill = "Sexo"
) +
theme_minimal(base_size = 10) +
theme(
legend.position = "bottom",
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "#e3eaf7"),
strip.text = element_text(face = "bold", size = 9),
axis.text.y = element_text(size = 8) # Texto más pequeño para que quepa mejor
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF"))library(moments)
# 1. Limpiar y agregar datos por grupo etario y sexo
distribucion_edad_sexo <- datos %>%
# Corregir el problema de codificación de "años"
mutate(grupo_edad = str_replace_all(curso_de_vida, "años", "años")) %>%
# Asegurar orden correcto de grupos etarios
mutate(grupo_edad = factor(grupo_edad,
levels = c("0 a 6 años", "7 a 11 años", "12 a 17 años",
"18 a 28 años", "29 a 59 años", ">60 años"),
ordered = TRUE)) %>%
# Contar atenciones por grupo de edad y sexo
group_by(sexo, grupo_edad) %>%
summarise(total_atenciones = sum(cantidad, na.rm = TRUE)) %>%
arrange(sexo, grupo_edad)
# 2. Mostrar la tabla de distribución por edad y sexo
knitr::kable(distribucion_edad_sexo,
caption = "Distribución de atenciones por grupo etario y sexo",
col.names = c("Sexo", "Grupo de edad", "Total de atenciones"))| Sexo | Grupo de edad | Total de atenciones |
|---|---|---|
| Femenino | 0 a 6 años | 21187 |
| Femenino | 7 a 11 años | 4424 |
| Femenino | 12 a 17 años | 11178 |
| Femenino | 18 a 28 años | 97448 |
| Femenino | 29 a 59 años | 48543 |
| Femenino | >60 años | 3623 |
| Masculino | 0 a 6 años | 23183 |
| Masculino | 7 a 11 años | 4279 |
| Masculino | 12 a 17 años | 2630 |
| Masculino | 18 a 28 años | 10397 |
| Masculino | 29 a 59 años | 14901 |
| Masculino | >60 años | 2979 |
# 3. Asignar valores numéricos representativos para cálculos estadísticos
datos_estadisticos_sexo <- distribucion_edad_sexo %>%
mutate(edad_representativa = case_when(
grupo_edad == "0 a 6 años" ~ 3,
grupo_edad == "7 a 11 años" ~ 9,
grupo_edad == "12 a 17 años" ~ 14.5,
grupo_edad == "18 a 28 años" ~ 23,
grupo_edad == "29 a 59 años" ~ 44,
grupo_edad == ">60 años" ~ 70,
TRUE ~ NA_real_
))
# 4. Calcular estadísticas por sexo
stats_por_sexo <- datos_estadisticos_sexo %>%
group_by(sexo) %>%
summarize(
# Media ponderada
media_ponderada = sum(edad_representativa * total_atenciones) / sum(total_atenciones),
# Momento 2 (varianza)
m2 = sum(total_atenciones * (edad_representativa - media_ponderada)^2) /
sum(total_atenciones),
# Momento 3 (para sesgo)
m3 = sum(total_atenciones * (edad_representativa - media_ponderada)^3) /
sum(total_atenciones),
# Momento 4 (para curtosis)
m4 = sum(total_atenciones * (edad_representativa - media_ponderada)^4) /
sum(total_atenciones),
# Calcular sesgo y curtosis
desv_est = sqrt(m2),
sesgo = m3 / (m2^(3/2)),
curtosis_exceso = m4 / (m2^2) - 3
)
# 5. Visualizar la distribución por sexo
p1 <- ggplot(distribucion_edad_sexo, aes(x = grupo_edad, y = total_atenciones, fill = sexo)) +
geom_col(position = "dodge") +
geom_text(aes(label = total_atenciones),
position = position_dodge(width = 0.9),
vjust = -0.5, size = 3) +
labs(
title = "Distribución de atenciones por grupo etario y sexo",
subtitle = paste("Sesgo - Femenino:", round(stats_por_sexo$sesgo[1], 2),
"| Masculino:", round(stats_por_sexo$sesgo[2], 2)),
x = "Grupo de edad",
y = "Total de atenciones",
fill = "Sexo"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF"))
# 6. Crear datos para histograma y densidad - VERSIÓN CORREGIDA
datos_densidad <- bind_rows(
# Datos para mujeres
datos_estadisticos_sexo %>%
filter(sexo == "Femenino") %>%
rowwise() %>%
do(data.frame(
sexo = "Femenino",
edad = rep(.$edad_representativa, times = ceiling(.$total_atenciones/100))
)),
# Datos para hombres
datos_estadisticos_sexo %>%
filter(sexo == "Masculino") %>%
rowwise() %>%
do(data.frame(
sexo = "Masculino",
edad = rep(.$edad_representativa, times = ceiling(.$total_atenciones/100))
))
)
# 7. Visualizar la distribución aproximada por sexo
p2 <- ggplot(datos_densidad, aes(x = edad, fill = sexo, color = sexo)) +
geom_histogram(binwidth = 5, alpha = 0.6, position = "identity") +
geom_density(aes(y = ..count.. * 5), alpha = 0.3, size = 1) +
labs(
title = "Distribución aproximada de la edad en atenciones por sexo",
subtitle = paste("Media - Femenino:", round(stats_por_sexo$media_ponderada[1], 1),
"| Masculino:", round(stats_por_sexo$media_ponderada[2], 1)),
x = "Edad representativa",
y = "Frecuencia",
fill = "Sexo",
color = "Sexo"
) +
theme_minimal() +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF")) +
scale_color_manual(values = c("Femenino" = "#FF7A82", "Masculino" = "#4692DF"))
# 8. Tabla con estadísticas descriptivas comparativas por sexo
estadisticas_tabla <- data.frame(
Estadistica = c("Media (años)", "Desviación estándar (años)", "Sesgo", "Curtosis (exceso)"),
Femenino = c(round(stats_por_sexo$media_ponderada[1], 2),
round(stats_por_sexo$desv_est[1], 2),
round(stats_por_sexo$sesgo[1], 2),
round(stats_por_sexo$curtosis_exceso[1], 2)),
Masculino = c(round(stats_por_sexo$media_ponderada[2], 2),
round(stats_por_sexo$desv_est[2], 2),
round(stats_por_sexo$sesgo[2], 2),
round(stats_por_sexo$curtosis_exceso[2], 2)),
Interpretacion = c(
paste("Las mujeres tienen una edad promedio de atención de",
round(stats_por_sexo$media_ponderada[1], 1),
"años frente a", round(stats_por_sexo$media_ponderada[2], 1),
"años para los hombres."),
paste("La distribución de edades en mujeres es",
ifelse(stats_por_sexo$desv_est[1] > stats_por_sexo$desv_est[2], "más dispersa", "menos dispersa"),
"que en hombres."),
paste("Para mujeres:",
ifelse(stats_por_sexo$sesgo[1] < 0,
"Distribución sesgada a la izquierda (mayor concentración en edades mayores)",
"Distribución sesgada a la derecha (mayor concentración en edades menores)"),
"| Para hombres:",
ifelse(stats_por_sexo$sesgo[2] < 0,
"Distribución sesgada a la izquierda (mayor concentración en edades mayores)",
"Distribución sesgada a la derecha (mayor concentración en edades menores)")),
paste("Para mujeres:",
ifelse(stats_por_sexo$curtosis_exceso[1] > 0,
"Distribución leptocúrtica (más puntiaguda)",
"Distribución platicúrtica (más plana)"),
"| Para hombres:",
ifelse(stats_por_sexo$curtosis_exceso[2] > 0,
"Distribución leptocúrtica (más puntiaguda)",
"Distribución platicúrtica (más plana)"))
)
)
# 9. Mostrar resultados
p1| Estadistica | Femenino | Masculino | Interpretacion |
|---|---|---|---|
| Media (años) | 26.27 | 21.41 | Las mujeres tienen una edad promedio de atención de 26.3 años frente a 21.4 años para los hombres. |
| Desviación estándar (años) | 14.20 | 19.98 | La distribución de edades en mujeres es menos dispersa que en hombres. |
| Sesgo | 0.49 | 0.77 | Para mujeres: Distribución sesgada a la derecha (mayor concentración en edades menores) | Para hombres: Distribución sesgada a la derecha (mayor concentración en edades menores) |
| Curtosis (exceso) | 0.29 | -0.50 | Para mujeres: Distribución leptocúrtica (más puntiaguda) | Para hombres: Distribución platicúrtica (más plana) |
# 10. Crear gráfico de proporciones para mejor visualización
# Calcular proporciones por grupo etario y sexo
proporciones_sexo <- distribucion_edad_sexo %>%
group_by(grupo_edad) %>%
mutate(proporcion = total_atenciones / sum(total_atenciones) * 100) %>%
ungroup()
# Gráfico de proporciones
p3 <- ggplot(proporciones_sexo, aes(x = grupo_edad, y = proporcion, fill = sexo)) +
geom_bar(stat = "identity", position = "fill") +
geom_text(aes(label = paste0(round(proporcion), "%")),
position = position_fill(vjust = 0.5),
color = "white", size = 3) +
labs(
title = "Proporción de atenciones por grupo etario y sexo",
x = "Grupo de edad",
y = "Proporción",
fill = "Sexo"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF")) +
scale_y_continuous(labels = scales::percent_format(scale = 1))
p3Interpretación
El gráfico revela diferencias notables en la forma en que hombres y mujeres migrantes acceden a los servicios de salud a lo largo del ciclo de vida:
0 a 11 años:
12 a 28 años:
12 a 28 años (hombres):
29 a 59 años:
Mayores de 60 años:
Además, si observamos la distribución total de atenciones por grupo etario, se confirma que el rango de 18 a 28 años en mujeres concentra el mayor volumen absoluto, seguido por el grupo de 29 a 59 años.
Esto justifica enfocar el siguiente análisis en el grupo de mujeres entre 18 y 28 años, por ser el segmento más representativo, con mayor carga diagnóstica, gasto acumulado y necesidades específicas en salud reproductiva, sexual y preventiva.
Análisis específico para mujeres de 18-28 años
# Filtrar datos para mujeres de 18-28 años
# (Corrigiendo el formato de "años" que tiene problemas en los datos)
mujeres_jovenes <- datos %>%
filter(sexo == "Femenino") %>%
mutate(curso_de_vida_clean = str_replace_all(curso_de_vida, "años", "años")) %>%
filter(curso_de_vida_clean == "18 a 28 años")
# Tabla: Top 15 servicios más utilizados por mujeres jóvenes
servicios_top <- mujeres_jovenes %>%
group_by(servicio) %>%
summarise(
total_atenciones = sum(cantidad),
costo_promedio = mean(valor_servicio),
costo_total = sum(cantidad * valor_servicio)
) %>%
arrange(desc(total_atenciones)) %>%
slice_head(n = 15)
# Mostrar tabla de servicios top
knitr::kable(servicios_top %>%
mutate(
costo_promedio = round(costo_promedio, 2),
costo_total = round(costo_total, 2)
),
caption = "Top 15 servicios más utilizados por mujeres migrantes de 18-28 años",
col.names = c("Servicio", "Total Atenciones", "Costo Promedio ($)", "Costo Total ($)"))| Servicio | Total Atenciones | Costo Promedio (\()| Costo Total (\)) | |
|---|---|---|---|
| HEMOGRAMA IV [HEMOGLOBINA HEMATOCRITO RECUENTO ETC | 3947 | 21041.69 | 83361417 |
| UROANALISIS CON SEDIMENTO Y DENSIDAD URINARIA | 2546 | 13235.19 | 33707915 |
| VIH 1 Y 2 ANTICUERPOS | 2461 | 70840.05 | 174344756 |
| TREPONEMA PALLIDUM ANTICUERPOS (PRUEBA TREPONEMICA) MANUAL O SEMIAUTOMATIZADA O AUTOMATIZADA | 2299 | 13558.09 | 31170928 |
| 890701 CONSULTA DE URGENCIAS POR MEDICINA GENERAL | 2137 | 53285.06 | 113870180 |
| EXAMEN DIRECTO FRESCO DE CUALQUIER MUESTRA | 2086 | 43990.62 | 91764443 |
| 902208 HEMOGRAMA II ( HEMOGLOBINA HEMATOCRITO RECUENTO DE ERITROCITOS | 1898 | 22032.09 | 41816900 |
| 890301 CONSULTA DE CONTROL O DE SEGUIMIE MEDIC GRAL | 1845 | 26098.16 | 48151100 |
| GONADOTROPINA CORIONICA SUBUNIDAD BETA CUALITATIVA [BHCG] PRUEBA DE EMBARAZO EN ORINA O SUERO | 1812 | 12191.46 | 22096719 |
| CONSULTA DE URGENCIAS POR MEDICINA GENERAL - PARTOS | 1733 | 52797.74 | 91498482 |
| CONSULTA MEDICA DE CONTROL EN PRENATAL | 1644 | 28404.63 | 46697213 |
| 907106 UROANÃLISIS CON SEDIMENTO Y DENSIDAD URINARIA | 1510 | 13152.52 | 19860300 |
| HEMOCLASIFICACION GRUPO ABO Y FACTOR RH | 1422 | 25830.91 | 36733640 |
| ECOGRAFÃA PÉLVICA GINECOLÓGICA TRANSABDOMINAL POR MEDICINA GENERAL | 1363 | 76432.27 | 104177190 |
| 906249 VIH 1 Y 2 ANTICUERPOS & | 1358 | 68347.18 | 92815464 |
# Gráfico de barras para los servicios principales
ggplot(servicios_top %>% slice_head(n = 10),
aes(x = reorder(servicio, total_atenciones), y = total_atenciones)) +
geom_bar(stat = "identity", fill = "#FF9AA2") +
coord_flip() +
labs(
title = "Top 10 servicios más utilizados por mujeres migrantes de 18-28 años",
x = "Servicio",
y = "Total de atenciones"
) +
theme_minimal(base_size = 12) +
theme(axis.text.y = element_text(size = 9))Interpretación
Las mujeres entre 18 y 28 años destacan como el grupo etario con mayor número de atenciones en todo el sistema de salud. Dentro de este grupo, los servicios más utilizados incluyen pruebas de laboratorio, consultas médicas generales, y atención de urgencias. Sin embargo, un hallazgo particularmente relevante es el rol central de los servicios relacionados con detección y control de enfermedades de transmisión sexual (ETS), especialmente VIH.
Servicios destacados:
VIH 1 y 2 anticuerpos:
Representa el servicio más costoso en total en este grupo, lo que refleja una inversión importante en tamizaje y prevención.
Prueba treponémica (sífilis):
Consulta de urgencias por parto y control prenatal:
Reflejan un fuerte componente reproductivo y perinatal en las atenciones
Prueba de embarazo (HCG) y uroanálisis:
Análisis específico de servicios relacionados con VIH por sexo
# Filtrar servicios relacionados con VIH
datos_vih <- datos %>%
filter(str_detect(toupper(servicio), "VIH")) %>%
group_by(sexo) %>%
summarise(total_atenciones = sum(cantidad)) %>%
mutate(porcentaje = total_atenciones / sum(total_atenciones) * 100)
# Ver la tabla de resultados
knitr::kable(datos_vih,
caption = "Distribución de atenciones relacionadas con VIH por sexo",
col.names = c("Sexo", "Total Atenciones", "Porcentaje (%)"))| Sexo | Total Atenciones | Porcentaje (%) |
|---|---|---|
| Femenino | 6879 | 94.765119 |
| Masculino | 380 | 5.234881 |
# Crear diagrama de sectores
ggplot(datos_vih, aes(x = "", y = porcentaje, fill = sexo)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
labs(
title = "Proporción de atenciones relacionadas con VIH por sexo",
subtitle = "Población migrante 2014-2022",
fill = "Sexo"
) +
geom_text(aes(label = paste0(round(porcentaje, 1), "%")),
position = position_stack(vjust = 0.5)) +
theme_minimal() +
theme(
axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank()
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF"))# Análisis adicional: top servicios específicos relacionados con VIH
servicios_vih_especificos <- datos %>%
filter(str_detect(toupper(servicio), "VIH")) %>%
count(servicio, sexo, wt = cantidad) %>%
arrange(desc(n)) %>%
group_by(servicio) %>%
mutate(total_servicio = sum(n)) %>%
ungroup() %>%
arrange(desc(total_servicio))
# Tabla de servicios específicos de VIH por sexo
knitr::kable(servicios_vih_especificos,
caption = "Distribución de atenciones por tipo específico de servicio de VIH",
col.names = c("Servicio específico", "Sexo", "Total Atenciones", "Total por servicio"))| Servicio específico | Sexo | Total Atenciones | Total por servicio |
|---|---|---|---|
| VIH 1 Y 2 ANTICUERPOS | Femenino | 3501 | 3644 |
| VIH 1 Y 2 ANTICUERPOS | Masculino | 143 | 3644 |
| 906249 VIH 1 Y 2 ANTICUERPOS & | Femenino | 1861 | 2021 |
| 906249 VIH 1 Y 2 ANTICUERPOS & | Masculino | 160 | 2021 |
| 906249MAT VIH 1 Y 2 ANTICUERPOS | Femenino | 761 | 776 |
| 906249MAT VIH 1 Y 2 ANTICUERPOS | Masculino | 15 | 776 |
| 19878 VIH 1 Y 2 ANTICUERPOS | Femenino | 380 | 421 |
| 19878 VIH 1 Y 2 ANTICUERPOS | Masculino | 41 | 421 |
| ASESORIA PRE Y POS TEST VIH | Femenino | 182 | 200 |
| ASESORIA PRE Y POS TEST VIH | Masculino | 18 | 200 |
| PERINATAL - VIH (PRUEBA RAPIDA) | Femenino | 187 | 187 |
| VIRUS DE INMUNODEFICIENCIA HUMANA PRUEBA CONFIRMATORIA (VIH) | Masculino | 3 | 5 |
| VIRUS DE INMUNODEFICIENCIA HUMANA PRUEBA CONFIRMATORIA (VIH) | Femenino | 2 | 5 |
| 906249CP VIH 1 Y 2 ANTICUERPOS | Femenino | 4 | 4 |
| 19878-1 VIH CARGA VIRAL CUALQUIER TECNICA | Femenino | 1 | 1 |
# Análisis por grupo etario y sexo para servicios relacionados con VIH
datos_vih_edad <- datos %>%
filter(str_detect(toupper(servicio), "VIH")) %>%
mutate(curso_de_vida_clean = str_replace_all(curso_de_vida, "años", "años")) %>%
group_by(curso_de_vida_clean, sexo) %>%
summarise(total_atenciones = sum(cantidad)) %>%
ungroup()
# Visualización por grupo etario para servicios de VIH
ggplot(datos_vih_edad, aes(x = curso_de_vida_clean, y = total_atenciones, fill = sexo)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Atenciones relacionadas con VIH por grupo etario y sexo",
x = "Grupo etario",
y = "Total de atenciones",
fill = "Sexo"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom"
) +
scale_fill_manual(values = c("Femenino" = "#FF9AA2", "Masculino" = "#66B2FF"))Interpretación
La figura del diagrama de sectores muestra que el 94.8% de las atenciones relacionadas con VIH fueron para mujeres, frente a apenas un 5.2% en hombres migrantes. Esta disparidad extrema podría tener múltiples explicaciones:
La siguiente figura detalla los diferentes tipos de servicios relacionados con VIH:
Este patrón refuerza la idea de que los hombres migrantes tienen una menor presencia en esquemas de tamizaje, diagnóstico o control para VIH, a pesar de ser también población de riesgo.
¿Los resultados responden a las preguntas de investigación?
¿Cuáles son los 3 servicios de salud más utilizados por mujeres migrantes vs. hombres migrantes, y cómo se compara su costo promedio?
¿Existen diferencias significativas en el tipo de especialidad médica demandada según el sexo?
¿Cómo varía la distribución del costo?
¿Hay hallazgos inesperados?
Sí, el estudio reveló fenómenos no anticipados inicialmente:
¿Qué valor aporta este análisis?
Resumen del problema
El presente estudio se enfocó en analizar cómo la población migrante accede a los servicios de salud en el municipio, diferenciando según sexo, edad, tipo de servicio, sede de atención y periodo temporal. El objetivo fue identificar patrones de uso, diferencias en especialidades demandadas y distribución del gasto en salud.
Resumen del enfoque y metodología
Se trabajó con un conjunto de datos del Ministerio de Salud, que contiene más de 230.000 registros de atenciones a población migrante entre octubre de 2014 y diciembre de 2022.
Se aplicó una metodología de análisis exploratorio de datos en RMarkdown, que incluyó:
Ideas interesantes encontradas
Implicaciones para el consumidor
Los hallazgos tienen valor práctico para múltiples actores del sistema de salud:
Además, se abre la puerta a estudios predictivos que ayuden a anticipar sobrecargas, identificar grupos invisibilizados y diseñar soluciones específicas.
Limitaciones
Posibles mejoras