Análisis de Datos I
Universidad Católica de Temuco
2026-05-04
La semana anterior fue reemplazada por una evaluación remedial. Por eso, antes de avanzar hacia el póster, necesitamos reforzar el paso que conecta la descarga de datos con el análisis.
No basta con descargar archivos desde Transparencia Activa.
Para analizarlos, necesitamos nombrarlos, identificarlos, limpiarlos, unirlos y resumirlos.
Hoy trabajaremos el siguiente flujo:
El póster no parte con el diseño visual.
Parte con una base que permita responder una pregunta descriptiva.
Para eso necesitamos:
Trabajaremos con información de Transparencia Activa municipal.
En particular:
Remuneraciones mensuales informadas por municipios, desde marzo de 2023 hasta marzo de 2026, según disponibilidad.
Para el trabajo del curso se considerarán los cuatro tipos de personal:
| Tipo de personal | Descripción general |
|---|---|
| Planta | Personal permanente de la dotación municipal |
| Contrata | Personal contratado por periodos definidos |
| Código del Trabajo | Personal sujeto al Código del Trabajo |
| Honorarios | Personas naturales contratadas para prestación de servicios |
El análisis principal debe incluir los cuatro tipos de personal, pero siempre distinguiendo el tipo de vínculo contractual.
No se debe mezclar planta, contrata, Código del Trabajo y honorarios como si fueran equivalentes.
Transparencia Activa puede separar la información en:
Para el póster, el criterio base será trabajar con:
Municipalidad como unidad institucional principal.
Porque permite mantener mayor comparabilidad.
DAEM y Salud tienen:
Cada grupo descargará varios archivos por mes y por tipo de personal (desde la web de transparencia de su municipio).
Obligatoriamente, guardaremos los archivos en una carpeta llamada “datos_raw” dentro de nuestro proyecto, y los archivos se denominaran con una estructura común:
Ejemplos:
Problema
Esos nombres no permiten saber qué contiene el archivo, de qué mes viene ni a qué tipo de personal corresponde.
Porque cuando unimos muchos archivos en una sola base, el nombre del archivo deja de estar visible.
Por eso, cada fila debe conservar información mínima sobre su origen.
Cada archivo debe incorporar estas variables antes de unirse:
| Variable | Ejemplo | Función |
|---|---|---|
municipio |
"Vilcún" |
Identifica la comuna |
tipo_personal |
"contrata" |
Distingue el vínculo contractual |
anio |
2026 |
Identifica el año |
mes |
"marzo" |
Identifica el mes |
mes_num |
3 |
Permite ordenar cronológicamente |
periodo |
"2026-03" |
Facilita series temporales |
Cuando unimos los archivos, perdemos trazabilidad.
Después no sabremos:
Importante
Una base analizable debe conservar siempre la historia mínima de cada fila.
Hoy distinguiremos dos operaciones:
| Operación | Qué hace | Ejemplo en este trabajo |
|---|---|---|
bind_rows() |
Apila filas | Juntar planta, contrata, CDT y honorarios |
join |
Agrega columnas desde otra base | Agregar provincia, región o población comunal |
No todas las uniones de bases sirven para lo mismo.
Antes de elegir un comando, debemos preguntarnos:
¿Queremos sumar registros o queremos agregar información?
| Operación | ¿Qué hace? | ¿Cuándo se usa? |
|---|---|---|
bind_rows() |
Apila filas | Cuando tengo varios archivos con la misma lógica de registros |
left_join() |
Agrega columnas y conserva todos los casos de la base principal | Cuando quiero sumar información contextual |
inner_join() |
Conserva solo los casos que aparecen en ambas bases | Cuando quiero quedarme solo con coincidencias exactas |
full_join() |
Conserva todos los casos de ambas bases | Cuando quiero combinar fuentes sin perder registros |
anti_join() |
Muestra casos de una base que no aparecen en otra | Cuando quiero detectar problemas de emparejamiento |
semi_join() |
Conserva casos de la primera base que sí tienen coincidencia en la segunda, sin agregar columnas | Cuando quiero filtrar según existencia en otra base |
bind_rows()Usamos bind_rows() cuando tenemos archivos con registros similares y queremos construir una sola base larga.
bind_rows()?Imaginemos cuatro bases:
Cada una contiene registros mensuales de personas o prestaciones informadas.
Con bind_rows() obtenemos:
join?Usamos join cuando queremos agregar columnas desde otra base.
Por ejemplo, una base auxiliar de municipios:
| municipio | provincia | region | poblacion |
|---|---|---|---|
| Vilcún | Cautín | La Araucanía | 30000 |
| Temuco | Cautín | La Araucanía | 280000 |
left_join()Esto no suma más personas.
Agrega columnas de contexto a los registros existentes.
Si quiero sumar registros, uso bind_rows().
Si quiero agregar información (variables) sobre esos registros, uso join.
Para construir la base de remuneraciones usaremos principalmente:
Porque queremos apilar archivos mensuales y tipos de personal.
Los join los revisaremos como herramienta complementaria.
En el laboratorio usaremos archivos tipo de Vilcún (pueden usar los de su municipio):
Estos archivos tienen estructuras parecidas, pero no idénticas.
Planta y contrata incluyen, entre otras:
Honorarios incluye, entre otras:
No podemos unir directamente bases con estructuras distintas sin tomar decisiones.
Necesitamos crear nombres comunes.
| Planta / Contrata / CDT | Honorarios | Nombre común |
|---|---|---|
| Cargo o función | Descripción de la función | funcion |
| Remuneración bruta del mes | Honorario Total Bruto del mes | monto_bruto |
| Remuneración líquida del mes | Honorario Total Líquido del mes | monto_liquido |
| Fecha de inicio | Fecha de inicio | fecha_inicio |
| Fecha de término | Fecha de término | fecha_termino |
Una vez procesados los archivos, la base debería tener columnas como:
Algunas columnas existen en una base, pero no en otra.
Por ejemplo:
estamentotipo_pagoEn esos casos, se puede crear la columna con NA.
Los montos suelen venir como texto:
Antes de calcular promedios, medianas o totales, deben transformarse a números.
Una vez unida la base, podemos construir tablas como:
| tipo_personal | registros | promedio bruto | mediana bruto | sin monto |
|---|---|---|---|---|
| planta | ||||
| contrata | ||||
| codigo_trabajo | ||||
| honorarios |
Una buena interpretación debe incluir:
La tabla resume las remuneraciones brutas informadas por tipo de vínculo contractual en la Municipalidad de Vilcún durante marzo de 2026. Permite observar diferencias descriptivas en el número de registros y en los montos informados entre planta, contrata, Código del Trabajo y honorarios. Sin embargo, estas diferencias deben interpretarse con cautela, porque los tipos de vínculo no necesariamente corresponden a funciones, jornadas o responsabilidades equivalentes.
Nunca editar manualmente el archivo descargado.
El archivo original queda en:
La base procesada queda en:
Ejemplos de decisiones que deben quedar escritas:
$ de los montosperiodobind_rows() porque se quería apilar registros.Antes de hacer tablas:
Una tabla exploratoria sirve para revisar.
Una tabla de presentación sirve para comunicar.
No todas las tablas que hacemos deben ir al póster.
Toda tabla debe indicar:
En R no existe una sola forma de hacer tablas.
La elección del paquete depende de qué necesitamos hacer con la tabla:
| Paquete | Mejor uso | Ventaja | Precaución |
|---|---|---|---|
dplyr |
Construir tablas desde cero | Permite entender qué se está calculando | Requiere más pasos |
janitor |
Frecuencias y tablas cruzadas | Muy simple para porcentajes | Menos flexible para formato final |
flextable |
Tablas para Word | Buena integración con .docx |
Puede requerir ajustes de formato |
gt |
Tablas para HTML, imagen o póster | Muy buena presentación visual | Exportar a imagen puede requerir configuración extra |
gtsummary |
Tablas descriptivas tipo artículo | Genera tablas completas rápidamente | Puede ocultar la lógica del cálculo |
writexl |
Exportar resultados a Excel | Simple y liviano | No mejora la estética de la tabla |
kableExtra |
Tablas en HTML/PDF | Útil para informes en Quarto | En PDF puede depender de LaTeX |
| Objetivo | Paquete recomendado |
|---|---|
| Contar casos | dplyr::count() |
| Frecuencias y porcentajes rápidos | janitor::tabyl() |
| Resúmenes por grupo | dplyr::group_by() + summarise() |
| Exportar a Word | flextable + officer |
| Exportar a Excel | writexl |
| Tabla visual para póster | gt |
| Tabla descriptiva avanzada | gtsummary |
| Tabla para PDF/HTML en Quarto | knitr::kable() o kableExtra |
Para la Evaluación 2, usaremos una lógica simple:
Flujo recomendado
dplyr o janitor.flextablewritexlgtknitr::kable() o kableExtra.En el laboratorio vamos a:
bind_rows()left_join()