Cinco etapas. Una semana de trabajo de dato. Sin scrapeo activo de LinkedIn ni costos recurrentes — solo cruces sobre datasets ya construidos. Esto es lo que hace cada paso, qué decisiones tomamos, y qué dejamos fuera.
Input: Alumnos Historicos IV Medio - SIGE.xlsx, exportado por la SIP del sistema MINEDUC. 15.437 filas con RUT + DV, nombres, apellidos, RBD del colegio, ciclo, des_grado, letra_curso, porc_asistencia y promedio_final.
Bug detectado: Excel convirtió 12.290 promedios decimales (ej. "5,8") a fechas (ej. "5 de agosto 2026"). Recuperamos los valores con la regla promedio = day + month/10 — verificable manualmente sobre cualquier muestra. Las cohortes 2024 vienen sin métricas (SIGE no había cerrado el año), las flaggeamos como cierre_academico=False.
Validación adicional: 100% de los 15.437 RUT-DV pasan el algoritmo módulo 11. La fuente es de calidad excepcional. 79 RUTs aparecen duplicados (probables repitentes); conservamos el último ciclo registrado por persona, total 15.358 RUTs únicos.
15 RBDs distintos en el archivo. Los mapeamos a nombres oficiales de colegios SIP usando el listado público de sip.cl y el dataset colegios.json de Gran Mapa Datos Chile (2.811 colegios con datos PAES 2024). Resultado: data/colegios_sip.csv con 15 colegios, 12 comunas, PAES 2024 disponible para 12/15.
Cruce contra OpenSearch Audiencias Unholster (25,5M RUTs, fuente TransUnion) vía túnel SSH. Para cada RUT SIP consultamos persona_natural_v2 y obtenemos el nombre completo del registro civil.
| Métrica | Valor |
|---|---|
| RUTs SIP en Audiencias | 15.229 (99,16%) |
| Match perfecto de nombre (Jaccard = 1) | 15.117 (98,43%) |
| Match alto (Jaccard ≥ 0,66) | 15.136 (98,55%) |
Esto cumple dos funciones: (1) confirmar la calidad de la fuente SIP, (2) construir un nombre canónico para usar en la siguiente etapa, evitando typos y abreviaturas del SIGE.
DuckDB local con 5,3 millones de perfiles LinkedIn de Chile (fuentes PDL 2021 + Nubela 2022, dataset interno Unholster). Tablas master (perfiles), m_exp (trayectoria laboral), m_edu (educación).
El reto: el campo la de LinkedIn captura la última palabra del display name de la persona, que en chilenos puede ser el apellido paterno o el materno según cómo firme. Esto produce muchos falsos positivos por homonimia (10+ "Cindy López" distintas).
fi = primer_nombre AND la IN (apellido_p, apellido_m)cindy-bustos-lópez-a2b76a57) típicamente contiene ambos apellidos. Limpiamos el slug, removemos acentos, y exigimos que ambos apellidos del SIP aparezcan.Hit rate global: 3.492 perfiles SIP localizados (22,7%). Por bloque de cohortes: 42,1% en 2009-2014 (las maduras), 23,5% en 2015-2018, 14,9% en 2019-2024.
JSON públicos sin PII en aggregates/:
El dashboard del sitio carga dashboard_data.json que consolida todo lo anterior.
Todo el pipeline está versionado en github.com/diazaraujo/impacto-sip. Los scripts se corren en orden:
limpiar_alumnos.py — Etapa 1validar_ruts_sip.py — Etapa 3 (requiere túnel SSH a Audiencias)cruzar_linkedin.py — Etapa 4 (requiere DuckDB linkedin_chile.duckdb)generar_agregados.py — Etapa 5Los CSVs intermedios (data/) contienen PII y no se comparten en repo público. Solo los agregados (aggregates/) y el dashboard son distribuibles.