Autor/a

Checho

Fecha de publicación

23 de enero de 2025

Cómo la búsqueda de los mejores vinos de Mendoza puede ayudar a la gestión de proveedores de capacitación

Yo durante mi luna de miel en Finca Adelma.

El objetivo de este post es mostrar cómo se puede aplicar un análisis de un tema cualquiera, a un problema de RRHH.

La razón detrás de esta idea es que cuando estamos aprendiendo a usar cualquier programa de análisis de datos, llámese R, Python, Power BI o Excel, encontramos mucho contenido sobre muchos tipos de análisis, pero muy poco contenido relacionado con RRHH. Y eso es algo que podemos hacer por nuestra cuenta.

Con esto en mente, lo que vamos a hacer es ver cómo podemos aprovechar un análisis en el cual buscamos en qué región de Mendoza podemos hallar los mejores malbecs, haciendo un ránking de las mejores regiones. Luego veremos cómo ese mismo tipo de análisis lo podemos usar para detectar cuáles son los mejores proveedores de capacitación de una empresa.

Primer Análisis: Dónde encontrar los mejores vinos

Para el primer ejercicio vamos a imaginar que estamos planeando un viaje a Mendoza, y queremos saber en qué región se producen los mejores malbecs.

Vamos a usar un dataset que se llama Wine Ratings Dataset que lo compartió la comunidad de R a través su iniciativa #TidyTuesday en la que cada martes, comparten un dataset diferente para que cualquier persona pueda practicar y compartir su trabajo. Ahí se puede encontrar datos sobre casi cualquier cosa.

Manos a la obra… Salú! 🍷

Librerías y datos

Vamos a usar varios paquetes dentro de tidyverse y cargamos los datos directamente desde el repositorio de GitHub del proyecto TidyTuesday.

Ver código
library(tidyverse)

# Carga de datos
wine_ratings <- read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-05-28/winemag-data-130k-v2.csv")

# Filtramos los datos de la provincia de Mendoza
wine_ar <- wine_ratings %>% 
  filter(province == "Mendoza Province") 

El dataset original contiene 129971 filas y 14. Después de filtrar los datos sólo por Mendoza Province nos quedamos con 3264 filas que representan los puntajes que personas expertas le han dado a los vinos. De ahora en más seguiremos trabajando con el dataset wine_ar.

Ver código
# Exploremos el contenido del dataset
glimpse(wine_ar)
Rows: 3,264
Columns: 14
$ ...1                  <dbl> 17, 224, 231, 253, 261, 266, 273, 275, 284, 294,…
$ country               <chr> "Argentina", "Argentina", "Argentina", "Argentin…
$ description           <chr> "Raw black-cherry aromas are direct and simple b…
$ designation           <chr> "Winemaker Selection", "Lunta", NA, "Reserve", "…
$ points                <dbl> 87, 90, 85, 85, 89, 89, 89, 89, 92, 92, 93, 93, …
$ price                 <dbl> 13, 22, 10, 15, 37, 14, 19, 30, 215, 30, 42, 55,…
$ province              <chr> "Mendoza Province", "Mendoza Province", "Mendoza…
$ region_1              <chr> "Mendoza", "Luján de Cuyo", "Mendoza", "Luján de…
$ region_2              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ taster_name           <chr> "Michael Schachner", "Michael Schachner", "Micha…
$ taster_twitter_handle <chr> "@wineschach", "@wineschach", "@wineschach", "@w…
$ title                 <chr> "Gaucho Andino 2011 Winemaker Selection Malbec (…
$ variety               <chr> "Malbec", "Malbec", "Bonarda", "Malbec", "Red Bl…
$ winery                <chr> "Gaucho Andino", "Mendel", "Andean Sky", "Cueva …

Solo de explorar el dataset se me hace agua la boca. En fin, sigamos…

Calcular puntaje promedio de vinos por regiones

