trabajo fin de título - paloma cuesta uría
Post on 12-Apr-2017
89 Views
Preview:
TRANSCRIPT
UNIVERSIDAD AUTÓNOMA DE MADRID
ESCUELA POLITÉCNICA SUPERIOR
Experto en Big Data y Data Science: ciencia e ingeniería de datos
TRABAJO FIN DE TÍTULO
¿CUÁNTO VALE EL CLIENTE?
UNA ALTERNATIVA AL MODELO DE PARETO.
Paloma Cuesta Uría
Tutor: José Ramón Dorronsoro Íbero
Agosto 2016
¿CUÁNTO VALE EL CLIENTE?
UNA ALTERNATIVA AL MODELO DE PARETO.
AUTOR: Paloma Cuesta Uría
TUTOR: José Ramón Dorronsoro Íbero
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Agosto de 2016
Resumen
En una economía moderna basada en los servicios, el análisis del comportamiento del cliente y la relación
con la empresa, juega un papel crucial en la optimización de costes en pro del beneficio y crecimiento
sostenible de las compañías. La necesidad de optimizar la cuantificación de los retornos de la inversión en
marketing, toman sentido e importancia en un momento de incertidumbre creciente pero también de
desarrollo de nuevas y mejoradas técnicas de extracción de la información y análisis del comportamiento
del consumidor. El diagnóstico se vuelve cada vez más complejo, pero a la vez, las empresas tienen cada
vez más información sobre ese feed-back del cliente, existiendo la posibilidad creciente de personalizarlo.
Es por ello, que aparecen nuevos nichos analíticos para enriquecer esta panorámica.
Nuestro estudio se centrará en intentar calcular el valor del cliente para la empresa en el largo plazo,
también conocido como CLTV (Customer Lifetime Value), o LCV, concepto clave en marketing y
estrategia de negocio, pero también como materia de estudio en numerosas investigaciones académicas.
Es un valor cuantificable que monetiza la relación con el cliente basándose en el valor presente de los
flujos de esa relación, extrayéndose de ello conclusiones importantes en torno al retorno y compensación
de esa inversión.
En el caso de una empresa de telecomunicaciones o de un banco, se asocia directamente con el estudio de
la rentabilidad para la compañía de la permanencia del cliente en el largo plazo.
De ello se desprende la idea de que no todos ellos son rentables para la empresa o al menos, no a todos
hay que dedicarle la misma fuerza de ventas.
También se intuye que su modelización debería emplear el cruce de técnicas predictivas como el estudio
del abandono, la segmentación por clustering, predicciones de frecuencias de uso del servicio y en
general, procesos inductivos de análisis para descubrir relaciones y patrones ya presentes en los datos.
Cabe señalar, aunque no es objeto de esta primera aproximación, que el modelo se puede beneficiar
también de técnicas econométricas, entre otras, que optimizan y complementan bien algunos resultados.
Centrándonos en nuestro enfoque, para su implementación en Python, se utilizará el modelo BD/NBD1,
como alternativa paramétrica al modelo de Pareto/NBD2 para un primer ajuste inicial.
Posteriormente, se emplearán varios métodos tales como la matriz de frecuencias o la creación de
rankings de nuestros clientes en base a su histórico de compras para visualizar algunos de los conceptos
estudiados.
En suma, el objeto de este TFT, no es otro que el de hacer una aproximación conceptual y primera
aplicación práctica con Python para intentar visualizar y predecir el comportamiento de nuestros clientes a
la vez que evaluamos la calidad de nuestro modelo.
1 O modelo Beta – Geometric/NBD que es una pequeña variación al modelo de Pareto. Lo iremos referenciando y explicando más en
detalle a lo largo de toda la memoria. 2 Desarrollado por Schmittlein y otros (1987), también llamado SMC.
Agradecimientos
Pienso en todo y todos los que han hecho posible que yo
esté aquí hoy. En ocasiones son una serie de aparentes
casualidades concatenadas que cuando se dan cita, sólo cabe
agradecer infinitamente a la mano que definitivamente las ejecuta.
Ellos saben quiénes son, o no.
ÍNDICE
1. Introducción 1
2. Estado del Arte 2
3. Planteamiento del Modelo 3
3.1. Fundamentos del Modelo CLV 3
3.2. El Modelo de Pareto/NBD. 4
3.3. Supuestos del Modelo BG/NBD. 6
4. Desarrollo del modelo 7
4.1. Desarrollo del Modelo a nivel individual. 7
4.1.1. Derivación de la Función de Probabilidad. 7
4.1.2. Derivación de P (X (t)=x). 8
4.1.3. Derivación de E [X (t)] 8
4.2. Desarrollo del modelo para un individuo aleatorio. 9
5. Aplicación empírica. 10
6. Conclusiones y trabajo futuro 22
6.1. Conclusiones 22
6.2. Trabajo futuro 22
7. Referencias 25
8. Anexos 27
8.1. Manual de instalación 27
8.2. Manual del programador 27
8.3. Apéndice matemático 30
8.3.1. Derivada de 𝑬[𝑿(𝒕)] 30
8.3.2. Derivada de 𝑬𝒀𝒕𝑿 = 𝒙, 𝒕𝒙, 𝑻 31
1
1. Introducción La obtención, evaluación y análisis de información útil para el negocio, no sólo financiera o contable,
juega un papel crucial en la nueva estrategia empresarial. La necesidad creciente de contabilizar el
marketing en un momento de reducción de beneficios debido a la competencia y la coyuntura económica
actual, plantean nuevos retos para las compañías. Ante la conciencia de la diversidad de la demanda,
surgen nuevas necesidades de conocimiento y trato con el cliente. Se deduce que no todos los clientes son
iguales, y no todos son igual de valiosos para las compañías.
El presente trabajo tendrá como objetivo principal acercarse a una visión integral en el desarrollo y
análisis de un modelo. Se introducirá el planteamiento matemático que lo sustenta, se relacionará
directamente con el código y finalmente se expondrán los resultados de negocio que se pretenden
investigar.
La elección del tema pasa por lo expositivo y lo didáctico, pero también es una primera aproximación a
una temática que une lo académico con lo empresarial, en un momento clave donde se necesitan y
complementan los dos mundos, abriendo nuevas perspectivas y oportunidades.
La utilización del modelo concreto BG/NBD que se expondrá viene justificada por su facilidad de
implementación computacional y busca ser un acercamiento al modelo de Pareto, pero de una forma más
accesible, y contando con una librería3 de reciente creación.
Las motivaciones principales que me llevaron a elegir investigar este tema concreto fueron una clara
percepción de la convergencia futura de técnicas no paramétricas con técnicas paramétricas que quería
empezar a investigar desde los modelos más antiguos. Consideré prioritario tener una visión global, para
ir acercándome poco a poco desde diferentes perspectivas. Aunque a priori, se podría pensar que no
encaja del todo con el objeto de este título, si lo hace en tanto en cuanto exige un conocimiento previo de
ciertas herramientas como Python, y entra dentro de los campos de analytics, visualización y data mining
con orientación directa al business intelligence.
Otro punto que me llamó la atención fue pensar en los motivos que podría tener el MIT para desarrollar
una librería en el 2014 cuando podría pensarse que es un modelo “obsoleto”, o demasiado complejo. Pero
no lo es tanto. De hecho, una vez desplegado parece sencillo.
Pero el argumento definitivo fue la atención empresarial que este modelo en general sigue despertando,
que puedo ver y experimentar a diario. Y que no dudo que todavía tiene mucho recorrido, porque por
encima de todo, su esencia es el estudio del consumo.
3 La excelente librería Lifetimes-0.2.0.0 desarrollado por Cam Davidson-Pilon, y con licencia del MIT, Copyright del 2015 se puede
encontrar en < https://github.com/CamDavidsonPilon/lifetimes > que nos proporcionará prácticamente todo el material que
necesitaremos para ésta primera aproximación.
2
Todo lo anterior unido al inicio de una nueva era en el tratamiento, monitorización y análisis de los datos,
hacen resurgir este tema como concepto clave y fácilmente alcanzable para las compañías. El futuro se
acerca, y se intuye que sólo es el comienzo de una larga e interesante andadura. Lo mejor está por venir.
2. Estado del Arte El Customer Lifetime Value (CLV) es un concepto muy estudiado tanto en el ámbito empresarial como en
el académico. Compañías como IBM, ING, Harrah´s, Capital One, LL Bean, por poner algunos ejemplos,
utilizan continuamente esta herramienta para medir el éxito de su negocio. Fue un tema que ganó
popularidad en los años 90 y ya entonces estaba siendo muy analizado en la academia.
Concretamente, el modelo en el que se basa el núcleo de este estudio, es el Modelo de Pareto/NBD en un
marco teórico propuesto por Schmittlein entre otros, en 1987, llamado también SMC.
Aunque las preguntas fundamentales serán las mismas (qué clientes son los más valiosos para la
empresa, cómo distribuir los recursos, etc.) y en muchos casos la metodología subyacente sea similar
(modelos de riesgo de retención de los clientes con distribuciones binomiales negativas), hay muchas
perspectivas de investigación abiertas.
Algunos investigadores han preferido un horizonte temporal aleatorio o CLV esperado
(Reinartz y Kumar 2000; Thomas 2001) mientras que otros han centrado sus esfuerzos en un
horizonte temporal infinito (Fader, Hardie, y Lee 2005; Gupta, Lehmann, y Stuart 2004). Gupta
y Lehmann (2005) demostraron que trabajar con el CLV esperado, suele tender a sobreestimar
los resultados significativamente.
Es importante señalar que la mayoría de las aproximaciones al modelo ignoran la competencia
por la falta de datos, al menos hasta el momento. Lo que es muy probable que empiece a
cambiar, si no lo está haciendo ya.
Por otra parte, la actualización del modelo depende de las características del tipo de mercado (o
mercados) en el que se desenvuelva el estudio. La elasticidad de la oferta y demanda, que
puedan hacer que por ejemplo los márgenes o la retención puedan variar en un periodo corto de
tiempo, harán necesario recalcular el CLV con más frecuencia.
Algunos modelos se han desarrollado en torno a la construcción de tres modelos separados para
el estudio de la adquisición, retención y margen de beneficio del cliente para la empresa.
Mientras que otros modelos combinan dos de estos tres componentes. Por ejemplo, Thomas
(2001) y Reinartz, Thomas y Kumar (2005) estudiaron la adquisición y retención del cliente en
un mismo modelo. Como veremos a continuación Fader, Hardie, y Lee (2005) estudiaron lo
que llamarán recency y frecuency por un lado, y su valor monetario por otro.
3
Nos encontraremos con los Modelos RFM (Recency, Frecuency, Monetary Value), modelos
probabilísticos, modelos econométricos, modelos de persistencia, modelos informáticos y
modelos de difusión y crecimiento de los datos (Diffussion/Growth models).
Cabe destacar los modelos informáticos o más correctamente Computer Science Models.
Mientras que los modelos paramétricos provenientes de la teoría económica (como la teoría de
la utilidad) son fáciles de entender e interpretar, pero tienen menos capacidad predictiva
demostrada. Tales son algunos modelos de riesgo, logit o probit.
Por otra parte, el desarrollo de la estadística no paramétrica para machine learning disfruta
ahora de una acogida mayor dadas las nuevas técnicas de data mining. Algunos ejemplos
pueden incluir redes neuronales, árboles de decisión, modelos spline-based tales como
generalized additive models (GAM), multivariate adaptative regresión splines (MARS) y
modelos SVM.
Está claro que la combinación de varios de ellos también es una posibilidad, en ocasiones más
que recomendable. Todos ellos darían para un análisis y comparación realmente interesante,
pero que no es objeto de esta memoria por el momento.
3. Planteamiento del Modelo
3.1. Fundamentos del Modelo CLV
Se define Customer Lifetime Value (CLV) como el valor presente de los beneficios obtenidos por
un cliente durante el ciclo de vida de su relación con la empresa. Su cálculo puede ser similar a la
contabilización de los cash flows financieros. Aunque hay dos diferencias fundamentales. En
primer lugar, el CLV se define y calcula a nivel individual, y/o por segmentos de clientes. No se
trabaja con valores medios. Además, a diferencia de los valores financieros, se incorpora a la
competencia. Existe y se calcula la posibilidad de que el cliente se vaya a la competencia en un
futuro.
Una definición genérica e introductoria en donde se visualiza bien esta similitud con los cash
flows, podría ser la siguiente (Gupta, Lehmann and Stuart 2004; Reinartz and Kumar 2003)
𝐶𝐿𝑉 = ∑(𝑝𝑡−𝑐𝑡)𝑟𝑡
(1+𝑖)𝑡𝑇𝑡=0 − 𝐴𝐶 (1a)
donde
𝑝𝑡 = precio que paga el cliente en un momento determinado del tiempo t
𝑐𝑡 = coste directo de dar servicio al cliente en un tiempo t
𝑖 = tasa de descuento de coste del capital para la empresa
𝑟𝑡 = probabilidad de que el cliente vuelva a comprar o de que esté “vivo” en un tiempo t.
𝐴𝐶 = coste de adquisición
𝑇 = horizonte temporal para estimar el CLV
4
Esta es una de las formulaciones más simples, que creemos es interesante como aproximación
conceptual. Aunque no será objeto de este análisis.
A partir de aquí nos centraremos en el Modelo de Pareto/NBD.
3.2. El Modelo de Pareto/NBD.
El modelo de Pareto/NBD, fue desarrollado por Schmittlein y otros, en 1987. También conocido
como SMC, analiza el comportamiento del consumidor en base a su consumo reiterado, en un
contexto no contractual. Del análisis se desprenden la probabilidad, condicionada a su histórico
de compras, de que un cliente permanezca activo, así como el número de transacciones esperadas
para un cliente aleatorio.
La función hipergeométrica Gaussiana es una de las partes centrales del modelo.
𝐹1(𝑎, 𝑏; 𝑐; 𝑧)=∑(𝑎)𝑗(𝑏)𝑗
(𝑐)𝑗
𝑧𝑗
𝑗!∞𝑗=0 , 𝑐 ≠ 0, −1, −2, …,
En el anexo desarrollamos esto algo más en detalle.
El modelo de Pareto/NBD está basado en cinco supuestos básicos:
(1) Mientras está activo, el número de transacciones realizadas por un cliente en un periodo de
tiempo t, se distribuye como una Poisson con media 𝜆𝑡.
(2) Por lo tanto, la probabilidad de observar x transacciones en un intervalo de tiempo (0, t] se
muestra como
𝑃(𝑋(𝑡) = 𝑥|𝜆) =(𝜆𝑡)𝑥𝑒−𝜆𝑡
𝑥! , 𝑥 = 0, 1, 2 …
Esto es equivalente a suponer que el intervalo de tiempo entre cada transacción se distribuye
como una exponencial con tasa de transacción λ,
𝑓(𝑡𝑗 − 𝑡𝑗−1|𝜆) = 𝜆𝑒−𝜆(𝑡𝑗−𝑡𝑗−1), 𝑡𝑗 > 𝑡𝑗−1 > 0,
donde 𝑡𝑗 es el momento de la compra j.
(3) La heterogeneidad en la tasa de transacción de los clientes λ, sigue una distribución Gamma
con forma (shape parameter) 𝑟 y escala (scale parameter) 𝛼.
𝑔(𝜆|𝑟, 𝛼) =𝛼𝑟𝜆𝑟−1𝑒−𝜆𝛼
Г(𝑟)
(4) Cada cliente tiene un ciclo de vida indeterminado (lifetime) de longitud 𝜏, tras el que se
considerará inactivo. El momento en el que el cliente se transforma en inactivo se distribuye
como una exponencial con tasa de abandono 𝜇.
𝑓(Г|𝜇) = 𝜇𝑒−𝜇Г
5
(5) La heterogeneidad en las tasas de abandono de los clientes sigue una distribución Gamma con
forma 𝑠 y escala 𝛽.
𝑔(𝜇 |𝑠) =𝛽𝑠𝜇𝑠−1𝑒−𝜇𝛽
Г(𝑟)
(6) La tasa de transacción 𝜆 y de abandono μ, varían independientemente de los consumidores.
Además, tanto el modelo de Pareto/NBD como el modelo BG/NBD sólo requerirán dos datos del
histórico de compras de cada cliente: la fecha de su última transacción, parámetro que llamaremos
recency, y el número de transacciones hechas en un tiempo determinado, definido como frecuency
(frecuencia de compra).
La notación será (𝑋 = 𝑥, 𝑡𝑥 , 𝑇) donde 𝑥 es el número de transacciones observadas en el periodo
(0, 𝑇] y 𝑡𝑥(0 < 𝑡𝑥 ≤ 𝑇 ) es el tiempo de la última transacción.
Usando estas dos estadísticas agregadas clave, con el modelo SMC podemos extraer conclusiones
económicas para un número significativo de KPIs (Key Performance Indicators) tales como:
𝐸[𝑋(𝑡)] como las compras esperadas en un periodo de tiempo de longitud 𝑡 para lo que es
necesario calcular el volumen de transacciones esperadas para la base de clientes a lo largo
del tiempo.
𝑃(𝑋(𝑡) = 𝑥) la probabilidad de observar 𝑥 transacciones en un periodo de tiempo de
longitud 𝑡.
𝐸[𝑌 (𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇] es el número esperado de transacciones en el periodo (𝑇, 𝑇 + 𝑡] para
un cliente con comportamiento determinado (𝑥, 𝑡𝑥 , 𝑇).
La función de probabilidad asociada con el modelo de Pareto/NBD es compleja e implica varios
análisis de la función hipergeométrica Gaussiana y exige muchos cálculos desde el punto de
vista computacional. Además, la precisión de los procesos numéricos para evaluar esta función
son claves, incluso por encima de los parámetros pudiendo causar problemas importantes
buscando optimizar la función de máxima probabilidad.
Reinartz y Kumar (2003) publicaron sus resultados sobre esta implementación, con reconocida
carga computacional utilizando técnicas de estimación de máxima verosimilitud (Standard
Maximum Likelihood Estimation o MLE).
Schmittlein y Peterson (1994) propusieron un método de estimación en tres pasos que, aunque
más simple que el MLE, es difícil de implementar y no cumple con los principios básicos del
MLE.
El modelo que se presenta a continuación es fácilmente implementable y cumple con las
condiciones probabilísticas del MLE. La estimación de los parámetros no requiere ningún
software especializado ni funciones matemáticas demasiado complejas.
6
3.3. Supuestos del Modelo BG/NBD.
Este modelo está basado en el Modelo de Pareto/NBD con la única diferencia de cómo y cuándo
determinar si un cliente está inactivo. El Modelo temporal de Pareto supone que el abandono del
cliente puede ocurrir en cualquier momento del tiempo, independientemente de las compras
realizadas.
Más formalmente, el modelo BG/NBD está basado en los siguientes cinco supuestos (el primer
y segundo supuesto son coincidentes con el modelo SMC):
(1) El número de transacciones realizadas por un cliente mientras está activo en un periodo
de tiempo t, se distribuye como una Poisson con media 𝜆𝑡.
Por lo tanto, la probabilidad de observar x transacciones en un intervalo de tiempo (0, t]
se muestra como
𝑃(𝑋(𝑡) = 𝑥|𝜆) =(𝜆𝑡)𝑥𝑒−𝜆𝑡
𝑥! , 𝑥 = 0, 1, 2 …
Esto es equivalente a suponer que el intervalo de tiempo entre cada transacción se
distribuye como una exponencial con tasa de transacción λ, por ejemplo,
𝑓(𝑡𝑗 − 𝑡𝑗−1|𝜆) = 𝜆𝑒−𝜆(𝑡𝑗−𝑡𝑗−1), 𝑡𝑗 > 𝑡𝑗−1 > 0,
donde 𝑡𝑗 es el momento de la compra j.
(2) La heterogeneidad en la tasa de transacción de los clientes, 𝜆, sigue una distribución
gamma con forma 𝑟 y escala 𝛼.
𝑓( 𝜆| 𝑟, 𝛼) =∝𝑟𝜆𝑟−1𝑒−𝜆𝛼
𝛤(𝑟) , 𝜆 > 0 (1)
(3) Después de una transacción cualquiera, un cliente se convierte en inactivo con
probabilidad 𝑝. Por lo tanto, el punto en el que un cliente abandona se distribuye a lo
largo de varias transacciones de acuerdo a una distribución geométrica (“desplazada”)
cuya función de probabilidad será
𝑃(𝑐𝑙𝑖𝑒𝑛𝑡𝑒 𝑖𝑛𝑎𝑐𝑡𝑖𝑣𝑜 𝑖𝑛𝑚𝑒𝑑𝑖𝑎𝑡𝑎𝑚𝑒𝑛𝑡𝑒 𝑑𝑒𝑠𝑝𝑢é𝑠 𝑑𝑒 𝑙𝑎 𝑐𝑜𝑚𝑝𝑟𝑎 𝑗) = 𝑝(1 − 𝑝)𝑗−1,
𝑗 = 1, 2, 3 …
(4) La heterogeneidad en p sigue una distribución de densidad beta de la forma
𝑓( 𝑝| 𝑎, 𝑏) =𝑝𝑎−1(1−𝑝)𝑏−1
𝐵(𝑎,𝑏) , 0 ≤ 𝑝 ≤ 1 (2)
donde 𝐵(𝑎, 𝑏) es la función Beta que puede expresarse en términos de funciones
Gamma:
𝐵(𝑎, 𝑏) =𝛤(𝑎) + 𝛤(𝑏)
𝛤(𝑎 + 𝑏)
7
(5) La tasa de transacción λ, y la probabilidad de abandono 𝑝 varía con independencia de
los clientes.
4. Desarrollo del modelo
4.1. Desarrollo del Modelo a nivel individual.
4.1.1. Derivación de la Función de Probabilidad.
Consideremos un cliente que ha realizado x transacciones en el periodo (0, 𝑇] ocurridas en
diferentes momentos 𝑡1, 𝑡2, … , 𝑡𝑥:
0 𝑡1 𝑡2 𝑡𝑥 𝑇
… ….
Derivaremos la función de probabilidad a nivel individual de la siguiente manera:
La probabilidad de que la primera transacción ocurra en el momento 𝑡1 tiene una
probabilidad exponencial estándar igual a 𝜆𝑒−𝜆𝑡1.
La probabilidad de que la segunda transacción ocurra en el momento 𝑡2 tiene una
probabilidad exponencial estándar igual a (1 − 𝑝)𝜆𝑒−𝜆(𝑡2−𝑡1).
Esto continúa para las siguientes transacciones hasta que:
La probabilidad de que la transacción 𝑥 ocurra en el momento 𝑡𝑥 es la probabilidad de
permanecer activo en el momento 𝑡𝑥−1 que sería igual a
(1 − 𝑝)𝜆𝑒−𝜆(𝑡𝑥−𝑡𝑥−1).
Por último, la probabilidad de no observar ninguna compra en (𝑡𝑥, 𝑇] es la probabilidad de
que el cliente permanezca inactivo en 𝑡𝑥 más la probabilidad de que permanezca activo pero
que no haya hecho compras en ese intervalo, que es igual a
𝑝 + (1 − 𝑝)𝑒−𝜆(𝑇−𝑡𝑥)
Por lo tanto,
ℒ(𝜆, 𝑝|𝑡1, 𝑡2, … , 𝑡𝑥 , 𝑇) =
𝜆𝑒−𝜆𝑡1(1 − 𝑝)𝜆𝑒𝜆(𝑡2−𝑡1) … (1 − 𝑝)𝜆𝑒𝜆(𝑡𝑥−𝑡𝑥−1). {𝑝 + (1 − 𝑝)𝑒−𝜆(𝑇−𝑡𝑥)}
= 𝑝(1 − 𝑝)𝑥−1 𝜆𝑥 𝑒−𝜆𝑡𝑥 + (1 − 𝑝)𝑥 𝜆𝑥𝑒−𝜆𝑇
Como hemos apuntado antes, para el Modelo de Pareto/NBD, tampoco se necesitarán los
momentos de las compras. Será suficiente con un sumatorio del histórico de las mismas.
(𝑋 = 𝑥, 𝑡𝑥 , 𝑇).
8
De la misma manera que el Modelo SMC, suponemos que todos los clientes están activos en el
momento del periodo de observación. Por lo tanto, la función de probabilidad para que un cliente
no haga ninguna compra en el periodo (0, 𝑇] es la recurrente función exponencial.
ℒ(𝜆|𝑋 = 0, 𝑇) = 𝑒−𝜆𝑇
Por tanto, la función de probabilidad individual será:
ℒ(𝜆, 𝑝|𝑋 = 𝑥, 𝑇) = (1 − 𝑝)𝑥 𝜆𝑥𝑒−𝜆𝑇 + 𝛿𝑥>0𝑝(1 − 𝑝)𝑥−1𝜆𝑥 𝑒−𝜆𝑡𝑥 , (3)
donde 𝛿𝑥>0 = 1 si 𝑥 > 0, en caso contrario es 0.
4.1.2. Derivación de P (X (t)=x).
Considerando las variables aleatorias 𝑋(𝑡) como el número de transacciones que ocurren en un
periodo de tiempo de longitud 𝑡 (empezando en el tiempo 0), y 𝑇𝑥 como el tiempo de la
transacción 𝑥, tenemos que 𝑋(𝑡) ≥ 𝑥 ⇔ 𝑇𝑥 ≤ 𝑡.
Derivando una expresión como 𝑃(𝑋(𝑡) = 𝑥), subrayaremos la relación existente entre el número
de eventos y los periodos entre dichos eventos.
Entonces,
𝑃(𝑋(𝑡) = 𝑥) = 𝑃(𝑐𝑙𝑖𝑒𝑛𝑡𝑒 𝑎𝑐𝑡𝑖𝑣𝑜 𝑑𝑒𝑠𝑝𝑢é𝑠 𝑑𝑒 𝑙𝑎 𝑐𝑜𝑚𝑝𝑟𝑎 𝑥) . 𝑃(𝑇𝑥 ≤ 𝑡 𝑦 𝑇𝑥+1 > 𝑡) + 𝛿𝑥>0
. 𝑃(𝑐𝑙𝑖𝑒𝑛𝑡𝑒 𝑖𝑛𝑎𝑐𝑡𝑖𝑣𝑜 𝑑𝑒𝑠𝑝𝑢é𝑠 𝑑𝑒 𝑙𝑎 𝑐𝑜𝑚𝑝𝑟𝑎 𝑥) . 𝑃(𝑇𝑥 ≤ 𝑡)
Bajo el supuesto de que el tiempo entre las transacciones se distribuye como una exponencial
𝑃(𝑇𝑥 ≤ 𝑡 𝑦 𝑇𝑥+1 > 𝑡) que es simplemente la probabilidad de Poisson en la que 𝑋(𝑡) = 𝑥 y
𝑃(𝑇𝑥 ≤ 𝑡). Por tanto,
𝑃(𝑋(𝑡) = 𝑥|𝜆, 𝑝) = (1 − 𝑝)𝑥 (𝜆𝑡)𝑥𝑒−𝜆𝑡
𝑥!+ 𝛿𝑥>0 𝑝(1 − 𝑝)𝑥−1 [1 − 𝑒−𝜆𝑡 ∑
(𝜆𝑡)𝑗
𝑗!𝑥−1𝑗=0 ] (4)
4.1.3. Derivación de E [X (t)]
Dado que el número de transacciones se distribuye como una Poisson, 𝐸[𝑋(𝑡)] es simplemente
𝜆𝑡 si el cliente está activo en 𝑡. Para un cliente que se convierte en inactivo en
𝜏 ≤ 𝑡, el número de transacciones esperadas en el periodo (0, 𝜏] es λ𝜏.
En cualquier caso, ¿cuál es la probabilidad de que un cliente llegue a ser inactivo en 𝜏?
Condicionado a λ y 𝑝,
𝑃(𝜏 > 𝑡) = 𝑃(𝑎𝑐𝑡𝑖𝑣𝑜 𝑒𝑛 𝑡| 𝜆, 𝑝) = ∑(1 − 𝑝)𝑗(𝜆𝑡)𝑗𝑒−𝜆𝑡
𝑗!
∞
𝑗=0
= 𝑒−𝜆𝑝𝑡
Esto implica que el momento del abandono se daría como 𝑔(𝜏|𝜆, 𝑝) = 𝜆𝑝𝑒−𝜆𝑝𝜏
(el modelo de Pareto considera independiente el abandono y la tasa de transacción)
Por lo tanto, el número de transacciones esperado en un periodo de longitud 𝑡 aparece como
9
𝐸(𝑋(𝑡)|𝜆, 𝑝) = 𝜆𝑡 𝑃(𝜏 > 𝑡) + ∫ 𝜆𝜏𝑔(𝜏|𝜆, 𝑝) 𝑑𝜏𝑡
0=
1
𝑝−
1
𝑝𝑒−𝜆𝑝𝑡 (5)
4.2. Desarrollo del modelo para un individuo aleatorio.
Todas las expresiones desarrolladas debajo están condicionadas a la tasa de transacción λ, y la
probabilidad de abandono 𝑝, ambas son no observadas.
Para derivar las expresiones equivalentes para un cliente elegido aleatoriamente, tomamos los
resultados esperados a nivel individual por encima de las distribuciones combinadas para λ y 𝑝,
como vemos en (1) y (2). Esto nos da los siguientes resultados.
Tomando el valor esperado de (3) por encima de la distribución de λ y 𝑝 se obtiene la siguiente
expresión de la función de probabilidad para un cliente aleatorio con histórico de compras
(𝑋 = 𝑥, 𝑡𝑥 , 𝑇):
ℒ(𝑟, 𝛼, 𝑎, 𝑏|𝑋 = 𝑥, 𝑡𝑥 , 𝑇) =
=𝐵(𝑎,𝑏+𝑥)
𝐵(𝑎,𝑏)
Г(𝑟+𝑥)𝛼𝑟
Г(𝑟)(𝛼+𝑇)𝑟+𝑥 + 𝛿𝑥>0𝐵(𝑎+1,𝑏+𝑥−1)
𝐵(𝑎,𝑏)
Г(𝑟+𝑥)𝛼𝑟
Г(𝑟)(𝛼+𝑡𝑥)𝑟+𝑥 (6)
Los cuatro parámetros del modelo BG/NBD (𝑟, 𝛼, 𝑎, 𝑏) pueden estimarse por el método de
máxima verosimilitud de la siguiente manera. Suponemos que tenemos una muestra de N
clientes, donde el cliente 𝑖 tiene 𝑋𝑖 = 𝑥𝑖, transacciones en el período (0, 𝑇], con la última
transacción que tiene lugar en 𝑡𝑥𝑖. La función de probabilidad logarítmica sería,
ℒℒ(𝑟, 𝛼, 𝑎, 𝑏) = ∑ ln[ℒ(𝑟, 𝛼, 𝑎, 𝑏|𝑋𝑖 = 𝑥𝑖 , 𝑡𝑥𝑖, 𝑇𝑖)]𝑁
𝑖=1 (7)
Esto se puede maximizar utilizando técnicas de optimización estándar.
Tomando el valor esperado de (4) por encima de la distribución de λ y 𝑝, resulta la siguiente
expresión para la probabilidad de compras observadas en un período de tiempo t:
𝑃(𝑋(𝑡) = 𝑥 | 𝑟, 𝛼, 𝑎, 𝑏) =
=𝐵(𝑎, 𝑏 + 𝑥)
𝐵(𝑎, 𝑏)
Г(𝑟 + 𝑥)
Г(𝑟)𝑥!(
𝛼
𝛼 + 𝑡)
𝑟
(𝑡
𝛼 + 𝑡)
𝑡
+𝛿𝑥>0𝐵(𝑎+1,𝑏+𝑥−1)
𝐵(𝑎,𝑏)[1 − (
𝛼
𝛼+𝑡)
𝑟
{∑Г(𝑟+𝑗)
Г(𝑟)𝑗!
𝑥−1𝑗=0 (
𝑡
𝛼+𝑡)
𝑗
}] (8)
Finalmente, tomando el valor esperado de (5) por encima de la distribución de λ y 𝑝 resulta la
siguiente expresión para un número esperado de compras en un período de tiempo de longitud t:
𝐸(𝑋(𝑡) = 𝑥 | 𝑟, 𝛼, 𝑎, 𝑏) =𝑎+𝑏−1
𝑎−1[1 − (
𝛼
𝛼+𝑡)
𝑟𝐹2 1 (𝑟, 𝑏; 𝑎 + 𝑏 − 1;
𝑡
𝛼+𝑡)] (9)
Donde 𝐹2 1 es la función hipergeométrica Gaussiana (ver anexo).
10
Advertir que esta expresión final necesita una evaluación individual para la función
hipergeométrica Gaussiana, pero es importante subrayar que este valor esperado se utiliza sólo
después de que la función de probabilidad se haya maximizado. una evaluación individual para
la función hipergeométrica Gaussiana para un conjunto dado de parámetros es relativamente
directa, y se puede acercar mucho a una serie polinomial, incluso en un entorno como el de
Microsoft Excel.
En tanto en cuanto el modelo BG/NBD se utilice en predicciones basadas en el análisis del
cliente necesitamos obtener una expresión para el valor esperado de las transacciones en un
período de tiempo futuro de longitud 𝑡 para una observación del histórico individual de los
clientes (𝑋 = 𝑥, 𝑡𝑥 , 𝑇).
La expresión final resultante sería la siguiente:
𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝑟, 𝛼, 𝑎, 𝑏) =
𝑎+𝑏+𝑥−1
𝑎+1[1−(
𝛼+𝑇
𝛼+𝑇+𝑡)
𝑟+𝑥+ 𝐹2 1(𝑟+𝑥,𝑏+𝑥;𝑎+𝑏+𝑥−1;
𝑡
𝛼+𝑇+𝑡) ]
1+𝛿𝑥>0 𝑎
𝑏+𝑥−1 (
𝛼+𝑇
𝛼+𝑡𝑥)
𝑟+𝑥 (10)
Una vez más este valor esperado requiere una evaluación individual de la función
hipergeométrica Gaussiana para cualquier cliente de interés. Es una tarea relativamente sencilla
porque es simple aritmética.
5. Aplicación empírica.
En nuestro estudio, exploraremos el rendimiento del modelo BG/NBD usando datos de las
compras de los CDs en la tienda online CDNOW. El dataset completo se enfoca en un grupo de
clientes nuevos que hicieron su primera compra en el primer cuatrimestre de 1997 hasta junio de
1998, durante los cuales 23.570 personas estudiadas se compraron cerca de 163.000 CDs en el
primer cuatrimestre del año 97 después de su primera ocasión de compra (ver Fader y Hardie
2001 para más detalles sobre este dataset4). Para los objetivos de este análisis, tomaremos sólo
una parte de esos datos.
Calibraremos el modelo usando los datos de las transacciones repetidas para la muestra de 2357
clientes sobre la primera mitad del periodo de 78 semanas y las compras predichas de las
siguientes 39. Nótese que para el cliente 𝑖(𝑖 = 1, … , 2357), ya conocemos la longitud del
periodo de tiempo durante el cual podía haber comprado (𝑇𝑖 =39-momento de la primera
4 Fader, Peter S., Bruce G. S. Hardie (2001). Forecasting repeat sales at CDNOW: A case study, Part 2 of 2. Interfaces 31
(May-June) S94-S107.
11
compra), el número de compras que ha hecho en ese periodo (𝑥𝑖) y el momento en el que repitió
su última compra (𝑡𝑥).
Es importante señalar que nos estamos centrando en el número de transacciones, de compras, no
en el número de productos (cds, en este caso), vendidos.
En nuestro notebook de Python, se analizará la actividad o inactividad del consumidor final,
basándonos en un tiempo finito: al cabo de un tiempo concreto la relación con el cliente
"morirá". El objetivo será tratar de predecir la frecuencia con la que un potencial cliente visitará
nuestra web. Estudiando el histórico de compras, trataremos de predecir la repetición de una
compra, el abandono de una aplicación, y calcular el CLTV.
Para esta primera parte se importarán las librerías necesarias más comunes tales como numpy,
spicy matplotlib y pandas. Pero antes que nada la librería lifetimes, de la que iremos hablando a
lo largo de esta memoria (ver anexo de instalación).
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
La librería Lifetimes jugará un papel fundamental en todo nuestro análisis, de la que extraemos
una muestra del dataset comentado cdnow.
from lifetimes.datasets import load_cdnow
data = load_cdnow(index_col=[0])
print data.head()
ID Frequency Recency T
1 2 30.43 38.86
2 1 1.71 38.86
3 0 0.00 38.86
4 0 0.00 38.86
5 0 0.00 38.86
Tabla 1: Muestra del dataset cdnow_customers
En la Tabla 1 observamos una pequeña muestra del dataset cdnow_customers en la que
observamos los datos con los que vamos a trabajar en esta primera parte.
La frecuencia de compra de los clientes (calculado como el total menos 1).
12
T el tiempo que lleva el cliente en la empresa, en una unidad de tiempo cualquiera
(una semana, en nuestro caso). Es igual al tiempo transcurrido entre la primera y la
última compra total.
Recency es el momento de la última compra. Es la diferencia entre la primera y la
última compra individual. Nótese que 1 compra tiene una recency de 0. Lo
notaremos como 𝑡𝑥 .
Observamos por ejemplo como en la tabla 1, el cliente 1, ha repetido 2 veces su compra,
lleva más de 38 semanas con nosotros y hace 30 semanas que no nos visita para adquirir
nada. Al contrario que el cliente 2 que hace una semana realizó su última compra.
Como se ha comentado anteriormente, utilizaremos el Modelo BG/NBD, una variación del
modelo de Pareto que implementamos con el código que sigue.
from lifetimes import BetaGeoFitter
# similar API to scikit-learn and lifelines.
bgf = BetaGeoFitter(penalizer_coef=0.0)
bgf.fit(data['frequency'], data['recency'], data['T'])
print bgf
<lifetimes.BetaGeoFitter:
fitted with 2357 subjects, r: 0.24, alpha: 4.41, a: 0.79, b: 2.43>
Comprobamos que tenemos un dataset de 2357 filas cuyos 4 parámetros clave
comentados (𝑟, 𝛼, 𝑎 𝑦 𝑏) tienen los valores que observamos arriba (0.24, 4.41, 0.79, 2.43).
Matriz de Frecuencias
A continuación, pongamos un ejemplo. Un cliente ha realizado compras durante tres semanas
seguidas, y después de eso, desaparece. Se considera que las probabilidades de que vuelva a
comprar son bajas. Por otra parte, un cliente que compra periódicamente bajo un espacio de
tiempo más dilatado, pero regular (1 vez al trimestre, por ejemplo), se considera activo.
Podemos visualizar esta relación usando la Matriz de Frecuencias, que calcula el número de
transacciones esperadas de un cliente en el próximo período, dado su recency (edad de la última
compra) y frecuencia (número de compras repetidas).
13
Figura 1: Matriz de Frecuencias
Observamos que, si un cliente ha realizado más de 25 compras, y su última compra fue cuando
llevaba 35 semanas con nosotros, entonces es uno de nuestros mejores clientes (abajo a la
derecha del gráfico). Por lo tanto, tiene muchas probabilidades de repetir su consumo
inminentemente (color rojo).
Por el contrario, se considera que nuestros clientes menos activos son aquellos que hicieron
muchas compras repetidas y desaparecen durante semanas. Como observamos en la esquina
superior derecha en color azul oscuro.
También vemos que hay una sombra residual (en azul claro a la izquierda) que representa el
cliente menos activo, pero que ha realizado alguna compra recientemente, y quizá vuelva a
comprar.
Otra matriz interesante es la que tenemos en la figura 2. En ella estudiamos la probabilidad de
que un cliente permanezca activo en base a su histórico de compras del que obtenemos su
frecuency y recency comentados.
Observamos, por ejemplo, como el color rojo indica la alta probabilidad de actividad de un
cliente ya que han comprado con frecuencia en el pasado y por otra parte ha transcurrido tiempo
desde que no nos visitan. Sin embargo, se espera su vuelta.
14
Figura 2: Matriz de frecuencias probabilidad-actividad
Ranking de clientes
A continuación, haremos una pequeña predicción en base a un histórico de compras y
construiremos con ello un ranking de clientes ordenados de menor a mayor número de
transacciones esperadas para el próximo período. Nótese que coincide con un creciente
frecuency.
ID Frequency Recency T Predicted_Purchases
509 18 35.14 35.86 0.424877
841 19 34.00 34.14 0.474738
1981 17 28.43 28.86 0.486526
157 29 37.71 38.00 0.662396
1516 26 30.96 31.00 0.710623
Tabla 2: Ranking de clientes en base a sus compras esperadas.
Observamos por ejemplo como los clientes que han hecho 26 compras, y nos han comprado
recientemente, probablemente lo vuelvan a hacer en el próximo período.
Evaluando el ajuste del modelo
Hasta el momento hemos predicho y visualizado el comportamiento de nuestros clientes, pero
ahora vamos a evaluar si nuestro modelo es bueno o no. Hay varias formas de hacerlo. Lo
primero que haremos será comparar nuestros datos con datos artificiales con los parámetros
ajustados del modelo.
15
Figura 3: Histograma para evaluar el ajuste del modelo
Se refleja claramente como los datos reales y simulados se alinean bien. Esto prueba que el
modelo funciona correctamente para todos los tipos de cliente que realizaron transacciones con
diversas frecuencias.
De datos transaccionales a datos agregados
La mayoría de las veces los datos que manejamos son transaccionales como vemos en la tabla 3,
que desplegamos desde aquí (En el anexo 3 mostramos un poco más en detalle cómo se define).
from lifetimes.datasets import load_transaction_data from lifetimes.utils import
summary_data_from_transaction_data transaction_data = load_transaction_data()
transaction_data.head()
Date ID
0 2014-03-08 00:00:00 0
1 2014-05-21 00:00:00 1
2 2014-03-14 00:00:00 2
3 2014-04-09 00:00:00 2
4 2014-05-21 00:00:00 2
Tabla 3: Datos transaccionales
Utilizaremos algunas funciones interesantes para transformar esos datos transaccionales (una
fila por compra) en datos agregados (un dataset que combine frecuencias, antigüedad del cliente
y recency).
16
Lo haremos con el siguiente código.
bgf.fit(summary['frequency'], summary['recency'], summary['T'])
# <lifetimes.BetaGeoFitter: fitted with 5000 customers, a: 1.85, alpha: 1.86, r: 0.16, b: 3.18>
Del que resultan los nuevos parámetros para el nuevo ajuste del modelo.
<lifetimes.BetaGeoFitter: fitted with 5000 subjects,
r: 0.16, alpha: 1.86, a: 1.85, b: 3.18>
Que nos ayudarán para desplegar un nuevo dataset de datos agregados.
ID Frequency Recency T
0 0 0 298
1 0 0 224
2 6 142 292
3 0 0 147
4 2 9 183
Tabla 4: Nuevos datos agregados transformados
Predicciones del cliente individual
Basándonos en el histórico de compras del cliente, haremos una predicción las futuras compras.
t = 10 #Predicción de compras para los próximos 10 periodos
individual = summary.iloc[20]
# La función de abajo es un alias de `bfg.conditional_expected_number_of_purchases_up_to_time`
bgf.predict(t, individual['frequency'], individual['recency'], individual['T'])
0.057651166220182973
En el ejemplo, la probabilidad de que un individuo vuelva a repetir la compra en base a los
nuestros parámetros comentados (t, frecuency, recency y T) es de 0.05765.
Probabilidad de actividad
Dado un histórico de compras del cliente, podemos calcular su probabilidad de estar activo, de
acuerdo al modelo que acabamos de entrenar. A continuación, el ejemplo.
from lifetimes.plotting import plot_history_alive
id = 35 # Cliente 35
days_since_birth = 200 # Con 200 días de antigüedad en relación con la empresa
sp_trans = transaction_data.ix[transaction_data['id'] == id]
plot_history_alive(bgf, days_since_birth, sp_trans, 'date')
17
Figura 5: Probabilidad de actividad de un cliente frente a sus compras efectivas.
En la figura 5 podemos observar el histórico de actividad que refleja las compras de un cliente
individual (id = 35) que lleva 200 días realizando compras en nuestra web a la vez que
visualizamos su probabilidad estimada de estar activo.
Segundo ajuste del modelo
A continuación, vamos a evaluar el rendimiento de nuestro modelo ya parametrizado.
Normalmente, la observación del sobreajuste, es decir, la falta de generalización, pasa
lógicamente por utilizar una muestra para la modelización/entrenamiento (también llamado
training o calibration en nuestro caso), distinta a la utilizada para la evaluación/prueba (test o
holdout). El ratio de acierto (o la medida que se utilice para la evaluación) obtenida en la
muestra de training o calibration (acierto aparente) se comparará con la obtenida en la muestra
de test o holdout.
Con nuestros datos transaccionales, podemos particionar el dataset en un calibration period
dataset y un dataset de validación o test (houldout dataset). Esto es importante porque
queremos comprobar el funcionamiento de nuestro modelo con datos no vistos hasta el
momento (cross-validation). A continuación, utilizamos una función para particionar el dataset
hasta las dos fechas determinadas del 2014 que vemos a continuación.
from lifetimes.utils import calibration_and_holdout_data
summary_cal_holdout = calibration_and_holdout_data(transaction_data, 'id', 'date',
calibration_period_end='2014-09-01',
observation_period_end='2014-12-31' )
print summary_cal_holdout.head()
18
A partir de aquí, vemos como particiona el dataset en dos subconjuntos con sus respectivas
recency y frecuency para nuestras pruebas. Es sólo la cabecera, pero nos sirve para visualizar lo
que hacemos. En general, se tratará de general muestras de training y test lo suficientemente
amplias como para garantizar que la evaluación en ambas es confiable.
ID Frequency_Cal Recency_Cal T_Cal Frequency_Holdout Duration_Holdout
0 0 0 177 0 121
1 0 0 103 0 121
2 6 142 171 0 121
3 0 0 26 0 121
4 2 9 62 0 121
Tabla 5: Dataset dividido en calibration period dataset y houldout dataset.
from lifetimes.plotting import plot_calibration_purchases_vs_holdout_purchases
bgf.fit(summary_cal_holdout['frequency_cal'], summary_cal_holdout['recency_cal'], summary_cal_ho
ldout['T_cal'])
plot_calibration_purchases_vs_holdout_purchases(bgf, summary_cal_holdout)
Salvando las limitaciones y el riesgo que supone la utilización de una única muestra de
entrenamiento y otra de validación, comprobamos que nuestro modelo predice bastante bien
frente a nuestros datos de prueba.
Figura 4: Evaluación de la capacidad predictiva de nuestro modelo.
En la figura 4, estamos comparando las compras reales del conjunto de test con sus compras
predichas, y evaluando si se ajustan bien. Parece que, para compras elevadas, difieren más (de la
quinta a la sexta compra), el modelo pierde capacidad predictiva.
19
Estimando el Customer Life Time Value
Hasta este momento no hemos tenido en cuenta el valor económico de cada compra y nos hemos
enfocado principalmente en la existencia de estas transacciones. Para estimar esto podemos usar
el submodelo Gamma-Gamma. Pero primero necesitamos crear datos agregados de datos
transaccionales que también contengan valores económicos de estas transacciones (por ejemplo,
beneficios o ingresos). En la tabla 6 apreciamos mejor esa transformación. Más detalles del código
asociado en el anexo.
from lifetimes.datasets import load_summary_data_with_monetary_value
summary_with_money_value = load_summary_data_with_monetary_value()
summary_with_money_value.head()
returning_customers_summary = summary_with_money_value[summary_with_money_value['frequency']>0]
returning_customers_summary.head()
Customer_id Frequency Recency T Monetary_value
1 2 30.43 38.86 22.35
2 1 1.71 38.86 11.77
6 7 29.43 38.86 73.74
7 1 5.00 38.86 11.77
9 2 35.71 38.86 25.55
Tabla 6: Nuevo dataset transformado
El submodelo Gamma-Gamma5 y el supuesto de independencia
El modelo que vamos a usar para estimar para el CLV para nuestra base de datos de clientes se
llama submodelo Gamma-Gamma, que es necesario para incluir los valores monetarios que
expondremos a continuación. El submodelo Gamma-Gamma supone que no hay relación entre
el valor monetario y la frecuencia de compra. En la práctica, vamos a comprobar primero si el
coeficiente de correlación de Pearson entre los dos vectores se aproxima a cero para poder usar
este modelo.
returning_customers_summary[['monetary_value', 'frequency']].corr()
Monetary_value Frequency
Monetary_value 1.000000 0.113884
Frequency 0.113884 1.000000
Tabla 7: Coeficiente de correlación entre el valor monetario y la frecuencia de compra.
5 Fader, Peter S., Bruce G. S. Hardie (2013). The Gamma-Gamma Model of Monetary Value <http://brucehardie.com/notes/025/>
20
Confirmamos que no hay relación entre el precio de los bienes de nuestro dataset y su frecuencia
de compra. Parece que el precio determina poco la compra. Obviamente esto sería muy
característico del tipo de bien que estudiamos. Para este caso concreto, la correlación es muy baja.
A partir de aquí, entrenaremos nuestro submodelo Gamma-Gamma y trataremos de predecir el
valor esperado medio de nuestros clientes.
from lifetimes import GammaGammaFitter
ggf = GammaGammaFitter(penalizer_coef = 0)
ggf.fit(returning_customers_summary['frequency'],
returning_customers_summary['monetary_value'])
print ggf
<lifetimes.GammaGammaFitter: fitted with 946 subjects, p: 6.25, q: 3.74, v: 15.45>
De los 2357 individuos en nuestro dataset, 946 hicieron como mínimo una compra, y es con los
que hemos trabajado para concluir que, por el método de máxima verosimilitud, los valores de
los tres parámetros de nuestro modelo (p, q, 𝛾) son (6.25, 3.74, 15.45) respectivamente. Una vez
que tenemos nuestro modelo Gamma-Gamma parametrizado, procedemos a calcular el CLV
que debe de exponerse en unidades monetarias.
print ggf.conditional_expected_average_profit(
summary_with_money_value['frequency'],
summary_with_money_value['monetary_value']
).head()
customer_id CLV
1 24.658617
2 18.911481
3 35.171002
4 35.171002
5 35.171002
Dty6pe: float64
Tabla 8: Beneficio medio esperado por cliente o CLV
En la tabla 8 obtenemos el CLV por cliente para la empresa de nuestro dataset.
Ahora ya podemos mostrar el resultado del valor medio del CLV de nuestros clientes (averange
Customer Lifetime Value) como sigue.
21
print "Expected conditional average profit: %s, Average profit: %s" % (
ggf.conditional_expected_average_profit(
summary_with_money_value['frequency'],
summary_with_money_value['monetary_value']
).mean(),
summary_with_money_value[summary_with_money_value['frequency']>0]['monetary_value'].mean()
)
Expected conditional average profit: 35.2529582528, Average profit: 35.078551797
Resultando un beneficio medio esperado por cliente de 35.25 unidades monetarias, y un
beneficio medio de 35.07 u.m. Lo que los aproxima mucho, concluyendo con la fiabilidad de la
predicción.
Para hacer una comparación entre los dos métodos, ahora vamos a calcular el CLV total usando
el método de DFC (discounted cash flows) ajustado para el coste del capital con una tasa de
descuento de 0.7.
Recordamos la primera fórmula al inicio (1a), que utilizaremos para hacer una rápida
comparación entre dos métodos muy distintos. También lo son sus resultados.
𝐶𝐿𝑉 = ∑(𝑝𝑡−𝑐𝑡)𝑟𝑡
(1+𝑖)𝑡𝑇𝑡=0 − 𝐴𝐶 (1a)
# Reajuste del modelo BG para los datos agregados con valor monetario
bgf.fit(summary_with_money_value['frequency'], summary_with_money_value['recency'], summary_with
_money_value['T'])
print ggf.customer_lifetime_value(
bgf, #Modelo a usar para predecir el número de compras futuras
summary_with_money_value['frequency'],
summary_with_money_value['recency'],
summary_with_money_value['T'],
summary_with_money_value['monetary_value'],
time=12, # meses
discount_rate=0.7
).head(10)
22
Customer_ID CLV
1 27.535073
2 3.568359
3 6.598023
4 6.598023
5 6.598023
6 210.596295
7 5.294988
8 6.598023
9 32.905050
10 6.598023
Tabla 9: CLV por el método de DFC.
En la tabla 9 observamos el Customer Lifetime Value en valores monetarios para cada cliente,
con el método del DFC. Así, observamos que hay significativas diferencias entre los valores de
unos clientes y otros. Como ya hemos ido diciendo a lo largo de toda esta memoria: no todos los
clientes son iguales.
6. Conclusiones y trabajo futuro
6.1. Conclusiones
Con un ajuste correcto, el modelo BG/NBD se presta también a una buena capacidad de
generalización para la evaluación del Customer Litetime Value, con diversas métricas
empresariales. Aunque no hay que perder de vista que la segmentación de los clientes se realiza
en base a un histórico de compras siempre, como el utilizado método RFM (Recency,
Frecuency, Monetary Value). Esta segmentación puede y en la mayoría de ocasiones está
dirigida a objetivos de marketing diferentes (Elsner y otros 2004) e implica por ello ciertas
cuestiones que hay que tener en cuenta también, tales como el sesgo de endogeneidad (Shugan
2004) y el sesgo de selección de la muestra.
A pesar de todo, es un modelo muy bueno, con poca competencia hasta la fecha en contextos no
contractuales, donde las oportunidades de transacción para los clientes son continuas, y una vez
que el cliente se convierte en inactivo, la relación con la empresa expira.
6.2. Trabajo futuro
Estas son algunas líneas abiertas sobre las que se está trabajando en torno al Customer Lifetime
Value.
Más allá de los datos transaccionales
Uno de los retos principales para esta temática serán las limitaciones de los datos
transaccionales, de los cuales las empresas coleccionan cantidades ingentes, y a los que se
debería extraer valor.
23
Por un lado, los datos transaccionales son una base muy buena para un estudio de cross-selling
en marketing, y al mismo tiempo no arrojan luz sobre las causas inherentes de ese consumo, las
motivaciones del cliente o la competencia.
Desde el business intelligence se estudia la oferta, pero, ¿es tan representativa de la demanda?
Entender las causas inherentes del consumo es la gran pregunta, y aún sin formularla, está
presente en todo momento.
Los datos de encuestas que al fin y al cabo siempre serán muestrales, son difíciles de incluir o
fusionar con datos transaccionales que son mucho más representativos. Wagner y Wedel 6 están
investigando en esa línea.
Evolución de un cliente a un portfolio de clientes
Decisiones localmente óptimas, como podrían ser la adquisición y mantenimiento del cliente, en
muchos casos son globalmente subóptimas en lo que a decisiones empresariales estratégicas se
refiere. Por ejemplo, el valor esperado del cliente demandante de servicios financieros, quizá a
priori se considere más valioso para la empresa si tiene alta propensión al riesgo. Sin embargo,
los mercados financieros valorarán más a la entidad que tenga una cartera de clientes más
diversificada.
Dhar y Glazer7 han avanzado en esta dirección. En general hay mucha documentación financiera
sobre la optimización del Portfolio. Es precisamente uno de los retos principales que se intuye
desde el principio, inherente en toda esta memoria.
Micro-modelos vs macro-modelos
La utilización conjunta de micro-modelos junto con macro-modelos presenta dificultades de
integración conjunta en cuanto a diferencia de variables, pero sobre todo de escala. Percival y
Walden8 investigan sobre esta reconciliación necesaria.
Hay mucho que añadir en este apartado, pero no será objeto de este Trabajo de Fin de Título.
Actualmente las empresas tienen una gran cantidad de datos de las operaciones con sus clientes.
Y el desarrollo de modelos para el estudio de esos datos aumenta de forma exponencial, por lo
reveladores que resultan para el estudio del comportamiento de la demanda.
6 Wagner, K & Wedel, M, de Rosa, F. & Mazzon, J.A. (2003), Cross-Selling through Database Marketing: A Mixed Data Factor Analyzer for
Data Augmentation and Prediction, International Journal of Research in Marketing, 20 (March), 45–65.
7 Dhar, Ravi and Rashi Glazer (2003), Hedging Customers, Harvard Business Review, 81 (5), 3-8. 8 Percival, D.B. and A. T. Walden (2000), Wavelet methods for Time Series Analysis. Cambridge, UK: Cambridge University Press.
24
A pesar de todo, debemos de rendirnos a las limitaciones de esos datos, que al fin y al cabo son
en su mayoría, datos de compras. Pueden resultar datos significativos en un contexto de estudio
de cross-selling para el análisis de la cesta de la compra, pero será prácticamente imposible
descubrir la casuística inherente a esas compras.
Hasta ahora los esfuerzos del Business Intelligence se han concentrado en los datos más fiables
que tenían: el estudio de sus ventas. Pero ¿qué pasa con la demanda, con el cliente? ¿Y con la
competencia? ¿Cómo se relacionan entre sí? ¿Cómo extraer, seguir y modelizar esos datos?
Para completar el puzzle, hay que entender al cliente. Y ese es un reto mucho mayor que está
sobre la mesa.
25
7. Referencias Abramowitz, M. & Stegun I.A. (eds.) (1972), Handbook of Mathematical Functions, New York: Dover
Publications.
Andrews, G. E., Askey R., & Roy R. (1999), Special Functions, Cambridge: Cambridge University Press.
Dhar, R. & Glazer R. (2003), Hedging Customers, Harvard Business Review, 81 (5), 3-8.
Elsner, R., Krafft, M. & Huchzermeier, A. (2004), Optimizing Rhenania’s direct maketing business
through dynamic multilevel modeling (DMLM) in a multicatalog environment. Marketing Sci. 23(2) 192-
206
Fader, P. S. & Hardie, B. G. (2005), A Note on Deriving the Pareto/NBD Model and Related Expressions.
http://brucehardie.com/notes/009/, 2005
Fader, P. S., Hardie, B. G., & Lee, K. L. (2005a), A Note on Implementing the Pareto/NBD Model in
MATLAB. http://brucehardie.com/notes/008/, 2005c.
Fader, P. S., Hardie, B. G., & Lee, K. L. (2003), “Counting Your Customers” the Easy Way: An
Alternative to the Pareto/NBD Model, Marketing Science, 24(2):275-284, 2005b.
Fader, P. S. & Hardie, B. G. (2001), Forecasting repeat sales at CDNOW: A case study, Part 2 of 2.
Interfaces 31 (May-June) S94-S107.
Fader, P. S. & Hardie, B. G. (2013). The Gamma-Gamma Model of Monetary Value.
<http://brucehardie.com/notes/025/>
Fader, P. S., Hardie, B. G., & Lee, K. L. (2005), RFM and CLV: Using iso-value curves for customer
base analysis. Journal of Marketing Research, 42(4), 415-430.
Glady, N., Baesens B. & Croux C. A modified Pareto/NBD approach for predicting customer lifetime
value. Departament of Decision Sciences and Information Management. Faculty of Economics and
Applied Economics. Katholieke Universiteit Leuven.
Gupta, S., Hassens, D. Hardie, B. & others (2005), Modeling Customer Lifetime Value. Journal of
Service Research, Vol. 9, No. 2, November 2006 139-155.
Gupta, S. & Lehmann, D. R. (2005), Managing Customers as Investments. Philadelphia: Wharton School
Publishing.
McCarthy, D. & Wadsworth E. (2014), Buy ’Til You Die - A Walkthrough.
26
Reinartz, W. & Kumar, V. (2000), On the profitability of long-life customers in a non-contractual setting:
An empirical investigation and implications for marketing. J. Marketing 64 (October) 17-35.
Reinartz, W. & Kumar, V.(2003), The Impact of Customer Relationship Characteristics on
Profitable Lifetime Duration. J. Marketing 67 (January) 77-99.
Reinartz, W., Thomas, J. & Kumar, V. (2005), Balancing Acquisition & Retention Resources to
Maximize Customer Profitability. Journal of Marketing, 69 (1), 69-79.
Schmittlein, D. C., Morrison, D.G. & Colombo, R. (1987), Counting Your Customers: Who Are They
and What Will They Do Next? Management Science, Vol. 33, No. 1 (Jan., 1987), pp. 1–24.
Shugan, S. M. (2004), Endogeneity in marketing decision models. Marketing Sci. 23(1) 1-3.
Thomas, J. (2001), A Metodology for Linking Customer Acquisition to Customer Retention, Journal
of Marketing Research, 38 (2), 262-68.
Wagner, K. Ramaswami, S. & Srivastava R. (1991), Applying Latent Trait Analysis in the Evaluation
of Prospects for Cross-Selling of Financial Services, International Journal of Research in Marketing,
8, 329-49.
Wagner, K & Wedel, M. (2003), List Augmentation with Model Based Multiple Implementation: A
Case of Study Using a Mixed- Outcome Factor Model. Statistica Neerlandica, 57 (1), 46-57.
Wagner, K & Wedel, M, de Rosa, F. & Mazzon, J.A. (2003), Cross-Selling through Database Marketing:
A Mixed Data Factor Analyzer for Data Augmentation and Prediction, International Journal of Research
in Marketing, 20 (March), 45–65.
27
8. Anexos
8.1. Manual de instalación
La instalación de la librería lifetimes, previa a la ejecución del notebook de Python con el que se
han trabajado estos resultados, se realiza desde el terminal en Linux con el comando: pip install lifetimes
A partir de aquí, su ejecución no debería de plantear demasiados problemas funcionando bien
para las diversas versiones de Python.
8.2. Manual del programador
Agradecemos y señalamos con especial énfasis el código de Lifetimes-0.2.0.0 desarrollado por
Cam Davidson-Pilon, y con licencia del MIT, Copyright del 2015, que nos ha posibilitado el
despliegue del notebook de Python de nuestro modelo.
Es un código largo, pero a la vez limpio y directo, en el que se puede leer si cabe con más
claridad que el propio planteamiento matemático, que en ocasiones puede resultar denso. He
aquí una pequeña muestra de ese código. Destacamos algunas partes interesantes.
summary_data_from_transaction_data transformará datos transaccionales con determinada forma
customer_id, datetime [, monetary_value], a datos de la forma
customer_id, frequency, recency, T [, monetary_value].
Lo vemos con algunos comentarios del autor.
def summary_data_from_transaction_data(transactions, customer_id_col, datetime_col, monetary_val
ue_col=None, datetime_format=None,
observation_period_end=datetime.today(), freq='D'):
¨Parameters:
transactions: a Pandas DataFrame.
customer_id_col: the column in transactions that denotes the customer_id
datetime_col: the column in transactions that denotes the datetime the purchase was made.
monetary_value_col: the columns in the transactions that denotes the monetary value of the transaction
Optional, only needed for customer lifetime value estimation models.
observation_period_end: a string or datetime to denote the final date of the study. Events
after this date are truncated.
datetime_format: a string that represents the timestamp format. Useful if Pandas can't understand
the provided format.
freq: Default 'D' for days, 'W' for weeks, 'M' for months... etc. Full list here:
http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects ¨
observation_period_end = pd.to_datetime(observation_period_end, format=datetime_format).to_p
eriod(freq)
# Etiqueta todas las transacciones repetidas
repeated_transactions = find_first_transactions(
transactions,
28
customer_id_col,
datetime_col,
monetary_value_col,
datetime_format,
observation_period_end,
freq
)
# Cuenta todos los pedidos por cliente.
customers = repeated_transactions.groupby(customer_id_col, sort=False)[datetime_col].agg(['m
in', 'max', 'count'])
# Al restar uno del “count”, se ignora el primer pedido del cliente
customers['frequency'] = customers['count'] - 1
customers['T'] = (observation_period_end - customers['min'])
customers['recency'] = (customers['max'] - customers['min'])
summary_columns = ['frequency', 'recency', 'T']
if monetary_value_col:
# Crea un índice de todas las compras iniciales
first_purchases = repeated_transactions[repeated_transactions['first']].index
#Por “nan” el valor monetario de las primeras compras, se excluirá del cálculo del valor medio.
repeated_transactions.loc[first_purchases, monetary_value_col] = np.nan
customers['monetary_value'] = repeated_transactions.groupby(customer_id_col)[monetary_va
lue_col].mean().fillna(0)
summary_columns.append('monetary_value')
return customers[summary_columns].astype(float)
En otro apartado, también vemos como importa los modelos que ya hemos visto que utilizamos
para nuestro análisis: Beta-Geometric, Gamma-Gamma y el Modelo de Pareto/NBD.
from .estimation import BetaGeoFitter, ParetoNBDFitter, GammaGammaFitter, ModifiedBetaGeoFitter
from .version import __version__
__all__ = ['BetaGeoFitter', 'ParetoNBDFitter', 'GammaGammaFitter', 'ModifiedBetaGeoFitter']
Por ejemplo, para nuestro modelo Beta Geometric comentado lo escribe así:
def beta_geometric_nbd_model(T, r, alpha, a, b, size=1): # Parámetros
"""
Generate artificial data according to the BG/NBD model.
Parameters:
T: scalar or array, the length of time observing new customers.
r, alpha, a, b: scalars, represening parameters in the model. See [1]
size: the number of customers to generate
Returns:
29
DataFrame, with index as customer_ids and the following columns:
'frequency', 'recency', 'T', 'lambda', 'p', 'alive', 'customer_id'
"""
if type(T) in [float, int]:
T = T * np.ones(size)
else:
T = np.asarray(T)
probability_of_post_purchase_death = stats.beta.rvs(a, b, size=size)
lambda_ = stats.gamma.rvs(r, scale=1. / alpha, size=size)
columns = ['frequency', 'recency', 'T', 'lambda', 'p', 'alive', 'customer_id']
df = pd.DataFrame(np.zeros((size, len(columns))), columns=columns)
for i in range(size):
p = probability_of_post_purchase_death[i]
l = lambda_[i]
times = []
next_purchase_in = stats.expon.rvs(scale=1. / l)
alive = True
while (np.sum(times) + next_purchase_in < T[i]) and alive:
times.append(next_purchase_in)
next_purchase_in = stats.expon.rvs(scale=1. / l)
alive = np.random.random() > p
times = np.array(times).cumsum()
df.ix[i] = len(times), np.max(times if times.shape[0] > 0 else 0), T[i], l, p, alive, i
return df.set_index('customer_id')
El Modelo de Pareto/NBD sería
def pareto_nbd_model(T, r, alpha, s, beta, size=1):
"""
Generate artificial data according to the Pareto/NBD model.
Parameters:
T: scalar or array, the length of time observing new customers.
r, alpha, s, beta: scalars, representing parameters in the model. See [2]
size: the number of customers to generate, equal to size of T if T is
an array.
Returns:
DataFrame, with index as customer_ids and the following columns:
'frequency', 'recency', 'T', 'lambda', 'mu', 'alive', 'customer_id'
"""
if type(T) in [float, int]:
T = T * np.ones(size)
else:
T = np.asarray(T)
30
lambda_ = stats.gamma.rvs(r, scale=1. / alpha, size=size)
mus = stats.gamma.rvs(s, scale=1. / beta, size=size)
columns = ['frequency', 'recency', 'T', 'lambda', 'mu', 'alive', 'customer_id']
df = pd.DataFrame(np.zeros((size, len(columns))), columns=columns)
for i in range(size):
l = lambda_[i]
mu = mus[i]
time_of_death = stats.expon.rvs(scale=1. / mu)
times = []
next_purchase_in = stats.expon.rvs(scale=1. / l)
while np.sum(times) + next_purchase_in < min(time_of_death, T[i]):
times.append(next_purchase_in)
next_purchase_in = stats.expon.rvs(scale=1. / l)
times = np.array(times).cumsum()
df.ix[i] = len(times), np.max(times if times.shape[0] > 0 else 0), T[i], l, mu, time_of_
death > T[i], i
return df.set_index('customer_id')
Aquí están los datasets que se han utilizado.
import lifetimes.estimation as estimation
from lifetimes.datasets import load_cdnow, load_summary_data_with_monetary_value
cdnow_customers = load_cdnow()
cdnow_customers_with_monetary_value = load_summary_data_with_monetary_value()
Todo esto y más, está disponible en la librería Lifetimes.
8.3. Apéndice matemático
En el siguiente apéndice, derivaremos las expresiones para 𝐸[𝑋(𝑡)] y 𝐸[𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇]. El
elemento principal de estas derivadas es la integral de Euler para la función hipergeométrica
Gaussiana:
𝐹2 1(𝑎,𝑏;𝑐;𝑧) =1
B(b,c−b)∫ 𝑡𝑏−1(1 − 𝑡)𝑐−𝑏−11
0(1 − 𝑧𝑡)−𝑎𝑑𝑡 , 𝑐 > 𝑏.
8.3.1. Derivada de 𝑬[𝑿(𝒕)]
Para llegar a esta expresión, para un cliente elegido aleatoriamente, necesitaremos calcular antes
el valor esperado de la ecuación (5) en las distribuciones de λ y 𝑝.
En primer lugar, la esperanza con respecto a λ resulta
31
𝐸[𝑋(𝑡)| 𝑟, 𝛼, 𝑝] =1
𝑝−
𝛼𝑟
𝑝(𝛼 + 𝑝𝑡)𝑟
El próximo paso será obtener la esperanza de lo anterior respecto a 𝑝. Primero calculamos,
∫1
𝑝 𝑝𝑎−1(1 − 𝑝)𝑏−1
𝐵(𝑎, 𝑏)𝑑𝑝 =
𝑎 + 𝑏 − 1
𝑎 − 1
1
0
A continuación, deducimos
∫𝛼𝑟
𝑝(𝛼 + 𝑝𝑡)𝑟
𝑝𝑎−1(1 − 𝑝)𝑏−1
𝐵(𝑎, 𝑏)
1
0
𝑑𝑝 = 𝛼𝑟1
𝐵(𝑎, 𝑏)∫ 𝑝𝑎−2(1 − 𝑝)𝑏−1(𝛼 + 𝑝𝑡)−𝑟𝑑𝑝
1
0
,
Si tenemos en cuenta que 𝑞 = 1 − 𝑝 (que implica que 𝑑𝑝 = −𝑑𝑞), entonces,
= (𝛼
𝛼 + 𝑡)
𝑟 1
𝐵(𝑎, 𝑏)∫ 𝑞𝑏−1(1 − 𝑞)𝑎−2 (1 −
𝑡
𝛼 + 𝑡 𝑞)
−𝑟
𝑑𝑝 1
0
Recordando que la integral de Euler para la función hipergeométrica Gaussiana es
= (𝛼
𝛼 + 𝑡)
𝑟 𝐵(𝑎 − 1, 𝑏)
𝐵(𝑎, 𝑏)𝐹2 1 (𝑟, 𝑏; 𝑎 + 𝑏 − 1;
𝑡
𝛼 + 𝑡)
Se deduce que,
𝐸(𝑋(𝑡)|𝑟, 𝛼, 𝑎, 𝑏) =𝑎 + 𝑏 − 1
𝑎 − 1[1 − (
𝛼
𝛼 + 𝑡)
𝑟
] 𝐹2 1 (𝑟, 𝑏; 𝑎 + 𝑏 − 1;𝑡
𝛼 + 𝑡)
8.3.2. Derivada de 𝑬(𝒀(𝒕)|𝑿 = 𝒙, 𝒕𝒙, 𝑻)
Consideramos que la variable aleatoria 𝑌(𝑡) representa el número de transacciones realizadas en
un periodo (𝑇, 𝑇 + 𝑡]. El objetivo será calcular la esperanza condicionada 𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥, 𝑇)
al número de transacciones esperadas en el periodo (𝑇, 𝑇 + 𝑡] para un cliente con un historial
de compras 𝑋 = 𝑥, 𝑡𝑥 , 𝑇.
Si el cliente está activo en el periodo 𝑇, se deduce de la fórmula (5) en la que,
𝐸(𝑌(𝑡)|𝜆, 𝑝) =1
𝑝−
1
𝑝𝑒−𝜆𝑝𝑡 (A1)
¿Cuál es la probabilidad de que un cliente esté activo en 𝑻?
Dado nuestro supuesto de que todos los clientes están activos en el principio del periodo
observado, un cliente no puede abandonar antes de haber hecho su primera compra; por tanto,
𝑃(𝑐𝑙𝑖𝑒𝑛𝑡𝑒 𝑎𝑐𝑡𝑖𝑣𝑜 𝑒𝑛 𝑇|𝑋 = 0, 𝑇, 𝜆, 𝑝) = 1
Para el caso en el que las compras se hicieron en el periodo (0, 𝑇], la probabilidad de que un
cliente con un histórico de compras (𝑋 = 𝑥, 𝑡𝑥 , 𝑇) aun esté activo en 𝑇, condicionado a λ y 𝑝, es
simplemente la probabilidad de que no abandonara en 𝑡𝑥 y de que no hiciera ninguna compra en
32
(𝑡𝑥 , 𝑇], dividida por la probabilidad de no hacer compras en el mismo periodo. Recordando que
esta segunda probabilidad es simplemente la probabilidad de que un cliente se convierta en
inactivo en 𝑡𝑥, más la probabilidad de que permanezca activo pero que no haya hecho compras
en ese intervalo, obtenemos
𝑃(𝑐𝑙𝑖𝑒𝑛𝑡𝑒 𝑎𝑐𝑡𝑖𝑣𝑜 𝑒𝑛 𝑇|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝜆, 𝑝) =(1 − 𝑝)𝑒−𝜆(𝑇−𝑡𝑥)
𝑝 + (1 − 𝑝)𝑒−𝜆(𝑇−𝑡𝑥) .
Multiplicando lo anterior por (1−𝑝)𝑥−1𝜆𝑥𝑒−𝜆𝑡𝑥
(1−𝑝)𝑥−1𝜆𝑥𝑒−𝜆𝑡𝑥 , obtenemos
𝑃(𝑐𝑙𝑖𝑒𝑛𝑡𝑒 𝑎𝑐𝑡𝑖𝑣𝑜 𝑒𝑛 𝑇|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝜆, 𝑝) =(1−𝑝)𝑥𝜆𝑥𝑒−𝜆𝑇
ℒ(𝜆, 𝑝|𝑋 = 𝑥, 𝑡𝑥 , 𝑇) , (A2)
donde ℒ(𝜆, 𝑝|𝑋 = 𝑥, 𝑡𝑥, 𝑇) proviene de (3).
(Obsérvese que cuando 𝑥 = 0, la expresión obtenida en (A2) es igual a 1.)
Multiplicando (A1) y (A2), obtenemos
𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝜆, 𝑝)
=(1−𝑝)𝑥𝜆𝑥𝑒−𝜆𝑇 (
1
𝑝−
1
𝑝𝑒−𝜆𝑝𝑡
𝑝)
ℒ(𝜆, 𝑝|𝑋 = 𝑥, 𝑡𝑥, 𝑇)
=𝑝−1(1−𝑝)𝑥𝜆𝑥𝑒−𝜆𝑇−𝑝−1(1−𝑝)𝑥𝜆𝑥𝑒−𝜆(𝑇+𝑝𝑡)
ℒ(𝜆, 𝑝|𝑋 = 𝑥, 𝑡𝑥, 𝑇) . (A3)
(Nótese que esto se reduce a (A1) cuando 𝑥 = 0. De este resultado se desprende la idea de que
un cliente que no hizo ninguna compra en el periodo (0, 𝑇], se asume como activo en el
momento 𝑇).
Como la tasa de transacción 𝜆 y la probabilidad de abandono 𝑝 son inapreciables,
calculamos la esperanza 𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇) para un cliente aleatorio, tomando el valor
esperado de (A3) en la distribución de λ y 𝑝 y actualizándolo con la nueva información de
𝑋 = 𝑥, 𝑡𝑥 , 𝑇:
𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝑟, 𝛼, 𝑎, 𝑏)
= ∫ ∫ 𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝜆, 𝑝)∞
0
1
0· 𝑓(𝜆, 𝑝|𝑟, 𝛼, 𝑎, 𝑏, 𝑋 = 𝑥, 𝑡𝑥 , 𝑇)𝑑𝜆𝑑𝑝 . (A4)
Por el teorema de Bayes, la siguiente distribución de λ y 𝑝 sería
𝑓(𝜆, 𝑝|𝑟, 𝛼, 𝑎, 𝑏, 𝑋 = 𝑥, 𝑡𝑥, 𝑇)
=ℒ(𝜆, 𝑝|𝑋 = 𝑥, 𝑡𝑥, 𝑇)𝑓(𝜆,𝑝|𝑋=𝑥,𝑡𝑥,𝑇)𝑓(𝑝|𝑎,𝑏)
ℒ(𝑟, 𝛼, 𝑎, 𝑏|𝑋 = 𝑥, 𝑡𝑥, 𝑇) . (A5)
33
Sustituyendo (A3) y (A5) en (A4), obtenemos
𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝑟, 𝛼, 𝑎, 𝑏) =𝐴−𝐵
ℒ(𝑟, 𝛼, 𝑎, 𝑏|𝑋 = 𝑥, 𝑡𝑥, 𝑇) (A6)
Donde
𝐴 = ∫ ∫ 𝑝−1(1 − 𝑝)𝑥𝜆𝑥𝑒−𝜆𝑇𝑓(𝜆|𝑟, 𝛼)∞
0
1
0
𝑓(𝑝|𝑎, 𝑏)𝑑𝜆𝑑𝑝
=𝐵(𝑎−1,𝑏+𝑥)
𝐵(𝑎,𝑏)
𝛤(𝑟+𝑥)𝛼𝑟
𝛤(𝑟)(𝛼+𝑇)𝑟+𝑥 (A7)
Y
𝐵 = ∫ ∫ 𝑝−1(1 − 𝑝)𝑥𝜆𝑥𝑒−𝜆(𝑇+𝑝𝑡)𝑓(𝜆|𝑟, 𝛼)∞
0
1
0
𝑓(𝑝|𝑎, 𝑏)𝑑𝜆𝑑𝑝
= ∫𝑝𝑎−2(1 − 𝑝)𝑏+𝑥−1
𝐵(𝑎, 𝑏) {∫
𝛼𝑟𝜆𝑟+𝑥−1𝑒−𝜆(𝛼+𝑇+𝑝𝑡)
𝛤(𝑟) 𝑑𝜆
∞
0
} 𝑑𝑝1
0
=𝛤(𝑟 + 𝑥)𝛼𝑟
𝛤(𝑟)𝐵(𝑎, 𝑏)∫ 𝑝𝑎−2(1 − 𝑝)𝑏+𝑥−1(𝛼 + 𝑇 + 𝑝𝑡)−(𝑟+𝑥)𝑑𝑝
1
0
Si se considera que 𝑞 = 1 − 𝑝 (que implica que 𝑑𝑝 = −𝑑𝑞)
=𝛤(𝑟 + 𝑥)𝛼𝑟
𝛤(𝑟)𝐵(𝑎, 𝑏)(𝛼 + 𝑇 + 𝑡)𝑟+𝑥 · ∫ 𝑞𝑏+𝑥−11
0
(1 − 𝑞)𝑎−2 (1 −𝑡
𝛼 + 𝑇 + 𝑡𝑞)
−(𝑟+𝑥)
𝑑𝑞
junto con la integral de Euler para la función hipergeométrica Gaussiana,
=𝐵(𝑎−1,𝑏+𝑥)
𝐵(𝑎,𝑏)
𝛤(𝑟+𝑥)𝛼𝑟
𝛤(𝑟)(𝛼+𝑇)𝑟+𝑥 · 𝐹2 1 (𝑟 + 𝑥, 𝑏 + 𝑥; 𝑎 + 𝑏 + 𝑥 − 1;𝑡
𝛼+𝑇+𝑡) . (A8)
Sustituyendo (6), (A7) y (A8) en (A6) y simplificando, obtenemos
𝐸(𝑌(𝑡)|𝑋 = 𝑥, 𝑡𝑥 , 𝑇, 𝑟, 𝛼, 𝑎, 𝑏)
𝑎 + 𝑏 + 𝑥 − 1𝑎 − 1 [1 − (
𝛼 + 𝑇𝛼 + 𝑇 + 𝑡)
𝑟+𝑥
𝐹2 1 (𝑟 + 𝑥, 𝑏 + 𝑥; 𝑎 + 𝑏 + 𝑥 − 1;𝑡
𝛼 + 𝑇 + 𝑡)]
1 + 𝛿𝑥>0𝑎
𝑏 + 𝑥 − 1(
𝛼 + 𝑇𝛼 + 𝑡𝑥
)𝑟+𝑥 .
Dado que el objeto de esta memoria no es el desarrollo matemático, les instamos a que
completen sus dudas si las hubiere, en las notas más completas de este desarrollo concreto de
Fader y Hardie9.
9 Fader, Peter S. and Bruce G.S. Hardie (2005), A Note on Deriving the Pareto/NBD Model and Related Expressions.
http://brucehardie.com/notes/009/, 2005
top related