Para iniciar, antes de la construcción del tablero debemos entender el objetivo del negocio; el proposito que perseguimos con el mismo. En esta etapa definiremos cuales son los KPI/ OKR que buscamos mejorar en la campaña de mercadeo, posteriormente procesaremos la data para construir estos indicadores y finalmente definir el tablero que mejor se alinee con este propósito.
Entendiendo que el proposito del análisis es entender el funnel de conversión que tiene una campaña de mercadeo, la cual va desde que se intenta contactar a un cliente hasta el momento en el cual se le entrega (Bien sea de forma Fisica o digital), debemos iniciar conociendo cual es nuestra base potencial (Total de Leads).
A partir de allí encontramos que es importante definir como indicadores escenciales:
Así mismo, surgen varios interrogantes como detalle del funnel anterior sobre brechas que podrían cerrar areas operativas de Mercadeo, Riesgo o Servicio al cliente revisando el detalle de la información, como lo son:
import pandas as pd
import numpy as np
df = pd.read_csv('BusinessBIBA_Challenge.csv', sep=',')
df.rename({'Unnamed: 0':'ORDER'}, axis=1, inplace=True)
Entendiendo la logica que tiene el campo STATUS, poblaremos los campos vacios con NOT RESPOND cuando tengamos un cliente que no haya respondido a la campaña de mercadeo, y TX cuando el registro contenga una Trasacción con la tarjeta
df['STATUS'] = np.where((df['STATUS'].isnull()==True) & (df['TXN'].isnull()==True) , 'NOT RESPOND',
np.where((df['STATUS'].isnull()==True) & (df['TXN'].isnull()==False), 'TX',df['STATUS']))
Para mayor practicidad separamos la información correspondiente al funnel de conversion de la informacióin relacionada con las trasacciones
df_funnel = df.loc[:, df.columns != 'TXN'][df['STATUS']!='TX']
df_funnel.head(10)
ORDER | ID | UPDATE | STATUS | MOTIVE | INTEREST_RATE | AMOUNT | CAT | CP | DELIVERY_SCORE | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 59:50.4 | RESPONSE | NaN | NaN | NaN | NaN | NaN | NaN |
1 | 1 | 1 | 46:41.4 | RISK | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 2 | 1 | 14:50.5 | APPROVED | DIGITAL | 40.0 | 1300.0 | 49.0 | NaN | NaN |
4 | 4 | 2 | 00:00.0 | NOT RESPOND | NaN | NaN | NaN | NaN | NaN | NaN |
5 | 5 | 3 | 00:00.0 | NOT RESPOND | NaN | NaN | NaN | NaN | NaN | NaN |
6 | 6 | 4 | 01:07.0 | RESPONSE | NaN | NaN | NaN | NaN | NaN | NaN |
7 | 7 | 4 | 27:50.6 | RISK | NaN | NaN | NaN | NaN | NaN | NaN |
8 | 8 | 4 | 49:54.2 | APPROVED | PLASTIC | 32.0 | 10000.0 | 39.0 | NaN | NaN |
9 | 9 | 4 | 00:52.7 | DELIVERED | NaN | NaN | NaN | NaN | 11560.0 | 3.0 |
14 | 14 | 5 | 59:27.9 | RESPONSE | NaN | NaN | NaN | NaN | NaN | NaN |
Para poder construir una metrica del total de leads que respondieron como quienes no respondieron a la campaña de maketing creamos un status denominado LEADS
campaign = df_funnel[(df_funnel['STATUS']=='RESPONSE')|(df_funnel['STATUS']=='NOT RESPOND')][['ID']].drop_duplicates()
campaign['STATUS'] = 'LEADS'
campaign['UPDATE'] = '00:00.0'
df_funnel = df_funnel.append(campaign)
C:\Users\1016038645\AppData\Local\Temp\ipykernel_10244\3870721461.py:5: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead. df_funnel = df_funnel.append(campaign)
df_tx = df[['ORDER','ID','UPDATE','STATUS','TXN']][df['STATUS']=='TX']
df_tx.head()
ORDER | ID | UPDATE | STATUS | TXN | |
---|---|---|---|---|---|
3 | 3 | 1 | 08:23.4 | TX | 434.112066 |
10 | 10 | 4 | 25:47.0 | TX | 360.504173 |
11 | 11 | 4 | 22:22.1 | TX | 175.061765 |
12 | 12 | 4 | 44:53.3 | TX | 3719.618354 |
13 | 13 | 4 | 53:04.3 | TX | 1171.027491 |
Rectificamos que data tienen las bases ya que esta será la que llevaremos a los tableros así como también validamos cual sería el resultado de los KPI definidos inicialmente
total_leads = len(df_funnel['ID'].unique())
clientes_con_tx = len(df_tx['ID'].unique())
respondieron = len(df_funnel['ID'][df_funnel['STATUS']=='RESPONSE'].unique())
riesgo = len(df_funnel['ID'][df_funnel['STATUS']=='RISK'].unique())
aprobados = len(df_funnel['ID'][df_funnel['STATUS']=='APPROVED'].unique())
entregadas = len(df_funnel['ID'][df_funnel['STATUS']=='DELIVERED'].unique())
plasticos = len(df_funnel['ID'][df_funnel['MOTIVE']=='PLASTIC'].unique())
total_tx = df_tx['TXN'].sum()
print('Validacion de KPIs')
print('El dataset cuenta con ',str(total_leads), ' clientes')
print('El dataset cuenta con ',str(clientes_con_tx), ' clientes que han hecho al menos una transacción')
print('% Respuesta: ',str(respondieron/total_leads))
print('% Aprobación: ',str(aprobados/riesgo))
print('% Entrega: ',str(entregadas/plasticos))
print('% Uso: ',str(clientes_con_tx/aprobados))
print('$ Uso: ',str(total_tx))
Validacion de KPIs El dataset cuenta con 3341 clientes El dataset cuenta con 1255 clientes que han hecho al menos una transacción % Respuesta: 0.6878180185573182 % Aprobación: 0.654917319408181 % Entrega: 1.0 % Uso: 0.8338870431893688 $ Uso: 7582878.185593394
Ahora para evaluar el servicio al cliente hemos decidido crear la metrica del NPS:
nps = df_funnel[df_funnel['STATUS']=='DELIVERED']
total_enc = len(nps['ID'].unique())
detractores = len(nps[nps['DELIVERY_SCORE']<=3]['ID'].unique())
pasivos = len(nps[nps['DELIVERY_SCORE']==4]['ID'].unique())
promotores = len(nps[nps['DELIVERY_SCORE']==5]['ID'].unique())
nps_sc = (promotores-detractores)/total_enc
print('El NPS es :',str(nps_sc))
El NPS es : -0.9005736137667304
Tras lo anterior nos damos cuenta que las principales acciones deberían estar encaminadas a:
Habiendo validado los KPI que requerimos y la calidad en la data que necesitamos, exportamos las bases con las que construiremos los tableros
df_funnel.to_csv('df_funnel.csv',sep='|', index= False, decimal = ',')
df_tx.to_csv('df_tx.csv',sep='|', index= False, decimal = ',')
Con lo anterior, entendiendo los tres tipos de Clientes Internos que podrian observar el tablero, se deciden construir 3 lienzos a tres niveles distintos:
Lienzo Estratégico: Un lienzo donde se observen los KPI, que no cuente con filtros para garantizar que en la organización se tenga una misma óptica sobre el desempeño de la campaña de mercadeo, un lienzo enfocado en los grandes tomadores de decisiones o C-Level
Lienzo Táctico: Un lienzo que permita llegar un poco más a fondo en el analisis exploratorio y descriptivo sobre la data que lo alimenta, un lienzo enfocado en los mandos medios e intermedios
Lienzo Operativo: Un lienzo enfocado en mostrar el detalle de los datos, enfocado en el uno a uno de aquellos puntos donde se tengan accionables que permitan movilizar los KPI inicialmente definidos. Un lienzo enfocado en quienes tienen contacto directo con el cliente
Para lo anterior el resultado obtenido lo creamos en el siguiente tablero:
LINK DEL TABLERO: https://github.com/juankfc/DataScientist-Roadmap/blob/afdc417571d5c157fa8dcfa68bad07eb3936acf7/SK%20Assessment/Credit%20Card%20Delivery%20Funnel.pbix
Donde encontraremos el siguiente resultado:
Portada: un menú de botones donde encontraremos los accesos cada uno de los lienzos previamente definidos
Lienzo Estrategico: Un lienzo donde tuvimos que importar algunas visualizaciones del marketplace para construir los formatos condicionales en los KPI
Lienzo Táctico: Un lienzo donde podemos explorar la data
Lienzo Operativo: Un lienzo con la data accionable