Twitter sentiment analysis: qué comenta o povo sobre la reforma de pensiones en Brasil?

This post presents a twitter sentiment analysis with the aim of better understanding what Brazilian tweeter users have to say about the ongoing process of pension reform (PEC 006-2019). Particularly, this blog covers i) data extraction and description, ii) Natural Language Processing (NLP) illustrations, and iii) Machine Learning (ML) classification models. The Python code follows the same structure and can be found here:

I guess the first question is why Brazil, and why Twitter? Well, the current pension reform in Brazil is quite important for the country’s public finance, as Brazil’s aging process will be a pretty rapid one (See next graph; and excuse me for the slight language schizophrenia within this text and within the code’s comments as well ¯\_(ツ)_/¯).

Made in tableau using UN’s population data.

On the other hand, Twitter’s API allows to stream tweets from the last 7 days for free, and although its geo-location capabilities are not that good, you can select tweets in Portuguese from a particular topic of interest. In a few words, it’s a cheap way to collect opinions on specific topics. Finally, Brazil not only provides a good case study for the importance of its pension reform, but also because it is the only Portuguese speaking nation (I know of) currently reforming its pension system. At least it’s the only Latin American nation referring to Pensions as Aposentadorias, or Senior citizens as Pessoas Idosas.

I) Ok, so let’s query! The following snippet does the query, where the keywords are defined under the ‘query = ‘ object. Most of those keywords are variations of the following: Previdencia, Aposentadoria, Aposentados, reformaprevidencia, etc. That’s all the code we’ll see for now (as I said before, you can get the code in Github), from now on we’ll be discussing the main results.

# #Dates for fetching
start_date = '2019-7-9'
# # Create API object
api = connect_to_twitter_OAuth()  
def get_save_tweets(INSS, api, query, max_tweets=200000, lang='pt'):
    tweetCount = 0
    #Open file and save tweets
    with open(INSS, 'w') as f:
        # Send the query
        for tweet in tweepy.Cursor(,q=query,lang=lang, since=start_date).items(max_tweets):         
            #Convert to JSON format
            f.write(jsonpickle.encode(tweet._json, unpicklable=False) + '\n')
            tweetCount += 1
        #Display how many tweets we have collected
        print("Downloaded {0} tweets".format(tweetCount))
query = '#Previdencia OR #Aposentadoria OR #Previdência OR #Aposentados OR Previdencia OR Previdência \
        OR Aposentados OR Aposentadoria OR previdencia OR previdência OR reformaprevidencia OR #INSS OR #reformadaprevidência OR \
        #reformaprevidencia OR #previdenciasocial -Filter:retweets'                        
# # Get those tweets
get_save_tweets('tweetsF.json', api, query)

So, that code yields a json dataset including roughly 174 thousand tweets from the week of the first debate (-started on July 9th- to July 15th) of the reform’s proposal in the lower chamber of the legislative body (câmara dos deputados). Note: as the reform is a constitutional addendum it will have to go through 2 votes on that first instance and other two voting sessions on the Senate. The following graphs display our tweet’s timelines. This shows that the intensity of the tweets rose as the reform was discussed in the camara dos deputados, and declined as the base text was approved on the 10th and this first voting ended on the 12th. As for the time of day, people seem to be more active around lunch and after dinner. *With a broader stream listener we could see if these particular tweets are significant within Brazilian tweets at the time (out of our scope for now though).

In literary terms, the cleansed version of this corpus of tweets (about 16 million words) would fill up about 62 Don Quixote’s, or about 119 One Hundred Years of Solitude. The 500 most common words are represented in the following picture using Brazil’s map as a mask.

The code for this can be found in the second script.

As mentioned before, Twitter’s geo-capabilities are limited, mostly because people do not usually share where they are tweeting from. Well, for those who do share, we are able to use Nominatin to translate location strings (eg. Belo Horizonte, Sao Paolo, etc.) into geocoordinates and do the following mapping. We can also see the distribution of locations and countries. That distribution seems to correspond with Brazil’s current demographic distribution, and may also correspond to Twitter activity in Brazil.

