R- MBD, ML Problem 2, Logistic Regression. Predicting probability of selling

Práctica 2- MBD, Regresión logística

Parte 1) Problema a resolver

Uno de los elementos de la estrategia de Márketing de cualquier entidad financiera es la distribución, que trata de informar al usuario de los nuevos productos y servicios en unas condiciones que maximicen las opciones de adquisición. El desarrollo y aplicación de la segmentación de clientes, es una condición necesaria para competir adecuadamente en los diferentes ámbitos que la entidad financiera haya definido como mercado objetivo.

El telemarketing es una de las múltiples vías empleadas por las entidades financieras para ofrecer sus productos. Estas llamadas tienen unos costes de personal y de consumo que hacen primordial una buena selección de los individuos a los cuáles dirigir la venta. La entidad bancaria Just-Your-Bank (JYK) tiene el propósito de reducir dichos costes reduciendo el número de llamadas realizadas a aquellos clientes con pocas opciones de contractar el producto ofrecido.

El objetivo de esta práctica es predecir la probabilidad que un cliente al cual se realiza la llamada acepte el producto que se le ofrece.

Datos

Se entregarán dos conjuntos de datos con registros de clientes de JYK a los que se les realizó una llamada para vender un producto concreto:

  1. Datos de entrenamiento. Contendrán la variable respuesta (contrató o no contrató el producto)
  2. Datos test. No contendrán la variable respuesta y ésta deberá predecirse basándose en los datos históricos del conjunto de entrenamiento.

Las variables comunes que contienen ambos juegos son:

 

Características del cliente

id: identificador del cliente

age: edad

job: tipo de trabajo (admin., blue-collar, entrepreneur, housemaid, management, retired, self-employed, services, student, technician, unemployed, unknown)

marital: estado civil (divorced, married, single, unknown)

education: nivel de estudios (basic.4y, basic.6y, basic.9y, high.school, illiterate, professional.course, university.degree, unknown)

default: ¿es moroso? (no,yes,unknown)

housing: ¿tiene hipoteca? (no,yes,unknown)

loan: ¿tiene un préstamo personal? (no,yes,unknown)

 

Características de la llamada

contact: tipo de teléfono (cellular, telephone)

month: mes

day_of_week: día de la semana (mon, tue, wed, thu, fri)

 

Otros atributos

campaign: número de contactos realizados esta campaña para este cliente (incluyendo el actual)

pdays: número de días que han pasado desde que el cliente fue contactado por última vez para una campaña previa (999 significa que no fue contactado previamente)

previous: número de llamadas realizadas a este cliente antes de esta campaña

poutcome: resultado de la anterior campaña (failure, nonexistent, success)

 

Indicadores del contexto social y económico

emp.var.rate: indicador de la tasa de empleo (cuatrimestral)

cons.price.idx: IPC (mensual)

cons.conf.idx: Índice de confianza del consumidor (mensual)

euribor3m: euribor a 3 meses (diario)

nr.employed: número de empleados (cuadrimestral)

 

Variable respuesta (sólo en el juego de entrenamiento):

Y: ¿Se suscribió el cliente al depósito? (yes,no)

Evaluación

Se basará en el AUC (área bajo la curva ROC) del modelo aplicado sobre la prueba test.

Donde:

TPR es la proporción de verdaderos positivos

FPR es la proporción de falsos positivos

 

Se obtendrá una puntuación más alta cuanto mayor sea este estadístico. Adicionalmente se valorará:

  1. La parsimonia del modelo
  2. Los criterios de selección del modelo
  3. La presentación de los resultados

 

Parte 2: Estudio estadístico

Objetivo: Entrenar un modelo a partir de los datos de entrenamiento (training) con el objetivo predecir el valor de salida (y= exito de la campaña / adquisición del depósito) en los datos de test (testing – test validity and model accuracy).

2.1 Introducción conceptos estadísticos necesarios:

Para ello realizaremos un análisis estadístico basado en la regresion logística. Éste modelo predice a partir de un modelo diseñado con los coeficientes estimados para cada variable considerada en el modelo el valor de la variable salida o a predecir.

La variable salida predicha en la regresión logística no es normal, sino dicotómica ya que sólo puede tener dos valores posibles.

Función link

