Recomendación de Acciones en RapidMiner

ernestogaonaernestogaona Member Posts: 6 Contributor II
Hola Estimado @rfuentealba,

Estoy aprendiendo a utilizar RapidMiner,  quisiera saber como puedo realizar una modelo para predecir que acciones debería tomar para atender a un cliente, tomando en cuenta su historial del atenciones.
 Por ejemplo: Tengo un cliente al que se le debe aplicar una acción y en mi proceso ya identifico cuál acción me ha dado resultados efectivos y cuales no. En base a ese comportamiento, rapidminer o el modelo predictivo debe de sugerir la mejor opción. Las acciones pueden ser: LLamada, mensaje, Chat, etc.

Usted cree que me puede ayudar.
Quedo atento a sus comentarios.
Saludos.

Best Answer

Answers

  • rfuentealbarfuentealba Moderator, RapidMiner Certified Analyst, Member, University Professor Posts: 568 Unicorn
    Hola estimado @ernestogaona,

    Claro que sí, veamos primero cómo son tus datos. Asegúrate de ir hasta el final con la explicación.

    Lo que escribiste en mi muro es esto:
    ---------+---------+------------+
    | A       | SMS     | 3          |
    | A       | EMAIL   | 1          |
    | A       | CALL    | 1          |
    | B       | SMS     | 1          |
    | B       | EMAIL   | 2          |
    | B       | CALL    | 3          |
    +---------+---------+------------++---------+---------+------------+
    | Cliente | Gestión | Frecuencia |
    +
    Hay una enorme cantidad de cosas que puedes aplicar aquí, y todas van a llegar a resultados similares. Sin embargo, creo que la solución a la que quieres llegar no es la más adecuada, por una razón muy sencilla. Si quieres llegar a esto:
    ---------+---------+------------+
    | A       | SMS     | 3          |
    | B       | CALL    | 3          |
    +---------+---------+------------++---------+---------+------------+
    | Cliente | Gestión | Frecuencia |
    +
    Bastará usar el operador Aggregate para poder obtener las mayores frecuencias por cliente, usando el operador de agregación maximum. Luego puedes unir esos datos con un operador Join, en un left join (o right join, dependiendo de cómo conectes tus datos).

    Te enviaría el XML, pero quiero que practiques tú mismo, por lo que te enviaré la fotografía de cómo quedaría el proceso:



    Y el resultado:


    Ahora, tengo varias alertas para ti.

    Primero, esto no es Machine Learning, no tienes un algoritmo, y bien podrías haber hecho esto mismo con SQL, pero no te desanimes porque en el fondo más de un 80% de los problemas al interior de una empresa se resuelven organizando bien los datos, y sólo una pequeña porción realmente precisa de Machine Learning para poder obtener conocimientos.

    Segundo, esto no es lo que yo recomendaría para un negocio, en mi opinión profesional: en algún momento vas a tener clientes con 90 llamadas, 3 SMS, 2 chats y 1 correo electrónico, y te vas a dar cuenta de que todo lo que hiciste fue hacerle caso a un algoritmo que tú mismo entrenaste para que te dijera que "siempre llames a este cliente a su teléfono móvil". Si el cliente se queda sordo y desde entonces prefiere un correo electrónico (por poner un caso), no vas a tener información sobre eso y continuarás llamándole por teléfono.

    Si me tienes paciencia y me preguntas mañana por este mismo medio, podría crear un ejemplo más elaborado, como por ejemplo:
    • Identificar cuál es el mejor medio de contacto considerando el rubro de los clientes, como un todo. Ejemplo: un cliente en el rubro tecnología prefiere un correo, mientras que un comercial prefiere una carta en papel y un diseñador gráfico prefiere un sitio Web. 
    • Identificar cuál es el mejor medio de contacto considerando las fechas de nacimiento o las edades de los clientes. Ejemplo, los clientes de 50 o más años prefieren correo certificado; los de 40 a 50, Facebook; los de 30 a 40, correo electrónico; los de 18 a 30, Instagram.
    • Identificar cuál es el mejor medio de contacto basándonos en dos o más atributos.
    En esos casos sí se hace un poco más difícil y difusa la cantidad y tipo de información a procesar, ahí es donde los algoritmos de Machine Learning tienen su verdadero potencial.

    ¿Te parece? Disculpa la demora en contestar, pero he estado con mucho trabajo últimamente.

    Un abrazo muy grande,

    Rodrigo.
  • ernestogaonaernestogaona Member Posts: 6 Contributor II
    Hola estimado @rfuentealba

    Muchas gracias por su explicación y recomendaciones. 

    Con respecto al proceso con agregación, ya lo había realizado pero para mí sigue siendo un proceso de ETL y no le veía la utilidad a RM, por eso mi consulta para que me orientara si se podía hacer algo donde se aplicara ML.

    Me gustaría me compartiera un ejemplo para este caso.
    • Identificar cuál es el mejor medio de contacto considerando el rubro de los clientes, como un todo. Ejemplo: un cliente en el rubro tecnología prefiere un correo, mientras que un comercial prefiere una carta en papel y un diseñador gráfico prefiere un sitio Web. 
    Ya estoy más claro, que la mayor parte del trabajo es la preparación de la data.

    Quedo atento a sus comentarios.

    Saludos.
  • ernestogaonaernestogaona Member Posts: 6 Contributor II
    Hola estimado @MarcoBarradas,  
    Muchas gracias por su apoyo, como le mencionaba al estimado @rfuentealba,  le comparto una imagen del dataset que estoy armando.. No tengo atributos (True/False).  Las acciones (descTipoTrans) se repiten por clientes. Un cliente puede tener muchas acciones aplicadas, y de esas acciones se puede repetir durante la historia...



    Quedo atento a sus comentarios.

    Saludos.
  • MarcoBarradasMarcoBarradas Administrator, Employee, RapidMiner Certified Analyst, Member Posts: 272 Unicorn
    Hagamos el paso 1 de CRISP que se refiere a entender en negocio o el problema a resolver. 
    Según entiendo lo que buscas es diseñar un modelo que dependiendo del tipo de problema sugiera la acción más eficaz para la solución del problema.
    Por lo tanto buscamos modelar toda la información de los tickets y la toma de decisiones que hubo para solucionarlo.
    De aquí surgen las siguientes ideas y preguntas:
    1. ¿Tenemos un identificador único para cada ticket?
    2. ¿Qué características son únicas de cada ticket? Ejemplo Día, Hora, idCliente, Tipo de Caso, Status Actual
    3. ¿Todas las acciones secundarias tienen son vinculables al ticket original?
    4. ¿En cada sub acción se tiene más información? agente, status fecha de acción, solucionó o no el problema
    Al final de estas preguntas valdrá la pena transformar los datos para empezar a construir un dataset en dónde sólo tendremos una fila por cada ticket y muchas columnas (atributos) que nos ayudarán a encontrar los patrones compartidos entre los casos solucionados.
    Y los más importante será tener una variable objetivo que nos ayude a saber si el caso está solucionado (esto quizás lo cambiemos conforme vayamos mejorando nuestra solución)

    Tu data set podría tener algo cómo lo siguiente
    ID
    Fecha
    DíaSemana
    Hr TipoCaso
    TipoCliente
    EdadCliente
    NúmerosdeAccionesTomadas
    #SMS_Enviados
    #MAILS_Envíados
    #Llamadas_Realizadas
    TiempoTransucrrido
    Sexo
    UltimaAcciónRegistrada
    Solucionado (Sí/NO)

    De momento eso es lo que se me ocurre. 
    Después haremos un análisis exploratorio de los datos para entender distribuciones y casos atípicos, veremos si hay datos nulos o incongruentes. El modelo será tan efectivo cómo la calidad de los datos con que lo alimentes.

    Saludos.
  • ernestogaonaernestogaona Member Posts: 6 Contributor II
    Buenas tardes Estimado @MarcoBarradas

    Muchas gracias por darle seguimiento a mi tema.

    Solo para aclarar, entiendo por Tickets a cada gestión o acción que se le ha aplicado a un cliente o a los clientes.

    Repuestas:
    1.Cada ticket tiene su código de transacción (pero no lo estoy utilizando, quiero agrupar las gestiones por cliente).
    2.Tengo Fecha (Día Mes Año), IDCliente,Producto.
    3.Las acciones secundarias, no tienen vinculación con el original. Por ejemplo hoy quiero llamar al cliente porque me tiene que pagar y me paga, mañana le estaré enviando un email para ver si me paga, es posible que me esté pagando otra deuda y no la del día de ayer.
    4.Si se tiene mas información por cada acción, tengo el agente, tengo la fecha de la acción y tengo un flag que me indica que si pagó o no pagó. 

    Creo que pudiera generar un dataSet con la estructura que me indicas, pero mejor espero su feedback con respecto a las respuestas que le brindo.

    Quedo atento a sus comentarios.

    Saludos.
  • MarcoBarradasMarcoBarradas Administrator, Employee, RapidMiner Certified Analyst, Member Posts: 272 Unicorn
    @ernestogaona perfecto empiezo a entender más tu problema. 
    Con respecto al punto 1 ten en cuenta que estás buscando  crear una solución para todo tipo de clientes. 
    El agrupar los datos a nivel cliente estará sesgando tu modelo y estarías creando una regla específica para cada cliente. Quizás suena como lo que tu quisieras lograr sin embargo el poder de un modelo predictivo o de usar RM está en aprender de todas las interacciones para poder aplicar la acción que resultó la más efectiva ante el problema que se presenta. 
    Al final del camino estamos buscando que cuando llegue un cliente nuevo el sistema recomiende el camino más corto para cobrarle y esperas que el sistema sea capaz de sugerir la mejor acción para cobrarle a un cliente que ya lleva 5 intentos o 2 pagos atrasados.
    Es por ello que te recomiendo ver cada acción de cobro como filas independientes que tienen mucha información que ayuda a resolver el problema.

    No sé si estés familiarizado con arboles de decisión, basket analysis,clusters y marices de costos. Conforme vayas avanzando en tu problema irás incorporando estos elementos. Pero sigamos con lo básico.

    Si entendí bien construirás un modelo para cobro a clientes por lo que ya hay otra variable que quizás resulte importante incorporar. ¿Qué monto vale la operación? ¿Cuántos intentos previos se han hecho de cobro? ¿Es la primera vez que se le va a cobrar al cliente? ¿Cuál fue la última acción que se intentó (SMS, correo, llamada,envío de EDC)? ¿El cliente es moroso? 
    Si en algún momento sientes que te estoy enredando  mucho ten la confianza de decirlo y brincamos al siguiente paso. Pero algo que he aprendido en este negocio es que el 80% del tiempo que se invierte en la solución de estos problemas está en construir los datos adecuados para que el modelo haga su trabajo.
    Otro consejo muy importante es sólo considerar datos que se puedan calcular previo a conocer la respuesta (Cobro realizado, No Cobro) ya que todos los eventos futuros deberán de tener esos datos.

    Saludos



  • ernestogaonaernestogaona Member Posts: 6 Contributor II
    Hola @MarcoBarradas, como estás ?

    En efecto todo lo mencionaste está en la ruta de lo que quiero lograr.
    Pudiera agregar las variables que me que mencionas, si está moroso , si es un cliente nuevo .

    Corrígeme si me equivoco... mi set de datos (para aprendizaje), solo tiene los atributos que para mi son como agrupadores que identifican el perfil del cliente. |Rango edad|Sexo|Estado Civil|Mes de la transacción|Tipo de Producto| Ciclo o Etapa|TipoGestión (rol label)|.  Esa sería la información del cliente. Eso es lo que utilizo para realizar el entrenamiento con un árbol de decisión.
    Luego cuando voy a predecir,  utilizo el modelo entrenado y le envío un Set de Datos, puede ser un cliente que ya existe o uno nuevo.. al final lo que espero de la predicción es que me indique para este tipo de clientes cuál sería la acción o gestión de cobro que debo aplicarle.

    Creo que necesito, crear otros campos que tengan entonces las frecuencias por cada acción 10 SMS | 3 Email....

    No tengo ningún problema, de la forma como me estás apoyando.. cada explicación que me brinda me ayuda a aclara conceptos y poder ir aprendiendo sobre ML y RM.

    Quedo atento a sus comentarios.

    Saludos.
  • rfuentealbarfuentealba Moderator, RapidMiner Certified Analyst, Member, University Professor Posts: 568 Unicorn
    Hola @ernestogaona,

    Discúlpame la demora. Estos días he estado extremadamente ocupado.

    Tu set de datos para entrenamiento tiene los atributos de categoría (así se llaman los agrupadores). Esa es la información del cliente que usas para entrenar un árbol de decisión. Estás en lo correcto. En esa ruta, podrías agregar la fecha de incorporación del cliente, y las cantidades de mora (más que si es moroso o no). ¿Por qué? Porque en tus sistemas aparecerá la cantidad morosa, y puede ser igual 2 dólares que 64 millones. En cambio, puedes hacer un binning por especificación de sistema.

    Cuando vas a realizar la predicción, le envías toda la información de un cliente, no importa cuál sea el origen. Lo que debes hacer es tener toda la información del mismo, y para todos los clientes es la misma información (aunque diferentes valores).
      
    Hasta ahora, vas muy bien, felicidades.

    Saludos,

    Rodrigo.
  • ernestogaonaernestogaona Member Posts: 6 Contributor II
    Hola @rfuentealba
     
     Muchas gracias por compartirme sus comentarios.
    Como nuevos atributos, pudiera agregar la morosidad, pero con respecto a la fecha del cliente no la tengo solo la de nacimiento.

    Otra consulta si agrego la morosidad al set de datos para entrenar por un cliente tendría que mostrar todas sus morosidades en el tiempo? ,
    Ejemplo:
    row 1 -> Cliente1 | Mes 1 | morosidad = $10. | Otros atributos
    row 2 -> Cliente1 | Mes 2 | morosidad = $20. | Otros atributos
    row 3 -> Cliente1 | Mes 3 | morosidad = $30.| Otros atributos
    Por favor, me puedes confirmar si sería de esa forma o solo agarro la última morosidad o me estoy escapando del objetivo?


    Estoy adjuntando capturas que me muestran el accuracy y el dataset que estoy utilizando para entrenar. Me podrían explicar que me indica el Accuracy y cuál sería el porcentaje aceptable que debiera tener mi entrenamiento.. 

    Quedo atento a sus comentarios.




    Saludos.
  • MarcoBarradasMarcoBarradas Administrator, Employee, RapidMiner Certified Analyst, Member Posts: 272 Unicorn
    @ernestogaona perdón por le abandono pero ta vi que @rfuentealba te mantuvo a flote en estos días.
    Con respecto a la pregunta de la morosidad sería la cantidad de tiempo transcurrido entre la fecha de pago y el momento en que corras tu modelo.
    Con respecto a la pregunta de utilizar como label el método de contacto pienso que sería mucho mejor tener una variable binaria y que el método de contacto se vuelva una variable del modelo.
    Pienso que sería mejor así ya que podrías hacer que el modelo te indique la probabilidad de éxito por cada método y tu podrías elegir detonar cada acción.
    Así mismo al momento de entrenar tu modelo debe de saber por cada evento cuáles fueron exitosos y cuáles no lo fueron. En un dataset sin la columna Binaria cómo estás separando las acciones exitosas de las que no lo fueron?

    Saludos.
  • rfuentealbarfuentealba Moderator, RapidMiner Certified Analyst, Member, University Professor Posts: 568 Unicorn
    Hola @ernestogaona,

    Con respecto a la morosidad, yo en general tengo 3 variables para ello:
    • Morosidad total dentro de los últimos 30 días.
    • Morosidad total mayor a 30 días pero dentro de los últimos 90 días.
    • Morosidad de más de 90 días.
    ¿Por qué? Porque la morosidad como "binaria" te puede dar un cliente que aún no ha pagado su última letra. Además, el comportamiento de pago es diferente (esto es como evidencia anecdótica, y depende mucho de tu negocio) cuando un cliente recibe una llamada y dice "ups, olvidé pagar, voy mañana" que cuando un cliente recibe una llamada y sabe que no ha pagado en 6 meses. Es probable que el último hasta te tenga registrado en TrueCaller.

    En el resto, comparto la opinión de @MarcoBarradas. (Hola, Marco!!!)

    Saludos,

    Rodrigo.
Sign In or Register to comment.