El presente análisis se realizó gracias a la capacitación en el Club de R para RRHH.

Qué es el Club? Es una comunidad de aprendizaje de programación en R destinada para las personas que trabajan en Recursos Humanos de habla hispana.

Soy una de las integrantes del Club.👋



Objetivo

Vamos a analizar un texto, a través de un paquete de R llamado Text Mining.

En RRHH analizar texto resulta fundamental, lo podriamos utilizar en entrevistas, evaluaciones, encuestas, comunicación corporativa (…).

¿ Se te ocurre algún otro uso? Contanos en comentarios.

Datos

Los datos que vamos a usar son de una canción muy popular en Argentina.

¿Por qué una canción?

La idea es demostrar los resultados del uso de dicha herramienta y que sea visible para el lector.

La pieza musical en cuestión es “El Bómbon”, cuyos autores son “Los Palmeras”.1

library(googlesheets4)
library(tidyverse)
library(gargle)
library(tidytext)
library(wordcloud2)
library(tm)
library(funModeling)
library(scales)
library(xaringan)
# Estilos para los gráficos
zy <- theme(panel.background = element_blank(),
            panel.grid.major.y = element_line(colour = "#F4F6F6"),
            axis.line = element_line(colour = "grey"))

zx <- theme(panel.background = element_blank(),
            panel.grid.major.x = element_line(colour = "#F4F6F6"),
            axis.line = element_line(colour = "grey"))

letraPalmeras <- sheets_read("1FuU9kcPxJA37PGomv5zZzFrzchibEe-WDJ36Ty9vhHg")

Para trabajar con la letra, realizamos una serie de procesos, los cuales nos permiten acceder a una base de datos, compuesta por los siguientes lementos:

Tenemos un archivo inicial para trabajar compuesto por 1 columna y 40 filas.

Como sabemos, hay palabras que encontramos en los discursos que no sirven para un análisis, por ejemplo “y”, “o”, “lo”… Todas estas palabras las eliminamos de nuestras bases.

letraPalmeras_vacio <- letraPalmeras %>%
  anti_join(vacias)

Frecuencia

Nos interesa ver la frecuencia en la que aparecen las palabras en la canción.

Lo podemos visualizar en el siguiente grafico:

letraPalmeras_vacio %>%
  count(palabra, sort = TRUE) %>%
  filter(n>1) %>%
  ggplot(aes(x= reorder(palabra, n), y = n, fill = n))+
  geom_bar(stat = 'identity') + 
  scale_fill_gradient(low = "#D6DBDF", high = "#34495E")+
  zx+
  labs(title= "El Bombón",
       subtitle = "Autor: Los Palmeras",
       x="", y="Cantidad de apariciones") +
  coord_flip()

Como podemos observar, hay una palabra “Bombón” que es la que más se repite. Pero también hay un patrón de frecuencia en las palabras restantes. La intensidad de frecuencia que le damos a una palabra en un discurso, tiene un objetivo determinado. Tendremos que analizar si luego de realizada la comunicación en cuestión, el objetivo fue alcanzado o no.

Análisis de Sentimientos

Quisieramos saber la relación que hay entre las palabras de la canción y los sentimientos.

Por ejemplo: Si en una encuesta de clima tenemos palabras o frases como “Conforme”, “Recomendaría”, “Me encanta”, podemos relacionarlo con un sentimiento Positivo. En cambio si aparece “Injusto”, “Desagradable”, “Angustia”, podemos relacionarlo con uno Negativo.

En el análisis de sentimientos, hacemos el mismo procedimiento pero con un número mayor de categorías, como vemos a continuación.

sentimientos <- read_tsv("https://raw.githubusercontent.com/7PartidasDigital/AnaText/master/datos/diccionarios/sentimientos_2.txt",
                         col_types = "cccn",
                         locale = default_locale())
source("https://raw.githubusercontent.com/7PartidasDigital/R-LINHD-18/master/get_sentiments.R")

library(textdata)

letraPalmeras_nrc <- letraPalmeras_vacio %>%
  right_join(get_sentiments("nrc")) %>%
  filter(!is.na(sentimiento)) %>%
  count(sentimiento, sort = TRUE)

Podemos observar los sentimientos presentados.

Hay una predominancia de los sentimientos negativos en comparación de los positivos.

library(gt)
gt(letraPalmeras_nrc) %>% 
  tab_header(title = "Sentimientos") %>% 
  tab_source_note(source_note = "Elaboración Propia")%>% 
  cols_label(sentimiento = "Tipo", 
             n="Cantidad")
Sentimientos
Tipo Cantidad
negativo 2669
positivo 1982
miedo 1274
confianza 1124
ira 1073
tristeza 1013
disgusto 931
premonición 769
alegría 621
asombro 478
Elaboración Propia
feelings <- c("negativo", "positivo", "negativo", "negativo", "negativo", "positivo", "positivo", "positivo")

