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).
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.