El paso siguiente es filtrar por la cepa Malbec y luego podemos calcular un promedio de los puntajes de la columna points agrupados por la columna region_1 así podemos establecer un ranking de las regiones que tienen los mejores Malbecs de Mendoza.

Ver código
# Filtramos por Malbec
malbec <- wine_ar %>% 
  filter(variety == "Malbec")

# Creamos un ranking de las mejores regiones productoras de Malbec
promedio_regiones <- malbec %>% 
  filter(!is.na(region_1)) %>%  # Eliminamos filas sin datos
  group_by(region_1) %>%        # Agrupamos por region
  summarise(puntaje_promedio = mean(points)) %>% # Calculamos el promedio
  arrange(desc(puntaje_promedio)) # Ordenamos de mayor a menor

# Ver el resultado
promedio_regiones
# A tibble: 13 × 2
   region_1         puntaje_promedio
   <chr>                       <dbl>
 1 Perdriel                     90.5
 2 La Consulta                  90.1
 3 Valle de Uco                 89.5
 4 Agrelo                       89.3
 5 Luján de Cuyo                88.8
 6 Uco Valley                   88.4
 7 San Carlos                   88.3
 8 Tupungato                    88.2
 9 Medrano                      88  
10 Vista Flores                 87.8
11 Mendoza                      87.1
12 Maipú                        87  
13 Altos de Mendoza             86  

De esta manera descubrimos, para mi sorpresa incluso, que en Perdriel (una localidad dentro de Luján de Cuyo) podemos encontrar los mejores malbecs de la provincia.

Y ahora esto lo podemos visualizar en un gráfico.

Ver código
ggplot(promedio_regiones, aes(x = puntaje_promedio, 
                              y = reorder(region_1, puntaje_promedio))) + # Ordenamos las regiones por puntaje_promedio
  geom_col(fill = "#82163D") + # Color malbec ;p
  theme_minimal()  + # Modificamos el estilo del gráfico
  # Añadimos el título al gráfico y a los ejes
  labs(title = "Ranking de regiones de Mendoza con los mejores Malbec", 
       x = "Puntaje Promedio",
       y = "Región de Mendoza") +
  theme(title = element_text(color = "#82163D"),
        plot.title.position = "plot") +
  # Añadimos el puntaje a cada barra
  geom_text(aes(label = round(puntaje_promedio,1)),
            size = 2.5,
            color = "white",
            hjust = 1.2) 

Ver código
# Guardamos el gráfico en un archivo png
ggsave("output/ranking_regiones.png", dpi = 300, create.dir = TRUE)

Así podemos ver fácilmente las localidades con los mejores vinos malbec, y podríamos planificar el viaje asegurándonos de visitar las mejores bodegas.

Después me agradecen.

Segundo Análisis: ¿Cuáles son los mejores proveedores de capacitación en mi empresa?

Cómo decía anteriormente. Es probable que si trabajamos en un equipo de Capacitación, y busquemos cómo hacer un análisis de proveedores de capacitación, no encontremos ningún artículo que nos enseñe a hacerlo.

Pero, podemos usar el ejemplo del ranking de vinos para hacer un análisis similar usando las encuestas de capacitación que hacemos completar a nuestros empleados después que terminan un curso.

Los datos

Para realizar este ejercicio, vamos a usar un dataset ficticio, que simula compilar resultados de encuestas de capacitación, e incluye métricas como:

  • satisfaction: evalúa en qué medida el curso gustó o no.

  • facilitator_score: puntúa la calidad del facilitador/a de la actividad.

  • materials_satisfaction: mide la satisfacción con los materiales provistos por el proveedor del curso.

  • willing_recommend: evalúa si recomendaría el curso o no.

  • area_goals_alignment: mide en qué porcentaje el curso está alineado con los objetivos del área.

  • work_aplication: en qué medida el contenido del curso se puede trasladar al trabajo.

  • scrap_learning: mide cuánto del contenido de la actividad no tiene aplicación en el trabajo (leer más en este artículo).

