Cargar los paquetes readxl, janitor, naniar y tidyverse utilizando la función library().
Si alguno de los paquetes no está instalado, deberás instalarlo utilizando install.packages().
library(readxl)
library(janitor)
library(naniar)
library(tidyverse)
Consigna: Leé el archivo Excel utilizando read_excel() y guardá la información en un objeto llamado “datos”.
datos <- read_excel("controles_salud.xlsx", sheet = "controles")
Antes de comenzar el análisis, es importante conocer cómo está organizada la base de datos. Para ello, vamos a explorar los nombres de las variables y observar la estructura general del conjunto de datos.
Realizá las siguientes actividades insertando dos chunks de código:
names(datos)
## [1] "ID Paciente" "Fecha Control" "Departamento"
## [4] "Sexo" "Edad" "Peso (kg)"
## [7] "Talla (cm)" "Presión Sistólica" "Presión Diastólica"
## [10] "Glucemia (mg/dl)" "Diabetes" "Fumador"
glimpse(datos)
## Rows: 120
## Columns: 12
## $ `ID Paciente` <chr> "P001", "P002", "P003", "P004", "P005", "P006", "…
## $ `Fecha Control` <dttm> 2026-05-15, 2026-08-19, 2026-07-12, 2026-03-02, …
## $ Departamento <chr> "Andalgalá", "Valle Viejo", "Capital", "Belén", "…
## $ Sexo <chr> "F", "F", "M", "M", "F", "F", "M", "F", "F", "F",…
## $ Edad <dbl> 23, 58, 35, 73, 43, 57, 65, 66, 21, 29, 47, 59, 8…
## $ `Peso (kg)` <dbl> 68.7, 69.6, 87.8, 94.8, 62.4, 110.2, 64.3, 63.6, …
## $ `Talla (cm)` <dbl> 162, 157, 170, 168, 159, 178, 167, 150, 166, 150,…
## $ `Presión Sistólica` <dbl> 113, 126, 144, 152, 115, 146, 122, 118, 132, 116,…
## $ `Presión Diastólica` <dbl> 70, 70, 66, 85, 80, 71, 65, 69, 63, 62, 64, 77, 8…
## $ `Glucemia (mg/dl)` <dbl> 90, 91, 78, NA, 100, 87, 82, 86, 85, 98, 70, 184,…
## $ Diabetes <chr> "No", "No", "No", "No", "No", "No", "No", "No", "…
## $ Fumador <chr> "No", "No", "No", "No", "No", "Sí", "No", "No", "…
Responder:
¿Cuántas filas (pacientes) y cuántas columnas (variables) tiene la base? La base de datos cuenta con 120 registros (o filas) y 12 variables (o columnas).
¿Todas las variables son del mismo tipo? Indicar el tipo de variable(categóricas character, numéricas double) No. La base está compuesta por tres tipos de variables: character (chr), dbl (dbl) y datetime (dttm).
Una vez explorada la base de datos, vamos a realizar una primera preparación. Para ello, utilizaremos la función “clean_names()” del paquete janitor, que permite estandarizar los nombres de las variables.
salud <- clean_names(datos)
names(salud)
## [1] "id_paciente" "fecha_control" "departamento"
## [4] "sexo" "edad" "peso_kg"
## [7] "talla_cm" "presion_sistolica" "presion_diastolica"
## [10] "glucemia_mg_dl" "diabetes" "fumador"
glimpse(salud)
## Rows: 120
## Columns: 12
## $ id_paciente <chr> "P001", "P002", "P003", "P004", "P005", "P006", "P0…
## $ fecha_control <dttm> 2026-05-15, 2026-08-19, 2026-07-12, 2026-03-02, 20…
## $ departamento <chr> "Andalgalá", "Valle Viejo", "Capital", "Belén", "Fr…
## $ sexo <chr> "F", "F", "M", "M", "F", "F", "M", "F", "F", "F", "…
## $ edad <dbl> 23, 58, 35, 73, 43, 57, 65, 66, 21, 29, 47, 59, 80,…
## $ peso_kg <dbl> 68.7, 69.6, 87.8, 94.8, 62.4, 110.2, 64.3, 63.6, 73…
## $ talla_cm <dbl> 162, 157, 170, 168, 159, 178, 167, 150, 166, 150, 1…
## $ presion_sistolica <dbl> 113, 126, 144, 152, 115, 146, 122, 118, 132, 116, 1…
## $ presion_diastolica <dbl> 70, 70, 66, 85, 80, 71, 65, 69, 63, 62, 64, 77, 84,…
## $ glucemia_mg_dl <dbl> 90, 91, 78, NA, 100, 87, 82, 86, 85, 98, 70, 184, 1…
## $ diabetes <chr> "No", "No", "No", "No", "No", "No", "No", "No", "No…
## $ fumador <chr> "No", "No", "No", "No", "No", "Sí", "No", "No", "No…
Responder:
| Variable Numérica (dbl) | Variable de Texto (chr) | Variable de Fecha (dttm) |
|---|---|---|
| edad | id_paciente | fecha_control |
| peso_kg | departamento | |
| talla_cm | sexo | |
| presion_sistolica | diabetes | |
| presion_diastolica | fumador | |
| glucemia_mg_dl | id_paciente |
unique(salud$`ID Paciente`) es más cómodo utilizar
unique(salud$id_paciente), la sintaxis es más limpia.Una precisión conceptual: clean_names() modifica los nombres, no los valores de las variables ni sus tipos de datos.
Utilizá la función “vis_miss()” del paquete naniar para conocer la cantidad y el porcentaje de datos faltantes de cada variable.
vis_miss(salud)
Responder: - ¿Qué variables presentan datos faltantes? La variable glucemia_mg_dl es la única que presenta datos faltantes.
¿Cuál es la variable que tiene mayor cantidad de datos faltantes? La variable glucemia_mg_dl cuenta con 3 registros con datos faltantes.
¿Considerás que los datos faltantes pueden afectar los resultados de un análisis estadístico? ¿Por qué? Sí, los datos faltantes afectan drásticamente los resultados estadísticos porque, más allá de reducir el tamaño de la muestra y perder poder estadístico, el mayor riesgo es la introducción de sesgos sistemáticos. Si la ausencia de información no es completamente aleatoria, los datos analizados dejan de representar la realidad del fenómeno, aumentando el margen de error y distorsionando la varianza original. Además, al aplicar tratamientos de limpieza (como descartar filas completas que contienen NA), se pueden alterar severamente las correlaciones entre las variables, lo que termina invalidando la rigurosidad del análisis y conduciendo a decisiones equivocadas basadas en una imagen parcial de la realidad.
Vamos a suponer que nos interesa trabajar solamente con algunas variables de la base de datos.
Creá un nuevo objeto llamado “variables_seleccionadas” que contenga las siguientes variables: - Sexo. - Peso - Edad. - Departamento. - Presión sistólica. - Glucemia.
Para ello, utilizá la función “select()” y el operador pipe (|>).
Recordá la siguiente estructura:nuevo_objeto <- objeto_original
|>
select(variable_1, variable_2, variable_3)
variables_seleccionadas <- salud |>
select(sexo, peso_kg, edad, departamento, presion_sistolica, glucemia_mg_dl)
Para visualizar el nuevo objeto, insertá otro chunk y escribí el nombre del objeto creado.
variables_seleccionadas
## # A tibble: 120 × 6
## sexo peso_kg edad departamento presion_sistolica glucemia_mg_dl
## <chr> <dbl> <dbl> <chr> <dbl> <dbl>
## 1 F 68.7 23 Andalgalá 113 90
## 2 F 69.6 58 Valle Viejo 126 91
## 3 M 87.8 35 Capital 144 78
## 4 M 94.8 73 Belén 152 NA
## 5 F 62.4 43 Fray Mamerto Esquiú 115 100
## 6 F 110. 57 Fray Mamerto Esquiú 146 87
## 7 M 64.3 65 Valle Viejo 122 82
## 8 F 63.6 66 Belén 118 86
## 9 F 73.6 21 Andalgalá 132 85
## 10 F 55.2 29 Tinogasta 116 98
## # ℹ 110 more rows
Responder: - ¿Cuántas variables tiene ahora la nueva base de datos? La nueva base de datos cuenta con 6 variables. - ¿Se modificó la cantidad de pacientes respecto de la base original? (Inserta un nuevo chunk y utiliza la función glimpse para responder esta pregunta) No. La cantidad de pacientes no fue modificada al seleccionar un grupo de variables específicas.
glimpse(variables_seleccionadas)
## Rows: 120
## Columns: 6
## $ sexo <chr> "F", "F", "M", "M", "F", "F", "M", "F", "F", "F", "M…
## $ peso_kg <dbl> 68.7, 69.6, 87.8, 94.8, 62.4, 110.2, 64.3, 63.6, 73.…
## $ edad <dbl> 23, 58, 35, 73, 43, 57, 65, 66, 21, 29, 47, 59, 80, …
## $ departamento <chr> "Andalgalá", "Valle Viejo", "Capital", "Belén", "Fra…
## $ presion_sistolica <dbl> 113, 126, 144, 152, 115, 146, 122, 118, 132, 116, 12…
## $ glucemia_mg_dl <dbl> 90, 91, 78, NA, 100, 87, 82, 86, 85, 98, 70, 184, 16…
En esta actividad vamos a seleccionar pacientes que cumplan determinadas condiciones.
Creá un nuevo objeto llamado “masculino” utilizando filter() para seleccionar únicamente los pacientes de sexo masculino.
Podés utilizar esta estructura:
nuevo_objeto <- objeto_original |> filter(sexo == “Masculino”)
Valores únicos de la variable sexo
unique(salud$sexo)
## [1] "F" "M"
masculino <- salud |> filter(sexo == "M")
glimpse(masculino)
## Rows: 67
## Columns: 12
## $ id_paciente <chr> "P003", "P004", "P007", "P011", "P015", "P016", "P0…
## $ fecha_control <dttm> 2026-07-12, 2026-03-02, 2026-05-06, 2026-03-28, 20…
## $ departamento <chr> "Capital", "Belén", "Valle Viejo", "Capital", "Vall…
## $ sexo <chr> "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "…
## $ edad <dbl> 35, 73, 65, 47, 61, 24, 26, 19, 43, 66, 44, 73, 24,…
## $ peso_kg <dbl> 87.8, 94.8, 64.3, 87.3, 66.0, 84.2, 68.4, 114.5, 76…
## $ talla_cm <dbl> 170, 168, 167, 184, 161, 172, 170, 190, 172, 161, 1…
## $ presion_sistolica <dbl> 144, 152, 122, 129, 156, 107, 125, 107, 137, 136, 1…
## $ presion_diastolica <dbl> 66, 85, 65, 64, 78, 80, 58, 89, 74, 72, 70, 68, 56,…
## $ glucemia_mg_dl <dbl> 78, NA, 82, 70, 81, 98, 67, 101, 88, NA, 85, 91, 93…
## $ diabetes <chr> "No", "No", "No", "No", "No", "No", "No", "No", "No…
## $ fumador <chr> "No", "No", "No", "No", "Sí", "Sí", "Sí", "No", "No…
Responder: - ¿Cuántos pacientes de sexo masculino hay en la base de datos? La base tiene 67 pacientes de sexo masculino.
Filtrar a los pacientes que sean “fumadores” y pertenezcan al departamento “Capital”.
Ayuda:
objeto |> filter(fumadores == "Sí", departamento == "Capital")
Valores únicos de la variable fumador y departamento
unique(salud$fumador)
## [1] "No" "Sí"
unique(salud$departamento)
## [1] "Andalgalá" "Valle Viejo" "Capital"
## [4] "Belén" "Fray Mamerto Esquiú" "Tinogasta"
p_fumadores_capital <- salud |> filter(fumador == "Sí", departamento == "Capital")
glimpse(p_fumadores_capital)
## Rows: 6
## Columns: 12
## $ id_paciente <chr> "P029", "P050", "P086", "P104", "P107", "P116"
## $ fecha_control <dttm> 2026-05-27, 2026-03-12, 2026-08-13, 2026-03-03, 202…
## $ departamento <chr> "Capital", "Capital", "Capital", "Capital", "Capit…
## $ sexo <chr> "M", "M", "M", "M", "F", "F"
## $ edad <dbl> 24, 73, 73, 68, 64, 63
## $ peso_kg <dbl> 73.3, 71.8, 99.7, 101.4, 75.3, 69.7
## $ talla_cm <dbl> 162, 170, 177, 181, 160, 161
## $ presion_sistolica <dbl> 98, 159, 155, 116, 142, 131
## $ presion_diastolica <dbl> 56, 76, 75, 68, 78, 74
## $ glucemia_mg_dl <dbl> 93, 94, 138, 106, 96, 101
## $ diabetes <chr> "No", "Sí", "Sí", "Sí", "No", "No"
## $ fumador <chr> "Sí", "Sí", "Sí", "Sí", "Sí", "Sí"
Responder: - ¿Cuántos pacientes cumplen ambas condiciones? 6 pacientes cumplen con ambas condiciones.
En esta actividad vamos a calcular algunos indicadores estadísticos descriptivos para conocer mejor las características de los pacientes.
Calculá para toda la base de datos:
Funciones que vamos a utilizar:
Ayuda: algunas variables pueden contener datos
faltantes (NA). Para que estos valores no impidan realizar
los cálculos, agregá el argumento “na.rm = TRUE” dentro de las funciones
correspondientes.
media_edad <- mean(salud$edad)
mediana_edad <- median(salud$edad)
cat("Media[edad]: ", media_edad, "\n")
## Media[edad]: 50.325
cat("Mediana[edad]: ", mediana_edad, "\n\n")
## Mediana[edad]: 54
media_glucemia <- mean(salud$glucemia_mg_dl, na.rm = TRUE)
mediana_glucemia <- median(salud$glucemia_mg_dl, na.rm = TRUE)
cat("Media[glucemia_mg_dl]: ", media_glucemia, "\n")
## Media[glucemia_mg_dl]: 99.04274
cat("Mediana[glucemia_mg_dl]: ", mediana_glucemia, "\n")
## Mediana[glucemia_mg_dl]: 93
Responder:
b) Medidas de resumen por sexo
Calculá la media de la presión sistólica para cada grupo de sexo.
Para ello, utilizá “group_by()” para agrupar los pacientes por sexo y luego “summarise()” para calcular la media. Agregá también “n = n()” para conocer la cantidad de pacientes de cada grupo.
presion_sistolica_sexos <- salud |>
group_by(sexo) |>
summarise(n = n(), media = mean(presion_sistolica, na.rm = TRUE) )
presion_sistolica_sexos
## # A tibble: 2 × 3
## sexo n media
## <chr> <int> <dbl>
## 1 F 53 129.
## 2 M 67 132.
Responder:
ggplot2En esta actividad vamos a representar gráficamente la información para facilitar su interpretación.
a) Cantidad de pacientes por departamento
Realizá un gráfico de barras utilizando geom_bar() para
representar la cantidad de pacientes registrados en cada
departamento.
pacientes_departamento <- salud |>
group_by(departamento) |>
summarise(cantidad_pacientes = n())
ggplot(pacientes_departamento, aes( x = cantidad_pacientes, y = departamento , fill = departamento)) +
geom_bar(stat = "identity") +
scale_fill_brewer(palette = "Pastel1")
Responder:
Realizá un gráfico de barras subdivididas (apiladas) para representar la cantidad de pacientes con y sin diabetes, diferenciando los resultados según el sexo.
Para ello, utilizá “geom_bar()” y el argumento fill para
distinguir los grupos mediante colores.
Agregá un título y nombres a los ejes utilizando la función “labs()”.
pacientes_diabetes_sexo <- salud |>
group_by(diabetes, sexo) |>
summarise( cantidad = n())
ggplot(pacientes_diabetes_sexo, aes(x = sexo, y = cantidad, fill = diabetes)) +
geom_bar(stat = "identity") +
labs(
title = "Distribución de pacientes según condición de diabetes y sexo. Catamarca 2025",
x = "Sexo",
y = "Cantidad de Pacientes",
fill = "Condición de Diabetes" # Le da nombre a la leyenda
) +
theme_light()
Responder:
Modificá el gráfico anterior utilizando el argumento
position = "fill" dentro de geom_bar().
De esta manera, las barras representarán el 100 % de los pacientes de cada grupo de sexo y permitirán comparar las proporciones de pacientes con y sin diabetes.
ggplot(pacientes_diabetes_sexo, aes(x = sexo, y = cantidad, fill = diabetes)) +
geom_bar(stat = "identity", position = "fill") +
labs(
title = "Distribución de pacientes según condición de diabetes y sexo. Catamarca 2025",
x = "Sexo",
y = "Cantidad de Pacientes",
fill = "Condición de Diabetes" # Le da nombre a la leyenda
) +
theme_light()
Responder:
A partir de los análisis y gráficos realizados, redactá una breve conclusión que describa las principales características de los pacientes incluidos en la base de datos.
No es necesario incluir código en esta sección. Lo importante es comunicar los resultados utilizando la información obtenida durante el análisis.
Conclusión:
El análisis de los controles de salud realizados a los 120 pacientes de la muestra evidencia una población con una edad promedio de 50 años (con una mediana de 54) y una composición predominantemente masculina (67 hombres frente a 53 mujeres). La distribución territorial muestra una alta concentración de las atenciones en el departamento Capital.
Desde el punto de vista clínico, el nivel medio de glucemia general se situó en aproximadamente 99 mg/dl, valor que debió calcularse excluyendo un margen mínimo de datos faltantes. Al estratificar los factores de riesgo metabólico y cardiovascular por sexo, se observan asimetrías importantes: el grupo masculino no solo registró una presión sistólica media más elevada, sino que presentó una prevalencia de diabetes marcadamente superior a la del grupo femenino, tanto en volumen absoluto (12 casos frente a 3) como en proporción interna dentro de su propio grupo.
En conjunto, estos indicadores descriptivos sugieren que, dentro de esta cohorte, los pacientes masculinos presentan un perfil de mayor vulnerabilidad frente a enfermedades crónicas no transmisibles.
Hacer clic en Knit para renderizar el documento. Publicarlo en Rpubs.