Millón de Monos

Weblog de Manuel Aristarán

Algunos números de pauta oficial en Argentina

Hoy, por Twitter, me enviaron un link a la información sobre “fondos públicos destinados a la difusión de actos de gobierno” que publica la Jefatura de Gabinete. En formato PDF, como no podía ser de otra manera. Cada vez que aparece un PDF con una tabla adentro pruebo si Tabula (la aplicación que estoy desarrollando desde el año pasado) es capaz de extraerla. Funcionó casi perfectamente y luego de un poco de data cleansingla información estuvo lista para ser analizada. La Jefatura de Gabinete publica semestralmente un detalle de gasto publicitario: por organismo y rubro, y por proveedor y rubro. El último conjunto de datos disponible corresponde al primer semestre del año 2013. En sendos Google Spreadsheets, republiqué datos extraídos de los PDFs:


Resultados del Censo 2010 Argentina a nivel de radio censal

Los censos de población son uno de los conjuntos de datos fundamentales que produce el Estado. En Argentina, el último Censo Nacional de Población, Hogares y Viviendas se realizó el día 27 de octubre de 2010. Más de 3 años después, aparecieron en la web los resultados del cuestionario básico, desagregados a nivel de radio censal (la división espacial más chica en la que se publica el censo) y publicados en forma de una aplicación Windows desarrollada en base al sistema REDATAM

¿Qué es REDATAM?

Como muchos institutos nacionales de estadística, el INDEC usa el programa REDATAM para la confección y publicación de la base de datos de resultados censales. Este sistema es desarrollado por el CELADE, dependiente de la Comisión Económica para América Latina y el Caribe.

Considerando su adopción por numerosos organismos gubernamentales y el prestigio de sus responsables, no dudo de la alta calidad del sistema. No obstante, como bien señaló Andrés Vázquez en su blog, REDATAM presenta algunas complicaciones a la hora de reutilizar los datos con las herramientas, prácticas y convenciones a las que nos hemos acostumbrado en los últimos años. Llama la atención, además, que no estén públicamente disponibles ni su código fuente, ni la especificación de los formatos que utiliza para almacenar la información.

REDATAM es una aplicación con interfaz gráfica de usuario, pero también incluye un “procesador estadístico” (R+SP Process) que permite definir y exportar tablas mediante programas escritos en un lenguaje propio del sistema. Dado el diccionario de variables y entidades almacenadas en REDATAM, es posible construir consultas que exporten todas las variables a un archivo para luego convertirlo a un formato abierto que facilite su reutilización.

Liberando la información

Publiqué en GitHub un conjunto de scripts en lenguaje Python, que generan las queries apropiadas para ser ejecutadas por REDATAM y exportar casi todas las variables a DBF. Estos últimos son luego convertidos a archivos CSV (valores separados por comas). También publiqué los resultados de este procesamiento.

Cabe aclarar que estos archivos no son una fuente oficial de información y no asumo ninguna responsabilidad sobre su uso.. Las consultas generadas funcionan únicamente para los datos mencionados antes, pero es posible que esta metodología sea aplicable a otras bases de información publicadas con REDATAM.

¿Dónde están los radios censales?

Los radios censales —contenidos en las fracciones *censales— son una división administrativa del espacio. Su tamaño está definido por la cantidad de viviendas que contienen: una fracción censal contiene un promedio de 5000 viviendas y un radio contiene un promedio de 300 (fuente). Sólo la provincia de Buenos Aires y la Ciudad Autónoma de Buenos Aires publican la definición de estas divisiones en formatos geográficos apropiados. El INDEC mantiene un sitio informativo sobre “Unidades Geoestadísticas” para todo el país, pero publica los polígonos de los radios y fracciones censales en forma de archivos SVG desprovistos de información geográfica (imprescindible para *georeferenciar los datos)

Un ejemplo

Creo que visualizar información pública en “alta resolución” es valioso. El año pasado, como becario del programa OpenNews en el diario La Nación, participé en el desarrollo de una infografía interactiva sobre los resultados de las elecciones legislativas que introdujo la novedad de mostrar los resultados para cada centro de votación, en lugar de hacerlo a nivel distrital como suele ser el caso. Para mi sorpresa, tuvo muchísima repercusión —asumí que solo iba a interesarle a unos pocos nerds de la política y la información pública. Combinando un mapa de radios censales de Bahía Blanca y la información extraída de REDATAM, se puede hacer —por ejemplo— un mapa del porcentaje de hogares con algún indicador de necesidades básicas insatisfechas:

Este ejemplo es lo mínimo que puede hacerse con esta información. La publicación en un formato más ameno que REDATAM, espero, facilitará su utilización y aumentará la conciencia sobre el valor de la información pública publicada de forma apropiada.

