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

To read the Medium version, press here.

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: https://github.com/AlvaroAltamiranoM/Sentiment-analysis-of-pension-reform

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(api.search,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: https://minerandodados.com.br/analise-de-sentimentos-twitter-como-fazer/

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.

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.