Ver código
# Carga de datos
training <- read_delim("data/training_ratings.csv",
                       delim = ";")

# Explorar dataset
glimpse(training)
Rows: 101
Columns: 11
$ id_training            <dbl> 129, 129, 129, 129, 145, 41, 41, 41, 41, 41, 41…
$ program                <chr> "5 por qué/ Problem Solving", "5 por qué/ Probl…
$ id_emp                 <dbl> 892, 898, 1499, 1695, 967, 804, 879, 1454, 1455…
$ satisfaction           <dbl> 8, 7, 2, 5, 6, 10, 5, 9, 8, 4, 2, 8, 6, 10, 8, …
$ facilitator_score      <dbl> 4, 2, 8, 10, 10, 6, 6, 7, 4, 7, 1, 10, 6, 8, 4,…
$ materials_satisfaction <dbl> 8, 9, 5, 9, 9, 7, 4, 1, 1, 8, 5, 1, 9, 7, 1, 9,…
$ willing_reccomend      <dbl> 8, 7, 8, 1, 4, 5, 1, 2, 10, 8, 7, 8, 5, 5, 5, 9…
$ area_goals_alignment   <dbl> 0.4, 0.5, 0.9, 0.6, 0.4, 0.1, 0.6, 0.5, 0.6, 0.…
$ work_aplication        <dbl> 1.0, 0.6, 0.4, 0.9, 0.9, 0.1, 0.8, 0.1, 0.3, 0.…
$ scrap_learning         <dbl> 0.0, 0.4, 0.6, 0.1, 0.1, 0.9, 0.2, 0.9, 0.7, 0.…
$ supplier               <chr> "INTERNO", "INTERNO", "INTERNO", "INTERNO", "IN…

Como podemos apreciar, hay muchas dimensiones en las que nos podemos enfocar para medir la calidad de nuestros proveedores de capacitación. Para este ejercicio vamos a analizar a los proveedores según qué tan alineados están con los objetivos del área.

¿Por qué vamos a analizar a los proveedores según su alineación con los objetivos?

Paréntesis: Nombres de los proveedores de capacitación

Casi todos los datos de este dataset son inventados por mí, los puntajes fueron generados aleatoriamente, pero los nombres de los proveedores y de los cursos los saqué de los proveedores y cursos que teníamos en Pilkington de la época que trabajé ahí (2010-2016).

Así que para no herir susceptibilidades, ni que se malinterprete la información que vamos a generar, vamos a usar el paquete noah que lo que hace es generar nombres aleatorios para enmascarar los nombres reales, y mostrar un nombre simpático en vez del real.

Ver código
# Cargar la librería
# install.packages("noah")
library(noah)

# Crear columna con nombres random
training <- training %>% 
    mutate(pseudo_supplier = pseudonymize(supplier)) 

# Guardamos el archivo nuevo
write_delim(training, "output/training_data_fake_names.csv", delim = ";")

# Veamos los nombres nuevos que tienen los proveedores con este cambio
fake_names <- unique(training$pseudo_supplier)

fake_names
 [1] "Quick Louse"        "Tacky Hippopotamus" "Abject Antelope"   
 [4] "Hellish Ferret"     "Juvenile Hawk"      "Simple Badger"     
 [7] "Conscious Hoverfly" "Forgetful Firefly"  "Irate Reindeer"    
[10] "Macho Ox"           "Possessive Halibut" "Heavenly Dove"     
[13] "Tacky Quokka"       "Plain Salamander"   "Tame Mite"         
[16] "Well-To-Do Oribi"  

¿Quién no querría hacer un curso en Quick Louse? 😁

Cierro paréntesis.

Calcular proveedores mejor alineados con los objetivos del área

El siguiente paso es calcular el promedio de alineación con objetivos por cada proveedor. De nuevo, podría ser por cualquier métrica, pero para este artículo elejimos esa.

Como la idea del análisis es analizar proveedores externos. Vamos a filtrar los cursos dictados internamente, y luego vamos a calcular el promedio de alineación con objetivos para cada proveedor.

