Fuga de clients

Un model que assenyala quins clients són a punt de marxar, i què els empeny.

Dades i BI · Python · Demo navegable

Fuga de clients

El problema

Captar costa força més que retenir, així que la pregunta rendible no és quants van marxar el mes passat sinó qui marxa el mes vinent. Un recompte a posteriori no deixa marge per fer res; una probabilitat per client, sí.

Què fa

  • Construeix un conjunt de dades etiquetat i el prepara: codificació one-hot, selecció de variables i normalització.
  • Corregeix el desequilibri entre classes amb pesos balancejats i una partició estratificada, perquè la minoria que marxa no quedi ofegada.
  • Entrena una regressió logística, triada per damunt de models més opacs perquè els seus coeficients es llegeixen directament com a causes de negoci.
  • Publica un panell amb la probabilitat de fuga per client i els factors que l’expliquen.

El que es va decidir en construir-lo

Regressió logística, i es diu per què
Es va triar per interpretabilitat: cada coeficient es llegeix com una palanca de negoci. Un model de conjunt probablement ordenaria una mica millor i no diria res que un comitè pugui fer servir. La decisió està declarada al repositori; el que no hi ha és una comparació contra el model descartat.
Pesos equilibrats: es prefereix avisar de més
El llindar es mou cap a caçar qui se’n va, encara que això ompli la llista de falsos avisos. Quatre de cada cinc assenyalats no se n’anaven. L’intercanvi és deliberat i només compensa si una trucada de retenció costa força menys que perdre el client, i aquest cost aquest repositori no el modela.
Les mètriques les escriu el codi
L’informe de resultats s’escrivia a mà i es va separar del codi: va arribar a publicar una precisió d’un conjunt de dades que ja no existia, i cap AUC. Ara l’emet l’script juntament amb els JSON del panell. Un número que ningú no pot regenerar és un número que ningú no hauria de publicar.
Els trams s’ordenen per valor, no per lletra
Els trams d’import són categories ordenades, així que cent a cent vint no es col·loca abans que quaranta a seixanta. I els quatre fitxers de segment comparteixen una mateixa forma: emetre una clau diferent a cadascun és el que va deixar tres dels quatre gràfics sense retolació als eixos.

Fins on arriba

  • Un AUC de 0,703 mesura ordenació, no encert: donats un client que se’n va anar i un altre que es va quedar, el model posa al davant el que se’n va anar el 70 % de les vegades. La precisió real és 0,205, i predir «no se’n va ningú» trauria un 87 % d’encerts sent inútil.
  • Hi ha una sola partició d’entrenament i prova, sense validació creuada. Les xifres publicades són una realització, no una mitjana amb el seu interval: el recall de 0,615 són quaranta encerts sobre seixanta-cinc.
  • Les variables són associacions, no causes. El generador construeix la probabilitat de baixa com una suma d’indicadors coneguda per endavant; el model la recupera de manera imperfecta. Que més incidències acompanyin més baixes no autoritza a concloure que reduir-les retingui ningú.
  • No hi ha calibratge de probabilitats ni tria de llindar per cost. Per fer-lo servir de debò caldria posar preu a la trucada i a la baixa, i aquest càlcul no hi és.
  • 0,703 AUC-ROC
  • 64,0 % d’encert
  • 61,5 % de les fugues, detectades

Construït amb

  • Python
  • scikit-learn
  • React

D’on surten les dades

Dades sintètiques generades pel mateix repositori: no hi ha informació de cap client.

Dona suport a aquest servei

Quadres de comandament amb Power BI per a pimes

Llegir el codi · Obrir la demo