Destapando los promedios

Como dicen por ahí, los promedios esconden muchas cosas, en el articulo gender-pay-gap-en-tecnologia vimos un análisis que mostraba como, para esos datos, la diferencia de sueldos entre hombres y mujeres puede entenderse con factores distintos al género. Ahora vamos a ver una técnica, basada en machine learning, muy simple de explicar y comunicar para «destapar» lo que está por de debajo de los promedios.

Planteamiento

Imagínese que usted es el data scientist del área de satisfacción de una empresa y está a cargo de mantener la nota que ponen sus clientes al servicio de la compañía (o algún otro KPI). Esta nota se obtiene con un muestreo mensual hecho a clientes que se contactaron con el call center. Hoy es el día, llegó la nueva encuesta de satisfacción y si jefe está ansioso por saber como se hizo el trabajo el mes anterior y Eureka! la nota promedio subió de 5.577 a 5.723, por lo que todos se ganan el bono y salen a almorzar. Pero que oculta ese promedio? Subió realmente la nota? veamos como realizar rápidamente este análisis.

Datos

Para cada mes (anterior y actual) se tiene una tabla con 2000 observaciones que luce del siguiente modo (son datos simulados):
id        causa genero region nota
1  1       equipo hombre  norte    6
2  2        saldo  mujer  norte    8
3  3  facturacion hombre  norte    2
4  4        saldo  mujer centro    6
5  5 conectividad  mujer centro    9
6  6 conectividad hombre centro    4

Modelo

Para entender las variables que explican la nota, utilizando rpart calibraremos un arbol que se ve del siguiente modo:
library(rpart)
library(rattle)
fit = rpart(nota ~ causa + genero + region,data1,cp = 0.015)
fancyRpartPlot(fit)
Básicamente se lee de este modo: En la primera rama (arriba), el promedio es 5.6, pero si abrimos esa rama según la causa de la llamada, cuando la causa es conectividad o facturación, la nota baja a 4.4, mientras que de lo contrario la nota sube a 6.3. Cada una de las ramas anteriores se abre nuevamente, la de la izquierda en genero (del cliente), donde los hombres ponen nota 5.1 y las mujeres 5.2, mientras que mientras la de la derecha en la zona geográfica donde vive el cliente. La intuición en la siguiente: mi nota total puede cambiar por 2 razones:
  • Por que una hoja cambio su nota.
  • Por que una hoja se volvió más importante (por ejemplo, si se encuestan mas mujeres, mi nota debería subir).
Intentaremos descomponer los aportes en esos 2 factores:
dataset1 = data.frame(data1,hoja = rpart.predict.leaves(fit,data1)) %>% 
  group_by(hoja) %>% 
  summarise(nota1 = mean(nota),desvest1 = sd(nota), freq1 = n())

dataset2 = data.frame(data2,hoja = rpart.predict.leaves(fit,data2)) %>% 
  group_by(hoja) %>% 
  summarise(nota2 = mean(nota), freq2 = n())

dataset = dataset1 %>% 
  left_join(dataset2) %>% 
  ungroup() %>% 
  mutate(peso1 = freq1/sum(freq1), 
         peso2 = freq2/sum(freq2))

dataset = dataset %>% 
  mutate(
    delta_freq = (freq2 - freq1)/freq1,
    delta_nota = nota2 - nota1,
    pval = pnorm(-abs(delta_nota),0,desvest1/sqrt(freq1))
    )

print(dataset)
# A tibble: 4 x 11
   hoja nota1 desvest1 freq1 nota2 freq2 peso1 peso2 delta_freq delta_nota     pval
  <int> <dbl>    <dbl> <int> <dbl> <int> <dbl> <dbl>      <dbl>      <dbl>    <dbl>
1     3  4.09     1.63   560  3.47   221 0.28  0.110     -0.605     -0.620 1.40e-19
2     4  5.22     1.64   228  4.35   567 0.114 0.284      1.49      -0.865 8.67e-16
3     6  5.93     1.57   697  6.42   697 0.348 0.348      0          0.494 4.55e-17
4     7  6.88     1.65   515  7.25   515 0.258 0.258      0          0.373 1.36e- 7
En la tabla anterior resultante, la primera fila corresponde a la hoja de la mas izquierda, a medida que bajas, te mueves a la derecha en las hojas del árbol. Podemos ver que en las hojas 3 y 4 (fila 1 y 2), hay una disminución considerable en la nota (columna delta_nota = nota2 – nota1), las cuales corresponden a los servicios relacionados con facturación y conectividad, es más un pequeño test nos muestra que esta diferencia es estadisticamente significativa (columna pval). Si intentamos descomponer el cambio global de la nota en los 2 factores: frecuencia y nota, nos da el siguiente resultado:
dataset = dataset %>% 
  mutate(aporte_dfreq = peso1 * nota1 * (delta_freq),
         aporte_dnota = peso2 * delta_nota
  )
dataset %>% select(-pval)
# A tibble: 4 x 12
   hoja nota1 desvest1 freq1 nota2 freq2 peso1 peso2 delta_freq delta_nota aporte_dfreq aporte_dnota
  <int> <dbl>    <dbl> <int> <dbl> <int> <dbl> <dbl>      <dbl>      <dbl>        <dbl>        <dbl>
1     3  4.09     1.63   560  3.47   221 0.28  0.110     -0.605     -0.620       -0.693      -0.0685
2     4  5.22     1.64   228  4.35   567 0.114 0.284      1.49      -0.865        0.885      -0.245 
3     6  5.93     1.57   697  6.42   697 0.348 0.348      0          0.494        0           0.172 
4     7  6.88     1.65   515  7.25   515 0.258 0.258      0          0.373        0           0.096 

> #validacion
> sum(dataset$aporte_dnota) + sum(dataset$aporte_dfreq)
[1] 0.1465
> mean(data2$nota) - mean(data1$nota)
[1] 0.1465

# Aporte factores
> sum(dataset$aporte_dfreq)
[1] 0.1921425
> sum(dataset$aporte_dnota)
[1] -0.04564248</pre>
Básicamente el cambio en la nota me causó una perdida de -0.045 (columna aporte_dnota) y la ganancia en la nota global se debe a el cambio en las frecuencias, que corresponde a 0.192 (columna aporte_dfreq), básicamente por que hubo menos más mujeres en la muestra.

Conclusión

Se puede salir a celebrar, dado que el bono si se ganó, pero hay que ver que pasó con las causas conectividad y facturación, por que el próximo mes podríamos no vernos beneficiados por un aumento de mujeres en la encuesta. Lo que hay que hacer es partir revisando si ha habido un cambio en los protocolos normales de atención para conectividad y/o facturación o incluso escuchar algunas de las converzaciones para detectar que sucede. Lo importante es corregir la situación pronto. Saludos!
Print Friendly, PDF & Email