Ver código
# Crear un dataset de proveedores externos
external_vendors <- training %>% 
  filter(supplier != "INTERNO") # Elimina las filas de cursos internos

# Calculamos el puntaje promedio de alineación para cada proveedor
vendor_alignment_score <-  external_vendors %>% 
  group_by(pseudo_supplier) %>% 
  summarise(puntaje_promedio = mean(area_goals_alignment)) %>%
  arrange(desc(puntaje_promedio))

# Veamos el ranking
vendor_alignment_score
# A tibble: 15 × 2
   pseudo_supplier    puntaje_promedio
   <chr>                         <dbl>
 1 Tacky Hippopotamus            0.833
 2 Possessive Halibut            0.7  
 3 Tacky Quokka                  0.7  
 4 Abject Antelope               0.633
 5 Well-To-Do Oribi              0.614
 6 Conscious Hoverfly            0.6  
 7 Hellish Ferret                0.6  
 8 Juvenile Hawk                 0.583
 9 Tame Mite                     0.575
10 Irate Reindeer                0.562
11 Plain Salamander              0.5  
12 Simple Badger                 0.433
13 Heavenly Dove                 0.4  
14 Forgetful Firefly             0.375
15 Macho Ox                      0.3  

De esta manera podemos ver que Tacky Hippopotamus es el mejor proveedor con un puntaje de 83.3% y que el peor proveedor es Macho Ox.

Con estos datos podemos hacer un gráfico de la misma manera que lo hicimos con el gráfico de vinos.

Ver código
ggplot(vendor_alignment_score, aes(x = puntaje_promedio, 
                              y = reorder(pseudo_supplier, puntaje_promedio))) + # Ordenamos los vendors por puntaje_promedio
  geom_col(fill = "#103F79") +
  theme_minimal()  + # Modificamos el estilo del gráfico
  # Añadimos el título al gráfico y a los ejes
  labs(title = "Ranking de proveedores de capacitación",
       subtitle = "Ordenados por Alineación con Objetivos del Área",
       x = "Puntaje Promedio",
       y = "Vendor",
       caption = "Datos generados aleatoriamente") +
  theme(title = element_text(color = "#103F79"),
        plot.title.position = "plot") +
  # Añadimos el puntaje a cada barra
  geom_text(aes(label = scales::percent(puntaje_promedio,
                                        accuracy = 0.1)),
            size = 2.5,
            color = "white",
            hjust = 1.2) +
  scale_x_continuous(labels = scales::percent_format(accuracy = 1))

Ver código
# Guardamos el gráfico en un archivo png
ggsave("output/ranking_proveedores_basico.png", dpi = 300, create.dir = TRUE)

Incluso podemos ir un paso más allá y agregar una línea que nos indique el target de alineación mínimo. De esta manera podremos saber qué proveedores debemos mantener sí o sí independiemente del costo, y cuáles son los vendors que tenemos que reemplazar.

Ver código
ggplot(vendor_alignment_score, aes(x = puntaje_promedio, 
                              y = reorder(pseudo_supplier, puntaje_promedio))) + # Ordenamos los vendors por puntaje_promedio
  geom_col(fill = "#103F79") +
  theme_minimal()  + # Modificamos el estilo del gráfico
  # Añadimos el título al gráfico y a los ejes
  labs(title = "Ranking de proveedores de capacitación",
       subtitle = "Ordenados por Alineación con Objetivos del Área",
       x = "Puntaje Promedio",
       y = "Vendor",
       caption = "Datos generados aleatoriamente") +
  theme(title = element_text(color = "#103F79"),
        plot.title.position = "plot") +
  # Añadimos el puntaje a cada barra
  geom_text(aes(label = scales::percent(puntaje_promedio,
                                        accuracy = 0.1)),
            size = 2.5,
            color = "white",
            hjust = 1.2) +
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
  # Definimos un umbral de 60% con una línea punteada amarilla
  geom_vline(xintercept = 0.6,
             color = "#F3B229",
             linetype = 2,
             linewidth = 1)

