En el siguiente trabajo haremos uso de una base de datos de un Banco, buscamos responder a la pregunta ¿cómo mejorar la retención de los clientes?
Inicialmente cargamos las librerias que usaremos.
library(foreign)
library(survival)
library(mclust)
library(LifeTables)
library(KMsurv)
library(nlme)
library(muhaz)
library(MASS)
library(TH.data)
library(ggplot2)
library(proto)
library(GGally)
library(lattice)
library(mice)
La base de datos es la siguiente:
Datos<-read.csv("/Users/elsys/Downloads/Bank_Churn_Modelling.csv")
Hagamos un análisis de los datos en general. Nuestra base de datos contiene a 10,000 clientes.
summary(Datos)
## RowNumber CustomerId Surname CreditScore
## Min. : 1 Min. :15565701 Smith : 32 Min. :350.0
## 1st Qu.: 2501 1st Qu.:15628528 Martin : 29 1st Qu.:584.0
## Median : 5000 Median :15690738 Scott : 29 Median :652.0
## Mean : 5000 Mean :15690941 Walker : 28 Mean :650.5
## 3rd Qu.: 7500 3rd Qu.:15753234 Brown : 26 3rd Qu.:718.0
## Max. :10000 Max. :15815690 Genovese: 25 Max. :850.0
## (Other) :9831
## Geography Gender Age Tenure
## France :5014 Female:4543 Min. :18.00 Min. : 0.000
## Germany:2509 Male :5457 1st Qu.:32.00 1st Qu.: 3.000
## Spain :2477 Median :37.00 Median : 5.000
## Mean :38.92 Mean : 5.013
## 3rd Qu.:44.00 3rd Qu.: 7.000
## Max. :92.00 Max. :10.000
##
## Balance NumOfProducts HasCrCard IsActiveMember
## Min. : 0 Min. :1.00 Min. :0.0000 Min. :0.0000
## 1st Qu.: 0 1st Qu.:1.00 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 97199 Median :1.00 Median :1.0000 Median :1.0000
## Mean : 76486 Mean :1.53 Mean :0.7055 Mean :0.5151
## 3rd Qu.:127644 3rd Qu.:2.00 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :250898 Max. :4.00 Max. :1.0000 Max. :1.0000
##
## EstimatedSalary Exited
## Min. : 11.58 Min. :0.0000
## 1st Qu.: 51002.11 1st Qu.:0.0000
## Median :100193.91 Median :0.0000
## Mean :100090.24 Mean :0.2037
## 3rd Qu.:149388.25 3rd Qu.:0.0000
## Max. :199992.48 Max. :1.0000
##
str(Datos)
## 'data.frame': 10000 obs. of 14 variables:
## $ RowNumber : int 1 2 3 4 5 6 7 8 9 10 ...
## $ CustomerId : int 15634602 15647311 15619304 15701354 15737888 15574012 15592531 15656148 15792365 15592389 ...
## $ Surname : Factor w/ 2932 levels "Abazu","Abbie",..: 1116 1178 2041 290 1823 538 178 2001 1147 1082 ...
## $ CreditScore : int 619 608 502 699 850 645 822 376 501 684 ...
## $ Geography : Factor w/ 3 levels "France","Germany",..: 1 3 1 1 3 3 1 2 1 1 ...
## $ Gender : Factor w/ 2 levels "Female","Male": 1 1 1 1 1 2 2 1 2 2 ...
## $ Age : int 42 41 42 39 43 44 50 29 44 27 ...
## $ Tenure : int 2 1 8 1 2 8 7 4 4 2 ...
## $ Balance : num 0 83808 159661 0 125511 ...
## $ NumOfProducts : int 1 1 3 2 1 2 2 4 2 1 ...
## $ HasCrCard : int 1 0 1 0 1 1 1 1 0 1 ...
## $ IsActiveMember : int 1 1 0 0 1 0 1 0 1 1 ...
## $ EstimatedSalary: num 101349 112543 113932 93827 79084 ...
## $ Exited : int 1 0 1 0 0 1 0 1 0 0 ...
attach(Datos)
Veamos que de nuestros 10,000 clientes. Los que tienen tarjeta son 7055 clientes. Y los que no son 2945.
tabla1<-table(HasCrCard)
tabla1
## HasCrCard
## 0 1
## 2945 7055
b<-barplot(tabla1,col=rainbow(4),main="Tarjetahabientes",col.main="black", xlab =" Con Tarjeta Sin tarjeta",
col.lab="black",ylim = c(0,8000))
Veamos que los miembros activos de nuestra base son 5151.
tabla2<-table(IsActiveMember)
tabla2
## IsActiveMember
## 0 1
## 4849 5151
b<-barplot(tabla2,col=rainbow(5),main="Miembros Activos",col.main="black",
xlab = "Inactivos Activos",
col.lab="black",ylim = c(0,8000))
Los clientes contratan productos en el banco, pueden ser tarjetas de crédito, débito seguros, etc.
Veamos que 5084 personas contrataron 1 produto. 4590 personas contrataron 2 productos. 266 personas contrataron 3 productos. 60 perosnas contrataron 4 productos.
tabla3<-table(NumOfProducts)
tabla3
## NumOfProducts
## 1 2 3 4
## 5084 4590 266 60
b<-barplot(tabla3,col=rainbow(4),main="Productos contratados",col.main="black", xlab = "Produtos",
col.lab="black",ylim = c(0,8000))
Entendamos en la siguiente gráfica que 7963 personas aún son clientes del banco. Y qué 2037 clientes ya no son clientes.
tabla4<-table(Exited)
tabla4
## Exited
## 0 1
## 7963 2037
b<-barplot(tabla4,col=rainbow(5),main="Miembros Fuera",col.main="black",
xlab = "Estatus",
col.lab="black",ylim = c(0,8000))
Sabemos que la calificación crediticia establece la capacidad de una entidad en este caso de un cliente para pagar su deuda. Para este caso vemaos que aproximadamente 3000 clientes tienen una calificación regular.
a<-ggplot(data=Datos, aes(x=CreditScore))+
geom_histogram(breaks=seq(300, 800, by =50),aes(fill=..count..))+
scale_fill_gradient("Clientes", low = "gray", high = "blue")
a+ labs(title="Calificación crediticia",
x ="Malo Regular Excelente", y = "Clientes")
Además hay clientes de ambos géneros y de diferentes países. Mujeres 4543. Hombres 5457. France Germany Spain 5014 2509 2477
summary(Datos$Geography)
## France Germany Spain
## 5014 2509 2477
barplot(table(Datos$Geography),col=c("blue3","orange1","firebrick"), main="País", ylab ="Clientes")
summary(Datos$Gender)
## Female Male
## 4543 5457
barplot(table(Datos$Gender),col=c("darkgoldenrod1","forestgreen"), main="Género", ylab ="Clientes")
En la edad podemos ver que las personas de esta base pudieorn aquirir un producto a los 18 años e incluso hay clientes de 95 años.
La edad media de la base es de 38-39 años.
summary(Datos$Age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.00 32.00 37.00 38.92 44.00 92.00
c<-ggplot(data=Datos, aes(x=Age))+
geom_histogram(breaks=seq(18, 92, by =2),aes(fill=..count..))+
scale_fill_gradient("Clientes", low = "lightblue3", high = "lightpink")
c+ labs(title="Edad",
x ="Años", y = "Clientes")
Y además que el tiempo de permanencia de los clientes va de 0 a 10 años. En el cual los clientes en promedio permanecen 5 años.
summary(Datos$Tenure)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.000 5.000 5.013 7.000 10.000
d<-ggplot(data=Datos, aes(x=Tenure))+
geom_histogram(breaks=seq(0, 20, by =1),aes(fill=..count..))+
scale_fill_gradient("Clientes", low = "red", high = "lightcoral")
d+ labs(title="Tiempo de Permanencia",
x ="Años de permanencia", y = "Clientes")
Para el análisis de Supervivencia. Ajuste no paramétrico. En éste caso, utilizaremos el Método de Kaplan−Meier.
La mediana de la supervivencia es 10, lo que indica que a los 10 años la mitad de los clientes han salido del banco.
En esta función, podemos apreciar que, durante todo el tiempo de observación, en 10 años, todos los eventos suceden por intervalos, es decir, hay intervalos de tiempo algún en el que hay muchas fallas o censuras.
Como sabemos, la función de riesgo h(t) es una función que mide la probabilidad de que a un individuo le ocurra cierto suceso a lo largo del tiempo, en este caso, vemos que esta probabilidad es creciente en el tiempoy cuando esta cerca a los 10 años, el crecimiento es muy rápido.
attach(Datos)
datos1.surv<-Surv(Tenure,Exited)
#Utilizando Kaplan-Meier
estimador<-survfit(datos1.surv~1,type="kaplan-meier", conf.type="log-log", conf.int=0.95, data=Datos)
summary(estimador)
## Call: survfit(formula = datos1.surv ~ 1, data = Datos, type = "kaplan-meier",
## conf.type = "log-log", conf.int = 0.95)
##
## time n.risk n.event survival std.err lower 95% CI upper 95% CI
## 0 10000 95 0.991 0.00097 0.988 0.992
## 1 9587 232 0.967 0.00182 0.963 0.970
## 2 8552 201 0.944 0.00238 0.939 0.948
## 3 7504 213 0.917 0.00294 0.911 0.923
## 4 6495 203 0.888 0.00347 0.881 0.895
## 5 5506 209 0.855 0.00404 0.847 0.862
## 6 4494 196 0.817 0.00466 0.808 0.826
## 7 3527 177 0.776 0.00535 0.766 0.787
## 8 2499 197 0.715 0.00647 0.702 0.728
## 9 1474 213 0.612 0.00857 0.595 0.628
## 10 490 101 0.486 0.01309 0.460 0.511
#Funcion de supervivencia
plot(estimador, main="Funcion de supervivencia", xlab="Tiempo" , ylab="S(t)", col=2:4,lwd=1)
legend("bottomleft", c("Estimador K-M", "Lower", "Upper"), lty=c(1,1,1), col=2:4, lwd=1,xjust = 1,yjust = 1)
#Funcion de riesgo acumulado
plot(estimador, main="Funcion de riesgo",
xlab="Tiempo", ylab="h(t)",
fun="cumhaz", conf.int=F, col="red")
Ahora, para las funciones de supervivencia estimadas para la variable Gender, podemos ver, que es más probable que las mujeres permanezcan en el banco a que los hombres . sin embargo, hacemos su respectiva prueba de Log-Rank para determinar si rechazamos o no rechazamos Ho: Ho :Las funciones de supervivencia son iguales, p.t.t vs H1: Son distintas p.a. t>0 Donde rechazamos Ho cuando p-value<0.05 y se muestra la salida de las pruebas de hipótesis realizadas.
#K-M para sexo
comp1 <- survfit(Surv(Tenure,Exited)~factor(Gender), type = "kaplan-meier", conf.type="plain",
data=Datos)
plot(comp1, conf.int=F,xlab="Tiempo", ylab="Supervivencia", lty=c(1,4), col=c("blue","pink1"),
main = "Comparación S(t) variable Gender")
legend("bottomleft", c("Hombre", "Mujer"), lty=c(1,4), col=c("blue", "pink1"))
#Comparación de supervivencias
survdiff(Surv(Tenure,Exited)~factor(Gender),rho = 0)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(Gender), rho = 0)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(Gender)=Female 4543 1139 920 52.2 101
## factor(Gender)=Male 5457 898 1117 43.0 101
##
## Chisq= 101 on 1 degrees of freedom, p= <2e-16
survdiff(Surv(Tenure,Exited)~factor(Gender),rho = 1)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(Gender), rho = 1)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(Gender)=Female 4543 990 799 45.5 98.6
## factor(Gender)=Male 5457 782 972 37.4 98.6
##
## Chisq= 98.6 on 1 degrees of freedom, p= <2e-16
La cantidad de clientes activos en el banco. Rechazamos Ho: Las funciones de supervivencia son iguales ya que p-value<0.05 y se muestra la salida de las pruebas de hipótesis realizadas (para un nivel de significación del 5%)
#K-M para IsActiveMember
comp2 <- survfit(Surv(Tenure,Exited)~factor(IsActiveMember), type = "kaplan-meier", conf.type="plain",
data=Datos)
plot(comp2, conf.int=F,xlab="Tiempo", ylab="S(t)", lty=c(1,4), col=c("blue","red"),
main = "Comparación de S(t) para la variable IsActiveMember")
legend("bottomleft", c("Inactivos","Activos"), lty=c(1,1),
col=c("blue","red", xjust= 1, yjust = 1))
#Comparación de supervivencias
survdiff(Surv(Tenure,Exited)~factor(IsActiveMember),rho = 0)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(IsActiveMember),
## rho = 0)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(IsActiveMember)=0 4849 1302 1009 85.1 179
## factor(IsActiveMember)=1 5151 735 1028 83.5 179
##
## Chisq= 179 on 1 degrees of freedom, p= <2e-16
survdiff(Surv(Tenure,Exited)~factor(IsActiveMember),rho = 1)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(IsActiveMember),
## rho = 1)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(IsActiveMember)=0 4849 1129 876 72.7 171
## factor(IsActiveMember)=1 5151 643 895 71.1 171
##
## Chisq= 171 on 1 degrees of freedom, p= <2e-16
Para el caso de Tener o no Tener Tarjeta de Crédito.
No rechazamos Ho: Las funciones de supervivencia son iguales ya que p-value<0.05 y se muestra la salida de las pruebas de hipótesis realizadas (para un nivel de significación del 5%)
#K-M para HasCrCard
comp3 <- survfit(Surv(Tenure,Exited)~factor(HasCrCard), type = "kaplan-meier", conf.type="plain",
data=Datos)
plot(comp3, conf.int=F,xlab="Tiempo", ylab="S(t)", lty=c(1,4),
col=c("blue","red"),
main = "Comparación de S(t) para la variable HasCrCard")
legend("bottomleft", c("No Tiene", "Tiene"),
lty=c(1,4), col=c("blue","red"))
#Comparación de supervivencias
survdiff(Surv(Tenure,Exited)~factor(HasCrCard),rho = 0)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(HasCrCard),
## rho = 0)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(HasCrCard)=0 2945 613 587 1.197 1.78
## factor(HasCrCard)=1 7055 1424 1450 0.484 1.78
##
## Chisq= 1.8 on 1 degrees of freedom, p= 0.2
survdiff(Surv(Tenure,Exited)~factor(HasCrCard),rho = 1)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(HasCrCard),
## rho = 1)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(HasCrCard)=0 2945 534 511 1.048 1.75
## factor(HasCrCard)=1 7055 1238 1261 0.424 1.75
##
## Chisq= 1.7 on 1 degrees of freedom, p= 0.2
Para el caso de Número de productos. Rechazamos Ho: Las funciones de supervivencia son iguales ya que p-value<0.05 y se muestra la salida de las pruebas de hipótesis realizadas (para un nivel de significación del 5%) Esto nos indica que no importa le número de productos contratados, sin embargo podemos ver en la gráfica que son más los clientes que tiene entre uno y dos productos que permanecen como clientes del banco.
#K-M para NumOfProducts
comp4 <- survfit(Surv(Tenure,Exited)~factor(NumOfProducts), type = "kaplan-meier", conf.type="plain",
data=Datos)
plot(comp4, conf.int=F,xlab="Tiempo", ylab="S(t)", lty=c(1,4),
col=c("yellow","black","blue","red","green","violet","orange","magenta"),
main = "Comparación de s(t) para la variable NumofProducts")
legend("bottomleft", c("2 productos","1 producto","3 productos", "4 productos"), lty=c(1,4),
col=c("yellow","black","blue","red"))
#Comparación de supervivencias
survdiff(Surv(Tenure,Exited)~factor(NumOfProducts),rho = 0)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(NumOfProducts),
## rho = 0)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(NumOfProducts)=1 5084 1409 1027.2 142 304
## factor(NumOfProducts)=2 4590 348 941.4 374 737
## factor(NumOfProducts)=3 266 220 54.7 499 545
## factor(NumOfProducts)=4 60 60 13.7 157 169
##
## Chisq= 1246 on 3 degrees of freedom, p= <2e-16
survdiff(Surv(Tenure,Exited)~factor(NumOfProducts),rho = 1)
## Call:
## survdiff(formula = Surv(Tenure, Exited) ~ factor(NumOfProducts),
## rho = 1)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## factor(NumOfProducts)=1 5084 1226.7 893.5 124 298
## factor(NumOfProducts)=2 4590 302.7 818.6 325 719
## factor(NumOfProducts)=3 266 190.4 47.4 432 530
## factor(NumOfProducts)=4 60 51.3 11.7 134 164
##
## Chisq= 1212 on 3 degrees of freedom, p= <2e-16
Ajuste Paramétrico del modelo. Modelo de Cox. Con esto cual podemos concluir que el modelo es significativo para cualquiera de los tres criterios (test de razón de verosimilitud, test de Wald y test de los puntajes (score ologrank))
#Partiremos de la estimación KM
datos1.surv<-Surv(Tenure,Exited)
estimador<-survfit(datos1.surv~1,type="kaplan-meier", conf.type="log-log", conf.int=0.95, data=Datos)
## Modelo de Cox.
est1 <- coxph(datos1.surv~ Geography + Gender + Age + Balance + NumOfProducts
+ HasCrCard + IsActiveMember + EstimatedSalary )
est1
## Call:
## coxph(formula = datos1.surv ~ Geography + Gender + Age + Balance +
## NumOfProducts + HasCrCard + IsActiveMember + EstimatedSalary)
##
## coef exp(coef) se(coef) z p
## GeographyGermany 4.892e-01 1.631e+00 5.433e-02 9.005 < 2e-16
## GeographySpain 4.677e-02 1.048e+00 6.049e-02 0.773 0.4394
## GenderMale -3.855e-01 6.801e-01 4.476e-02 -8.612 < 2e-16
## Age 4.751e-02 1.049e+00 1.776e-03 26.752 < 2e-16
## Balance 2.091e-06 1.000e+00 4.384e-07 4.770 1.84e-06
## NumOfProducts -6.572e-02 9.364e-01 3.871e-02 -1.698 0.0895
## HasCrCard -6.162e-02 9.402e-01 4.835e-02 -1.275 0.2025
## IsActiveMember -7.416e-01 4.764e-01 4.745e-02 -15.630 < 2e-16
## EstimatedSalary 6.358e-09 1.000e+00 3.834e-07 0.017 0.9868
##
## Likelihood ratio test=1152 on 9 df, p=< 2.2e-16
## n= 10000, number of events= 2037
exp(est1$coefficients)
## GeographyGermany GeographySpain GenderMale Age
## 1.6310532 1.0478841 0.6801060 1.0486571
## Balance NumOfProducts HasCrCard IsActiveMember
## 1.0000021 0.9363903 0.9402386 0.4763641
## EstimatedSalary
## 1.0000000
modelo_Cox<-survfit(est1)
confint(est1, level = 0.95)
## 2.5 % 97.5 %
## GeographyGermany 3.827423e-01 5.957096e-01
## GeographySpain -7.177890e-02 1.653248e-01
## GenderMale -4.732372e-01 -2.977761e-01
## Age 4.402956e-02 5.099115e-02
## Balance 1.232161e-06 2.950787e-06
## NumOfProducts -1.415925e-01 1.014672e-02
## HasCrCard -1.563827e-01 3.313938e-02
## IsActiveMember -8.345642e-01 -6.485814e-01
## EstimatedSalary -7.450948e-07 7.578098e-07
plot(modelo_Cox,main="S(t) estimada con\n el modelo de Cox\n para las variables",
xlab="Tiempo", ylab="Proba. de sobrevivencia",
lwd=2, col="blue", cex.lab=0.7)
summary(est1)
## Call:
## coxph(formula = datos1.surv ~ Geography + Gender + Age + Balance +
## NumOfProducts + HasCrCard + IsActiveMember + EstimatedSalary)
##
## n= 10000, number of events= 2037
##
## coef exp(coef) se(coef) z Pr(>|z|)
## GeographyGermany 4.892e-01 1.631e+00 5.433e-02 9.005 < 2e-16 ***
## GeographySpain 4.677e-02 1.048e+00 6.049e-02 0.773 0.4394
## GenderMale -3.855e-01 6.801e-01 4.476e-02 -8.612 < 2e-16 ***
## Age 4.751e-02 1.049e+00 1.776e-03 26.752 < 2e-16 ***
## Balance 2.091e-06 1.000e+00 4.384e-07 4.770 1.84e-06 ***
## NumOfProducts -6.572e-02 9.364e-01 3.871e-02 -1.698 0.0895 .
## HasCrCard -6.162e-02 9.402e-01 4.835e-02 -1.275 0.2025
## IsActiveMember -7.416e-01 4.764e-01 4.745e-02 -15.630 < 2e-16 ***
## EstimatedSalary 6.358e-09 1.000e+00 3.834e-07 0.017 0.9868
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## GeographyGermany 1.6311 0.6131 1.4663 1.8143
## GeographySpain 1.0479 0.9543 0.9307 1.1798
## GenderMale 0.6801 1.4704 0.6230 0.7425
## Age 1.0487 0.9536 1.0450 1.0523
## Balance 1.0000 1.0000 1.0000 1.0000
## NumOfProducts 0.9364 1.0679 0.8680 1.0102
## HasCrCard 0.9402 1.0636 0.8552 1.0337
## IsActiveMember 0.4764 2.0992 0.4341 0.5228
## EstimatedSalary 1.0000 1.0000 1.0000 1.0000
##
## Concordance= 0.717 (se = 0.006 )
## Rsquare= 0.109 (max possible= 0.967 )
## Likelihood ratio test= 1152 on 9 df, p=<2e-16
## Wald test = 1198 on 9 df, p=<2e-16
## Score (logrank) test = 1241 on 9 df, p=<2e-16
variable_1 <- coxph(datos1.surv~Geography)
variable_1
## Call:
## coxph(formula = datos1.surv ~ Geography)
##
## coef exp(coef) se(coef) z p
## GeographyGermany 0.70863 2.03120 0.04963 14.277 <2e-16
## GeographySpain 0.03123 1.03172 0.06047 0.516 0.606
##
## Likelihood ratio test=223.7 on 2 df, p=< 2.2e-16
## n= 10000, number of events= 2037
variable_2 <- coxph(datos1.surv~Gender)
variable_2
## Call:
## coxph(formula = datos1.surv ~ Gender)
##
## coef exp(coef) se(coef) z p
## GenderMale -0.44517 0.64072 0.04463 -9.974 <2e-16
##
## Likelihood ratio test=100.4 on 1 df, p=< 2.2e-16
## n= 10000, number of events= 2037
variable_3 <- coxph(datos1.surv~Age)
variable_3
## Call:
## coxph(formula = datos1.surv ~ Age)
##
## coef exp(coef) se(coef) z p
## Age 0.04281 1.04374 0.00165 25.94 <2e-16
##
## Likelihood ratio test=576.1 on 1 df, p=< 2.2e-16
## n= 10000, number of events= 2037
variable_4 <- coxph(datos1.surv~Balance)
variable_4
## Call:
## coxph(formula = datos1.surv ~ Balance)
##
## coef exp(coef) se(coef) z p
## Balance 4.145e-06 1.000e+00 3.695e-07 11.22 <2e-16
##
## Likelihood ratio test=130.3 on 1 df, p=< 2.2e-16
## n= 10000, number of events= 2037
variable_5 <- coxph(datos1.surv~NumOfProducts)
variable_5
## Call:
## coxph(formula = datos1.surv ~ NumOfProducts)
##
## coef exp(coef) se(coef) z p
## NumOfProducts -0.19450 0.82325 0.03996 -4.867 1.13e-06
##
## Likelihood ratio test=24.33 on 1 df, p=8.13e-07
## n= 10000, number of events= 2037
variable_6 <- coxph(datos1.surv~HasCrCard)
variable_6
## Call:
## coxph(formula = datos1.surv ~ HasCrCard)
##
## coef exp(coef) se(coef) z p
## HasCrCard -0.06356 0.93842 0.04831 -1.316 0.188
##
## Likelihood ratio test=1.72 on 1 df, p=0.1902
## n= 10000, number of events= 2037
variable_7 <- coxph(datos1.surv~IsActiveMember)
variable_7
## Call:
## coxph(formula = datos1.surv ~ IsActiveMember)
##
## coef exp(coef) se(coef) z p
## IsActiveMember -0.60943 0.54366 0.04614 -13.21 <2e-16
##
## Likelihood ratio test=182 on 1 df, p=< 2.2e-16
## n= 10000, number of events= 2037
variable_8 <- coxph(datos1.surv~EstimatedSalary)
variable_8
## Call:
## coxph(formula = datos1.surv ~ EstimatedSalary)
##
## coef exp(coef) se(coef) z p
## EstimatedSalary 3.013e-07 1.000e+00 3.859e-07 0.781 0.435
##
## Likelihood ratio test=0.61 on 1 df, p=0.4349
## n= 10000, number of events= 2037
variables_Sig <- coxph(datos1.surv~ Geography + Gender + Age + Balance + NumOfProducts
+ IsActiveMember)
modelo_Cox_sig<-survfit(variables_Sig)
plot(modelo_Cox_sig,main="S(t) estimada con el modelo de Cox para\n variables significativas",
xlab="Tiempo", ylab="s(t)", lwd=2, col="lightseagreen",
cex.lab=0.7)
summary(variables_Sig)
## Call:
## coxph(formula = datos1.surv ~ Geography + Gender + Age + Balance +
## NumOfProducts + IsActiveMember)
##
## n= 10000, number of events= 2037
##
## coef exp(coef) se(coef) z Pr(>|z|)
## GeographyGermany 4.875e-01 1.628e+00 5.432e-02 8.975 < 2e-16 ***
## GeographySpain 4.628e-02 1.047e+00 6.048e-02 0.765 0.4441
## GenderMale -3.861e-01 6.797e-01 4.475e-02 -8.627 < 2e-16 ***
## Age 4.753e-02 1.049e+00 1.775e-03 26.775 < 2e-16 ***
## Balance 2.104e-06 1.000e+00 4.383e-07 4.801 1.58e-06 ***
## NumOfProducts -6.545e-02 9.366e-01 3.868e-02 -1.692 0.0906 .
## IsActiveMember -7.407e-01 4.768e-01 4.742e-02 -15.620 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## GeographyGermany 1.6283 0.6141 1.4639 1.8112
## GeographySpain 1.0474 0.9548 0.9303 1.1792
## GenderMale 0.6797 1.4712 0.6226 0.7420
## Age 1.0487 0.9536 1.0450 1.0523
## Balance 1.0000 1.0000 1.0000 1.0000
## NumOfProducts 0.9366 1.0676 0.8683 1.0104
## IsActiveMember 0.4768 2.0974 0.4345 0.5232
##
## Concordance= 0.717 (se = 0.006 )
## Rsquare= 0.109 (max possible= 0.967 )
## Likelihood ratio test= 1150 on 7 df, p=<2e-16
## Wald test = 1197 on 7 df, p=<2e-16
## Score (logrank) test = 1239 on 7 df, p=<2e-16
str(modelo_Cox_sig)
## List of 14
## $ n : int 10000
## $ time : num [1:11] 0 1 2 3 4 5 6 7 8 9 ...
## $ n.risk : num [1:11] 10000 9587 8552 7504 6495 ...
## $ n.event : num [1:11] 95 232 201 213 203 209 196 177 197 213 ...
## $ n.censor : num [1:11] 318 803 847 796 786 803 771 851 828 771 ...
## $ surv : num [1:11] 0.993 0.974 0.956 0.935 0.913 ...
## $ type : chr "right"
## $ cumhaz : num [1:11] 0.00732 0.02625 0.04463 0.0669 0.09149 ...
## $ std.err : num [1:11] 0.00076 0.00151 0.00207 0.00269 0.00334 ...
## $ lower : num [1:11] 0.991 0.971 0.952 0.93 0.907 ...
## $ upper : num [1:11] 0.994 0.977 0.96 0.94 0.919 ...
## $ conf.type: chr "log"
## $ conf.int : num 0.95
## $ call : language survfit(formula = variables_Sig)
## - attr(*, "class")= chr [1:2] "survfit.cox" "survfit"
confint(variables_Sig, level = 0.95)
## 2.5 % 97.5 %
## GeographyGermany 3.810717e-01 5.940080e-01
## GeographySpain -7.225969e-02 1.648271e-01
## GenderMale -4.737739e-01 -2.983530e-01
## Age 4.405214e-02 5.101096e-02
## Balance 1.245045e-06 2.963105e-06
## NumOfProducts -1.412727e-01 1.036666e-02
## IsActiveMember -8.336391e-01 -6.477526e-01
exp(confint(variables_Sig))
## 2.5 % 97.5 %
## GeographyGermany 1.4638526 1.8112333
## GeographySpain 0.9302893 1.1791892
## GenderMale 0.6226480 0.7420394
## Age 1.0450368 1.0523344
## Balance 1.0000012 1.0000030
## NumOfProducts 0.8682525 1.0104206
## IsActiveMember 0.4344653 0.5232203
Conclusiones. Nuestra base de datos tiene 10,000 usuarios registrados, de los cuales 7055 clientes tienen tarjeta, 5151 están activos y 5084 personas contrataron 1 produto. Además 7963 permanecen siendo clientes, es decir que 2037 se han ido. Esto nos puede indicar que las perosnas que sólo contratan un producto tiene mayor posibilidad de mantenerse activos en un banco.
Parael análisis de supervivencia podemos notar que permanecen como clientes del banco hasta aproximadamente 10 años como máximo. Esto nos indica que posiblemente el plan del banco es rentable para los clientes hasta esa fecha, podría ser por las tasas de interés que se cobran. Y que en intervalos de un año, los clientes salen o se censuran dentro del estudio.
Además que es más probable que las mujeres permanezcan como ususarios del banco a que los hombres pernmanezcan, considerando que inicialmente la cantidad de clientes hombres es mayor.
Otra información importante, obtenida directamente a través de salida anterior es la estimación de los riesgos relativos (a partir de los exp(coef)) es: En el Modelo de Cox veamos que:
IsActiveMember: Tenemos exp(coef)=0.4344, lo que nos dice que por cada unidad que aumenta, el riesgo disminuye un 52.3% Age: Tenemos esp(coef)=1.045036, lo que nos dice que por cada unidad que aumenta, el riesgo de sufrir el evento es 5.02% NumOfProducts: Tenemos exp(coef)=0.86825, lo que nos dice que por cada unidad que aumenta, el riesgo disminuye un 14.3%
Y que los miembros de España y Alemania son significativos puede implicar que tienen mayor permanencia en el banco que los de Francia. Así como las mujeres. GeographyGermany 1.4638526 1.8112333 GeographySpain 0.9302893 1.1791892 GenderMale 0.6226480 0.7420394 Age 1.0450368 1.0523344 Balance 1.0000012 1.0000030 NumOfProducts 0.8682525 1.0104206 IsActiveMember 0.4344653 0.5232203
Respondiendo a la pregunta ¿Qué podemos hacer para mejorar la retención del cliente? Dado un cliente del Banco, ¿podemos construir un clasificador que pueda determinar si se irán o no?
De acuerdo a lo analizado en la base de datos veamos que la satisfacción del cliente dentro del banco es de aproximadamente 10 años. Inicialmente creo que debe preguntarse el banco ¿quiénes son sus clientes? y con base en eso debe crear productos que se adapten a las ncesidades del cliente, ya que como podemos ver en la base son muy poco los clientes que tienen acceso a más de dos productos. Actaulmente existen muchas estrategias de retención de clientes, los cuales se van categorizando dependido del tipo de cliente que quiera consumir el producto, como jóvenes, empresarios, obreros, empresas etc.
Eso como parte de la compra y venta del producto. Actualmete para el análisis de la retención de clientes existen métodos más específicos que usan algoritmos complejos y logística para determinar las preferencias de los clientes. Donde se analizan los sitios Web, las redes sociales de los clientes. De este modo es posible determinar factores fundamentales que pueden ayudar a saber si un cliente permanece o no como parte de una empresa, obviamente con un posible margen de error.