Ir al contenido
  1. Bitácora/
  2. Experimentos y Artículos/

Votación y reportes ciudadanos de la primera vuelta en Santiago

La necesidad de entender los resultados electorales #

En noviembre de 2025 se llevó a cabo la primera vuelta de las elecciones presidenciales en Chile. Jeannette Jara (27%, Partido Comunista) y José Antonio Kast (24%, Partido Republicano) pasaron a segunda vuelta. En tercer lugar quedó Franco Parisi (20%, Partido de la Gente). Esto último fue la gran sorpresa, puesto que el candidato Parisi tuvo un desempeño que no fue anticipado.

Como estamos terminando el semestre en mi curso de Visualización de Información, quise que nuestro último caso de estudio fuese relacionado con las elecciones. Me gustaría entender quién votó a Jara, a Kast y a Parisi. Pero no es fácil hacerlo, no solo porque la pregunta en sí misma tiene múltiples respuestas complejas, sino porque:

  • El SERVEL no disponibiliza los datos, solo tiene una interfaz web en http://elecciones.servel.cl, donde se puede ver el resultado por mesa (el máximo nivel de detalle), pero no se puede exportar una base de datos. En elecciones anteriores sí se publicaba una base de datos en formato CSV.
  • El Censo 2024 todavía no está disponible a nivel individual. A noviembre de 2025, Solo hay datos agregados por comuna en https://censo2024.ine.gob.cl/estadisticas/.
  • La encuesta CASEN 2024 tampoco está disponible, puesto que el gobierno decidió publicarla en 2026.

Eso significa que hay un desafío interesante. ¿Cómo indagar por respuestas en los datos si, en realidad, hay dificultades? Por eso me parece un buen caso de estudio para el curso. Primero, tuve que programar un scraper de los datos del SERVEL1. Luego, identifiqué una fuente de datos que podría ser útil a la hora de caracterizar lo que sucede en una ciudad: justamente, los reportes ciudadanos de la aplicación SOSAFE2. En particular, utilicé los del año 2024. Y, finalmente, descargué los datos disponibles del censo. Con esas tres fuentes de datos quise entender cómo se había votado en mi ciudad, Santiago.

¿Cómo se votó en Santiago? #

Santiago es una ciudad segregada, por lo que tiene algunos patrones predecibles. Por ejemplo, en el llamado «cono de alta renta» o «comunas de oriente» (Providencia, Las Condes, Vitacura, Lo Barnechea) se esperaba que ganara la derecha; y en el resto, la izquierda. Esa es la imagen típica. Pero el punto es que yo quería saber cómo se votó, también, por Parisi, de modo de separar Santiago en distintas zonas que pueda caracterizar.

Para ello, usé matplotlib y geopandas para construir una visualización de la ciudad que tiene las siguientes componentes:

  • Un mapa principal que segmenta la ciudad en áreas hexagonales3, agrupadas en clusters. Cada cluster representa un sector cuyas áreas tuvieron patrones similares de votación4. El color de cada cluster representa la intensidad del sentimiento negativo expresado en los reportes de SOSAFE5: tonos naranjos y rojizos tienen un sentimiento más negativo que el promedio de la ciudad, mientras que un tono celeste tiene uno menor que el promedio (esto es lo que conoce como “valor estandarizado”).
  • Dos minimapas que muestran la concentración de reportes y de votos en la ciudad, para contextualizar la actividad en cada área y explicitar que los datos de SOSAFE tienen un sesgo regional. Por lo mismo, trabajo cada área con un sentimiento promedio estandarizado, no con la cantidad de reportes.
  • Un gráfico de barras apiladas que compara el porcentaje de votos por candidato en cada cluster, junto con los totales de Santiago y del país.

El resultado es el siguiente:

Mapa hexagonal de Santiago con <em>clusters</em> de votación, coloreados por sentimiento negativo en reportes ciudadanos. En el fondo se observa el tramado urbano mediante una imagen base obtenida de CartoDB. Incluye minimapas de concentración de reportes y votos, y un gráfico de barras apiladas con la distribución de votos por cada <em>cluster</em>.
Mapa hexagonal de Santiago con clusters de votación, coloreados por sentimiento negativo en reportes ciudadanos. En el fondo se observa el tramado urbano mediante una imagen base obtenida de CartoDB. Incluye minimapas de concentración de reportes y votos, y un gráfico de barras apiladas con la distribución de votos por cada cluster.