Transormación que se le aplica a la probabilidad de éxito (Π) para obtener valores entre -∞ y +∞.

  • La probabilidad de éxito (Π) se mueve en el intervalo [0,1].
  • Odd: (probabilidad éxito / probabilidad fracaso);
    • Odd: Π / (1- Π) = resultado entre [0, +∞].
  • Aplicando el logaritmo obtenemos lo deseado:
    • Función Link: log(Π / (1- Π)) = [-∞, +∞].

 

 

  1. Así pues, f(x) = log(x/(1-x) ) se denomina función logit.
  2. Al aplicar la función logit a una probabilidad el resultado se denomina logodd (logaritmo de odd)

Así pues, el modelo a ajustar será (en R se calcula con la función “glm” con el parámetro “family=binomial”:

Los parámetros se estiman por el método de máxima verosimilitud, asumiendo que la variable respuesta sigue una distribución binomial, maximizando el valor de los parámetros que maximicen la probabilidad de haber observado esos datos.

En caso que se desee conocer la probabilidad para unas variables predicotras una vez estimado el modelo (con sus coeficientes), se tiene que deshacer la transformación:

Ejemplo externo de cómo interpretar los datos predichos por un modelo:

R call (Y à prediction à will payo r not the loan):

glm(formula=y ~ status+ duration+age…., family= binomial, data = datos)

  • Variable “duration” (numérica/meses)
    • Deshacemos la transformación del valor “estimate” (estimado)

e^(-0.0282) = 0.97   –>

 

  • Variable “status >=200 DM” (categórica):
    • Deshacemos la transfomación del valor “estimate”

e^(1.382) = 4.00 –>

Evaluar capacidad predicción modelo:

El AUC (área bajo la curva ROC) del modelo aplicado sobre la prueba test.

Donde:

TPR es la proporción de verdaderos positivos

FPR es la proporción de falsos positivos

 

Para curvas más abombadas, o sea, para áreas bajo la curva más grandes à mejor capacidad predictiva del modelo

Para mayores AUC, mejor será la predicción del modelo:

  • AUC = 1 –> diagnostico perfecto
  • AUC = 0.5 –> discriminación al azar
    • [0.5, 0.6) –> Discriminación mala.
    • [0.6, 0.75) –> Discriminación regular.
    • [0.75, 0.9) –> Discriminación buena.
    • [0.9, 1) –> Discriminación muy buena.

2.2 Diseño del modelo (training) y su testeado (testing)

 2.2.1 PARTE 1: construcción del modelo (training)

Borrar objetos en memoria memoria

 

Cargar los datos que se utilizaran para entrenar el modelo ( ca 80%)


  1.  

    Hacer descriptiva para observar si hay que limpiar algún dato (i.e: eliminar campo no útil o tratar valores NA

 

 

  1. Después de leer 999 como NA, vemos que pdays tiene el 96% de NA y la eliminamos

 

  1. Hacemos una descriptiva bivariante para las variables categóricas y como se relacionan con el valor salida ( seleccionamos la posición de las variables categóricas)

 

 

  1. Plot con las variables categóricas y la respuesta

 

Observando como se pueden agrupar las variables, las agrupamos en el menor número de variables posibles dentro de lo razonable:

 

  1. A partir de este mosaicplot agrupamos los trabajos en el menor número de categorías razonables, creamos una variable job2 con solo 2 categorias:

 

 

  1. Miramos el modelo ajustado para la variable educación y agrupamos las que mayor similitud en efecto y semántica tienen: basic6y y basic.9y tienen un valor estimado parecido

 

  1. La variable default tiene una categoría sin individuos que hayan comprado. La juntamos esta categoría con otra obteniendo 2 categorias.

 

  1. Creamos otra variable month2 para agrupar en 2 grupos similares

 

  1. Descriptiva bivariante para variables numericas . Vamos a analizar como influye la variabilidad de las variables numéricas en la aceptar o no el deposito.

Creamos un vector (var.num) que contenga la posicion de todas las variables numéricas o enteras

 

  1. Usamos la función cdplot para dibujar las densidades de todas las variables numéricas con la respuesta

 

Conclusiones:

  • Age: entre 25 y 55 años la probabilidad de no adquisición (rechazo) esta por encima del 80%. En cambio, entre 60 y 90 se encuentra la probabilidad de aceptación incluso hasta el 50% en algunos tramos.
  • Number of campaingns: vemos que la probabilidad más alta de aceptación están en las primeras campañas. Cuentas más campañas se realizan menor es la probabilidad incluso prácticamente nula si el número de campañas es superior a 17, por lo que para ahorrar costes no se debería intentar más pasadas 17 veces.

 

 

  • Previous: indica numero de contactos realizados a un cliente previos a esta campaña. Vemos que entre 2 y 5 contactos obtienen la mayor tasa de éxito.
  • var.rate: en valores negativos de la tasa de empleo se obtiene mayor éxito. Para valores positivos o cercanos a cero la tasa de éxito es casi nula, así que una tasa negativa seria beneficiosa para obtener clientes que compren el deposito.
  • Price index: Tasas entre[92.5, 93] y [94, 94.3] obtienen más éxito.
  • Consumer confidence index: Parece ser que valores más cercanos al 0 tienen mejor éxito.

 

  • Euribor: entre 2 y 3 obtiene más éxito.
  • employed: cuanto más grande, menos probabilidad , o sea, una cantidad menor beneficia para obtener el objetivo. Inversamente proporcional a nuestro objetivo.

 

  1. Estimamos el modelo con todas las variables

 

  1. Selecciona automáticamente las variables relevantes con step

 

Vemos que muchas de las variables han sido eliminadas del modelo , por lo que las contamos como no relevantes para la predicción. I.e: age, y loan (ésta parecía no ser relevante al realizar el análisis bivariante con el grafico anteriormente, ya que todos sus valores obtenían resultado similar).

  1. Validación. Instalamos la siguiente librería

 

  1. Realiza el test de Hosmer-Lemeshow

 

Observamos que el test de Hosmer and Lemeshow falla. No obstante era de esperar en volúmenes de datos grandes.

Así pues, vamos a realizar una validación visual para validar el modelo.

 

  1. Dividimos los valores predichos en deciles

 

  1. Dibujamos los efectivos predichos vs los esperados en cada cuantil

 

Tras dividir los datos test en diez grupos, el análisis visual sobre los valores predichos / expected (barras negras) y los reales/ observed extraídos de los datos test (barra negra), vemos que la predicción se acerca mucho al valor real básicamente para todos los diez grupos en que se han dividido las observaciones.

 

19,20. Calculamos el OR de contactar al teléfono (contact) fijo respecto a hacerlo por móvil

 

  • celular (movil) –> variable referencia (1ª por orden alfabético)
  • telephone (fijo)

 

Proceso:

  • Obtenemos el coeficiente para “fijo”: mod.glm1$coefficients[“contacttelephone”] à -0.9290683
  • Ha sido calculado respecto la ODD del móvil (referencia) en el modelo.
  • Deshacer la transformación: e^(-0.9290683) = 3949215
  • R code: exp(mod.glm1$coefficients[“campaign”])

 

ODD_fijo_movil = ODD_fijo/ ODD_movil (ref) –>

 

Resultado –>

 

Si recordamos el gráfico anterior vemos que era lo esperado en el análisis.

  1. Calculamos los intervalos de confianza del 95% para todos los ORs

Cuál puede ser la variable más relevante a la hora de tener éxito en la venta?

Para esto calculamos los intervalos de confianza y confluiremos que la variable con más influencia será la que tiene el intervalo de confianza más estrecho.

 

 

  row.names 2.5 % 97.5 % dif
1 (Intercept) 0.00 0.00 0.00 (EXCLUIR)
2 contacttelephone 0.35 0.45 0.10
3 day_of_weekmon 0.73 0.95 0.22
4 day_of_weekthu 0.95 1.22 0.27
5 day_of_weektue 0.92 1.19 0.27
6 day_of_weekwed 0.95 1.24 0.29
7 campaign 0.93 0.97 0.04
8 poutcomenonexistent 1.43 1.84 0.41
9 poutcomesuccess 4.85 6.97 2.12
10 emp.var.rate 0.41 0.54 0.13
11 cons.price.idx 3.66 5.80 2.14
12 cons.conf.idx 1.05 1.07 0.02
13 euribor3m 0.60 0.87 0.27
14 nr.employed 1.00 1.01 0.01
15 job2not_active 1.23 1.61 0.38
16 month2lowerOffer 0.44 0.61 0.17
17 education2educationbasic 0.82 1.15 0.33
18 education2high.school 0.90 1.25 0.35
19 education2illiterate 0.45 8.37 7.92
20 education2professional.course 0.98 1.40 0.42
21 education2university.degree 1.08 1.48 0.40
22 education2unknown 0.93 1.48 0.55
23 default2other 0.63 0.82 0.19

 

Así pues, “nr. employed” es la variable que tiene más influencia.

 

# Estimacion de las probabilidades de adquirir el producto:

  1. Estima las probabilidades predichas por el modelo para todos los individuos

 

  1. Identificamos a los individuos que el modelo predice con mayor y menor probabilidad de comprar el producto y verifica si realmente lo adquirieron o no

 

  1. Escogemos un idividuo al azar y miramos la probabilidad predicha y si realmente escogio el producto

 

  1. Curva ROC y AUC

 

  1. La instruccion roc prepara los datos para luego hacer el grafico de la curva ROC y para calcular el AUC

 

Recordemos que cuando más abombada sea la curva, mejor será la predicción.

auc(roc.curve) = 0.7850414

  • AUC [0.75, 0.9) –> Discriminación buena.
  1. A partir de ahora la empresa decide unicamente llamar a aquellos que tengan una probabilidad mayor de 0.2 de adquirir el producto.

 

¿Que porcentaje se espera de las llamadas que adquieran el producto?

# True Positive Rate (TPR) –> De los que realmente hubieran adquirido el producto a que porcentaje llamaremos?

roc.curve$tpr[cut.point] –> 0.5083765

¿Que porcentaje de los que no llamamos hubiesen adquirido el producto? False Positive Rate (FPR) –> De los que realmente NO hubieran adquirido el producto, a que porcentaje llamaremos?

roc.curve$fpr[cut.point] –> 0.08082959

 2.2.2 PARTE 2: testear resultados (testing)

  1. Leemos los datos del conjunto test (testing)

 

  1. Realizamos las transformaciones realizadas en el modelo (conjunto de entrenamiento)

 

 

  1. Representamos las predicciones en función de la respuesta con un boxplot

 

En este gráfico se observa como era de esperar que las probabilidades más bajas (entre 0 y 0.2) la predicción fue correcta y no se tuvo éxito en la venta. Se observa algunos valores de error extremos por encima del tercer cuartil. En cambio en la segunda caja observamos predicciones más altas de éxito correspondiendo al valor real de éxito en la venta.

  1. Hacemos la curva ROC y calcula el AUC

 

auc(roc.curve) à 0.7962037 à AUC [0.75, 0.9) à Discriminación buena

2.3 Guardar probabilidades predichas para cada cliente

#Exportamos en un fichero txt los ids de los usuarios y la probabilidad de éxito.

 

  

*note: in %(probability *100)

En este grafico observamos como se distribuyen las probabilidades.
Se aprecia que ha un mayor número de probabilidades por debajo del 20%, por lo que podría concluirse que la mayoría de las llamadas no tendran éxito.

 


 

Another external example of LOGISTIC REGRESION and how to predict the probability of certain event. (fetched from http://www.theanalysisfactor.com/r-tutorial-glm1 ) 

The glm() command is designed to perform generalized linear models (regressions) on binary outcome data, count data, probability data, proportion data and many other data types.

In this blog post, we explore the use of R’s glm() command on one such data type. Let’s take a look at a simple example where we model binary data.

In the mtcars data set, the variable vs indicates if a car has a V engine or a straight engine.

We want to create a model that helps us to predict the probability of a vehicle having a V engine or a straight engine given a weight of 2100 lbs and engine displacement of 180 cubic inches.

First we fit the model:

We use the glm() function, include the variables in the usual way, and specify a binomial error distribution, as follows:

We see from the estimates of the coefficients that weight influences vs positively, while displacement has a slightly negative effect.

The model output is somewhat different from that of an ordinary least squares model. I will explain the output in more detail in the next article, but for now, let’s continue with our calculations.

Remember, our goal here is to calculate a predicted probability of a V engine, for specific values of the predictors: a weight of 2100 lbs and engine displacement of 180 cubic inches.

To do that, we create a data frame called newdata, in which we include the desired values for our prediction.

Now we use the predict() function to calculate the predicted probability. We include the argument type=”response” in order to get our prediction.

The predicted probability is 0.24.