Proximidad entre el valor nutricional de los alimentos de la colección de emojis

En este ejercicio recreamos el caso de multidimensionamiento escalar disponible en este sitio web: https://grace.rbind.io/post/2019-02-22-emoji-mds/

Dataset disponible en Kaggle (https://www.kaggle.com/ofrancisco/emoji-diet-nutritional-data-sr28/data)

Procedimiento Calculo de Multidimensionamiento escalar MDS

El multidimensionamiento escalar se hace unicamente con valores numéricos. Para esto se calcula una matriz de distancias sobre todas las dimensiones numericas normalizadas.

library(ggplot2)
# Importo el dataset
# install.packages("emojifont")
EmojisFood <- read.csv("EmojisFood.csv")
# normalizar datos
EmojisFoodN <- EmojisFood
EmojisFoodN[,c(3:35)] <- scale(EmojisFoodN[,c(3:35)])
rownames(EmojisFoodN) <- EmojisFood$name

# Calculo las distancias entre datos
distancias <- dist(EmojisFoodN, upper=TRUE)

# Multidimensionamiento escalar. k=2 significa distancias proyectadas en un espacio 2D
emoji_mds <- cmdscale(d = distancias, k = 2)

El calculo de MDS retorna un tibble, que es un formato de tabla de datos especial de R. Para saber mas de tibbles: https://blog.rstudio.com/2016/03/24/tibble-1-0-0/. Para trabajar en ggplot es mas conveninte convertir la tibble a dataframe. Los datos que obtenemos estan en dos dimensiones, lo que resta es plotearlos en un layout de diagrama de dispersión usando una geometria de puntos. Adicionalmente incluimos unas curvas de densidad para denotar zonas de similitud entre datapoints.

# Asigno nombres a las columnas
colnames(emoji_mds) <- c("mds_X", "mds_Y")

# Para convertir un tibble a un dataframe.
library(tibble)
emojis_mds_dataframe <- as.data.frame(emoji_mds)

# Gráfico con ggplot
chart <- ggplot(emojis_mds_dataframe, aes(mds_X, mds_Y, label = rownames(emojis_mds_dataframe)))
chart <- chart + geom_point()
chart <- chart + geom_density2d()
chart <- chart + geom_text(hjust = 0, nudge_x = 0.15, angle = 45, size = 3, check_overlap = TRUE)
chart

Para hacer el diagrama mas llamativo uncluimos los emojis usando la libreria emojifont. Esta librería hace uso de una fuente de tipografía de emojis que es necesario tenerla instalada en la máquina. Para mas información ver https://cran.r-project.org/web/packages/emojifont/vignettes/emojifont.html

library(emojifont)

emoji_labels <- read.csv("emoji_labels.csv")

labels <- EmojisFood[,c(1,2)]
dataPlot <- cbind(emojis_mds_dataframe,emoji_labels)

chart <- ggplot(dataPlot)
chart <- chart + geom_point(aes(mds_X,mds_Y, alpha=0.02))
chart <- chart + geom_text(aes(mds_X,mds_Y,label=emoji(name)),
                           family="EmojiOne", size = 5)
chart <- chart + geom_text(aes(mds_X,mds_Y, label=name, color='grey'),
                           nudge_x = 0.15, angle = 45, 
                           hjust = 0, size = 3, check_overlap = TRUE)
chart <- chart + scale_color_manual(values="#666666") + theme(legend.position="none")
chart

Una opcion alternativa es usar la librería ggimage y utilizar la geometria de ggplot geom_emoji. Sin embargo esta libreria no es muy confiable porque puede asociar incorrectamente los emojis a nombres de alimentos.

library(ggimage)

emoji_labels <- read.csv("emoji_labels.csv")

labels <- EmojisFood[,c(1,2)]
dataPlot <- cbind(emojis_mds_dataframe,emoji_labels)

chart <- ggplot(dataPlot, aes(mds_X, mds_Y, label = dataPlot$name))
chart <- chart + geom_emoji(data=dataPlot,aes(mds_X,mds_Y,image=code),size=0.02)
chart <- chart + geom_text(hjust = 0, nudge_x = 0.15, angle = 45, size = 3, check_overlap = TRUE)
chart