Está en la página 1de 13

 

Taller en grupo
Integrantes: Miguel Briones, Carlos García, Santiago Piedra y Andrés Villafuerte
Tema: Una compañía proveedora de servicios de telecomunicacio
Tema: Una telecomunicacionesnes desea predecir la
probabilidad de deserción de sus clientes, para así poder identificar las causas raíz de la
deserción y tomar acciones en la dirección de retener al cliente.

Descripción del dataset:


dataset: Para este tema se utilizará el conjunto de datos
telecom_churn.csv. El conjunto de datos consiste en 7043 registros de clientes de una
compañía de servicios de telecomunicaciones correspondientes
correspondientes a un corte en el tiempo.
Para cada cliente se presentan 20 variables (predictoras) y una variable (respuesta)
binaria "Churn" (Deserción, en español) que toma el valor de "Yes" si el cliente ha
terminado su relación comercial con la compañía y "No" si mantiene aún relaciones
comerciales con la compañía.
Actividades:
1.  Particionar los datos en 70% para entrenamiento del modelo y 30% para
prueba. (10 puntos)
Primero se cargarán e instalarán todos los paquetes necesarios:

# instalar y cargar paquetes necesarios

install.packages("rpart")
install.packages("caret")
library("rpart")
library("caret")

datos<- read.csv("C
read.csv("C:/Users/FIMCP/Downloads/te
:/Users/FIMCP/Downloads/telecom_churn.c
lecom_churn.csv",sep=",")
sv",sep=",")
head(datos)
summary(datos)

Particionar los datos en 70% para entrenamiento del modelo y 30% para prueba.
particion <- createDataP
createDataPartition(datos$Chur
artition(datos$Churn,
n,
p=0.7,
list=FALSE,
times=1)

TRAIN <- datos[particion,]


TEST <- datos[-particion,]

La corrida se observará en la siguiente imagen:


 

2.  Prepare los datos convirtiendo correctamente las variables en categóricas y en


numéricas. (10 puntos)
#Convertir variables en categóricas y en numéricas

datos$gender<-as.factor(datos$gender)
datos$SeniorCitizen<-as.factor(datos$SeniorCitizen)
datos$Partner<-as.factor(datos$Partner)
datos$Dependents<-as.factor(datos
datos$Dependents<- as.factor(datos$Dependents)
$Dependents)
datos$PhoneService<-as.factor(datos$Pho
datos$PhoneService <-as.factor(datos$PhoneService)
neService)
datos$MultipleLines<-as.factor(dato
datos$MultipleLine s<-as.factor(datos$MultipleLines
s$MultipleLines))
datos$InternetService<-as.factor(
datos$InternetSer vice<-as.factor(datos$InternetSe
datos$InternetService)
rvice)
datos$OnlineSecurity<-as.factor(da
datos$OnlineSecuri ty<-as.factor(datos$OnlineSec
tos$OnlineSecurity)
urity)
datos$OnlineBackup<-as.factor(dat
datos$OnlineBac kup<-as.factor(datos$OnlineBack
os$OnlineBackup)
up)
datos$DeviceProtection<-as.factor(
datos$DeviceProtec tion<-as.factor(datos$DeviceProtec
datos$DeviceProtection)
tion)
datos$TechSupport<-as.factor(datos$Te
datos$TechSupport <-as.factor(datos$TechSupport)
chSupport)
datos$StreamingTV<-as.factor(datos$St
datos$StreamingT V<-as.factor(datos$StreamingTV)
reamingTV)
datos$StreamingMovies<-as.factor(datos
datos$StreamingMovie s<-as.factor(datos$StreamingMovies)
$StreamingMovies)
datos$Contract<-as.factor(datos$Contract)
datos$PaperlessBilling<-as.factor(da
datos$PaperlessBi lling<-as.factor(datos$PaperlessB
tos$PaperlessBilling)
illing)
datos$PaymentMethod<-as.factor(da
datos$PaymentMe thod<-as.factor(datos$PaymentMetho
tos$PaymentMethod) d)
datos$Churn<-as.factor(datos$Churn)

summary(datos)
datos<-na.omit(datos)
datos <- datos[,-1]
sum(is.na(datos))
summary(datos)
 

Compararemos el desempeño de cuatro modelos de clasificación vistos durante el


curso: bayes ingenuo, árboles de clasificación, bosques aleatorios, y regresión
logística.
3. Cree una tabla que compare el accuracy, specificity, y sensitivity para cada uno de
los cuatro modelos de clasificación. Para cada modelo, utilice la función rfe del
paquete caret para identifique el subconjunto óptimo de variables que producen el
modelo con mayor accuracy. (60 puntos)

#selección de variables óptimas y creación de nuevo dataframe 


dataframe 
control = rfeControl(fu
rfeControl(functions=rfFuncs,
nctions=rfFuncs,
method= "repeatedc
"repeatedcv",
v",
repeats = 3,
verbose = TRUE)

modelo.seleccion.variables <- rfe(subset(TR


modelo.seleccion.variables rfe(subset(TRAIN,select=-C
AIN,select=-Churn),
hurn),
TRAIN$Churn,
rfeControl = control)
corrida:

modelo.seleccion.variables

modelo.seleccion.variables$optsize
modelo.seleccion.variables$optVariables
modelo.seleccion.variables$fit
 

 
corrida:

variable.op= datos
summary(variable.op)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-gender)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-SeniorC
select=-SeniorCitizen)
itizen)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Partne
select=-Partner)
r)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Depende
select=-Dependents)
nts)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-PhoneSer
select=-PhoneService)
vice)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Multiple
select=-MultipleLines)
Lines)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Device
select=-DeviceProtection)
Protection)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Stre
select=-StreamingTV)
amingTV)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Stream
select=-StreamingMovies)
ingMovies)
variable.op=subset(variable.op,
variable.op=subset(variable.op, select=-Paperle
select=-PaperlessBilling
ssBilling )
variable.op=subset(variable.op, select=-Payme
variable.op=subset(variable.op, select=-PaymentMethod)
ntMethod)

particion2 <- createData


createDataPartition(variable.op
Partition(variable.op$Churn,
$Churn,
p=0.7,
list=FALSE,
times=1)

TRAIN2 <- variable.op[partici


variable.op[particion,]
on,]
TEST2 <- variable.op[-part
variable.op[-particion,]
icion,]
 

# Arboles de Clasificación

modelo1 <- train(x=subs


train(x=subset(TRAIN2,selec
et(TRAIN2,select=-Churn),
t=-Churn),
y=TRAIN2$Churn,
method="rpart",
trControl=trainControl(method="c
trControl=train Control(method="cv",number=10))
v",number=10))
modelo1

modelo1$modelType
modelo1$finalModel

prediccion <- predict(modelo1, TEST2, type="raw")

confusionMatrix(prediccion,
confusionMatrix(prediccion, TEST2$Churn)

corrida:

#Bayes Ingenuo

library("klaR")
library("e1071")

modelo2 <- train(x=subs


train(x=subset(TRAIN2,
et(TRAIN2, select=-Churn),
y=TRAIN2$Churn,
method="nb")

modelo2
modelo2$modelType
modelo2$finalModel
 

 
prediccion <- predict(modelo2, TEST2, type="raw")

confusionMatrix(prediccion,
confusionMatrix(prediccion, TEST2$Churn)

corrida:

#Bosque Aleatorio

modelo3 <- train(x=subs


train(x=subset(TRAIN2,sele
et(TRAIN2,select=-Churn),
ct=-Churn),
y=TRAIN2$Churn,
method = "rf",
trControl = trainControl(met
trainControl(method="cv",number
hod="cv",number=10))
=10))
modelo3
modelo3$modelType
modelo3$finalModel

prediccion <- predict(modelo3, TEST2, type="raw")

confusionMatrix(prediccion,
confusionMatrix(prediccion, TEST2$Churn)

corrida:
 

#Regresión

modelo4 <- train(x=subs


train(x=subset(TRAIN2,sele
et(TRAIN2,select=-Churn),
ct=-Churn),
y=TRAIN2$Churn,
method = "glm",
family="binomial",
trControl=trainControl(method="cv",
number=10,
classProbs=TRUE,
summaryFunction = twoClassSummary)
twoClassSummary)))
modelo4
modelo4$modelType
modelo4$finalModel

prediccion <- predict(modelo4, TEST2, type="raw")

confusionMatrix(prediccion,
confusionMatrix(prediccion, TEST2$Churn)

corrida:
 

#Crear una tabla que compare el accuracy, specificity, y sensitivity para cada uno de
los cuatro modelos de clasificación

MODELOS
Accuracy Specificity Sensitivity
Árbol Clasificacion 0.7861 0.3643 0.9386
Bayes Ingenuo 0.75 0.7750 0.7532
Bosques
0.7894 0.4446 0.9141
Aleatorios
Regresión 0.7917 0.5161 0.8915

4. Determine la selección de modelo. Justifique su respuesta. (20 puntos)

Para determinar una


correcta selección del
modelo, nos basamos en
la evaluación desempeño
en clasificación binaria:
 

De esta manera se definen las medidas estadísticas del desempeño de la clasificación


binaria:

  Accuracy: (True Positive +True Negative)/ (True Positive+ False Positive + True


Negative + False Negative)


= (Correctly Selected + Correctly Rejected)/ (Total Excellent candidates
who actually deserved Selection + Total poor candidates who actually

deserved Rejection)
  Sensitivity = True Positive / True Positive + False Negative

= Correctly Selected/ Total Excellent candidates who actually deserved


Selection
  Specificity = True Negative/ True Negative + False Positive

= Correctly Rejected/ Total poor candidates who actually deserved


Rejection

Decisión en base a Compañía de Telecomunicaciones

Debido a que la compañía desea predecir la probabilidad de deserción de sus clientes, para así
poder identificar las causas raíz de la deserción y tomar acciones en la dirección de retener al
cliente. A esta le conviene identificar el error Tipo 1, es decir, determinar que clientes realmente
no quieren desertar pero que en el sistema se encuentran como si debieran terminar la relación
comercial con la compañía. En base a este análisis se realizó el siguiente gráfico basado en la
tabla:

Comparación de Modelos
1
0,9
0,8
0,7
0,6

0,5
0,4
0,3
0,2
0,1
0
Árbol Clasificacion Bayes Ingenuo Bosques Aleatorios Regresión

Accuracy Specificity Sensitivity


 

Accuracy
Entre los 4 modelos, el que tiene mayor precisión es el de Regresión con una medida de
0.7917, luego le sigue el Bosques Aleatorios con 0.7894, Árbol de clasificación con
0.7861 y finalmente Bayes Ingenuo con 0.759.
Specificity

El modelo
debido con mayor
a que especificidad
este valor es el Bayes Ingenuo
es el complemento del Errorcon unaI,probabilidad
Tipo de 0.7750,
el cual implica que la
empresa disertara clientes que realmente no romperán la relación comercial existente,
lo cual afecta en una mayor cantidad a los recursos de la compañía.
Sensitivity
Para esta medida, le interesa a la compañía conocer el mayor valor de probabilidad,
porque este indica que personas van a disertar y que en el programa indica que si deben
ser disertados. El modelo con mayor sensibilidad es el de Árbol de Clasificación con una
probabilidad de 0.9386.
Bajo el análisis realizado, se concluyó que el modelo ideal para que la compañía de
servicios de telecomunicaciones pueda predecir la probabilidad de deserción de sus
clientes, es el Bayes Ingenuo. Esto se debe a que a la empresa le interesa reducir el Error
Tipo I, por lo tanto, le conviene utilizar un modelo de clasificación que tenga la
probabilidad de Specificity y Sensitivity mayor y pese a que el Accuracy es el más bajo
de los 4 modelos, Bayes Ingenuo es el que mejor se acomoda a las necesidades de la
compañía de telecomunicac
telecomunicaciones.
iones.

MODELOS
Accuracy Specificity Sensitivity
Árbol Clasificacion 0.7861 0.3643 0.9386
Bayes Ingenuo 0.75 0.7750 0.7532
Bosques 0.7894 0.4446 0.9141
Aleatorios
Regresión 0.7917 0.5161 0.8915
 

Código Completo Adjunto:


# instalamos y cargamos paquetes necesarios
install.packages("rpart")
install.packages("caret")
library("rpart")
library("caret")

datos<- read.csv("C:/Users/FIMCP/Downloads/telecom_churn.csv",sep=","
read.csv("C:/Users/FIMCP/Downloads/telecom_churn.csv",sep=","))
head(datos)
summary(datos)

# PUNTO 2: Prepare los datos convirtiendo correctamente las variables en categóricas y en


numéricas

datos$gender<-as.factor(datos$gender)
datos$SeniorCitizen<-as.factor(datos$SeniorCitizen)
datos$Partner<-as.factor(datos$Partner)
datos$Dependents<-as.factor(datos$Dependents)
datos$PhoneService<-as.factor(datos$PhoneService)
datos$MultipleLines<-as.factor(datos$MultipleLines)
datos$InternetService<-as.factor(datos$InternetService)
datos$OnlineSecurity<-as.factor(datos$OnlineSecurity)
datos$OnlineBackup<-as.factor(datos$OnlineBackup)
datos$DeviceProtection<-as.factor(datos$DeviceProtection)
datos$TechSupport<-as.factor(datos$TechSupport)
datos$StreamingTV<-as.factor(datos$StreamingTV)
datos$StreamingMovies<-as.factor(datos$StreamingMovies)
datos$Contract<-as.factor(datos$Contract)
datos$PaperlessBilling<-as.factor(datos$PaperlessBilling)
datos$PaymentMethod<-as.factor(datos$PaymentMethod)
datos$Churn<-as.factor(datos$Churn)
summary(datos)
datos<-na.omit(datos)
datos <- datos[,-1]
sum(is.na(datos))
summary(datos)
# PUNTO 1: Particionar los datos en 70% para entrenamiento del modelo y 30% para prueba.
particion <- createDataPartition(datos$Churn,
c reateDataPartition(datos$Churn,
p=0.7,
list=FALSE,
times=1)

TRAIN <- datos[particion,]


TEST <- datos[-particion,]

control = rfeControl(functions=rfFuncs,
method= "repeatedcv",
repeats = 3,
verbose = TRUE)
 

modelo.seleccion.variables <- rfe(subset(TRAIN,select=-Churn),


TRAIN$Churn,
rfeControl = control)

modelo.seleccion.variables

modelo.seleccion.variables$optsize
modelo.seleccion.variables$optVariables
modelo.seleccion.variables$fit

#seleccion de variables optimas y creacion de nuevo datafram

variable.op= datos
summary(variable.op)
variable.op=subset(variable.op, select=-gender)
variable.op=subset(variable.op, select=-SeniorCitizen)
variable.op=subset(variable.op, select=-Partner)
variable.op=subset(variable.op, select=-Dependents)
select=-Dependents)
variable.op=subset(variable.op, select=-PhoneService)
variable.op=subset(variable.op, select=-MultipleLines)
variable.op=subset(variable.op, select=-DeviceProtection)
variable.op=subset(variable.op, select=-StreamingTV)
variable.op=subset(variable.op, select=-StreamingMovies)
variable.op=subset(variable.op, select=-PaperlessBilling )
variable.op=subset(variable.op, select=-PaymentMethod)
select=-PaymentMethod)

particion2 <- createDataPartition(variable.op$Churn,


p=0.7,
list=FALSE,
times=1)

TRAIN2 <- variable.op[particion,]


TEST2 <- variable.op[-particion,]

# Arboles de Clasificacion
modelo1 <- train(x=subset(TRAIN2,select=-Churn),
train(x=subset(TRAIN2,select=-Churn),
y=TRAIN2$Churn,
method="rpart",
trControl=trainControl(method="cv",number=10))
modelo1
modelo1$modelType
modelo1$finalModel

prediccion <- predict(modelo1, TEST2, type="raw")

confusionMatrix(prediccion, TEST2$Churn)
 

# bayes ingenuo
library("klaR")
library("e1071")

modelo2 <- train(x=subset(TRAIN2, select=-Churn),


y=TRAIN2$Churn,
method="nb")

modelo2
modelo2$modelType
modelo2$finalModel

prediccion <- predict(modelo2, TEST2, type="raw")

confusionMatrix(prediccion, TEST2$Churn)

# Bosque Aleatorios
modelo3 <- train(x=subset(TRAIN2,select=-Churn),
train(x=subset(TRAIN2,select=-Churn),
y=TRAIN2$Churn,
method = "rf",
trControl = trainControl(method="cv",number=10))
trainControl(method="cv",number=10))
modelo3
modelo3$modelType
modelo3$finalModel

prediccion <- predict(modelo3, TEST2, type="raw")

confusionMatrix(prediccion, TEST2$Churn)

# REGRESION
modelo4 <- train(x=subset(TRAIN2,select=-Churn),
train(x=subset(TRAIN2,select=-Churn),
y=TRAIN2$Churn,
method = "glm",
family="binomial",
trControl=trainControl(method="cv",
number=10,
classProbs=TRUE,
summaryFunction = twoClassSummary))
modelo4
modelo4$modelType
modelo4$finalModel

prediccion <- predict(modelo4, TEST2, type="raw")

confusionMatrix(prediccion, TEST2$Churn)

También podría gustarte