scieee AI-readable full text Open interactive document viewer

Relación entre renta per cápita y características del lenguaje utilizado en redes sociales

Pérez García-Consuegra, Noelia; Pinuaga López, Elena

Abstract

Este trabajo pretende comprobar si existe relación entre la renta per cápita de los usuarios de Twitter y el lenguaje que utilizan al escribir sus tweets. Para lograrlo, se ha recopilado una gran cantidad de tweets con coordenadas a fin de obtener una cantidad suficiente de personas para nuestro estudio. Estos se han ido descargando durante varias semanas de lunes a jueves por la noche. Se ha supuesto, por un lado, que los usuarios emiten los tweets desde su domicilio y, por otro, que sus datos de renta coinciden con los de la zona en la que viven. Tras asociarles la renta, se ha realizado una selección de usuarios para reunir únicamente aquellos que consideramos relevantes para el estudio. Hecho esto, se ha llevado a cabo la descarga de sus tweets durante un largo periodo de tiempo. Con los tweets recopilados y sus datos de renta asociados, se inicia un análisis del lenguaje. Buscamos hallar disimilitudes estadísticamente significativas entre aquellos tweets escritos por usuarios con rentas más altas y aquellos cuyos autores poseen rentas menores. Se comprueba que, en efecto, existen ciertas diferencias remarcables. En particular, las personas cuya renta es mayor reflejan un sentimiento más positivo en sus tweets, incluyen más números en sus mensajes y cometen menos errores ortográficos. Sin embargo, hacen uso de una cantidad menor de palabras y su volumen de tweets publicados es más bajo. Los usuarios con menor renta, por su parte, utilizan una mayor cantidad de verbos y menciones, aunque emplean menos emoticonos. Finalmente, se realizan pruebas con algoritmos de machine learning que, a pesar de no permitir predecir la renta a partir de los rasgos del lenguaje, sí confirman la dependencia existente entre la renta y la forma de expresarse en la red social.

Full text