[Muchas gracias a Andy Tow y a Andrés Vázquez por la ayuda y comentarios]


Sistemas, democracia y utopías tecnológicas

Unas lúcidas palabras de Adam Curtis:

Technology, and the spread of information it allows, can gather people together in squares in Egypt. What I find somewhat naive is the idea that you find within a lot of this web utopianism. Which is that, somehow, you can get a new democracy like this. Because underlying this, there’s the idea that all what democracy is, is all of us connected as nodal points of a network and —with feedback, a cybernetic idea— we’ll get to a shared harmony and out of that we’ll come to a shared harmony and order. Last time I looked, that’s not what democracy is, just a lot of individuals. That’s a naive market idea of democracy that we suffer from. Democracy is negotiating between the powerless and large, strong vested interests in society who often use their unequal access to power to their advantage at the expense of the less powerful. Democracy is about electing people who will stand up and represent you —the weak— and negotiate against the powerful. I’m very sympathetic to those movements, but self organizing systems are just that. They’re a retreat to managerialism, they’re a retreat to bureaucracy, they’re only a system. And that’s the ideology of our time: we’re all systems. What I argue, is that all those revolutions —if you look at them now— they all have gone backwards. They were incredibly noble, brave, hundreds of thousands people challenged those in power and got rid of them. What next? The idea that we’re all systems, and that system stabilizes itself is just that. We stabilize ourselves and that’s it. Is limiting or useless. (Cita tomada de una entrevista en el programa radial Little Atoms)


Presupuestos Públicos: del PDF a la visualización

Los fines y comienzos de año traen muchas noticias sobre los presupuestos públicos. Los medios comienzan informando sobre los proyectos de presupuesto enviados a las legislaturas por los ejecutivos, luego reportan sobre el debate, y finalmente sobre las inevitables disconformidades de la oposición, sindicatos y privados. Esas coberturas suelen centrarse en las variaciones interanuales de las partidas; tal ministerio subió en un 10% su presupuesto de gastos, y así. Es una gran oportunidad, en general no aprovechada por los medios digitales argentinos, para usar herramientas de visualización de datos que permitan una mejor comprensión de esos cambios presupuestarios. Por el contrario, eligen escribir cosas como “el Ministerio X tendrá asignados 54.234 millones de pesos, lo que representa un incremento del 12.98% con respecto al año pasado“. Es decir, consideran a la web como una hoja de papel y se limitan a traducir a lenguaje escrito lo que podría ser mejor expresado gráfica e interactivamente. Quizás la razón sea que muchos gobiernos, salvo honrosas excepciones, insisten en disponibilizar información pública en formatos muy difíciles de procesar y poco apropiados para el intercambio de información. En este post vamos a tomar como ejemplo los presupuestos de gastos publicados por el gobierno de la provincia de Buenos Aires en formato PDF, el favorito de los funcionarios públicos.

Primera página del presupuesto de gastos por jurisdicción y objeto (pcia BS.AS, 2013) (Primera página del presupuesto de gastos por jurisdicción y objeto (pcia BS.AS, 2013))

La imagen anterior es una captura de una página del presupuesto de gastos 2013 de la provincia de Buenos Aires. Queremos visualizar esa información. Si hubiera estado publicada en el formato apropiado, como CSV o inclusive Excel, podríamos habernos puesto manos a la obra. Pero está en PDF, así que vamos a tener que extraer los datos que contiene. Para eso vamos a usar Tabula, una herramienta opensource para liberar tablas atrapadas en PDF que comencé a desarrollar el año pasado. Este video muestra cómo extraer una tabla como la del presupuesto con Tabula:

Vamos a obtener un archivo CSV, que tiene la siguiente estructura:

1.1.1.02.01.000 - PODER JUDICIAL - ADMINISTRACION DE JUSTICIA -,5623235000,5060399000,38500000,229600000,260736000,34000000, 0, 0, 0
ACE-0001 - SUPREMA CORTE DE JUSTICIA,1212978700,1132555800,12520300,56192800,11709800, 0, 0, 0 , 0
ACE-0002 - TASA RETRIBUTIVA DE SERVICIOS JUDICIALES (Ley 11.594),270000000,235300000, 0, 700000, 0,34000000, 0, 0 , 0
ACE-0003 - INFRAESTRUCTURA DE LA JUSTICIA DE PAZ LETRADA - LEY 10,4000000, 0, 100000,3400000, 500000, 0, 0, 0 , 0<