II) For the NLP part I’ll mostly use spaCy’s Portuguese CNN model (pt_core_news_sm), although I also use NLTK for some parts. Let’s see for example the most repeated Verbs, Nouns, and Subjects within our tweets (a.k.a Parts-Of-Speech). The usual suspects here, at least for the most common verbs and nouns. The most common adjectives, however, show that humans are still better at identifying POS, because the adjectives ‘Politico’, ‘Especial’, and ‘Mínimo’, actually refer to nouns in the context of this pension reform: they mean ‘Politicians’, ‘Special pensions’, and ‘Minimum wage or Minimum pensions’. I know this depends on how (over what) spaCy’s Portuguese model was trained, and that I could do some micro engineering about it, but still, there is no single model (yet) that gets every POS right.

Syntactic dependencies are other popular NLP illustrations using spaCy. The following two are examples of spaCy’s accuracy in regards to that matter.

We can also do some Named-entity recognition (NER). The following examples show, for example, how spaCy’s model is good at recognizing that Alessandro Molon is a person, or that Brazil and Chile are locations.

Using another popular NLP library, NLTK, we can see the concordance of particular words. In this case we look for tweets with the word Idoso (meaning senior person).

III) In this part I present two supervised Machine Learning classification models and apply them to our ≈ 174k tweets. I use two annotated corpora for this task (both have a ternary classification: ‘negative-positive-neutral’). The first (Minas from now on) is a set of ≈ 9 thousand tweets about Minas Gerais’ government (Minas Gerais is a Brazilian state, a big one!). I found this first annotated corpora here:

The second corpora consists of ≈53k opinion tweets about Brazilian TV shows (USP from now on), created using both expert manual annotation and semi-supervised learning. For details please refer to this corpora’s website (which includes links to the author’s Universidade de Sao Paulo thesis and derivative papers).

The pre-processing of text follows standard NLP procedures: general cleaning for html, xml, names, numbers, caps, etc.; portuguese stopwords; normalization (eg. lemmas); and tokenization (at the word level using spaCy’s tokenizer in the pipeline).

For the specific algorithm I use Multinomial Naive Bayes as it theoretically relates more to the assumption of independence among tokens (I also tried random forests, SVM and logistic classifications, all yield similar results in term of fitness). The training uses 75% of both corporas and the following precision estimates are displayed for both binary (excluding the ‘neutral’ class) and ternary (neutral, positive and negative tweets). I only display the ‘accuracy’ measure for parsimony, and because the recall and F1 measures do not differ greatly (you can replicate these results yourself). For people worried about the model’s ‘sentiment’ recognition capabilities, the accuracy measure is always close to the ‘recall’ indicator.

The Minas model yields better accuracy for both representations (possibly over-fitted though), and this is explained by the fact that this corpora is more ‘self-contained’ as it only relates to one topic (opinions regarding Minas Gerais’ goverment in 2017). The USP’s model, much bigger and more thematically disperse, yields lower accuracy estimates.

So, let’s apply those models to our ≈ 174k tweets! The figures ahead show the results. In general, our tweets are classified as being mostly negative (No news there!). When including the neutral class, the Minas model says our tweets are mainly neutral, and negative. USP’s model provides a balance between neutrality and negativity.

We could display such classifications by localities (cities). Here is the example using USP’s model:

What now? I guess we could reinforce these classification hiring some time in Amazon Mechanical Turk to apply reinforced learning and fine-tune these models. I won’t be doing that. What I’ll try next, however, is using some transfer learning with distilled BERT models provided by the PYtorch-spaCy recently created library. If someone else wants to come along in that path I would appreciate it. I also have some snippets (prototype) for livestreaming tweets that would allow for presque real-time classification, a sort of live opinion monitoring (this is not easy as twitter is strict about stream listeners).