Ver código
# Guardamos el gráfico en un archivo png
ggsave("output/ranking_proveedores.png", dpi = 300, create.dir = TRUE)

Incluso podríamos asignar colores distintos a los proveedores cuyo puntaje sea inferior al 40% para indicar de esa manera qué proveedores deberían ser reemplazados.

Ver código
# Guardemos el gráfico en un objeto para simplificar la lectura
p <- ggplot(vendor_alignment_score, aes(x = puntaje_promedio, 
                              y = reorder(pseudo_supplier, puntaje_promedio))) + 
  # Definimos los cortes en función del puntaje promedio
  geom_col(aes(fill = cut(puntaje_promedio,
                           c(-Inf,0.4, Inf)))) 
# Los valores van de menos infinito, a 0.4, y luego hasta el infinito

# Veamos este paso
p

Ver código
# Ahora asignemos el color en función de los valores de puntaje_promedio
# Si el valor es mayor a 0.4 (40%) entonces el color es azul.
# Si el valor es menor a 0.4, entonces el color de la barra será naranja.
p <- p +
  scale_fill_manual(values = c("(-Inf,0.4]" = "#F7B234",
                               "(0.4, Inf]" = "#103F79"),
                    labels = c("Reemplazar", "Mantener")
                    )
# Veamos como queda hasta ahora
p

Ver código
# Gráfico final con todos los lujos
p +
  # Añadimos el título al gráfico y a los ejes
  labs(title = "Ranking de proveedores de capacitación",
       subtitle = "Ordenados por Alineación con Objetivos del Área",
       x = "Puntaje Promedio",
       y = "Vendor",
       caption = "Datos generados aleatoriamente",
       fill = "Acción") +
  # Añadimos el puntaje a cada barra
  geom_text(aes(label = scales::percent(puntaje_promedio,
                                        accuracy = 0.1)),
            size = 2.5,
            color = "white",
            hjust = 1.2) +
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
  # Definimos un umbral de 60% con una línea punteada amarilla
  geom_vline(xintercept = 0.6,
             color = "#F3B229",
             linetype = 2,
             linewidth = 1) +
  theme_minimal() +  # Modificamos el estilo del gráfico
  guides(fill = guide_legend(reverse=TRUE)) +
  theme(title = element_text(color = "#103F79"),
        plot.title.position = "plot",
        legend.position = "top") 

Ver código
ggsave("output/ranking_proveedores_final.png")

Conclusión

En este ejercicio podemos ver como un análisis aplicado a realizar un ranking de mejores lugares para encontrar vinos nos sirve como inspiración para realizar un ranking de los mejores proveedores de capacitación.

Hacer este tipo de ejercicios me parece muy importante por dos motivos:

  • No siempre vamos a encontrar precisamente lo que necesitamos.
  • A veces haciendo cosas divertidas podemos aprender a usar una herramienta (llámese, R, Excel, Power BI o Python) y luego aplicar lo que aprendemos a lo que necesitamos.

Estoy seguro que si googleamos “cómo hacer un ranking de capacitación en (inserte su herramienta aquí)”, probablemente no encontremos mucha información, en cambio si buscamos cómo hacer un ranking en “x” tecnología, hallaremos muchos recursos para aprender como hacerlo.

Por siempre en cada proyecto de datos, lo más importante es saber qué queremos lograr, qué es lo que estamos buscando, cuál es el problema que tenemos que resolver, para qué, etc., etc., etc.. La parte técnica se resuelve fácil cuando sabemos cuál es nuestro objetivo.

Espero que les haya gustado este ejercicio. Próximamente subiré el código para hacerlo en Python, así que stay tuned!

Notas

  1. Mendoza es la provincia más importante en producción de vinos de Argentina, y la cepa más representativa del país es el malbec.↩︎