Hay cuatro clusters significativos:

  • Cluster 0 (poniente), donde Jara lidera (34%) y Parisi tiene presencia (17%), y los reportes tienen un sentimiento negativo mayor al promedio.
  • Cluster 8 (centro-sur) con predominio de Jara (39%), y Parisi en segundo lugar (19%), más cercano al porcentaje que obtuvo en el país (20%). El sentimiento es menos negativo que en la ciudad en general.
  • Cluster 4 (centro-oriente), donde Jara también lidera (34%), pero Matthei supera al resto de los candidatos (22%). El sentimiento promedio es el más negativo de todos.
  • Cluster 1 (oriente alto), donde Kast, Matthei y Kaiser concentran la mayoría. Parisi tiene una votación ínfima (2%). Aquí hay pocos reportes y el sentimiento es el menos negativo de todos.

Estos porcentajes son muy distintos a los vistos a nivel regional y nacional (y eso puede ser tema para una visualización futura). Así, este mapa permite tener una vista general o global de lo que sucedió en la ciudad y también plantearse al menos dos preguntas: ¿Qué caracteriza a los clusters? ¿Qué podemos decir del voto de Parisi?

Exploremos cada una con una visualización focalizada.

¿Qué caracteriza a cada cluster? #

El mapa muestra dónde se votó de cada manera, pero no explica el por qué. Para eso podemos recurrir a los reportes de SOSAFE, ya que permiten caracterizar qué tipo de problemas preocupan a los habitantes de cada área.

Así, construí una wordcloud o nube de palabras por cada cluster. En estas nubes, el tamaño de las palabras depende de su importancia6. Como cada wordcloud tiene el mismo tamaño que las demás, agregué un gráfico de barras apiladas que permitiera ver cuánta gente vive en las áreas de cada cluster relevante.

Nubes de palabras o <em>wordclouds</em> con los términos más frecuentes en reportes ciudadanos de cada cluster, junto con la distribución de población en ellos.
Nubes de palabras o wordclouds con los términos más frecuentes en reportes ciudadanos de cada cluster, junto con la distribución de población en ellos.

Las nubes de palabras revelan realidades urbanas distintas. El cluster 0 (poniente) y el cluster 8 (centro-sur) hablan de violencia con palabras como «balazos», «disparos» y «asaltando». El cluster 1 (oriente alto) habla de problemas de convivencia vial, como «carreras» clandestinas y problemas y autos mal estacionados. El cluster 4 (centro-oriente) ocupa un lugar intermedio relacionado con la convivencia e infraestructura con “edificio” o “metro”.

Si comparamos esas palabras con los colores del mapa, nos damos cuenta que un sentimiento menos negativo que el resto de la ciudad no es necesariamente un sentimiento positivo. Puede ser, también, un sesgo del modelo de lenguaje utilizado.

Sin embargo, llama la atención que dentro del top-10 de palabras más características no aparezcan menciones a migrantes, ya que en los debates y en las campañas por medios se mencionaban frecuentemente. El porcentaje de reportes que menciona a migrantes es bajo (cercano al 3%)7.

¿Qué se puede decir del voto por Parisi? #

Quise explorar si el voto por Parisi tenía alguna relación espacial con el de Jara o Kast. Para eso utilicé ternary plots (gráficos ternarios), que representan datos composicionales donde tres variables suman 18. En este caso, las tres variables son Jara, Kast y otra candidatura, pues en vez de analizar solamente a Parisi, también consideré a Matthei, a Kaiser, y al resto. Así es posible comparar.

En cada gráfico, los tres vértices del triángulo corresponden a Jara, Kast y una tercera opción. Cada punto es un local de votación, y su posición indica la proporción relativa del voto entre esos tres candidatos (normalizada para que sumen 1). Si un punto está al medio del triángulo, ese local de votación tuvo la misma cantidad de votos para las tres opciones. Si los puntos se acercan hacia un vértice, entonces la opción de ese vértice fue fuerte.

<em>Ternary plots</em> que comparan la distribución del voto entre Jara, Kast y una tercera opción. Cada punto es un local de votación.
Ternary plots que comparan la distribución del voto entre Jara, Kast y una tercera opción. Cada punto es un local de votación.

