Вы находитесь на странице: 1из 5

Métodos Analíticos para la Industria

Tarea N° 2

Nombre: Adriana María Villavicencio Jara Fecha: 7/07/2018

Tema: Una compañía proveedora de servicios de telecomunicaciones desea


predecir la probabilidad de deserción de sus clientes, para así poder identificar las
causa raíz de la deserción y tomar acciones en la dirección de retener al cliente.

Descripción del dataset: Para este tema se utilizará el conjunto de datos


telecom_churn.csv disponible en el SidWeb. El conjunto de datos consiste en 7043
registros de clientes de una compañía de servicios de telecomunicaciones
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.

Específicamente, se requiere:

1. Prepare los datos convirtiendo correctamente las variables en


categóricas y en numéricas (10 puntos)
#TAREA 2 MÉTODOS ANALÍTICOS PARA LA INDUSTRIA

#LLAMADA DE LOS DATOS


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

#OBSERVAR LOS DATOS ANTES DE CAMBIAR A VARIABLES CATEGÓRICAS


summary(datos)

#CAMBIO A VARIABLES CATEGÓ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<-datos[,-1]

2. Particionar los datos en 70% para entrenamiento del modelo y 30% para
prueba. Hacerlo aleatoriamente, utilizando la función sample. (10
puntos)

#PARTICIÓN DE DATOS EN TRAIN Y TEST

ix<-sample(nrow(datos),size=round(.7*nrow(datos)),replace = FALSE)
TRAIN<-datos[ix,]
TEST<-datos[-ix,]

names(datos)

nombres<-names(datos)[-20]
3. Identifique las 10 variables que producen el modelo de regresión
logística con menor error de predicción. Incluya para cada modelo una
búsqueda del umbral que produce el menor error de predicción. Utilice
los datos de entrenamiento para ajustar el modelo y datos de prueba
para evaluar su desempeño. (50 puntos)

#REGRESIÓN LOGÍSTICA CON LOS DATOS TRAIN

selected<-character()
resultados<-data.frame()
remaining=names(datos)[-20]
current_score<-0.0
best_new_score<-0.0
while (length(selected)<=10 & best_new_score==current_score){
scores_with_candidates<-data.frame()
for (candidate in remaining){
formula.definida<-as.formula(paste0("Churn ~", paste(c(selected, candidate),
collapse=" + ")))
#MOSTRAR CON FORMULA DEFINIDA
tempo<-glm(formula.definida,data=TRAIN,family="binomial")
prediccion<-predict(tempo, newdata=TEST)
prediccion<-1/(1+exp(-prediccion))
temp.theta<-seq(0.1, 0.9, 0.01)
y<-NULL
for (t in 1:length(temp.theta)){
temp.confusion<-table(TEST$Churn, ifelse(prediccion>temp.theta[t],1,0))
y[t] <-sum(diag(temp.confusion))/sum(temp.confusion)
}
#DATOS CONFUSION
precision<-max(y)
#DATOS PRECISION
scores_with_candidates<-rbind(scores_with_candidates,
data.frame("candidate"=candidate, "precision"=precision))
}
best_new_score<-max(scores_with_candidates$precision)
best_candidate<-
scores_with_candidates[which(scores_with_candidates$precision==best_new_score),1]
if (current_score<best_new_score){
selected<-c(selected,as.character(best_candidate))
remaining<-remaining[-which(remaining==best_candidate)]
current_score<-best_new_score
resultados<-rbind(resultados, data.frame("precicion"=best_new_score,
"variables"=paste(selected, collapse=" + ")))
print(paste(selected, collapse=" + "))
}
}
resultados
4. Presente el modelo encontrado en el literal anterior, junto con su matriz
de confusión (utilizando datos de prueba). (10 puntos)

formula.definida<-"Churn ~ tenure + MonthlyCharges + TechSupport + PhoneService +


MultipleLines + Contract"
tempo<-glm(formula.definida,data=TRAIN,family="binomial")
prediccion<-predict(tempo, newdata=TEST)
prediccion<-1/(1+exp(-prediccion))
temp.theta<-seq(0.1, 0.9, 0.01)
y<-NULL
for (t in 1:length(temp.theta)){
temp.confusion<-table(TEST$Churn, ifelse(prediccion>temp.theta[t],1,0))
y[t] <-sum(diag(temp.confusion))/sum(temp.confusion)
}
#MOSTRAR MATRIZ DE CONFUSIÓN
precision<-max(y)
id<-which.max(y)
confusion<-table(TEST$Churn, ifelse(prediccion>temp.theta[id],1,0))

confusion

De los resultados mostrados se obtuvo que 305clientes cayeron en error tipo 1, esto
quiere decir que: los clientes desertaron y el modelo mostró no. Los que cayeron en
error tipo 2 fueron 120 clientes, lo cual muestra que no desertaron aunque el modelo
mostró que sí.

5. Identifique los 2 clientes (del conjunto de datos de prueba) con una


mayor probabilidad de deserción predicha por el modelo, pero que en
los datos no hayan desertado (es decir, que en los datos tengan la
variable Churn con valor "No"). Muestre el valor de las características
(variables) de estos dos clientes. (20 puntos)

best.var<- "tenure + MonthlyCharges + TechSupport + PhoneService +


MultipleLines + Contract"
y_real<-ifelse(TEST$Churn=="No", 1, 0)
y_pred<-ifelse(prediccion>temp.theta[id], 0, 1)
false.pos<-which((y_real-y_pred)==-1)
muestra<-sample(1:length(false.pos), 2)
ix<-unlist(strsplit(as.character(best.var), " + ", fixed = TRUE))
iy<-NULL
for (t in 1:length(ix)){
iy<-c(iy, which(nombres==ix[t]))
}
TEST[false.pos[muestra],iy]

Вам также может понравиться