La primer línea representa el primer nivel de desagregación del presupuesto, seguido por el segundo nivel. Cada una de las filas contiene, además, las diferentes componentes del gasto (total, gastos en personal, etc). Para esta visualización, vamos a usar el total de cada partida. Para facilitar el procesamiento vamos a aplanar esta estructura mediante este script en lenguaje Python (pero podríamos haber usado Excel, OpenOffice Calc u OpenRefine):

r = csv.reader(open(sys.argv[1]))
csv_out = csv.writer(sys.stdout)
juris = code_juris = None

for l in r:
    if re.match(r'\d\.', l[0]):
        s = l[0].split(' - ', 1)
        juris = s[1]
        code_juris = s[0]
        continue
    if juris is not None and re.match(r'[A-Z][A-Z][A-Z]-\d+', l[0]):
        s = l[0].split(' - ', 1)
        csv_out.writerow([code_juris, juris,
        code_juris + s[0], s[1]] + [n.replace('.', '') for n in l[1:]])

Luego de procesar los datos originales con este programa, obtenemos otro CSV:

1.1.1.02.01.000,PODER JUDICIAL - ADMINISTRACION DE JUSTICIA -,1.1.1.02.01.000ACE-0001,SUPREMA CORTE DE JUSTICIA, 920826957, 767799850, 7711477, 135545330, 9770300, 0, 0, 0 , 0
1.1.1.02.01.000,PODER JUDICIAL - ADMINISTRACION DE JUSTICIA -,1.1.1.02.01.000ACE-0002,TASA RETRIBUTIVA DE SERVICIOS JUDICIALES (Ley 11.594), 146500000, 126750000, 0, 700000, 0, 19050000, 0, 0 , 0
1.1.1.02.01.000,PODER JUDICIAL - ADMINISTRACION DE JUSTICIA -,1.1.1.02.01.000ACE-0003,INFRAESTRUCTURA DE LA JUSTICIA DE PAZ LETRADA - LEY 10, 2500000, 0, 28000, 1972000, 500000, 0, 0, 0 , 0
1.1.1.02.01.000,PODER JUDICIAL - ADMINISTRACION DE JUSTICIA -,1.1.1.02.01.000ACE-0004,MATERIAL BIBLIOGRÁFICO E INFORMÁTICO PARA LAS BIBLIO, 4000000, 0, 1600000, 200000, 2200000, 0, 0, 0 , 0

Vemos que el script aplanó la estructura, incluyendo el primer nivel de desagregación en todas las filas del conjunto de datos resultante. Además, remueve los puntos separadores de miles y genera un identificador único para las partidas de segundo nivel. Con esto, ya estamos listos para subirlo a OpenSpending, el sistema de visualización de datos financieros gubernamentales construído por la Open Knowledge Foundation. No voy a explicar cómo usar OpenSpending; es bastante fácil una vez que se entiende el uso de su data modeler. Lo importante es que, con relativamente poco esfuerzo, podemos ir del PDF a una visualización:

(Visualización Treemap para los datos de composición del Gasto por Nivel Institucional, Programa y Objeto del Gasto — Provincia de Buenos Aires, 2014)

El treemap, una buena manera de representar distribución de magnitudes en datos que tienen jerarquía, es solo una forma posible de representar la información. Según la necesidad, podíamos concentrarnos en la composición del gasto para algunas jurisdicciones, o mostrar variaciones interanuales.


Enero 18: Hackatón de Liberación de PDFs en GarageLab

Hay una enorme cantidad de información atrapada en archivos PDF. Hay dos razones para eso, como dije en la charla que dí en la MediaParty 2013 de Hacks/Hackers Buenos Aires. La primera es ignorancia; muchos no saben que el PDF un pésimo formato para compartir información. La segunda es pura maldad: extraer datos de archivos de PDF es por lo menos molesto y muchos se aprovechan de eso. Como becario 2013 del programa Knight-Mozilla OpenNews, trabajé bastante con conjuntos de datos en formato PDF. El resultado de ese interés fue Tabula, una herramienta libre para extraer tablas de archivos PDF que generó bastante entusiasmo en la comunidad de periodismo de datos y de datos abiertos. Sunlight Foundation organiza un hackatón de liberación de PDFs los días 17, 18 y 19 de Enero. Desde GarageLab vamos a sumarnos a esa iniciativa y convocamos a programadores, activistas e interesados en la liberación de datos para el día sábado 18 enero a partir de las 11:00 hs a reunirnos en nuestro espacio para trabajar en herramientas, técnicas y problemas de extracción de información desde archivos PDF. Si sos programador y tenés ganas de pasarte la tarde scrapeando PDFs, o si tenés algún conjunto de datos en PDF que quieras liberar, llená el formulario de inscripción (cupo limitado!) y acercate.