Entender los diferentes léxicos usados por Comerciales, Expertos y Consumidores para sensaciones táctiles y de boca
lexico <- data.table::fread(here::here("data", "lexico.tsv"),
select = 1:4,
encoding = 'UTF-8')
data.table::setnames(lexico,
old = colnames(lexico),
new = c("tipo", "id", "tactil", "boca"))
Un primer vistazo
De ancho a largo
lexico_largo <- data.table::melt(lexico,
id.vars = c("tipo", "id"),
variable.name = "sensacion",
value.name = "texto")
lexico_largo[, texto := tolower(texto)]
lexico_largo[, tipo := tolower(tipo)]
Para una mejor representación gráfica
lexico_largo[, tipo := factor(tipo, levels = c("consumidores", "comercial", "experto"))]
lexico_largo[, texto:= stringr::str_replace_all(string = texto,
pattern = "sensacion|sensaciones",
replacement = "sensación")]
lexico_largo[, texto:= stringr::str_replace_all(string = texto,
pattern = "sensaciónes",
replacement = "sensación")]
lexico_largo[, texto:= stringr::str_replace_all(string = texto,
pattern = "aspera",
replacement = "aspero")]
Una palabra por fila
lexico_largo %>%
unnest_tokens(output = palabra, input = texto) %>%
count(tipo, sensacion, palabra, sort = TRUE) -> palabras
Quitamos palabras comunes que no aportan valor, por ejemplo: “y” o “la”
stop_words_espanolas <- rbind(data.frame(palabra = c("si", "mas", "nose"), stringsAsFactors = FALSE),
data.frame(palabra = tm::stopwords("spanish"), stringsAsFactors = FALSE))
palabras %>%
anti_join(stop_words_espanolas, by = "palabra") -> palabras
palabras %>%
paged_table(options = list(rows.print = 5))
palabras_grupos <- palabras %>%
group_by(tipo, sensacion) %>%
summarize(total = sum(n))
palabras <- left_join(palabras, palabras_grupos, by = c("tipo","sensacion"))
palabras %>%
paged_table(options = list(rows.print = 5))
palabras %>%
arrange(desc(n)) %>%
group_by(tipo) %>%
top_n(15, n) %>%
ungroup() %>%
mutate(palabra = reorder(palabra, n)) %>%
ggplot(aes(x= palabra, y = n, fill = tipo)) +
geom_col(show.legend = FALSE) +
facet_grid(sensacion~tipo) +
coord_flip() +
labs(x="", y="Frequencia",
title="Palabras más comunes usadas por los consumidores",
subtitle = "Por tipo de consumdor y sensación",
caption = "Muestra de 196 consumidores") +
scale_fill_viridis_d()
palabras %>%
ggplot(aes(n/total, fill = tipo)) +
geom_histogram(show.legend = FALSE, bins = 30) +
facet_grid(sensacion~tipo) +
labs(x="Frequencia relativa",
y= "Número de veces",
title = "Número de veces que aparece una palabra con una frequencia relativa dada") +
scale_fill_viridis_d()
Calcular el coeficiente tf_idf nos ayudará a encontrar el vocabulario especíco de cada tipo de consumidor. Que palabras usan unos que los otros casi nunca usan.
palabras <- palabras %>%
group_by(sensacion) %>%
group_modify(~ bind_tf_idf(.x, palabra, tipo, n))
palabras %>%
select(-total) %>%
arrange(desc(tf_idf)) %>%
paged_table(options = list(rows.print = 5))
palabras %>%
#filter(sensacion=="tactil") %>%
arrange(desc(tf_idf)) %>%
mutate(palabra = factor(palabra, levels = rev(unique(palabra)))) %>%
group_by(tipo) %>%
top_n(6, wt = tf_idf) %>%
#slice(1:5) %>%
ungroup() %>%
mutate(palabra = reorder(palabra, tf_idf)) %>%
ggplot(aes(palabra, tf_idf, fill = tipo)) +
geom_col(show.legend = FALSE) +
labs(x = "",
y = "",
title = "Léxico específico de sensaciones por tipo de consumidor",
subtitle = "Basado en coeficiente tf-idf",
caption = "") +
facet_wrap(tipo ~., ncol = 3) +
coord_flip() +
scale_fill_viridis_d() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Usaremos Consine Similarity para calcular los ángulos entre los vectores de palabras usados por cada uno de los tres tipos de usuarios
palabras_ancho <- dcast(palabras,
sensacion + palabra ~ tipo,
value.var="n",
fill = 0L)
palabras_ancho%>%
paged_table(options = list(rows.print = 5))
con_com <- lsa::cosine(palabras_ancho$consumidores, palabras_ancho$comercial)
com_exp <- lsa::cosine(palabras_ancho$comercial, palabras_ancho$experto)
con_exp <- lsa::cosine(palabras_ancho$consumidores, palabras_ancho$experto)
result <- data.table(var1 = c("consumidores", "experto", "experto", "comercial", "experto", "consumidores"),
var2 = c("comercial", "consumidores", "comercial", "comercial", "experto","consumidores"),
value= c(con_com, con_exp, com_exp, NA, NA, NA))
ggplot(data = result, aes(x=var1, y=var2, fill=value)) +
geom_tile() +
scale_fill_viridis() +
geom_text(aes(var1, var2, label = round(value, 3)), color = "black", size = 4) +
theme(legend.position= "none")+
labs(x="", y="",
subtitle = "Método: Cosine Similarity sobre vector de palabras usadas",
title = "El vocabulario de los Expertos es más similar al de los Comerciales \nque al de los consumidores")