FACULTAD DE INFORMÁTICA TRABAJO DE FIN DE GRADO Relación entre renta per cápita y características del lenguaje utilizado en redes sociales Relationship between income per cápita and feaures of the language employed in social networks Noelia Pérez García-Consuegra Elena Pinuaga López Ingeniería Informática - Matemáticas Curso 2021-2022 Director: Rafael Caballero Roldán Índice Resumen 5 Palabrasclave.............................. 5 Abstract 7 Keywords ................................ 7 1 Introducción 9 1.1 Planteamiento del problema y trabajos relacionados . . . . . . 9 1.2 Objetivos y metodología . . . . . . . . . . . . . . . . . . . . . 10 2 Plan de trabajo 13 3 Tecnologías 17 4 Descarga de tweets e incorporación de direcciones 19 4.1 Obtención de usuarios . . . . . . . . . . . . . . . . . . . . . . 19 4.2 Limpiezadedatos......................... 20 4.3 Incorporación de direcciones . . . . . . . . . . . . . . . . . . . 20 5 Asociación de rentas a usuarios 23 6 Análisis del lenguaje 27 7 Estadísticas 35 7.1 Correlaciones ........................... 35 7.2 Diferencias de medias . . . . . . . . . . . . . . . . . . . . . . . 37 7.3 Características de los verbos . . . . . . . . . . . . . . . . . . . 41 8 Machine learning 45 8.1 Regresión ............................. 45 8.2 Clasificación............................ 46 3 9 Conclusiones y trabajo futuro 49 10 Contribuciones 51 10.1 Noelia Pérez García-Consuegra . . . . . . . . . . . . . . . . . 51 10.2 Elena Pinuaga López . . . . . . . . . . . . . . . . . . . . . . . 54 Bibliografía 57 11 Introduction 61 11.1 Approach to the problem and related works . . . . . . . . . . 61 11.2 Objectives and methodology . . . . . . . . . . . . . . . . . . . 62 12 Conclusions and future work 63 Las figuras y tablas del trabajo son de elaboración propia salvo que se indique explícitamente lo contrario. Resumen Este trabajo pretende comprobar si existe relación entre la renta per cápita de los usuarios de Twitter y el lenguaje que utilizan al escribir sus tweets. Para lograrlo, se ha recopilado una gran cantidad de tweets con coordenadas a fin de obtener una cantidad suficiente de personas para nuestro estudio. Estos se han ido descargando durante varias semanas de lunes a jueves por la noche. Se ha supuesto, por un lado, que los usuarios emiten los tweets desde su domicilio y, por otro, que sus datos de renta coinciden con los de la zona en la que viven. Tras asociarles la renta, se ha realizado una selección de usuarios para reunir únicamente aquellos que consideramos relevantes para el estudio. Hecho esto, se ha llevado a cabo la descarga de sus tweets durante un largo periodo de tiempo. Con los tweets recopilados y sus datos de renta asociados, se inicia un análisis del lenguaje. Buscamos hallar disimilitudes estadísticamente significativas entre aquellos tweets escritos por usuarios con rentas más altas y aquellos cuyos autores poseen rentas menores. Se comprueba que, en efecto, existen ciertas diferencias remarcables. En particular, las personas cuya renta es mayor reflejan un sentimiento más positivo en sus tweets, incluyen más números en sus mensajes y cometen menos errores ortográficos. Sin embargo, hacen uso de una cantidad menor de palabras y su volumen de tweets publicados es más bajo. Los usuarios con menor renta, por su parte, utilizan una mayor cantidad de verbos y menciones, aunque emplean menos emoticonos. Finalmente, se realizan pruebas con algoritmos de machine learning que, a pesar de no permitir predecir la renta a partir de los rasgos del lenguaje, sí confirman la dependencia existente entre la renta y la forma de expresarse en la red social. Palabras clave machine learning, tweets, renta, lenguaje, estadísticas, usuarios 5 Abstract This project tries to prove if there is any relationship between Twitter users’ income and language used on their tweets. To reach this, we have gathered together a large amount of tweets containing coordinates so that we can obtain a sufficient amount of people for the study. We have been downloading these tweets for a long time from Monday to Thusrday in the evening. On the one hand, we have assumed that users upload their tweets from their place of residence. On the other hand, we suppose their income is consistent with the area where they live. Once the income is associated with our users, we have selected the users considered relevant for our investigation. Next, we have been downloading their tweets for some months, so that we can carry out a language analysis. We look for statistically significant dissimilarities between those tweets written by higher income users and those written by users whose income is lower. We prove that, in fact, there exist some remarkable differences. In particular, people whose income is higher reflect a more positive feeling on their tweets. Besides, they include more numbers on their messages and fewer spelling mistakes. However, they use fewer words and their level of posts is lower. In contrast, lower income users use more verbs and mentions, although they employ fewer emoticons. Finally, we conduct tests with machine learning algorithms. Despite not being able to make predictions about income on the basis of language features, they confirm a dependency between income and the way users express on the social network. Keywords machine learning, tweets, income, language, statictics, users 7 Capítulo 1 Introducción En este primer capítulo, planteamos el problema que tratamos de resolver en nuestro proyecto, sus antecedentes y los objetivos marcados. 1.1 Planteamiento del problema y trabajos relacionados El proyecto se plantea en un principio en colaboración con el doctor Mirko Antino, del grupo de investigación del director del trabajo, pero perteneciente a la Facultad de Psicología. Tratamos de estudiar si existe alguna relación entre la renta per cápita y el tipo de lenguaje empleado en redes sociales y, en concreto, en la red social Twitter. En particular, una teoría que se quiere poner a prueba afirma que las personas con mayor renta tienden a expresarse más en tiempo futuro que las personas de renta más baja. Por tanto, tratamos de corroborar o descartar estas ideas a partir de los textos publicados en Twitter. A continuación, exponemos una serie de trabajos relacionados con nuestro proyecto. The psychosocial effects of economic inequality depend on its perception Este artículo [22] estudia la influencia de la desigualdad económica en el bienestar subjetivo a través de procesos psicológicos como la competencia por el estatus. Esta perspectiva sugiere que surgen hallazgos inconsistentes porque los efectos psicológicos de la desigualdad económica son impulsados por la desigualdad percibida, en lugar de objetiva. A pesar de que en nuestro estudio no contamos con indicadores de pobreza percibida, tenemos una variable que expresa el incremento 9 Capítulo 3 Tecnologías Durante la implementación del código del proyecto hemos utilizado el lenguaje de programación Python por su facilidad para analizar datos y automatizar operaciones. En particular, hemos trabajado con Jupyter Notebook, una plataforma de desarrollo en un entorno web que permite combinar texto y código. En las primeras fases del proyecto también ha sido de gran utilidad la base de datos NoSQL MongoDB, orientada a documento, que cuenta con lenguaje de consultas propio para utilizar desde Python o desde su propia consola. En este proyecto se ha empleado para almacenar datos de tweets y usuarios y obtener de forma eficiente resultados de consultas complejas. Una ventaja es que permite almacenar información compleja en documentos en formato JSON [27] 1como la obtenida de la biblioteca geopy. Además, permite el almacenamiento de documentos con formatos diferentes, lo que ha resultado útil porque, por ejemplo, para algunos tweets no disponíamos de dirección asociada. Otras ventajas son su facilidad para hacer consultas y su rapidez y escalabilidad. De hecho, nuestro proyecto se trata de un prototipo que se podría utilizar en un estudio con un volumen de datos mucho mayor. Centrándonos en Python, hemos empleado gran diversidad de bibliotecas, entre las que encontramos las siguientes: •folium: facilita la visualización de datos que han sido manipulados en Python en un mapa interactivo [1]. •geopy: ayuda a los desarrolladores de Python a localizar las coordenadas de direcciones, ciudades, países y puntos de referencia en todo el mundo 1JSON (JavaScript Object Notation - Notación de Objetos de JavaScript) es un formato ligero de intercambio de datos. Leerlo y escribirlo es simple para humanos, mientras que para las máquinas es simple interpretarlo y generarlo. [26] 17 mediante geocodificadores de terceros y otras fuentes de datos [2]. •pymongo: contiene herramientas para interactuar con la base de datos MongoDB desde Python [11]. •Pandas: proporciona estructuras de datos rápidas, flexibles y expresivas diseñadas para que trabajar con datos “relacionales” o “etiquetados” sea fácil e intuitivo [7]. •selenium: se utiliza para automatizar la interacción del navegador web desde Python [12]. •emoji: proporciona todo el conjunto de códigos Emoji definidos por el consorcio Unicode [13]. •matplotlib: sirve para crear visualizaciones estáticas, animadas e interactivas en Python [14]. •flair: es utilizada para el procesamiento del lenguaje natural (NLP) [9]. •spacy: es utilizada para el procesamiento de lenguaje natural de potencia industrial [15]. •scipy: proporciona algoritmos fundamentales para la computación científica en Python [16]. •scikit-learn: es utilizada para el aprendizaje automático en Python [17]. •seaborn: es utilizada para mostrar gráficas de datos estadísticos [20]. La aplicación particular de algunas de estas bibliotecas en nuestro trabajo se comentará al explicar la fase asociada. Todo el código elaborado durante la implementación de este trabajo de fin de grado puede encontrarse en este GitHub. En el capítulo 4, veremos cómo se han recopilado los datos iniciales para dar comienzo al proyecto. Capítulo 4 Descarga de tweets e incorporación de direcciones 4.1 Obtención de usuarios El primer paso para la implementación del trabajo es detectar y obtener suficientes usuarios de Twitter para su posterior análisis. Para ello comenzamos descargando tweets a los que requerimos que contengan las coordenadas. Muy pocos las incluyen, ya que Twitter suele omitir este tipo de información, en particular, entre el 1% y el 2% de ellos las tienen. La red social permite definir límites en las coordenadas entre las cuales se pueden descargar tweets mediante intersección de cajas. Para lograr nuestro objetivo, tomamos una sola caja que contiene toda España incluyendo Canarias. Desgraciadamente también abarca Portugal y parte de Marruecos, entre otros puntos, pero no nos afecta, ya que solo registramos tweets cuyos idiomas corresponden a España: [“es”, “eu”, “gl”, “ca”]. Finalmente solo utilizamos “es” para facilitar el posterior uso de herramientas de tratamiento del lenguaje. Las coordenadas utilizadas son: norte = 44, sur = 27, este = 5, oeste = -19. Más adelante, al hacer uso de la biblioteca geopy para obtener la dirección de cada tweet, se descartan las direcciones que no corresponden a España. La Figura 4.1, obtenida mediante la biblioteca folium (3), muestra la representación gráfica de las coordenadas registradas. Los tweets se graban de lunes a jueves, de 21:00 P.M a 03:00 A.M (en Canarias, de 20:00 P.M a 02:00 A.M). Tras realizar este proceso, se obtienen 8563 tweets pertenecientes a 3334 usuarios, que almacenamos en una base de datos MongoDB. Por un lado, guardamos los tweets en una colección llamada “tweet” y, por otro, almacenamos la información de los usuarios en la colección “user”. 19 Figura 4.1 Mapa de coordenadas registradas 4.2 Limpieza de datos El siguiente paso es hacer limpieza de los datos obtenidos. El método utilizado para la descarga tiene la peculiaridad de que si un tweet representa un retweet, se baja también al que hace referencia. Esto hace que haya tweets extra que no pertenecen al rango horario. Para descartarlos, se eliminan aquellos que cumplan alguna de las siguientes condiciones: no tener campo “coordinates”, no estar en los idiomas seleccionados o contener el campo “hora” >3 u “hora” <21 (donde “hora” representa la hora en tiempo universal, luego es la hora registrada más 2). Haciendo esto, se eliminan un total de 270 tweets y 110 usuarios, ya que estos últimos dejan de tener tweets asociados, restando por tanto 8293 tweets y 3224 usuarios. Aun así, se continúa con el proceso de descarga durante las siguientes fases, por lo que estas cantidades no serán las definitivas. 4.3 Incorporación de direcciones Una vez obtenidos los datos, procedemos a añadir las direcciones. En primer lugar, incorporamos la dirección a los tweets a partir de las coordenadas. Para ello, hacemos uso de la biblioteca geopy (3) de Python. Al hacer esto, aprovechamos para eliminar aquellos tweets cuya dirección no es española, de tal forma que nos quedamos con 8193 tweets y 3161 usuarios. A continuación, filtramos para disponer únicamente de direcciones correspondientes a domicilios particulares. Este dato es importante ya que, al no tener la dirección real, estamos asumiendo que cada usuario emite el tweet desde su domicilio. La información de la dirección, que viene en el formato que se muestra en la Figura 4.2, puede indicarnos si se trata de un local comercial, una institución, etc. Figura 4.2 Formato del campo “dirección” de un tweet Comenzamos descartando todos los tweets que dentro del campo “dirección”, en el subcampo “address”, contengan alguno de los siguientes subcampos: “tourism”,“industrial”,“amenity”,“building”,“highway”,“historic”,“shop”,“leisure” u “office”. Aparte de esto, se realiza un filtrado manual, eliminando algunos usuarios cuyos tweets indiquen que se trata de cuentas de comercios, restaurantes o usuarios cuyo único objetivo es hacer publicidad. En segundo lugar, deseamos convertir las direcciones de los tweets en direcciones de sus respectivos usuarios. La dirección de cada tweet se encuentra en la clave “dirección”, que es un documento JSON cuya estructura se ha mostrado en la Figura 4.2. Para cada usuario, analizamos las direcciones que aparecen en sus tweets. En caso de usuarios con un solo tweet, añadimos la clave “dirección” al fichero del usuario, copiando el contenido de la dirección de su tweet. En caso de usuarios con más de un tweet, comprobamos si hay una “dirección mayoritaria” o moda, que sería la escogida. En caso contrario, decidimos eliminar a ese usuario. Llegado este punto, ya tenemos un fichero en formato JSON con los usuarios y sus direcciones y otro con los correspondientes tweets y sus direcciones. Capítulo 5 Asociación de rentas a usuarios En esta fase trabajamos únicamente con el documento en formato JSON que contiene la información de los usuarios seleccionados en la fase anterior. Una vez tenemos añadidas las direcciones, buscamos asociar a cada usuario su renta correspondiente con ayuda de este nuevo campo “dirección”. En primer lugar, realizamos un procesado de las direcciones de cada usuario para eliminar datos redundantes o confusos. En particular, eliminamos un campo llamado “municipality”, que hace referencia a las comarcas o áreas, así como los duplicados de nombres de ciudades en lenguas cooficiales tras una barra “\”, como ocurre en València \Valencia. A continuación, para asociar las direcciones con sus rentas, nos ayudamos de los datos del INE 1del año 2018. La información registrada por el INE está organizada por sectores de censo y es difícil de tratar. Por ello, decidimos utilizar un widget interactivo proporcionado por el periódico El País que recopila los datos del INE y permite la búsqueda de rentas por dirección. Según explica el periódico El País [3]: Los datos de cada sección representan la renta neta por persona (o lo que se conoce como unidad de consumo). Este dato se calcula tomando todas las rentas de un hogar y dividiéndolas por el número de personas que habitan en él, pero dándoles diferente peso: el primer adulto cuenta como 1, el segundo como 0,5 y los menores como 0,3. Para cada sección, el INE ofrece datos de la renta mediana, del cambio porcentual de la renta del año 2015 al año 2018 y de la posición en la que se encuentra la renta asociada a una dirección respecto al país y respecto a su comunidad. Para 1El Instituto Nacional de Estadística (INE) es un organismo autónomo de carácter administrativo al que la Ley asigna un papel destacado en la actividad estadística pública encomendándole expresamente la realización de las operaciones estadísticas de gran envergadura [4]. 23 automatizar el proceso de asociación de rentas y añadir todos estos datos en nuestro archivo JSON, realizamos Web scraping sobre el widget interactivo mencionado. Para ello, nos ayudamos de la biblioteca selenium (3). Nos movemos por el código HTML 2de la página web y guardamos la información que encontramos en “panel-info” (Figura 5.1, Figura 5.2) en nuestro JSON. Además, a fin de que la página cargue correctamente y evitar introducir datos erróneos, agregamos un retardo de 10 segundos por dirección. Figura 5.1 Código HTML del widget interactivo de El País Figura 5.2 Renta sin procesar de un usuario accedido desde MongoDB Finalmente, para que todos los datos de la renta se puedan procesar más adelante de manera efectiva, son analizados en una segunda pasada. Para ello, creamos un campo “datosrenta”. Este nuevo campo no contendrá los duplicados de nombres de ciudades tras una barra “\”, como ocurre en València \Valencia. Asimismo, hemos tenido que omitir los usuarios correspondientes a las provincias de Guipúzcoa, Vizcaya, Álava y Navarra, pues presentan datos incompletos de renta. También eliminamos el resto de los usuarios sin datos de renta. Finalmente, separamos el texto sin procesar en los campos siguientes: •“localidad” •“provincia” 2El Lenguaje de Marcado de Hipertexto (HTML) es el código que se utiliza para estructurar y desplegar una página web y sus contenidos [5]. •“distrito” •“sección” •“renta mediana” •“cambio1518” (cambio porcentual de la renta del año 2015 al año 2018). •“rentapais” (posición de pobreza en la que se encuentra una dirección respecto al país) •“rentacom” (posición de pobreza en la que se encuentra una dirección respecto a su comunidad) Como se menciona, los campos “rentapais” y “rentacom” son unificados de manera que solo hablamos de pobreza respecto al país o a la comunidad y no de riqueza (Figura 5.3). Figura 5.3 Renta parseada de un usuario accedido desde MongoDB Para finalizar esta fase, generamos un archivo en formato CSV de los datos JSON para manejarlos en un formato más sencillo que no requiera el uso de MongoDB (Figura 5.4). En este archivo eliminamos los usuarios con datos incompletos (por ausencia de “mediana” o de “cambio1518”), convertimos la renta mediana a tipo entero y separamos las listas con información sobre pobreza en valores sueltos. El siguiente paso sería recopilar los tweets de los usuarios finales y comprobar si tenemos suficientes tweets para los representantes de cada segmento de renta a fin de encontrar diferencias significativas en algún aspecto de estos tweets. Figura 6.6 Emojis con su sentimiento [8] Para aquellos tweets cuya columna “acabadepublicar” tiene un valor positivo, todos los campos que acabamos de mencionar se rellenan con un 0. Podemos ver algunas de las columnas añadidas en la Figura 6.8. A lo largo del proceso anterior se limpia de nuevo el texto para deshacernos de emails, números y signos de puntuación. Esto lo hacemos para que la obtención de la proporción de palabras correctas resulte más sencilla. Para conseguir esta información, en un primer momento programamos una función que nos mostraba con bastante precisión cuándo una palabra pertenecía o no a la Real Academia de la Lengua Española. Desgraciadamente, consume demasiado tiempo, por lo que no hacemos uso de ella. En su lugar, creamos un fichero que contiene el diccionario de castellano utilizado comúnmente en LaTeX, que tiene por nombre “es.dic” y cuenta con 247000 palabras. Lo cargamos en un conjunto para, de esta manera, calcular cuántos tokens de cada tweet se corresponden con palabras correctas. Una vez realizado este cálculo, lo dividimos por el número total de palabras, obteniendo así la proporción de palabras correctas de cada texto, información recogida en un campo adicional llamado “propCorrectas”. Para finalizar el análisis del lenguaje, queremos obtener una característica semántica más que será crucial en el capítulo 7: el sentimiento medio de un tweet. Este paso no es nada sencillo, ya que un mensaje puede contener ironía, palabras Figura 6.7 Análisis del sentimiento de los emojis Figura 6.8 Nuevas columnas descriptivas de cada tweet cuyas connotaciones no son claras o expresiones peculiares, entre otros, lo cual dificulta la distinción entre un significado positivo o negativo. Para lograrlo, hemos utilizado IBM Watson 5, desarrollado por la empresa estadounidense IBM. Una vez añadidas todas las características que consideramos relevantes para nuestro trabajo, crearemos un nuevo DataFrame que agrupa para cada usuario la media o la moda, según corresponda, de las características de todos sus tweets. Para ello, creamos un primer DataFrame llamado “dfFotoVideo”, en el que asociamos a cada usuario la moda de las horas de sus tweets y la media de cada 5IBM Watson es un sistema de inteligencia artificial informático, capaz de responder preguntas en lenguaje natural. [25] una de las siguientes columnas: “hora”, “foto/vídeo”,“foto”, “video”. Además, asociamos a cada uno su número total de tweets. Podemos ver cómo queda este DataFrame en la Figura 6.9. Tras guardar esta información, nos quedamos solo con aquellos tweets que tengan el valor cero en su columna “foto/vídeo”. Figura 6.9 DataFrame “dfFotoVideo” con agrupación de características por usuarios A continuación, creamos otro DataFrame llamado “dfSinFotoVideo”, en el que asociamos a cada usuario la media de los siguientes campos de cada uno de sus tweets: “¡”, “!”, “¿”, “?”, “menciones”, “hashtags”, “URLs”, “emojis”, “sentimiento medio emojis”, “palabras”, “proporción palabras correctas”, “longitud media palabras”, “mayúsculas”, “números”, “palabras vacías”, “adjetivos”, “sustantivos”, “verbos”, “tiempo pasado”, “tiempo presente”, “tiempo futuro”, “tiempo imperfecto”, “tiempo condicional”, “modo imperativo”, “modo indicativo”, “modo subjuntivo”, “primera persona”, “segunda persona”, “tercera persona”, “singular”, “plural”, “infinitivo”,“gerundio”,“participio”. Encontramos una forma sencilla para hacer esto, utilizando la función pivot_table de la biblioteca Pandas. La Figura 6.10 muestra cómo quedan algunos campos de este DataFrame. Figura 6.10 DataFrame “dfSinFotoVideo” con agrupación de características por usuarios Capítulo 7 Estadísticas En este capítulo partimos del DataFrame de tweets que hemos obtenido en el capítulo previo. Este reúne múltiples características o variables, tanto léxicas como semánticas, de cada uno de los tweets, además de los datos de renta del usuario que ha escrito el tweet. Nuestro objetivo ahora es estudiar si existen relaciones estadísticamente significativas entre estas variables y la renta per cápita de los usuarios. En concreto, queremos contrastar los valores de las variables correspondientes a usuarios con una renta relativamente alta respecto a los valores de estas mismas variables cuando se trata de personas cuya renta es menor. De esta forma, quizá encontremos diversos patrones de escritura que siguen, por un lado, las personas más adineradas y, por otro, las que lo son menos. 7.1 Correlaciones Comenzamos calculando las correlaciones que existen entre las diferentes variables. El coeficiente de correlación de Pearson calculado para dos variables es un valor comprendido entre -1 y 1 que se interpreta de la siguiente manera. Si es menor que cero indica que existe una correlación negativa, es decir, que las dos variables están asociadas en sentido lineal inverso: cuando el valor de una aumenta el de la otra disminuye. Cuánto más se acerca a -1, mayor es la fuerza de esta relación. Por el contrario, si es mayor que cero, existe una correlación positiva. En este caso, las variables están asociadas en sentido lineal directo así que cuando una aumenta la otra también. Cuanto más cerca esté de 1 más fuerte es esta relación. Si el valor es 0 indica que no existe ninguna relación lineal entre ambas variables. Para representar los resultados gráficamente utilizamos la biblioteca seaborn (3), la cual nos proporciona el mapa 7.1: 35 Figura 7.1 Mapa de calor con correlaciones entre columnas Veamos algunas conclusiones que podemos obtener, aunque en la mayor parte de los casos se trata de correlaciones muy bajas que únicamente muestran posibles tendencias. Analicemos la correlación que existe entre la variable “mediana” y otras variables. Con “verified” el valor es de 0.06 y con “followers” es de 0.09, mientras que con “friends_count” es de -0.14. También es -0.14 la correlación que tiene con la variable “tweets”. Con “emojis” y “sentimiento medio emojis”, es positiva, a diferencia de la que tiene con “palabras”, que es negativa. De aquí podemos concluir lo siguiente. Cuanto más alto es el valor de la renta mediana de un usuario, más probabilidad hay de que su cuenta sea verificada y más seguidores tiene. Sin embargo, es menor el número de usuarios a los que sigue. Además, aquellos cuya renta mediana es más alta escriben menos tweets que los demás, y, al escribirlos, utilizan menos palabras, pero más emoticonos, teniendo estos un sentimiento medio más positivo. Hay relaciones que no nos sorprenden ya que son una mera confirmación de la realidad, como la correlación positiva de 0.5 que existe entre las variables “adjetivos” y “sustantivos”, que era de esperar, ya que los primeros suelen ir acompañados de los segundos. También se confirma la correlación positiva de 0.68 que existe entre las variables “followers” y “verified”, ya que en general las cuentas verificadas son aquellas que poseen un gran número de seguidores. 7.2 Diferencias de medias Hasta aquí hemos visto algunas relaciones lineales. No obstante, puede que haya correlaciones no lineales que no se han detectado aún. En primer lugar, para continuar con el análisis, tenemos que dividir el DataFrame en dos tablas según la renta y estudiar los valores de las variables de cada una por separado. Para hacer esta división, en algunos casos tenemos en cuenta la variable “mediana” y, en otros, el “cambio1518”, ya que según cuál de las dos se utilice podemos obtener unos resultados u otros. En ambos casos, para llevar a cabo la separación debemos tener en cuenta que queremos quedarnos con aquellos tweets cuyos usuarios sean representativos de cada grupo. Es decir, no basta con calcular la media de la “mediana” y quedarnos, por un lado, con aquellos que estén por encima y, por otro, con los que estén por debajo. Nos interesan los extremos. Por ello, calculamos la desviación típica de la “mediana” y agrupamos en una tabla llamada “debajoMedia” aquellos cuya “mediana” sea menor que la media menos 0.5 veces la desviación típica. En otra tabla “encimaMedia”, reunimos aquellos cuya “mediana” sea mayor que la media más 0.5 veces la desviación típica. Hemos elegido 0.5 veces la desviación típica porque es un rango que nos permite eliminar los valores centrales y a la vez mantener la mayoría de la población. En particular, en una distribución normal este criterio elimina el 38% de los valores centrales, dejando por tanto al 62%, lo que en nuestro caso, asumiendo aproximadamente una normal, supone quedarnos con el 31% de renta más alta y el 31% de renta más baja. En segundo lugar, para cada variable de interés, calculamos la media de sus valores en una tabla y la media de sus valores en la otra. A continuación, se calcula la diferencia de medias en tanto por ciento de usuarios con mayor renta respecto a aquellos con menor renta. Es importante darse cuenta de que estos valores pueden no ser estadísticamente significativos. Para comprobar en qué casos no lo son, hacemos uso de la prueba “t” de Student1que nos proporciona la biblioteca scipy. 1La prueba “t” de Student es un tipo de estadística deductiva. Uno de sus posibles usos es determinar si hay una diferencia estadísticamente significativa entre las medias de dos grupos [21] Una breve explicación de este test es la siguiente. Queremos determinar si la diferencia de medias se debe al azar. Partimos de una hipótesis nula que afirma que las medias son iguales. Al finalizar el test, se rechaza o confirma esta suposición. Se descarta si el p-value devuelto es menor estrictamente que 0.01 y se confirma en caso contrario. Una vez hecho esto, podemos tener la certeza de que nuestras conclusiones se verifican con una alta probabilidad. Este proceso lo hacemos dos veces (una vez teniendo en cuenta la “mediana” y otra vez según el “cambio1518”) para cada una de las siguientes variables: “sentimiento medio emojis”, “sentiment”, “adjetivos”, “emojis”, “hashtags”, “URLs”, “mayúsculas”, “menciones”, “números”, “palabras”, “proporción palabras correctas”, “sustantivos”, “verbos”, “longitud media palabras”. Reunimos los resultados obtenidos en la tabla 7.1: Variables Menor1518 Mayor1518 Dif1518 MenorMed MayorMed DifMed Sent Emojis 0,208 0,229 10% 0,17 0,241 42% Sentiment 0,109 0,141 30% 0,117 0,143 22% Adjetivos 0,893 0,802 -10% 0,871 0,867 -0,40% Emojis 0,706 0,928 31% 0,597 0,796 33% Hashtags 0,816 0,985 21% 0,838 0,844 1% URLs 0,62 0,604 -3% 0,602 0,618 3% Mayúsculas 4,444 4,501 1% 4,455 4,238 -5% Menciones 0,376 0,248 -34% 0,397 0,348 -12% Números 0,213 0,181 -15% 0,188 0,208 11% Palabras 15,355 13,862 -10% 15,231 15,009 -1% Correctas 0,93 0,932 0,18% 0,927 0,935 1% Sustantivos 2,543 2,26 -11% 2,513 2,561 2% Verbos 2,227 2,059 -8% 2,353 2,279 -3% LonPalabras 4,592 4,597 0,09% 4,597 4,591 -0,13% Tabla 7.1: Medias de variables con respecto a la renta (los valores en rojo corresponden a medias no significativamente diferentes) Veamos qué representa cada columna de la tabla 7.1. En la primera, encontramos las variables que consideramos relevantes para calcular las diferencias de medias mencionadas anteriormente. La columna “Menor1518” representa la media de los valores de cierta variable cuando nos restringimos a personas cuyo “cambio1518” es menor que la media menos 0.5 veces la desviación típica, mientras que la columna “Mayor1518” se refiere a lo mismo, pero centrándonos en las personas cuyo “cambio1518” es mayor. Por su parte, la columna “Dif1518” contiene las diferencias de medias en tanto por ciento de personas con mayor “cambio1518” respecto a aquellas con menor “cambio1518”. El significado de “MenorMed” es el análogo al de “Menor1518”, pero refiriéndose al campo “mediana” en vez de a “cambio1518”. Lo mismo sucede con la columna “MayorMed”, siendo su interpretación análoga a “Mayor1518”, pero teniendo en cuenta la variable “mediana” en lugar de “cambio1518”. Por último, la columna “DifMed” representa la diferencia de medias en tanto por ciento de personas con mayor “mediana” respecto a aquellas con menor “mediana”. Los datos que aparecen en color rojo son aquellos que no han resultado ser estadísticamente significativos tras hacerles la prueba “t” de Student. Interpretamos por tanto aquellos que están escritos en color negro. Veamos qué conclusiones relevantes podemos deducir sobre cada variable. •Sent Emojis: El sentimiento de los emoticonos es significativamente superior en personas que, o bien viven en zonas que han incrementado su renta, o bien simplemente su renta es más alta. Es especialmente llamativo el incremento del sentimiento de emoticonos en el caso de personas con renta alta con respecto a las personas con renta baja, un 42%. Recordamos además, que vimos, al hablar de las correlaciones, que el número de emoticonos parece estar correlacionado de forma lineal con la renta. Por tanto, podemos deducir que las personas de renta más alta no solo utilizan más emoticonos, sino que los utilizan para expresar sentimientos más positivos. •Sentiment: El sentimiento expresado en los tweets es notablemente más positivo cuando los escriben usuarios que residen en zonas cuya renta ha incrementado más o cuya renta es superior. •Adjetivos: En cuanto al número de adjetivos utilizados, este es mayor cuando los usuarios viven en zonas cuya renta ha aumentado menos. Con respecto a su relación con la renta del usuario, no podemos sacar conclusiones estadísticamente significativas. •Emojis: La cantidad de emoticonos que emplean las personas cuya zona presenta más aumento en la renta o cuya renta es superior, es considerablemente mayor, en concreto, en torno al 30%. •Hashtags: Utilizan más hashtags los usuarios cuyo domicilio se encuentra en una zona con mayor incremento de renta. •URLs: En este caso, no presentan el mismo comportamiento las personas que viven en zonas cuya renta se ha incrementado más y aquellas con mayor renta. Las primeras hacen un menor uso de URLs que los usuarios cuyos domicilios se encuentran en zonas con menor incremento de renta. Sin embargo, las segundas sí utilizan más URLs que aquellos que tienen menor renta. •Mayúsculas: Resulta interesante que emplean más mayúsculas los usuarios cuya renta es menor. •Menciones: En este caso, tanto las personas con menos renta como aquellas cuya zona ha experimentado un menor incremento de renta utilizan más menciones en sus tweets. •Números: Incluyen mayor cantidad de números los usuarios cuya renta es más alta. Sin embargo, en cuanto al incremento de renta, aquellos cuyos domicilios se encuentran en zonas donde este es menor emplean más números. •Palabras: Como ya vimos en el apartado de correlaciones, utilizan menos palabras aquellos cuya renta mediana es mayor. Ahora podemos deducir que sucede lo mismo con las personas cuya zona presenta un mayor aumento en la renta. •Correctas: A pesar de ser mínima la diferencia, sí podemos apreciar que es mayor la proporción de palabras correctas en los tweets escritos por usuarios con mayor renta. •Sustantivos: Utilizan más sustantivos las personas cuya zona presenta un menor aumento de renta. Esto tiene sentido, ya que ocurre algo similar con el número de adjetivos, que como vimos, está altamente correlacionado con la cantidad de sustantivos. •Verbos: Aparecen más verbos en los tweets pertenecientes a usuarios con menor renta o a aquellos cuyos domicilios se hallan en zonas donde el incremento de esta es menor. •LonPalabras: Respecto a esta variable, no podemos concluir nada que sea estadísticamente significativo. En conclusión, las personas que viven en zonas cuya renta se ha incrementado más (cuyo “cambio1518” es mayor), escriben tweets y emoticonos cuyo sentimiento es más positivo que los de los demás usuarios. También utilizan más cantidad de emoticonos y hashtags. Sin embargo, utilizan menos adjetivos que aquellos en cuya zona la renta no ha aumentado demasiado. Además, son estas personas con “cambio1518” menor las que hacen más uso de URLs, menciones y números. Escriben también más palabras, verbos y sustantivos los usuarios cuya zona presenta un mayor incremento de renta. Con respecto a la renta mediana, los usuarios que la tienen más alta, escriben tweets cuyo sentimiento es más positivo e incorporan más emoticonos, teniendo estos un mejor sentimiento que los de los demás usuarios. Además, estas personas hacen un mayor uso de URLs y números y la proporción de palabras que escriben correctamente es más alta que la de personas con renta mediana menor. Sin embargo, los tweets de estas últimas personas incluyen más mayúsculas, menciones y verbos que los que tienen más renta mediana. 7.3 Características de los verbos Por otra parte, es de gran interés y utilidad para el trabajo hallar la proporción de tweets que dedican los usuarios con más renta y los usuarios con menos renta a cada tiempo verbal. Veamos cómo logramos calcular la proporción de tweets en tiempo pasado. Obtenemos en primer lugar, para cada tabla, la cantidad total de tweets que incluyen tiempo pasado, presente, futuro y condicional. Sumamos estas cantidades y lo almacenamos en una variable. Dividimos el número de tweets en los que aparece tiempo pasado entre la suma almacenada, obteniendo así el resultado. Repetimos estos pasos para el resto de tiempos: presente, futuro y condicional. Dividimos el DataFrame primero por la “mediana” y luego por el “cambio1518” y, finalmente, calculamos en cada caso las diferencias de proporciones en tanto por ciento de usuarios con mayor renta respecto a aquellos con menor renta. Los resultados se muestran en la tabla 7.2: tiempos Menor1518 Mayor1518 Dif1518 MenorMed MayorMed DifMed Futuro 0,067 0,053 -21,00% 0,062 0,062 0% Pasado 0,166 0,156 -6,00% 0,153 0,158 3,00% Presente 0,736 0,763 4,00% 0,754 0,751 0% Condicional 0,031 0,028 -10,00% 0,03 0,029 -3,00% Tabla 7.2: Proporción de tweets dedicados a cada tiempo verbal según la renta A los datos obtenidos en la tabla 7.2 no se les puede aplicar el test, ya que se trata de comparación de proporciones y no de medias de poblaciones. Por tanto, no podemos asegurar que las diferencias mostradas sean estadísticamente significativas. Teniendo esto en cuenta, de la tabla 7.2, en principio, podemos Figura 8.4 Métricas para “renta mediana” dado el conjunto de hiperparámetros i Lo cierto es que el resultado no nos permite asegurar que podemos deducir la renta, pero sí que existe, en efecto, una relación entre la forma de escribir y la renta, porque de no estar relacionadas estas variables se esperaría una precisión de alrededor de un 33% y una kappa de Cohen de 0. Se observa además en la matriz de confusión, y, en particular, en el grupo de etiqueta 2 que corresponde con las rentas más altas, que cuando se equivoca lo hace principalmente con rentas medias y no con renta bajas, mostrando de nuevo que las variables son relevantes a la hora de relacionarlas con la renta. Capítulo 9 Conclusiones y trabajo futuro La pregunta que intenta contestar el trabajo es: ¿la renta del usuario tiene alguna relación con su forma de escribir en Twitter? Hemos podido comprobar que efectivamente sí la tiene. En el capítulo 7, relativo a la parte de estadísticas, se han concluido resultados de interés que lo confirman. Entre los más relevantes, destacamos el hecho de que las personas cuya renta per cápita es mayor, utilizan un menor número de palabras y hacen uso de más emoticonos. Además, el sentimiento tanto del texto como de los emoticonos es más positivo que aquellos con renta menor. También incluyen más números y cometen menos faltas de ortografía. Cuando hacen referencia al futuro, el sentimiento que reflejan sus tweets y emoticonos es más positivo que el de aquellos que tienen menor renta. Esto ocurre también con las personas que viven en zonas cuya renta se ha incrementado significativamente entre los años 2015 y 2018. Sucede algo similar cuando el tiempo verbal empleado es el pasado y el presente. En cuanto a las personas con menor renta, cabe destacar que escriben haciendo uso de un mayor número de verbos y menciones y utilizan en mayor medida el tiempo condicional. Finalmente, se concluye que en el capítulo 8 de machine learning se corroboran los resultados de la parte estadística, mostrando que en algún sentido la renta está relacionada con la forma de expresarse, pero esta vez considerando todas las variables que caracterizan un tweet simultáneamente. Un trabajo futuro relacionado con el proyecto podría tratar la deducción del lenguaje utilizado en redes sociales a partir de los datos de la renta. Por otro lado, los resultados que se han obtenido a lo largo de este proyecto se han dado en base atweets y no a usuarios. Esto se debe a que, a pesar de haber dedicado un largo periodo de tiempo a la descarga de tweets, no hemos conseguido un número de 49 usuarios suficientemente grande. Por tanto, sería interesante para un trabajo futuro conseguir reunir una cantidad considerable de usuarios para obtener conclusiones a partir de su estudio. Además, debido a las limitaciones del trabajo, el tiempo en el que se han obtenido los usuarios se ha correspondido a una época en la que podría haber personas en residencias de vacaciones. Por tal razón, se podría repetir el trabajo extendiendo el tiempo en el que se detectan los usuarios. Capítulo 10 Contribuciones En este capítulo, comentamos las partes del proyecto que ha trabajado cada integrante, haciendo referencia a las fases descritas en (2). 10.1 Noelia Pérez García-Consuegra En la Fase 2 contribuye en la eliminación de direcciones que no se correspondían con domicilios particulares mediante el uso de una lista con palabras clave que hacen referencia a un establecimiento público como “tourism” o “shop”. Por otro lado, haciendo uso de la moda de las direcciones, participa en la incorporación de direcciones a los usuarios. En la Fase 3 encuentra un widget interactivo de la página hallada [3] que evitaba la aceptación de cookies y que fue el que finalmente utilizamos para realizar web scrapping. Además, lleva a cabo el procesado de direcciones para que pudiesen ser encontradas por el buscador. Para ello, elimina ciertos campos de la dirección (como “municipality”) que impiden que el buscador consiga la localización de la dirección introducida. También inicia el web scrapping sobre nuestras direcciones. Aparte, contribuye en el procesado de rentas para darles un formato más práctico mediante la separación del texto en “localidad”, “provincia”, “distrito”, “sección”, “renta mediana”, “cambio1518”, “rentapais” y “rentacom”. En particular, implementa una función que permite la separación de la parte de índices de pobreza y riqueza respecto al país y a la comunidad y los unifica de manera que solo se haga referencia a la pobreza. En la Fase 4 contribuye en la selección de usuarios mediante el marcado de tweets 51 en una hoja de cálculo. Esta hoja indica qué usuarios hay que retirar para no ser estudiados a partir de este momento. En la Fase 6 contribuye en el cálculo del número de publicaciones, exclamaciones, interrogaciones, menciones, hashtags,URLs, palabras y mayúsculas y en hallar la longitud media de las palabras de cada tweet. Se centra, sin embargo, en el conteo de emoticonos haciendo uso de la biblioteca emoji, que trbaja con expresiones regulares. Por otro lado, halla un archivo CSV que asocia codificaciones Unicode a sus emojis correspondientes [8]. Trata ese archivo para asociar un sentimiento a cada emoji utilizando funciones de la biblioteca flair sobre las palabras clave de los emojis. Además, implementa un código que calcula el sentimiento global de los emoticonos de un tweet comparando sus codificaciones con las del archivo CSV hallado. Finalmente, colabora en el cálculo del número de tipos y subtipos de palabras, que incluyen adjetivos, números, sustantivos y verbos y sus formas personales y no personales. Con ayuda de un archivo .dic compuesto por las palabras de la lengua española y tras un procesado del texto de cada tweet, participa en la obtención de la proporción de palabras correctas. Para ello, es empleada la biblioteca spacy (3) con un corpus en castellano. Este uso particular es estudiado gracias a un vídeo en español. Para el análisis del sentimiento de los tweets, estudia la biblioteca spacy en español mediante el visionado del vídeo ya mencionado. Esta biblioteca, como se menciona anteriormente, es utilizada para la distinción entre tipos y subtipos de palabras, pero no es incorporada para analizar el sentimiento de un texto, puesto que se emplea un modelo con un conjunto de entrenamiento muy limitado, lo que da lugar a malos resultados. En esta misma fase, modifica el nombre de ciertos rasgos del lenguaje en nuestro archivo CSV para que sean más descriptivos. Por otro lado, halla tweets en otro idioma para ser retirados puesto que nuestro estudio trata el idioma español. Finalmente, en la parte de predicción, realiza pruebas con todas las columnas relativas a datos de renta: “renta mediana”, “cambio1518”, “rentapais” y “rentacom”. Además, incorpora distintos métodos de machine learning regresivos relevantes, como regresión lineal y potenciación del gradiente. También lleva a cabo una separación por cuantiles de los datos de renta para poder aplicar métodos de clasificación, en particular, Random forests. Para su exploración alterna entre distintos hiperparámetros y muestra distintas métricas de clasificación como la precisión y el recall, además de obtener varias matrices de confusión para estudiar el desempeño del algoritmo. Aparte de la implementación del proyecto, lleva a cabo la creación del GitHub con los archivos del proyecto en su perfil y elabora el documento readme.md que explica de manera breve las fases del proyecto e indica la correspondencia de cada una con sus notebooks. 10.2 Elena Pinuaga López En la Fase 2 de búsqueda e incorporación de direcciones, contribuye en la eliminación de direcciones que no se correspondían con domicilios particulares y en la asignación de direcciones a los usuarios. En la Fase 3 de inclusión de datos de renta per cápita a los usuarios, encuentra la página web [3] que ha permitido obtener los datos de renta del INE a partir de las direcciones. Además, contribuye en el filtrado de usuarios considerados para obtener las rentas y trabaja en la transformación del campo de texto “renta” en formato original al campo “datosrenta” con un formato más legible. En la Fase 4 contribuye en la selección de usuarios. Para ello, ojea un conjunto representativo de tweets de cada usuario para descartar las cuentas que no se corresponden con domicilios particulares. En la Fase 6, respecto a la parte de análisis del lenguaje, realiza parte del cálculo del número de publicaciones, exclamaciones, interrogaciones, menciones, hashtags, URLs, palabras, mayúsculas y emoticonos. Además, contribuye en el cálculo de la longitud media de las palabras de cada tweet y añade el campo “hora” convirtiéndolo a un formato estándar. En cuanto al análisis de los tipos de palabras, investiga la biblioteca NLTK utilizada para el procesamiento del lenguaje natural. Realiza algunas pruebas, pero finalmente no es de utilidad ya que no permite obtener el análisis buscado. Estudia por tanto la biblioteca spacy similar a la anterior. Esta sí que sirve para el trabajo, y es de gran ayuda un documento que encuentra, en el que aparecen varios ejemplos de uso de esta biblioteca. Con ayuda de spacy, realiza parte del análisis de tipos de palabras, distinguiendo entre adjetivos, números, sustantivos, verbos y las diferentes formas y tiempos de estos. Por último, busca formas de determinar cuándo una palabra pertenece a la Real Academia de la Lengua Española. Programa una función que realiza esto, pero tarda demasiado tiempo debido a la gran cantidad de palabras para las que debe hacer web scrapping, por lo que se termina descartándo. Finalmente, participa en la limpieza del texto, quitándole emails, números y signos de puntuación, entre otros, para hacer más sencilla la comprobación de si las palabras pertenecen o no al diccionario utilizado. Esto es lo que se termina usando para calcular la proporción de palabras correctas. A continuación, realiza la agrupación de características por usuarios. Para ello, en primer lugar, asocia a cada usuario la moda de las horas de sus tweets, y la media de cada una de las siguientes columnas: “hora”, “foto/vídeo”,“foto”, “video”. Además, asocia a cada uno su número total de tweets. Encuentra una forma sencilla para hacer esto, utilizando la función pivot_table de la biblioteca Pandas. Con ella realiza el resto de agrupaciones, asociando a cada usuario la media de cada una de las características de todos sus tweets. En algunos casos, asocia la moda, ya que la media no aporta información relevante. En cuanto al apartado de estadísticas, realiza todo el proceso desarrollado en el capítulo 7. Divide el DataFrame final de los tweets en dos partes en base a la renta. Calcula la media de las variables de interés en cada una de las dos y finalmente, la diferencia de estas medias en tanto por ciento comprobando si es estadísticamente significativa. Además, calcula la proporción de tweets que dedican los usuarios con más renta y los usuarios con menos renta a cada persona y tiempo verbal. También se encarga de comparar cómo varía el sentimiento de los tweets escritos en tiempo futuro por personas con renta alta cuando estos mismos los escriben personas cuya renta es más baja. Repite lo mismo para tiempo pasado y tiempo presente. Finalmente, para representar de manera clara todos los datos y conclusiones obtenidas en la fase de estadísticas, crea varias tablas en Excel y traslada una a una las cifras que obtiene tras ejecutar el código. En primer lugar, muestra en la tabla 7.1 la media de las variables más relevantes para personas con renta alta y para personas con renta baja, así como sus diferencias en tanto por ciento. En segundo lugar, elabora las tablas 7.2 y 7.3, en las que se reflejan las proporciones de tweets dedicados a cada persona y tiempo verbal según la renta del usuario, además de las diferencias en porcentaje. Por último, incluye las tablas 7.5, 7.6 y 7.4, donde se pueden ver las diferencias de sentimiento y signos de puntuación de los tweets de usuarios de renta menor y mayor, cuando éstos se expresan en futuro, pasado y presente. Para terminar, se encarga de interpretarlas y explicar todas las conclusiones obtenidas. Bibliografía [1] Folium.https://python-visualization.github.io/folium/. Accedido el 25/04/2022. [2] Welcome to GeoPy’s documentation! https://geopy.readthedocs.io/. Accedido el 23/04/2022. [3] El mapa de la renta de los españoles, calle a calle. mapa-de-la-renta. Accedido en noviembre de 2021. [4] INE. https://www.ine.es/. Accedido el 19/04/2022. [5] HTML: Lenguaje de etiquetas de hipertexto. https://developer.mozilla.org/es/docs/Web/HTML. Accedido el 20/04/2022. [6] Archivo CSV: Definición. https://support.google.com/google-ads/answer/9004364?hl=es-419. Accedido el 20/04/2022. [7] Pandas.https://pandas.pydata.org/. Accedido el 20/04/2022. [8] Emoji List, v14.0. https://www.unicode.org/emoji/charts/emoji-list.html. Accedido el 20/04/2022. [9] Introduction to Flair for NLP: A Simple yet Powerful State-of-the-Art NLP Library. https://www.analyticsvidhya.com/blog/2019/02/flair-nlp-library-python/. Accedido el 24/04/2022. [10] Find, install and publish Python packages with the Python Package Index. https://pypi.org/. Accedido el 24/04/2022. 57 because of the constraints of the project, the users have been collected during a vacation period when they might not be staying at their habitual residences. For that reason, this project could be done once more extending the time frame in which the users are detected.