La representacion grafica seria la siguiente:

letraPalmeras_nrc %>%
  filter(sentimiento != "negativo", sentimiento !="positivo") %>%
  cbind(feelings) %>% #el vector creado
  ggplot(aes(reorder(sentimiento, n), n, fill = feelings)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  scale_fill_manual(values = c("#F5B041","#5DADE2"))+
  zx + #Estilo grafico
  coord_flip() +
  labs(title="Ranking de sentimientos",
       x = "Sentimiento",
       y = "Cantidad de Apariciones")

Una de las cosas que se puede presentar en el análisis, es que un sentimiento tenga una predominancia mayor o menor que otra.

¿Para qué podría servirnos?

Por ejemplo, para tenerlo en consideración en el armado de nuestras piezas de comunicación y usar esta información para reforzar conceptos, o suspender/eliminar aquellos que no estan ayudando.

A continuación , podemos observar las palabras relacionadas con “Confianza”.

letraPalmeras_vacio %>%
  right_join(get_sentiments("nrc")) %>%
  filter(!is.na(sentimiento)) %>%
  group_by(sentimiento) %>%
  count(palabra, sort = TRUE) %>%
  filter(sentimiento == "confianza") %>% top_n(5)# solo podemos consultar los primeros 5
## # A tibble: 1,122 x 3
## # Groups:   sentimiento [1]
##    sentimiento palabra        n
##    <chr>       <chr>      <int>
##  1 confianza   seguro         3
##  2 confianza   ábaco          1
##  3 confianza   abad           1
##  4 confianza   abogado        1
##  5 confianza   abrazar        1
##  6 confianza   abrazo         1
##  7 confianza   abrigo         1
##  8 confianza   absolución     1
##  9 confianza   absorto        1
## 10 confianza   abuelo         1
## # ... with 1,112 more rows

Asimismo podemos observar la frecuencia en las palabras relacionadas con “Miedo”.

letraPalmeras_vacio %>%
  right_join(get_sentiments("nrc")) %>%
  filter(!is.na(sentimiento)) %>%
  group_by(sentimiento) %>%
  count(palabra, sort = TRUE) %>%
  filter(sentimiento == "miedo") 
## # A tibble: 1,272 x 3
## # Groups:   sentimiento [1]
##    sentimiento palabra         n
##    <chr>       <chr>       <int>
##  1 miedo       asesino         3
##  2 miedo       abandonado      1
##  3 miedo       abandonar       1
##  4 miedo       abandono        1
##  5 miedo       abeja           1
##  6 miedo       abierto         1
##  7 miedo       abismo          1
##  8 miedo       abogado         1
##  9 miedo       abominable      1
## 10 miedo       abominación     1
## # ... with 1,262 more rows

En conclusión, el análisis de las palabras por si solo, no nos dice mucho, a menos que lo relacionemos con una acción concreta.
Pero, como ustedes saben, esta es la base del análisis de datos.


Nube de Palabras

Por último, con la presente pieza musical podemos armar una nube de palabras.

¿Para qué usar una nube? Porque queda divino

Más allá de lo estético, las nubes de palabras nos sirven visualmente para observar aquellas palabras/categorías con mayor/menor presencia en el discurso analizado.

Por ejemplo: La empresa quiere cambiar su politica de beneficios. Para ello hace una consulta a sus colaboradores sobre qué beneficios valorarían más. Luego utiliza la nube de palabras para demostrar que la empresa accedió a otorgar aquellos beneficios con mayor cantidad de votos.

¿ Se te ocurren otros casos de uso? Contanos en comentarios.

Volviendo a nuestra canción, podemos observar que “Bombón” es la que más veces aparece. En menor medida, pero con una frecuencia alta aparece “Menea” y “Sabe” y “Mueve”.

letraPalmeras_vacio %>% 
  count(palabra,sort = TRUE) %>% 
  ungroup() %>% 
  wordcloud2(size = 0.6, shape = "cardioid")

Llegamos al final. Gracias por estar ahi.👏

Sospecho que la próxima vez que escuchen el tema recordarán esta lectura. 🤗

Si te interesa que analicemos otra canción, dejalo en comentarios o mandame por privado.

Yanel Paulette

Fuentes

Club de R para RRHH Club de R

Cuentapalabras 7 Partidas Digital

Text Mining with R de Julia Silge and David Robinson

Wordcloud2


  1. No es nuestro objetivo entrar en debate respecto del significado de la letra, su interpretación, ni tampoco realizar una critica artística. Solo queremos usar los datos, y que sean fácilmente visibles al lector.↩︎