Los datos se encuentran en el fichero “cross_SELLING” y se trata de una encuesta realizada en una compañía de seguros de automóviles para ver la predisposición de individuos, llamados al azar, a adquirir un seguro de salud con ellos. En Marketing, la venta cruzada (cross-selling) consiste en ofrecer un producto nuevo a un cliente que ya tienes. En esta base de datos, contamos con:
Sin embargo, tal y como están codificadas las variables “Región” y “Policy Sales” consideramos no utilizarlas. Esto, quizás, haga que todo este trabajo esté incompleto.
En la vida real, usted deberá reunirse con la unidad de negocio y tener claro esto. Hasta que no conozca exactamente el significado de los valores de una variable no la utilice.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.1.3
library(readxl)
DB <- read_excel("C:/Users/Hortera de la Cutre/Downloads/Churn_SELLING.xlsx")
View(DB)
Descartaremos a aquellos clientes que no tienen permiso de conducir, dado que el servicio que ofrecemos es el de un seguro de automóvil (parece lógico pero: párese a pensar si siempre tiene en cuenta estos mínimos detalles).
DB<-data.frame(DB)
DB1 <- subset(DB,DB$Driving_License==1)
View(DB1)
La variable que nos interesa predecir es la 11: Response.
Como ya ha aprendido este curso, en vez de analizar todas las variables de golpe, vamos a realizarnos diferentes preguntas con el fin de explorar diversas hipótesis sobre qué puede llevar a un individuo a realizar esa compra cruzada. La primera pregunta, descriptiva, que debemos realizarnos es
¿Es fácil predecir la compra cruzada?, esto es, ¿cómo de frecuente es en nuestra muestra?
boxplot(DB1$Response)
mean(DB1$Response)
## [1] 0.1227172
No lo parece: hay un gran desequilibrio de 0 y 1, sólo el 12% de la muestra es partidario de comprar el producto nuevo: por lo que los modelos serán buenos prediciendo “ceros”, es decir, “no compra” pero mucho peores prediciendo “unos”. De hecho, si usted tuviera que elegir, al azar, si un individuo compraría el producto, diría que no. Sólo se equivocará un 12% de las veces aproximadamente. Pero claro, como “científico de marketing” no interesará mucho contrartarlo.
Una primera prueba que debemos hacer es cuántos de nuestros clientes estarían dispuestos a adquirir el seguro médico, y cuántos de los que no tienen nuestro seguro de coche estarían dispuestos a adquirir el seguro médico. Para ello, podemos analizar las variables 5 y 11: “gente con seguro previo” frente a gente “dispuesta a asegurarse”
prop.table(table(DB1$Previously_Insured,dnn="Previo",DB1$Response),margin=1 )
## NA
## Previo 0 1
## 0 0.7741197611 0.2258802389
## 1 0.9990939692 0.0009060308
De este resultado nos llama la atención que de los individuos que no tienen un seguro con nosotros, el 77% seguirá sin querer tener ningún seguro con nosotros. Pero de los que ya tienen seguro, el 99% no querrá tener el seguro de salud con nosotros.
Este es un resultado clave, puesto que nuestro público objetivo será ese 22%. De hecho, la pregunta que nos debemos hacer es: ¿que´diferencia a ese 22% del otro 77% que no quiere nuestro producto? Por ahí deberá ir nuestro análisis.
Para analizar esto, construiremos una nueva submuestra donde sólo trataremos a individuos que no tienen un seguro previo con nosotros, puesto que ya sabemos que los que tienen el seguro con nosotros “no quieren saber nada de más seguros con nosotros”.
DB2 <- subset(DB1,DB1$Previously_Insured==0)
View(DB2)
y tratamos de caracterizar al individuo. Podemos analizar, primeramente, variables sociales básicas: EDAD y GÉNERO.
Para ello, podemos realizar un boxplot para analizar la edad y género de los que comprarían y no comprarían el producto
boxplot(DB2$Age~DB2$Gender+DB2$Response)
La mayor diferencia podemos encontrarla entre las mujeres. Una mujer por debajo de los 30 años, no parece probable que quiera el seguro. En el caso de los hombres, la edad no parece una variable tan clara. Es decir,un primer público objetivo es una mujer de más de 30 años. Retenemos ese resultado, por ahora, y seguimos preguntándonos.
La siguiente pregunta que deberíamos formularnos es cómo influye la cuota que están pagando en su seguro actual en la compañía que tienen.
boxplot(DB2$Annual_Premium~DB2$Gender+DB2$Response)
Fijémonos que hay un problema de atípicos. Esto nos impide analizar adecuadamente el posible efecto de la prima en las decisiones del seguro. Podemos eliminar los atípicos, con el fin de ver si la prima afecta a la decisión de los individuos
Q <- quantile(DB2$Annual_Premium, probs=c(.25, .75), na.rm = FALSE)
iqr <- IQR(DB2$Annual_Premium)
up <- Q[2]+1.5*iqr # Upper Range
low<- Q[1]-1.5*iqr # Lower Range
eliminated<- subset(DB2,DB2$Annual_Premium > (Q[1] - 1.5*iqr) & DB2$Annual_Premium < (Q[2]+1.5*iqr))
boxplot(eliminated$Annual_Premium~eliminated$Gender+eliminated$Response)
Pero no nos quedemos con este resultado. Hay que seguir pensando. Podríamos preguntarnos, por ejemplo, en si unas primas exageradamente altas/bajas pueden estar afectando a los indiviuduos que las sufren. Para ello, ahora vamos a analizar los atípicos del gráfico anterior, con el objetivo de ver si eso afecta o no a su decisión. Empecemos a ver qué ocurre con primas que están por encima del percentil 75. Para ello, calculamos el percentil 75, y buscamos a los individuos (hombres y mujeres) que pagan dichas primas. Construimos una variable que será la intersección de pagar una prima mayor del percentil 75 y querer comprar o no el producto. Por ejemplo, FemaleNO significa que una mujer paga una prima alta pero NO quiere comprar el nuevo seguro. FemaleYES es una mujer que paga la prima alta y que está dispuesta a comprar el producto. Si las primeras tuvieran efecto en dicha decisión, deberían apreciarse diferencias en las distribuciones.
precio<-quantile(DB2$Annual_Premium,0.75)
df<-data.frame(DB2$Gender,DB2$Response,DB2$Annual_Premium)
#aquí estoy creando una nueva variable que tomará valor MALE YES si un hombre accede al seguro teniendo una prima mayor del percentil 75, MALE No en caso contraio (y lo mismo para FEMALE)
newChurn<-subset(df,subset=DB2.Annual_Premium>precio)
newChurn$Type<-ifelse(newChurn$DB2.Gender=="Female" & newChurn$DB2.Response==0,"FemaleNO",ifelse(newChurn$DB2.Gender=="Female" & newChurn$DB2.Response==1,"FemaleYes",ifelse(newChurn$DB2.Gender=="Male" & newChurn$DB2.Response==0,"MaleNO",ifelse(newChurn$DB2.Gender=="Male" & newChurn$DB2.Response==1,"MaleYes",0))))
dat <- data.frame(xx = newChurn$DB2.Annual_Premium,yy = newChurn$Type)
ggplot(dat, aes(x = xx, fill = yy)) +
geom_density(alpha = 0.5) +
theme(legend.title = element_blank())+xlim(30000,150000)
## Warning: Removed 120 rows containing non-finite values (stat_density).
Sin embargo, no encontramos grandes diferencias en las distribuciones de las primas “caras” que hagan más probable que un individuo quiera tomar la decisión de comprar el producto adicional: es decir, no parece que el efecto prima sea relevante.
Otra variable que puede interesarnos es la posible fidelidad del cliente a la compañía en la que está. Para ello, la variable “vintage” nos puede ayudar a entender si es más fácil o no conseguir que un cliente (en este caso, parece más probable, clienta) consiga cambiarse con nosotros frente a la alternativa de quedarse.
Si se observa un gráfico de boxplot (similares a los que se han hecho antes) no hay una gran diferencia en las distribuciones de la variable vintage (haga el correspondiente boxplot). Sin embargo, si vemos la distribución por edades, hay cierta inercia a no querer moverse de compañía a mayor edad.
DBYES<-subset(DB2,subset=DB2$Response==1)
DBNO<-subset(DB2,subset=DB2$Response==0)
boxplot(DBYES$Vintage~DBYES$Age)
boxplot(DBNO$Vintage~DBNO$Age)
Hay variables que, por ahora, no es muy aconsejable usar:
Region: código de la región *No tenemos muy claro qué significa. Sería interesante saber a qué regiones pertenecen y poder establecer hipótesis. A lo mejor hay regiones con más/menos competencia. Nunca use variables de las que no está seguro/a.
Vehicle Age: edad del vehículo (Podría no ser útil. Simplemente, queremos ofrecer un servicio de salud a gente que ya tiene un seguro de coche.)
Vehicle damage: (1 si el cliente obtuvo daños en su vehículo en el pasado) (Podría no ser útil. Simplemente, queremos ofrecer un servicio de salud a gente que ya tiene un seguro de coche.)
Policy Sales: Canal de venta (se ha anonimizado utilizando un código) (esta también es “peligrosa”. No sabemos qué canales se ha utilizado para vender. Es difícil poder obtener conclusiones sobre qué canal resulta más efectivo mediante un código. Es aconsejable tener esa información)
El modelo que planteamos, finalmente, pretenderá establecer perfiles de mujeres mayores de 30 años, que no pertenezcan a nuestra compañía, y nos preguntaremos ¿a partir de qué permanencia en su compañía deberíamos ofrecerles el seguro?
El sobremuestreo Hay un detalle sutil que hemos visto al principio de la práctica. Hay muy pocas observaciones en la variable “Respuesta” que tomen valor 1. Al modelo, entonces, la va a costar aprender. Hay una técnica, llamada “sobremuestreo/inframuestreo” que lo que hace es equilibra la muestra de tal forma que, por ejemplo, mantenga el mismo porcentaje de observaciones cuya variable respuesta toma valor 1 que valor 0.
Por ejemplo, con el paquete ROSE, podemos
library(ROSE)
## Warning: package 'ROSE' was built under R version 4.1.3
## Loaded ROSE 0.0-4
train_balanced <- ovun.sample(Response ~ ., data = DB2, method = "both", p=0.5,N=33800, seed=1)$data # Aquí creamos una muestra nueva. Le pedimos que la muestra quede igualada en cantidad de 0 y 1 para la variable "Response"
View(train_balanced)
mean(train_balanced$Response) #como ve, obtiene un 50% de respuestas positivas y, por lo tanto, otro 50% de respuestas negativas.
## [1] 0.4971302
Esto nos ayudará en el entrenamiento de los modelos, puesto que la estimación no estará sesgada hacia aprender de la categoría mayoritaria, pero ¡nunca en la validación! Para la validación deberemos usar muestras de test que no hayan pasado por este filtro, puesto que si no estaremos falseando la realidad de los modelos.
Eligiendo la muestra de clientes que no tienen seguro contratado con nosotros (ya que hemos visto que ese es nuestro target) Predecir la respuesta con la variable “Mujer” y la “Edad” y decidir a partir de qué edad conviene ofrecerle el producto
train_balanced$Mujer<-train_balanced$Gender=="Female"
model1 <- glm(Response ~ Mujer+I(Mujer*Age)+Age,data=train_balanced,family=binomial)
newdata <- data.frame(Age=seq(0,90,1),Mujer=TRUE)
P<-predict(model1,newdata=newdata,type="response")
Age<-seq(0,90,1)
plot(Age,P)
Utilice ahora la variable vintage., añadido a lo anterior. Puede hacer un modelo con la variable vintage de manera aditiva y otro que interactúe con la variable eda. Obtenga probabilidades de que Response sea igual a 1, condicionada por la edad de la mujer, ante diversos escenarios de la variable “vintage”.
model2 <- glm(Response ~ Mujer+I(Mujer*Age)+Age+Vintage,data=train_balanced,family=binomial)
newdata <- data.frame(Age=seq(0,90,1),Mujer=TRUE,Vintage=10)
P_10<-predict(model2,newdata=newdata,type="response")
Age<-seq(0,90,1)
plot(Age,P_10, main="Probabilidad de cross selling mujer con vintage=10",xlab="Edad")
newdata2 <- data.frame(Age=seq(0,90,1),Mujer=TRUE,Vintage=100)
P_100<-predict(model2,newdata=newdata2,type="response")
Age<-seq(0,90,1)
plot(Age,P_100, main="Probabilidad de cross selling mujer con vintage=100",xlab="Edad")
A su juicio, ¿qué impacto parece tener la variable vintage?
Ahora deberá entrenar diferentes modelos según lo aprendido aquí:
Recuerde que usted está remuestreando los datos de tal forma que el modelo pueda aprender mejor de ellos. Pero el test lo deberá hacer con datos no remuestreados. Por otro lado, recuerde que tendrá falsos positivos (gente que el modelo predecirá que están interesados en el producto y será mentira) y falsos negativos (lo contrario). Imagine que si le compran el producto, usted ingresa 100 euros por cliente, aunque en publicidad por individuo gasta 5 euros (de tal forma que, si predice que un individuo le va a comprar un producto y luego no lo hace, pierde 5 euros) Utilice esa información, de manera creativa, para analizar cada uno de los modelos que propone en validación cruzada. Use el criterio de maximizar su beneficio (o minimizar sus costes) a la hora de decantarse por un modelo o conjunto de modelos.
Como ve, de nuevo, no hemos mirado ni un p-valor. De hecho, la información que tiene que utilizar aquí, y que deberá preguntar a su cliente es el coste y los ingresos de cada acción. Recuerde lo que nos dicen en el vídeo 5 “si una vacuna es muy cara y tiene un efecto poco relevante, aunque”muy significativo estadísticamente” a nadie le interesará en realidad