Finally, some caveats/limitations and acknowledgements are needed. First, this type of twitter analysis lacks external validation (something household surveys or public polls also lack to some extend, but for which they provide better sampling/methodological documentation). Secondly, this project grew upon many other bloggers, programmers and coders. The list of which is too long to mention. I am but a code scavenger, and any errors are mine solely.

Calculador/Simulador de pensiones para Nicaragua

Al final de la vida laboral es probable que la única fuente de ingresos que tengamos sea la pensión por vejez que otorga el sistema de seguridad social. En ese caso, necesitaremos ajustar nuestro consumo, es decir, nuestro estilo de vida, porque las pensiones usualmente son más bajas que nuestro último salario.

En esta entrada presento una herramienta para simular las pensiones por vejez que otorga el Instituto Nicaragüense de Seguridad Social (INSS). En síntesis, se trata de un programa para Windows que usa las reglas vigentes de la seguridad social para darle al usuario un estimado de su futura pensión mensual.

Para instalar el programa puede descargar el instalador desde el siguiente link: DESCARGAR. Una vez instalado, el programa debería proyectar la siguiente interfaz al ser ejecutado (ver imagen abajo). En la izquierda, la interfaz ejecuta el cálculo una vez que el usuario haya ingresado los parámetros y supuestos del ejercicio. La pensión estimada será proyectada en el cuadro de texto, junto con la tasa de reemplazo y el nivel de la pensión en dólares. Una vez que el usuario de click en el botón de cálculo aparecerá la ventana de la derecha, ilustrando su nivel de pensión entre la pensión mínima y máxima que el sistema nicaragüense otorga.

GUI Calc

A continuación, explicaré los parámetros usados en el ejercicio para que el usuario pueda simular diferentes escenarios de pensión, pero antes resumiré brevemente las principales características del sistema. En Nicaragua, el régimen de seguridad social es de beneficio definido (BD), y otorga pensiones para trabajadores con un mínimo de 250 semanas de cotización (primer nivel de la pensión reducida). La pensión completa o tradicional se alcanza luego de 750 semanas de contribuciones al INSS. La edad legal de retiro es a partir de los 60 años. En el REGLAMENTO GENERAL DE LA LEY DE SEGURIDAD SOCIAL pueden encontrar los detalles de cálculo de beneficios.

i Edad actual: este ejercicio supone que los trabajadores desean jubilarse a la edad mínima de retiro, 60 años tanto para hombres como para mujeres. En ese sentido, el usuario debe imputar su edad actual (p. ej. 39) como un número entero menor a 60 años y superior a la edad mínima laboral que en Nicaragua es de 14 años.

ii Salario actual: el usuario debe imputar su salario actual como un número entero (sin decimales). El salario de referencia usado para el cálculo de la pensión depende tanto del nivel salarial imputado, como del número de contribuciones totales efectuadas al final de la vida laboral. El nivel salarial imputado también determinará la “cuantía básica” de la pensión (Arto. 85). La trayectoria salarial, es decir, cuánto aumentará su salario hasta alcanzar la edad de retiro dependerá de la tasa de crecimiento salarial a ser imputada posteriormente.

iii Número de años que espera cotizar durante su vida laboral: el usuario debe ingresar una estimativa de cuantos años habrá cotizado en total al momento de retiro (incluyendo los que ha cotizado hasta el momento actual). De acuerdo con la Ley, los beneficios pensionales comienzan a partir de 5 años (pensión reducida), mientras que la pensión completa es otorgada a partir de los 15 años de contribución.

iv Salario mínimo legal: el salario mínimo determina la generosidad del beneficio pensional, con dos tasas de incremento pensional anual de acuerdo con el nivel del salario del trabajador en relación al salario mínimo vigente de la industria manufacturera (Arto. 85).

