📚 Maestría en Investigación
Curación de Datos y Análisis en R | Clase 07/05/2026
📌 Marco Conceptual del Curso
Objetivos Principales
Este curso NO es sobre memorizar código. Se trata de aprender a:
- Reconocer qué pregunta hacer ante una base de datos
- Saber dónde buscar la respuesta (documentación, blogs, IA)
- Entender conceptualmente qué hacer en cada caso
- Aplicar las herramientas a problemas reales
Práctica Necesaria
- No es solo por programa, sino por curva de aprendizaje
- Trabajar con R es práctica pura
- El contacto con la disciplina es imprescindible
Importancia de lo que Aprenderán
Es un capital humano altamente capacitado. La Universidad Nacional de Caaguazú brinda este espacio para contribuir al crecimiento profesional en investigación.
🧹 Curación de Base de Datos
¿Qué es la Curación?
Es el primer paso fundamental del análisis. Consiste en preparar, limpiar, validar y estandarizar los datos antes de hacer cualquier análisis estadístico.
Estructura del Script de R
El script se organiza en tres partes principales:
PARTE 1: CURACIÓN DE BASE DE DATOS
↓
PARTE 2: GENERACIÓN DE VARIABLES NUEVAS
↓
PARTE 3: ANÁLISIS (tests estadísticos, gráficos)Los Seis Componentes Clave
- Validación – ¿Los datos son reales y plausibles?
- Completitud – ¿Faltan datos críticos?
- Limpieza – ¿Hay categorías inconsistentes?
- Normalización de fechas – ¿Mismo formato?
- Normalización de unidades – ¿Misma unidad?
- Nomenclatura – ¿Nombres estandarizados?
❌ Validación de Datos: Errores Comunes
Edad Mayor a 120 Años
Es poco probable que una persona tenga eso. Parece más un error de carga.
Porcentaje Fuera de Rango
Ejemplo: Porcentaje de progesterona del 700%
- Si es porcentaje, debe estar entre 0 y 100%
- 700% es definitivamente un error
Fechas Ilógicas (CASO REAL)
• Fecha inicio síntomas: 1 de junio de 2022
• Fecha diagnóstico: 29 de mayo de 2022
Es IMPOSIBLE: Nadie recibe un diagnóstico antes de tener síntomas. Uno va al médico PORQUE tiene síntomas.
Cómo Detectar Estos Problemas
- Prestar atención a valores extremos (mínimos y máximos)
- Buscar valores que no tengan sentido biológico
- Verificar relaciones lógicas entre variables
📋 Completitud de Datos
Variables Críticas Faltantes
Algunos datos faltantes son críticos para el análisis:
Estado Vital del Paciente
- ¿El paciente está vivo o muerto?
- Esta es una variable FUNDAMENTAL
- Sin ella, muchos análisis son imposibles
Fecha de Muerte (cuando aplica)
- Necesaria para análisis de sobrevida
- Si el paciente está muerto pero no hay fecha, es un problema
Caso Real: Cáncer de Cuello Uterino
• Base de 1500 pacientes
• 300 pacientes sin fecha de último contacto ni estado vital
• Se generó reporte de errores en Excel
• Se dieron tiempo para corregir
• Se continuó análisis con 1200 pacientes
Reportado: «Se imputó 300 datos por ausencia de estado vital o fecha de último contacto»
🧽 Limpieza: Unificación de Categorías
Caso del Insulinoma (PROBLEMA REAL)
Un insulinoma es un tumor pancreático que genera insulina descontrolada, causando hipoglucemia.
Se tenía que analizar si pacientes presentaban cuadro clínico «5P» (pérdida brusca del conocimiento = desmayo).
En la base de datos estaba registrado como:
• «5P» (mayúscula)
• «5p» (minúscula)
• «desmayo»
• «pérdida del conocimiento»
Todos se refieren a LO MISMO pero estaban cargados diferente.
Esto hace IMPOSIBLE contar correctamente.
Solución: Formularios desde el Inicio
- Google Forms: Genera Excel automáticamente, formato consistente
- Excel con validación: Casillas desplegables para seleccionar opciones
- Esto reduce drásticamente el error humano en la carga de datos
⚖️ Normalización: Fechas, Unidades, Nombres
Normalización de Fechas
Formatos que causan confusión:
• Día-Mes-Año: 29/05/2022
• Mes-Día-Año: 05/29/2022
• Año-Mes-Día: 2022/05/29
La regla: Establecer UN ÚNICO formato y respetarlo en toda la base de datos.
Normalización de Unidades
Problema: Mezclar unidades en la misma variable
- Una medida en kilogramos, otra en gramos, otra en miligramos
- Una temperatura en Celsius, otra en Fahrenheit
Solución: Elegir UNA unidad para toda la variable y convertir todo a esa unidad.
Convención de Nombres de Variables
nombre_de_variable_tipo
Donde tipo indica:
_n = variable numérica
_c = variable categórica
_f = variable de fecha
_d = variable descriptiva
Ejemplos correctos:
fecha_nacimiento_f
edad_n
genero_c
numero_medicamentos_n• Identificas rápidamente el tipo de variable
• Evitas confusiones
• Facilita la programación
🔍 Tipos de Variables en R
Identificar el Tipo
Usar class() para ver cómo R interpreta una variable:
class(polifarma$fecha_nacimiento) # Debe ser "Date"
class(polifarma$genero) # Debe ser "character" o "factor"
class(polifarma$numero_medicamentos) # Debe ser "numeric"Problema Frecuente
class(polifarma$numero_medicamentos)Retorna: «character»
Debería ser: «numeric»
Si aparece como texto, R no puede calcular media, mediana, etc.
🔄 Conversiones de Datos: Las Tres Fundamentales
1. as.date() – Convertir a Fecha
polifarma$fecha_nacimiento <- as.date(polifarma$fecha_nacimiento)Después de esto, R interpreta esa variable como fecha y puede hacer cálculos con ella.
2. as.numeric() - Convertir a Número
polifarma$numero_medicamentos <- as.numeric(polifarma$numero_medicamentos)Ahora R puede calcular media, mediana, estadísticas.
3. as.factor() - Convertir a Categórica
polifarma$id <- as.factor(polifarma$id)
polifarma$genero <- as.factor(polifarma$genero)Ejemplo Completo: Creación de Variable Edad
# Paso 1: Asegurar que la fecha sea fecha
polifarma$fecha_nacimiento <- as.date(polifarma$fecha_nacimiento)
# Paso 2: Crear variable edad
polifarma$edad <- as.numeric(Sys.date() - polifarma$fecha_nacimiento) / 365.25
# Paso 3: Verificar resultado
summary(polifarma$edad)• Mínimo: 1.56 años (IMPOSIBLE en base de adultos)
• Probablemente fecha de nacimiento mal cargada
• Ej: Fecha 29/09/2024 daría ~1.5 años
📊 Descripción de Variables
Variables Categóricas
Usar freq() de la librería descritivar:
library(descritivar)
freq(polifarma$genero)Variables Numéricas
Usar summary():
summary(polifarma$edad)Interpretación de Cuartiles
Si la mediana es 74:
- El 25% de la población tiene menos de 65.90 años
- El 50% de la población está entre 65.90 y 77.10 años
- El 25% de la población tiene más de 77.10 años
Exploración Completa
library(skimr)
skim(polifarma) # Resumen visual de toda la base➕ Creación de Nuevas Variables
Categorización de Variables Categóricas
# Método: Creación gradual
polifarma$riesgo_cancer_pulmon <- NA
polifarma$riesgo_cancer_pulmon[
polifarma$tabaquismo == "sí"
] <- "sí_riesgo"
polifarma$riesgo_cancer_pulmon[
polifarma$tabaquismo == "nunca fumé"
] <- "no_riesgo"Método con if_else() (más eficiente)
polifarma$riesgo_cancer_pulmon <- if_else(
polifarma$tabaquismo %in% c("sí", "extabaquista"),
"sí_riesgo",
"no_riesgo"
)Categorización de Variables Continuas (por Mediana)
polifarma$edad_categorizada <- NA
polifarma$edad_categorizada[
polifarma$edad < 74
] <- "jóvenes"
polifarma$edad_categorizada[
polifarma$edad >= 74
] <- "viejos"📈 Escalas de Likert
¿Qué es?
Una variable categórica ordinal con orden jerárquico y frecuentemente un polo neutro central.
Características
- Tiene un orden: No es lo mismo "muy malo" que "malo"
- Tiene dos polos: Negativo y positivo
- Puede tener centro: Punto neutro
- Proporciona puntaje: Cada opción tiene valor numérico
Tipos de Escalas Likert
1. Intensidad
¿Cómo dormiste? → Muy mal | Mal | Ni bien ni mal | Bien | Muy bien
2. Frecuencia
¿Con qué frecuencia estudias? → Nunca | Pocas veces | A veces | Casi siempre | Siempre
3. Acuerdo/Desacuerdo
"Boca es el mejor club" → Muy en desacuerdo | En desacuerdo | Neutro | De acuerdo | Muy de acuerdo
⚠️ Puntajes NO Equidistantes
Ejemplo (calidad del sueño):
Muy bien → 5.0
Bien → 4.5 (diferencia: 0.5)
Ni bien ni mal → 3.0 (diferencia: 1.5)
Mal → 2.0 (diferencia: 1.0)
Muy mal → 0.5 (diferencia: 1.5)
La mejora entre "muy bien" y "bien" es menor que entre "ni bien ni mal" y "bien".
🚫 REGLA CRÍTICA
Porque:
• El neutral es un PUNTAJE
• Una respuesta faltante significa "no tengo dato"
• Poner neutral sería inventar un dato
📋 Tabla 1 de Descriptivos
¿Qué es?
Tabla fundamental en cualquier artículo científico. Describe características de los participantes.
Crear Tabla 1 en R
library(tableone)
vars <- c("edad", "genero", "nivel_educativo", "tabaquismo")
factorVars <- c("genero", "nivel_educativo", "tabaquismo")
tabla1 <- CreateTableOne(
vars = vars,
data = polifarma,
factorVars = factorVars
)
print(tabla1)Estratificación (Comparar Grupos)
Comparar características según una variable (ej: por edad):
tabla1_estratificada <- CreateTableOne(
vars = vars,
strata = "edad_categorizada",
data = polifarma,
factorVars = factorVars
)
print(tabla1_estratificada)Las P-values se calculan automáticamente (t-test para continuas, chi-cuadrado para categóricas).
🤖 Uso de Inteligencia Artificial
Recomendación Principal: USA SIEMPRE LA MISMA
No cambies entre ChatGPT, Gemini, Claude, etc. constantemente.
La IA aprende a través de machine learning:
• Se entrena con muchos datos
• Identifica patrones
• Mejora con la experiencia
Si usas siempre la misma IA:
• Aprende tus patrones de pregunta
• Aprende qué tipo de respuesta prefieres
• Se especializa en tus necesidades
Niveles de Aprendizaje en IA
Machine Learning
- La IA ve muchos ejemplos
- Identifica patrones
- Mejora gradualmente
- Ejemplo: Identificar caras en general
Deep Learning
- Nivel superior de aprendizaje
- Identifica características complejas
- Contextualiza información
- Ejemplo: Identificar a MARCOS ESPECÍFICAMENTE
Cómo Usar IA Efectivamente en R
- Dale contexto: No solo "dame código", sino detalles específicos
- Sé específico: Incluye nombres de bases, columnas, objetivos
- Mantén consistencia: Usa la misma herramienta siempre
- Revisa el código: Entiende qué hace antes de correr
🔧 Solución de Problemas Comunes
1. Variable como Texto Siendo Número
# Síntoma
mean(polifarma$numero_medicamentos)
# Error: argument is not numeric or logical
# Solución
class(polifarma$numero_medicamentos)
polifarma$numero_medicamentos <- as.numeric(polifarma$numero_medicamentos)
summary(polifarma$numero_medicamentos)2. Librería No Se Carga
# Instalar (UNA SOLA VEZ)
install.packages("descritivar")
# Cargar (cada sesión)
library(descritivar)3. R Se "Cuelga"
- Presionas Run pero nada pasa
- Solución: Cierra RStudio completamente, reabre, intenta de nuevo
4. Error en Cálculo de Edad
# Problema: Retorna valores como "26671 days"
polifarma$edad <- Sys.date() - polifarma$fecha_nacimiento
# Solución: Convertir a numérico y dividir
polifarma$edad <- as.numeric(Sys.date() - polifarma$fecha_nacimiento) / 365.255. Valores Faltantes (NA) Impiden Cálculos
# Problema
mean(polifarma$edad)
# Returns: NA
# Solución 1
mean(polifarma$edad, na.rm = TRUE)
# Solución 2
summary(polifarma$edad) # Ya ignora NAs automáticamente⚡ Cheat Sheet Rápido
Conversiones
as.date(variable) # Convertir a fecha
as.numeric(variable) # Convertir a número
as.factor(variable) # Convertir a categórica
class(variable) # Ver tipo actualDescripción
summary(variable) # Estadísticas numéricas
freq(variable) # Frecuencias categóricas
skim(base_datos) # Exploración completaCrear Variables
base$nueva <- NA # Variable vacía
base$nueva[condición] <- valor # Llenar condicional
if_else(condición, valor_si, valor_no)Edad desde Fecha
base$fecha <- as.date(base$fecha)
base$edad <- as.numeric(Sys.date() - base$fecha) / 365.25Tabla 1
library(tableone)
CreateTableOne(vars = vars, strata = "grupo", data = base)Búsqueda de Código
- Papers: Busca en Google Scholar o GitHub
- Stack Overflow: Busca tu problema exacto
- IA: Dale contexto específico