Los patrones que se observan son:

  • Parisi: Hay locales con una tendencia mayoritaria hacia Kast (sector oriente de la ciudad). Pero el resto de puntos están dispersos cerca del centro del triángulo, lo que indica que su base electoral no correlaciona espacialmente con ninguno de los dos candidatos de segunda vuelta.
  • Matthei y Kaiser: Los puntos se estiran hacia el vértice de Kast. Donde Kast fue fuerte, estos candidatos también lo fueron. Esto sugiere que compitieron por el mismo electorado en primera vuelta.
  • Otros: A medida que la distribución se acerca levemente a Otros, lo hace con más intensidad a Jara.

Es importante notar que estos gráficos muestran correlaciones espaciales, no transferencia de votos. Que Kaiser y Kast compartan base geográfica no significa que los votantes de Kaiser voten por Kast en segunda vuelta; para inferir eso se necesitarían encuestas o datos de panel.

Lo que sí puede decirse es que Parisi captó un electorado con distribución espacial propia. Según el gráfico de barras del mapa principal, tuvo presencia en los clusters 0 y 8 (sectores más populares que cluster 1 y parte del cluster 4), lo que sugiere un voto que no se alinea con el eje tradicional izquierda–derecha.

Conclusión #

El análisis muestra patrones espaciales claros en Santiago: el voto por Kast, Matthei y Kaiser se concentró en el sector oriente, mientras que Jara dominó en el poniente y sur. Parisi tuvo presencia en sectores populares sin alinearse con izquierda o derecha, tal como parodia su expresión «ni facho ni comunacho» (sic).

Los reportes ciudadanos revelan que los problemas de cada zona son distintos. En el oriente, las quejas son sobre convivencia vial y ruidos; en el poniente y sur, sobre violencia directa. Sin embargo, el porcentaje de reportes que menciona a migrantes es bajo (cercano al 3%), lo que contrasta con la centralidad que tuvo ese tema en la campaña.

Esto sugiere que en Santiago la experiencia cotidiana de inseguridad no se tradujo en voto por la derecha. Las razones pueden ser múltiples: desconfianza en las instituciones, preferencias por otras propuestas, o simplemente que el voto responde a variables que este análisis no captura. Queda ver si en el resto del país aplica este mismo patrón o no.

Lo que sí queda claro es que Santiago está segregado no solo en términos socioeconómicos, sino también en los problemas que sus habitantes enfrentan y reportan. Esa segregación se refleja en los patrones de votación que hemos visualizado.

La estructura de este análisis sigue el information seeking mantra que vimos en clase: primero tenemos una vista global (overview first), identificamos en ella aspectos que producen preguntas (zoom and filter) y después las respondemos con visualizaciones específicas (details on demand).

Recursos y definiciones #

Los datos y el código de este caso de estudio están disponibles en el repositorio del curso.


  1. Un scraper es un bot que entra a una página e interactúa con ella siguiendo reglas, de manera de poder almacenar los datos que despliega. En este caso, utilicé la herramienta Selenium para «escrapear» los resultados de la elección haciendo clic sobre los distintos formularios para así guardar cada tabla de resultados por mesa en un archivo CSV. ↩︎

  2. Los datos de SOSAFE no son públicos, pero sí son publicados por la aplicación, por ejemplo en este feed↩︎

  3. Esta grilla hexagonal regular se construyó utilizando H3 de Uber↩︎

  4. Utilicé Agglomerative Clustering de scikit-learn. En general, las métricas de clustering tradicionales daban dos grandes clusters como partición óptima, pero como quería indagar profundamente debí separar los dos grupos típicos e imponer restricciones geográficas. Por eso hay clusters que no aparecen en el mapa, porque no cumplen con las restricciones (por ej., solo tienen una celda hexagonal desconectada del resto). ↩︎

  5. El sentimiento negativo fue medido con pysentimiento para cada reporte de manera individual y luego agregado a nivel de celda hexagonal. ↩︎

  6. Esta importancia es una medida de su frecuencia (term frequency) ponderada por el recíproco de su frecuencia global (similar a inverse document frequency), utilizando una transformación de raíz cuadrada. Esto es necesario porque las palabras más frecuentes suelen ser stopwords o palabras funcionales que en sí mismas no tienen significado (por ejemplo: «de» o «la» son las más frecuentes, pero no dicen nada). Para la frecuencia global utilicé wordfreq. Después de ponderar las palabras e identificar las que tienen significado para los reportes, utilicé la métrica TF-IDF para los clusters↩︎

  7. Esta cifra surge de una investigación que estamos realizando con Daniela Opitz respecto a discursos de odio en reportes ciudadanos. ↩︎

  8. Para construir estos gráficos utilicé la librería python-ternary↩︎