v Crecimiento salarial esperado: el usuario debe imputar la tasa de crecimiento salarial que espera recibir en los años previos a alcanzar la edad de retiro. Esta tasa también será usada para ajustar los niveles de las pensiones reducidas. La costumbre en estudios internacionales (ver Pensions at a Glance de la OECD) es asumir que los salarios crecerán al 2% por año en el largo plazo, pero el usuario puede imputar cualquier tasa de crecimiento salarial. El número debe ser imputado como tasa y no como porcentaje, es decir como 0.03 para denotar un supuesto de crecimiento del 3%.

vi Tipo de cambio actual: Como la economía nicaragüense está extraoficialmente dolarizada, las personas usualmente conocen el tipo de cambio vigente en cada momento. El usuario puede también consultar el tipo de cambio en la pagina del Banco Central de Nicaragua ( El tipo de cambio será usado para estimar el nivel de la pensión en dólares estadounidenses, y para proyectar el nivel máximo de la pensión establecido por Ley en US$ 1500 por mes.

v Devaluación cambiaria: En Nicaragua el tipo de cambio es fijo con devaluación anual preanunciada (crawling peg). Desde 2004, la devaluación del córdoba ha sido de 5% por año. El usuario puede mantener este supuesto imputando 0.05 en la casilla correspondiente, o puede imputar cualquier otra tasa de devaluación. Al igual que con la tasa de crecimiento salarial, el número debe ser imputado como tasa y no como porcentaje.

Las pensiones bajo el régimen INSS pueden incrementarse en el caso de que el jubilado tenga dependientes (esposo/esposa invalida, hijos menores de 15 años, etc.). Este ejercicio no contiene tales disposiciones porque su propósito principal es simular escenarios futuros (de largo plazo). Sin embargo, una vez estimada su pensión, el usuario puede consultar el Arto. 85 de la Ley para agregar fácilmente cualquier beneficio adicional. Este programa tampoco estima la pensión para maestros/maestras y profesiones de riesgo, para las cuales existen otros requisitos de edad de retiro.

El programa lo he desarrollado desde Python 3.6, como una iniciativa académica personal (sin vínculos profesionales directos), y sin afilición al INSS. Se agradecen comentarios para mejorar la herramienta.

América Latina y el Caribe: una región que envejece rápido

Publicado originalmente en: Factor Trabajo (BID)

América Latina y el Caribe envejece más rápido que el resto del mundo. Un nuevo estudio del BIDdestaca que, en las próximas décadas, países como Nicaragua, México y Chile envejecerán hasta tres veces más rápido que algunos países europeos. Sin embargo, a pesar de que tenemos muchos más datos y proyecciones sobre el envejecimiento poblacional que sobre el impacto de los avances tecnológicos, a menudo la tecnología opaca a la demografía en los titulares sobre el futuro del trabajo, pues existe el mito de que vivimos en una región joven. Si la realidad es que los adultos mayores se están convirtiendo en un segmento tan importante de la población, ¿qué pasará con los mercados laborales de nuestros países?

Un nuevo estudio del BID destaca que, en las próximas décadas, países como Nicaragua, México y Chile envejecerán hasta tres veces más rápido que algunos países europeos.

Envejecer en condiciones de pobreza

Dada la persistencia de la informalidad laboral y la provisión limitada de mecanismos de protección social, nuestra región corre el riesgo de envejecer en condiciones de pobreza. Aún con la proliferación de pensiones no contributivas, se estima que 4 de cada 10 adultos mayores en América Latina y el Caribe no reciben ningún tipo de pensión por vejez, y a quienes sí reciben pensión muchas veces no les alcanza para escapar de la pobreza.

Se estima que 4 de cada 10 adultos mayores en América Latina y el Caribe no reciben ningún tipo de pensión por vejez.

Aunque ni la informalidad ni el trabajo en la vejez son fenómenos novedosos en la región, cambios culturales y demográficos relativamente recientes traen elementos nuevos al contexto regional. Entre ellos, se pueden mencionar la reducción del tamaño de las familias y la inserción laboral femenina, que, a pesar de ser logros sociales importantes, limitan la provisión tradicional de cuidados dentro del hogar (las familias solían representar una red de seguridad para el bienestar de las personas mayores). Adicionalmente, los avances en prevención y atención médica permiten vivir vidas más largas, por lo que crecerá el porcentaje de personas que alcanzan la llamada ‘cuarta edad’ (mientras que la esperanza de vida era de 69 años para los hombres y 76 años para las mujeres en el año 2000, se estima que para el año 2050 los hombres vivirán un promedio de 80 años y las mujeres un promedio de 84 años). Estos elementos se traducirán en incrementos substanciales en el gasto público en salud y pensiones durante las próximas décadas. Además, los mercados laborales deberán adaptarse para darle oportunidades a los adultos mayores, que ahora tendrán la necesidad de trabajar durante más años.

Los avances en prevención y atención médica permiten vivir vidas más largas, por lo que crecerá el porcentaje de personas que alcanzan la llamada ‘cuarta edad’.

Lecciones de otros países

Quizás podemos aprender algunas lecciones del país más envejecido del planeta, Japón. La super envejecida sociedad nipona introdujo en el año 2000 un programa de seguros para esquemas de cuidado médico de largo plazo, en donde los asegurados comienzan a pagar mensualidades a partir de los 40 años y pueden acceder a los beneficios a partir de los 65 años (luego de someterse a algunos exámenes para definir su elegibilidad). La mitad de esta iniciativa se financia por las contribuciones de los contribuyentes y la otra mitad por el gobierno. Además de promover la cobertura de protección social a la vejez, la introducción de este programa promovió la inserción laboral de los familiares de los asegurados, actuando implícitamente como una política activa de mercado laboral.

Con una tasa de envejecimiento tan alta como la de Japón, no sorprende que, durante el período de 2002 a 2016, la profesión que más creció en este país fue la de servicios de cuidado de la salud. De hecho, las municipalidades japonesas ya están reclutando adultos mayores menos envejecidos (como los sexagenarios) para emprender actividades ligeras dentro de los centros geriátricos. Las previsiones de demanda de trabajadores para otros países, como es el caso de Estados Unidos, corroboran que las ocupaciones que van a ser cada día más demandadas serán aquellas relacionadas con servicios médicosy cuidado de personas mayores.

¿Qué hacer con una región envejecida?

La provisión de salud y la protección ante el riesgo de pobreza en la vejez serán retos ineludibles para las políticas públicas en América Latina y el Caribe, ya que envejeceremos más rápido que algunas economías más desarrolladas y con mayor cobertura de protección social en la vejez. Ante estos desafíos, el Estado debe ver a la tecnología como una aliada para brindar oportunidades laborales a los adultos mayores que seguirán trabajando después de la edad tradicional de retiro, facilitando el aprendizaje a lo largo de la vida. Además, los países se verán obligados a repensar el Estado de Bienestar para adoptarlo a la realidad de una región envejecida. Con la serie de publicaciones interactivas El futuro del trabajo en América Latina y el Caribe, buscamos dar respuestas a estas y otras cuestiones que marcarán el mercado laboral del mañana en la región.

¿Existe una brecha de género en las pensiones?

Publicado originalmente en: Factor Trabajo (BID)

Aunque muchos estudios demuestran mejoras en la participación laboral de las mujeres en América Latina y el Caribe, todavía queda mucho camino por recorrer. Como se explica en la publicación Empleos para crecer, a lo largo de su ciclo de vida laboral las mujeres latinoamericanas participan menos en el mercado de trabajo remunerado, devengan salarios más bajos y tienen menor acceso a empleos formales que los hombres. Por esta razón, en la mayoría de los países de la región las mujeres reciben menores pensionescuando alcanzan la edad de retiro. ¿Se puede compensar esta brecha haciendo cambios a los actuales sistemas de pensiones?

En la mayoría de los países de la región las mujeres reciben menores pensiones cuando alcanzan la edad de retiro.

Peores pensiones para las mujeres

Desde inicios del siglo XXI, la brecha de género en los montos de pensiones contributivas se ha reducido desde un promedio regional de 23% a inicios de los años 2000 hasta un promedio de 13% en 2015. Sin embargo, la persistencia de diferencias salariales y baja participación en actividades remuneradas amenaza con extender aún durante más años estos contrastes en los montos de pensión por retiro. Este legado, como muestra el gráfico, se observa en numerosos países de la región.

Las encuestas de hogares incluidas en el Sistema de Información de Mercados Laborales y Seguridad Social (SIMS) muestran la persistencia de importantes diferencias en las tasas de participación y niveles salariales. A pesar de que la región obtuvo la mayor reducción mundial en la brecha de participación, aún sigue teniendo la brecha más amplia cuando se le compara con otras regiones (siendo Uruguay y Perú los únicos países de América Latina en donde la brecha es inferior al 20%, sin tomar en cuenta si las mujeres cotizan a la seguridad social o en qué tipo de trabajos se insertan).

La continuidad de estas diferencias es preocupante porque los montos de la pensión dependen directamente del nivel salarial y de los años de contribución al sistema jubilatorio. Por un lado, salarios bajos se convertirán en pensiones bajas. Por otro, si las mujeres trabajan menos o dejan de hacerlo por cuidar a sus hijos, aportarán menos a la seguridad social, obteniendo por tanto menores beneficios pensionales.

Compensar la brecha de género desde los sistemas de pensiones

El diseño de los sistemas de pensiones puede replicar, amplificar o reducir estas diferencias. Por ejemplo, jubilarse cinco años antes que sus contrapartes hombres puede implicar que una profesional no logre alcanzar el potencial de mayores ingresos laborales al final de su senda laboral, período usado como referencia para calcular su pensión. Esto puede ocurrir en los diez países de América Latina y el Caribe que aún mantienen diferencias de género en la edad de retiro. Por otro lado, jubilarse anticipadamente puede verse como una transferencia de recursos de hombres hacia mujeres, si tomamos en cuenta que al vivir más años ellas recibirán durante más tiempo tales beneficios. Esto ocurre si los sistemas no toman en cuenta las diferencias en la esperanza de vida para calcular las pensiones.

El diseño de los sistemas de pensiones puede replicar, amplificar o reducir estas diferencias. Por ejemplo, jubilarse cinco años antes que sus contrapartes hombres puede implicar que una profesional no logre alcanzar el potencial de mayores ingresos laborales al final de su senda laboral.

Sin respuestas unívocas para recomendar diseños particulares, es útil conocer ejemplos de gobiernos que intentan reducir las tensiones del mercado laboral a través de la seguridad social. En Uruguay, a las mujeres se les reconoce un año de cotización por cada hijo. En Chile a las mujeres se les otorga un bono equivalente al 10% de 18 salarios mínimos por cada hijo. Estados Unidos y la Unión Europea exigen el uso de tablas de vida unisex para el cálculo de las pensiones bajo esquemas de beneficio definido, evitando que un hombre y una mujer con el mismo capital acumulado reciban pensiones diferentes al retirarse con la misma edad. Adicionalmente, la introducción de pensiones no contributivas en la mayoría de los países de la región ha beneficiado a aquellas mujeres más afectadas por rupturas laborales.

Los sistemas pensionales, por tanto, sí pueden mitigar las brechas de género derivadas del mercado de trabajo. Estas estrategias de compensación ya existen en algunos países latinoamericanos. Pero quizá sea más interesante preguntarnos hasta cuándo las diferencias de género en materia de pensiones continuarán reflejando el residuo de mercados laborales desiguales. La respuesta a esto dependerá, más que de cambios legales, de una transformación en las expectativas y roles de género en el mercado de trabajo. Y, como decía, en eso queda mucho por hacer.