Churn Prediction

SVM


In [2]:
#install.packages("e1071")


Updating HTML index of packages in '.Library'
Making 'packages.html' ... done

In [3]:
library(e1071)

In [4]:
df <- read.csv('evasao.csv')

In [5]:
n <- nrow(df)
set.seed(42) # Se não fizer isso, verá valores diferentes dos meus
limite <- sample(1:n, size = round(0.75*n), replace = FALSE)
train_df <- df[limite,]
test_df <- df[-limite,]

In [58]:
abandonou = train_df$abandonou
periodo = train_df$periodo 
bolsa = train_df$bolsa 
repetiu =  train_df$repetiu
ematraso = train_df$ematraso 
disciplinas = train_df$disciplinas 
faltas = train_df$faltas
desempenho = train_df$desempenho
modelo_svm <- svm(abandonou ~ periodo + bolsa + repetiu + ematraso + disciplinas + faltas + desempenho , train_df,
                  kernel = 'polynomial', gamma = 10, cost = 2, type='C-classification')

In [59]:
summary(modelo_svm)


Call:
svm(formula = abandonou ~ periodo + bolsa + repetiu + ematraso + 
    disciplinas + faltas + desempenho, data = train_df, kernel = "polynomial", 
    gamma = 10, cost = 2, type = "C-classification")


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  polynomial 
       cost:  2 
     degree:  3 
      gamma:  10 
     coef.0:  0 

Number of Support Vectors:  91

 ( 48 43 )


Number of Classes:  2 

Levels: 
 0 1



In [65]:
abandonou = test_df$abandonou
periodo = test_df$periodo 
bolsa = test_df$bolsa 
repetiu =  test_df$repetiu
ematraso = test_df$ematraso 
disciplinas = test_df$disciplinas 
faltas = test_df$faltas
desempenho = test_df$desempenho

predicoes <- predict(modelo_svm, test_df)

In [66]:
head(predicoes)


3
0
4
1
7
1
9
1
11
1
17
0

In [67]:
df_predicao <- data.frame(desempenho = test_df$desempenho, 
                          repetiu = test_df$repetiu, 
                          abandonou_obs = test_df$abandonou, 
                          abandonou_pred = predicoes)

In [68]:
head(df_predicao)


desempenhorepetiuabandonou_obsabandonou_pred
38.0000000 0 0
44.0000008 1 1
72.0000006 0 1
92.8000007 0 1
112.6666675 0 1
179.0000000 0 0

In [69]:
erros <- test_df$abandonou != predicoes
qtdErros <- sum(erros)
percErros <- qtdErros / length(test_df$abandonou)
acuracia <- (1 - percErros) * 100
acuracia


61.3333333333333

In [ ]: