datatable(dados)
## Warning in instance$preRenderHook(instance): It seems your data is too
## big for client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
Realizando algumas transformações como médias e ajustando as siglas para a natureza do prestador, temos :
datatable(dados)
dados %>%
select(4:8) %>%
melt() %>%
ggplot(aes(y = value)) +
geom_boxplot() +
facet_wrap(~variable, scales = "free")
Filtros adotados (Podem ser sugeridos novos filtros) :
dados_1 <- dados %>%
na.omit() %>%
filter(Tarif < 20) %>%
filter(Desemp < 800) %>%
filter(Sufic < 1000) %>%
filter(Receita < 1000) %>%
filter(Invest < 1500) %>%
filter(Invest >= 0)
dados_1 %>%
select(4:8) %>%
melt() %>%
ggplot(aes(y = value)) +
geom_boxplot() +
facet_wrap(~variable, scales = "free")
all_plots
## [[1]]
## [[1]][[1]]
##
##
## [[2]]
## [[2]][[1]]
##
##
## [[3]]
## [[3]][[1]]
##
##
## [[4]]
## [[4]][[1]]
##
##
## [[5]]
## [[5]][[1]]
data <- dados_1 %>%
select(4:9) %>%
group_by(Nat_jur) %>%
mutate(tarifa = scores(Tarif,type = "z", prob = 0.95)) %>%
mutate(desemp_fin = scores(Desemp,type = "z", prob = 0.95)) %>%
mutate(suf_caixa = scores(Sufic,type = "z", prob = 0.95)) %>%
mutate(receita_capita = scores(Receita,type = "z", prob = 0.95)) %>%
mutate(invest_capita = scores(Invest,type = "z", prob = 0.95)) %>%
mutate(invest_capita = ifelse(is.na(invest_capita), FALSE, invest_capita)) %>%
mutate(outlier = if_else(tarifa == FALSE & desemp_fin == FALSE &
suf_caixa == FALSE & receita_capita == FALSE &
invest_capita == FALSE, 0 , 1)) %>%
ungroup()
datatable(data)
data %>%
filter(outlier == 0) %>%
group_by(Nat_jur) %>%
melt() %>%
filter(variable != "outlier") %>%
ungroup() %>%
group_by(Nat_jur) %>%
ggplot(aes(x = Nat_jur, y = value)) +
geom_boxplot() +
facet_wrap(~variable, ncol = 2, scales = "free") +
labs(title = "Grupo A", y = "Valor do indicador", x = "Tipo de prestador") +
opt
## Using Nat_jur, tarifa, desemp_fin, suf_caixa, receita_capita, invest_capita as id variables
data %>%
filter(outlier == 1) %>%
group_by(Nat_jur) %>%
melt() %>%
filter(variable != "outlier") %>%
ungroup() %>%
group_by(Nat_jur) %>%
ggplot(aes(x = Nat_jur, y = value)) +
geom_boxplot() +
facet_wrap(~variable, ncol = 2, scales = "free") +
labs(title = "Grupo B", y = "Valor do indicador", x = "Tipo de prestador") +
opt
## Using Nat_jur, tarifa, desemp_fin, suf_caixa, receita_capita, invest_capita as id variables
Floresta Aleatória (random forest) é um algoritmo de aprendizagem supervisionada, ou seja, temos previamente a classificação final desejada. A “floresta” criada é uma combinação de árvores de decisão, na maioria dos casos treinados com o método de bagging. A idéia principal deste método é que as árvores aleátorias “votam” no modelo mais adequado, criando então uma combinação final mais eficiente e estável do que o modelo de árvores de decisão.
Uma grande vantagem do algoritmo de random forest é que ele pode ser utilizado tanto para tarefas de classificação quanto para regressão, o que representa a maioria dos sistemas de aprendizagem de máquina atuais
O grupo A será aquele onde o modelo será treinado, testado e validado, para isto fracionaremos os dados em dois grupos: Treino e Teste. Além disto, utilizaremos o método k-fold para a validação cruzada do modelo durante o treino, desta forma queremos reduzir a possibilidade de overfitting deste.
data_full <- data %>%
filter(outlier == 0) %>%
select(c(1:6))
seed <- 7
metric <- "Accuracy"
set.seed(seed)
indxTrain <- createDataPartition(y = data_full$Nat_jur,p = 0.75,list = FALSE)
training <- data_full[indxTrain,]
testing <- data_full[-indxTrain,]
#Preprocessing
trainX <- training[,names(training) != "Nat_jur"]
preProcValues <- preProcess(x = trainX,method = c("center", "scale"))
#Training and train control
control <- trainControl(method="repeatedcv", number=10, repeats=3)
# rf_default <- train(Nat_jur ~ ., data = training, method="rf",
# metric=metric, trControl=control)
load("C:/Users/tarss/Desktop/Trabalhos em andamento/cbesa/Paty/rf.RData")
rf_default
## Random Forest
##
## 2619 samples
## 5 predictor
## 4 classes: 'AUT', 'PRE', 'PRI', 'REG'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times)
## Summary of sample sizes: 2357, 2358, 2356, 2357, 2357, 2357, ...
## Resampling results across tuning parameters:
##
## mtry Accuracy Kappa
## 2 0.8620400 0.6844970
## 3 0.8625499 0.6852125
## 5 0.8601296 0.6794393
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 3.
# Temos uma acurácia de 86,5% um bom resultado, porém, o que determina a qualidade de um algoritmo de aprendizado é a qualidade do teste.
# mtry = 3, ou seja, o número de variáveis amostradas aleatoriamente para serem candidatas nos ramos das árvores.
# Vemos que a ordem de importância das variáveis para classificação é:
importance(rf_default$finalModel)
## MeanDecreaseGini
## Tarif 436.7746
## Desemp 160.3248
## Sufic 216.9506
## Receita 190.2522
## Invest 177.6986
testX <- testing[,names(testing) != "Nat_jur"]
rpartPred <- predict(rf_default, testX)
# 89% de precisão no teste, um bom resultado, porém para as naturezas juridicas: Autarquia e Privada as precisões são mais baixas, deve-se ponderar também que há um desequilibrio entre os numéros de observação de cada uma das features.
confusionMatrix(rpartPred, as.factor(testing$Nat_jur))
## Confusion Matrix and Statistics
##
## Reference
## Prediction AUT PRE PRI REG
## AUT 53 4 9 4
## PRE 12 102 1 2
## PRI 8 0 27 2
## REG 27 3 4 612
##
## Overall Statistics
##
## Accuracy : 0.9126
## 95% CI : (0.8919, 0.9306)
## No Information Rate : 0.7126
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8027
## Mcnemar's Test P-Value : 0.0007998
##
## Statistics by Class:
##
## Class: AUT Class: PRE Class: PRI Class: REG
## Sensitivity 0.53000 0.9358 0.65854 0.9871
## Specificity 0.97792 0.9803 0.98794 0.8640
## Pos Pred Value 0.75714 0.8718 0.72973 0.9474
## Neg Pred Value 0.94125 0.9907 0.98319 0.9643
## Prevalence 0.11494 0.1253 0.04713 0.7126
## Detection Rate 0.06092 0.1172 0.03103 0.7034
## Detection Prevalence 0.08046 0.1345 0.04253 0.7425
## Balanced Accuracy 0.75396 0.9580 0.82324 0.9255
new <- data %>%
filter(outlier == 1) %>%
select(c(1:5))
out <- data %>%
filter(outlier == 1)
rf_b <- predict(rf_default,newdata = new)
# A matriz abaixo exibe como seriam reclassificados os "outliers":
#confusionMatrix(rf_b, as.factor(testing$Nat_jur))
load("B.RData")
aux
## Confusion Matrix and Statistics
##
## Reference
## Prediction AUT PRE PRI REG
## AUT 11 11 3 34
## PRE 7 43 2 22
## PRI 57 14 29 145
## REG 38 38 14 463
##
## Overall Statistics
##
## Accuracy : 0.5865
## 95% CI : (0.5541, 0.6183)
## No Information Rate : 0.7132
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.2427
## Mcnemar's Test P-Value : <2e-16
##
## Statistics by Class:
##
## Class: AUT Class: PRE Class: PRI Class: REG
## Sensitivity 0.09735 0.40566 0.60417 0.6973
## Specificity 0.94132 0.96242 0.75538 0.6629
## Pos Pred Value 0.18644 0.58108 0.11837 0.8373
## Neg Pred Value 0.88303 0.92649 0.97230 0.4683
## Prevalence 0.12137 0.11386 0.05156 0.7132
## Detection Rate 0.01182 0.04619 0.03115 0.4973
## Detection Prevalence 0.06337 0.07948 0.26316 0.5940
## Balanced Accuracy 0.51933 0.68404 0.67977 0.6801
A partir dos dados obtidos, pode-se pensar a cerca da relação dos outliers. Para as Autarquias temos reclassificações associadas, principalmente, a empresas de prestação de saneamento com a natureza jurídica privada ou regional.
Para as prefeituras, temos como principais reclassificações a própria prefeitura ou empresas regionais. Quanto a reclassificação ser, majoritariamente, igual a classificação original, pode-se inferir que existe uma grande variabilidade dos indicadores financeiros das prestoras de saneamento com a natureza juridica relacionada a prestação pela própria prefeitura. Criando, assim, indicadores com valores distintos dos outros tipos de prestadores, mas com grande variabilidade interna.
As empresas privadas, também, não são na sua maioria reclassificadas, ou seja mantem a feature original. Pode-se pensar que este fato é correlacionado a sua natureza própria que visa o lucro, tendo, assim, indicadores que são bastante distintos quanto as demais. Salienta-se, também, que a tarifa é a variável mais importante, fato que corrobora com o apresentado acima.
Para as prestadoras regionais, observa-se um grande indice de não reclassificação, demonstrando uma grande variabilidade dos seus indicadores, fato este que é decorrência da grande abrangência dos municípios atentidos por estas (de grandes centros economicos a pequenas cidades do interior com menos de 20 mil habitantes).