Pipeline · Reproducibilidad · Limitaciones

Cómo construimos este análisis

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.

Etapa 1 — Recepción y limpieza del listado SIGE

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.

Etapa 2 — Catálogo de colegios SIP

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.

Etapa 3 — Validación de RUT y nombre canónico

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étricaValor
RUTs SIP en Audiencias15.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.

Etapa 4 — Cruce con LinkedIn

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).

Algoritmo de match

  1. JOIN amplio: fi = primer_nombre AND la IN (apellido_p, apellido_m)
  2. Disambiguación: el slug del URL LinkedIn (ej. cindy-bustos-lópez-a2b76a57) típicamente contiene ambos apellidos. Limpiamos el slug, removemos acentos, y exigimos que ambos apellidos del SIP aparezcan.
  3. Aceptamos:
    • Match fuerte — ambos apellidos en el URL (3.020 casos).
    • Match único — solo un candidato existe (610 casos).
  4. Descartamos los casos ambiguos sin disambiguar (10.702 RUTs con candidatos múltiples).

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.

Etapa 5 — Agregaciones

JSON públicos sin PII en aggregates/:

El dashboard del sitio carga dashboard_data.json que consolida todo lo anterior.

Lo que no hicimos

Limitaciones a tener en mente

  1. Sub-cobertura de LinkedIn: ~70% de los chilenos en edad laboral no tienen perfil. Trabajadores de oficios, comercio independiente y sector informal están sub-representados. Las conclusiones son sobre los localizables, no sobre el universo SIP.
  2. Sin grupo de control: no podemos atribuir outcomes a la SIP vs. selección de entrada o factores externos.
  3. Heurística de cargos: la clasificación de seniority por keywords del job_title es aproximada (~85% de precisión por inspección manual). El "% líderes" tiene barra de error de ±0,5pp.
  4. Cohortes 2024 incompletas: sin métricas escolares al exportar. Útiles solo para roster.

Reproducibilidad

Todo el pipeline está versionado en github.com/diazaraujo/impacto-sip. Los scripts se corren en orden:

  1. limpiar_alumnos.py — Etapa 1
  2. validar_ruts_sip.py — Etapa 3 (requiere túnel SSH a Audiencias)
  3. cruzar_linkedin.py — Etapa 4 (requiere DuckDB linkedin_chile.duckdb)
  4. generar_agregados.py — Etapa 5

Los CSVs intermedios (data/) contienen PII y no se comparten en repo público. Solo los agregados (aggregates/) y el dashboard son distribuibles.