Ir para Fase 7.

Inicialmente carraga o modelo de clusters.

rm(list = ls(all.names = TRUE))
library(leaflet)
library(leaflet.extras)
library(apcluster)
## 
## Attaching package: 'apcluster'
## The following object is masked from 'package:stats':
## 
##     heatmap
library(geosphere)
library(data.table)
setwd("~/OneDrive/r-files/TCC/")
load(file = "apres2-25000.rda")
load(file = "x2-25000.rda")
head(x2)
##           [,1]      [,2]
## [1,] -51.22665 -30.08557
## [2,] -51.20434 -30.06956
## [3,] -51.22628 -30.03048
## [4,] -51.17905 -30.05931
## [5,] -51.18213 -30.00723
## [6,] -51.21227 -30.12198
dim(x2)
## [1] 20000     2
summary(apres)
##   Length    Class     Mode 
##      136 APResult       S4

Inicializa a função de classificacao e atribuição de clusters.

predict.apcluster <- function(s, exemplars, newdata)
{
  simMat <- s(rbind(exemplars, newdata), sel=(1:nrow(newdata)) + nrow(exemplars))[1:nrow(exemplars), ]
  unname(apply(simMat, 2, which.max))
}

Carregamos os dados extraidos de um SGBD.
# SELECT * FROM ponto p, tipoSinal t WHERE _idtipoSinal IN (7, 8, 20) AND p._idtipoSinal = t.idtipoSinal

#carregamos o dataset de parquímetros
parq = read.csv('~/OneDrive/r-files/read_parquimetros/tipoSinal2.csv', header = FALSE, sep = ",")
head(parq)
dim(parq)
## [1] 220  23

Realizas os tipecasts e data cleaning necessários.

parq$V5 = as.integer(parq$V5)
parq$V6 = NULL;parq$V7 = NULL;parq$V8 = NULL;parq$V9 = NULL;parq$V10 = NULL;parq$V11 = NULL;parq$V12 = NULL;parq$V13 = NULL
parq$V14 = NULL;parq$V15 = NULL;parq$V16 = NULL;parq$V17 = NULL;parq$V19 = NULL;parq$V20 = NULL;parq$V1 = NULL
parq$V3 <- as.numeric(as.character(parq$V3))
parq$V4 <- as.numeric(as.character(parq$V4))
parq <- parq[parq$V3 < 0, ]
parq <- subset(parq, !is.na(V3))

Verifica os bairros onde existem parquímetros.

areas = unique(parq$V21)
print(areas)
##  [1] CENTRO           INDEPENDENCIA    TRISTEZA         PETROPOLIS      
##  [5] RIO BRANCO       MOINHOS DE VENTO AUXILIADORA      PRAIA DE BELAS  
##  [9] MENINO DEUS      FLORESTA         FARROUPILHA      SANTANA         
## [13] FARROUPINHA      BOM FIM          AZENHA           MOINHOS         
## [17]                 
## 17 Levels:  AUXILIADORA AZENHA BOM FIM CENTRO FARROUPILHA ... TRISTEZA
head(parq)
#Verificamos o número de parquímetros
dim(parq)
## [1] 220   8

Converte os valores de receita e número de vagas para numérico

parq$'V18' = as.numeric(as.character(parq$'V18'))

parq$'V5' = as.numeric(as.character(parq$'V5'))

Multiplicas o número de vagas pelo número de horas operacionais/ano.

parq$'V5' = ((parq$'V5' * 11) *280)*1.5

Divide a receita pelo número de horas para saber a taxa de ocupação.

parq$densidade = (parq$'V18' / parq$'V5')
head(parq)
names(parq) = c("V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8")
head(parq)
#aa= length(parq$V3)/10
#aa

Classifica os parquímetros dentro dos clusters identificados na clusterização dos alvarás.

resultado <- list()
resultado = predict.apcluster(negDistMat(r=2), x2[apres@exemplars, ],  parq[1:length(parq$V3), 2:3])
parq$cluster[1:length(parq$V3)] = resultado
length(resultado)
## [1] 220
head(parq)
names(parq) = c("V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "dens", "cluster")

Verifica os clusters nos quais os parquímetros foram atribuídos.

clusters_encontrados = unique(parq$cluster)
clusters_encontrados = sort(clusters_encontrados)
length(clusters_encontrados)
## [1] 24
clusters_encontrados
##  [1]   4   6   8  10  17  29  34  36  40  41  43  45  46  52  68  78  83
## [18]  86  99 103 112 116 125 135

Verifica a quantidade de parquímetros em cada cluster.

table(parq$cluster)
## 
##   4   6   8  10  17  29  34  36  40  41  43  45  46  52  68  78  83  86 
##   1   1   7   1   8   2   6  16   3   5  14   6   9   6  20   8   6  21 
##  99 103 112 116 125 135 
##   2  12  28  21   4  13
head(parq)

Classifica os parquimetros de acordo com a taxa de ocupação

library(Hmisc)
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## Loading required package: ggplot2
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
prop.table(table(cut2(parq$dens, g=10)))
## 
## [0.103,0.197) [0.197,0.230) [0.230,0.266) [0.266,0.304) [0.304,0.349) 
##           0.1           0.1           0.1           0.1           0.1 
## [0.349,0.391) [0.391,0.438) [0.438,0.497) [0.497,0.562) [0.562,1.355] 
##           0.1           0.1           0.1           0.1           0.1
prop.table(table(cut2(parq$dens, g=3)))
## 
## [0.103,0.282) [0.282,0.422) [0.422,1.355] 
##     0.3363636     0.3318182     0.3318182
prop.table(table(cut2(parq$dens, g=4)))
## 
## [0.103,0.245) [0.245,0.349) [0.349,0.470) [0.470,1.355] 
##          0.25          0.25          0.25          0.25
prop.table(table(cut2(parq$dens, g=5)))
## 
## [0.103,0.230) [0.230,0.304) [0.304,0.391) [0.391,0.497) [0.497,1.355] 
##           0.2           0.2           0.2           0.2           0.2
prop.table(table(cut2(parq$dens, g=6)))
## 
## [0.103,0.216) [0.216,0.282) [0.282,0.349) [0.349,0.422) [0.422,0.522) 
##     0.1681818     0.1681818     0.1636364     0.1681818     0.1681818 
## [0.522,1.355] 
##     0.1636364
parq$ocupacao <- as.integer(as.character(parq$dens))
parq$ocupacao <- round(parq$dens, 2)
parq$dens <- cut2(parq$dens, g=10)
head(parq)

Cria os pares de chaves para linkagem de dados

names(parq) = c("log", "lat", "lon", "v3", "v4", "V5", "group", "v7", "dens", "cluster", "ocupacao")
head(parq)
parq$id = (parq$cluster * 11)
parq$group = parq$id
head(parq)
dim(parq)
## [1] 220  12
head(parq)

Faz a carga dos dados dosclusters.

load("clusters_centroids.rda")
head(dadostemp)
head(parq)
names(parq) = c("log", "Lon", "Lat", "Horas", "Receita", "Bairro", "Group", "Equip", "faixas_ocupacao",  "cluster", "ocupacao")
head(parq)

Realiza typecasts necessários

dadostemp$cluster = as.numeric(as.character(dadostemp$cluster))
parq$cluster = as.numeric(as.character(parq$cluster))

Realiza um bind tipo “left outer join”.

parq[,"centroide_lon"]  <-dadostemp[parq[ ,"cluster"], "centroide_lat"]
parq[,"centroide_lat"]  <-dadostemp[parq[ ,"cluster"], "centroide_lon"]
parq[,"medoide_lon"]    <-dadostemp[parq[ ,"cluster"], "medoide_lat"]
parq[,"medoide_lat"]    <-dadostemp[parq[ ,"cluster"], "medoide_lon"]
parq[,"exemplar_lon"]<-dadostemp[parq[ ,"cluster"], "exemplars_lat"]
parq[,"exemplar_lat"]<-dadostemp[parq[ ,"cluster"], "exemplars_lon"]
parq[,"area"]           <-dadostemp[parq[ ,"cluster"], "area"]
parq[,"ocorrencias"]    <-dadostemp[parq[ ,"cluster"], "ocorrencias"]
parq[,"alvara_km2"]     <-dadostemp[parq[ ,"cluster"], "id"]
head(parq)
parquimetros_clusterizados = parq
head(parquimetros_clusterizados)

Calcula as distancias dos parquímetros em relaçãp à centróides, medoides e exemplares.

setDT(parquimetros_clusterizados)
parquimetros_clusterizados[, distancia_medoide := distHaversine(matrix(c(parquimetros_clusterizados$Lon, parquimetros_clusterizados$Lat), ncol = 2),                                                                matrix(c(parquimetros_clusterizados$medoide_lon, parquimetros_clusterizados$medoide_lat), ncol = 2))]

parquimetros_clusterizados[, distancia_cemtroide := distHaversine(matrix(c(parquimetros_clusterizados$Lon, parquimetros_clusterizados$Lat), ncol = 2),                                                                  matrix(c(parquimetros_clusterizados$centroide_lon, parquimetros_clusterizados$centroide_lat), ncol = 2))]


parquimetros_clusterizados[, distancia_exemplars := distHaversine(matrix(c(parquimetros_clusterizados$Lon, parquimetros_clusterizados$Lat), ncol = 2),                                                                  matrix(c(parquimetros_clusterizados$exemplar_lon, parquimetros_clusterizados$exemplar_lat), ncol = 2))]

head(parquimetros_clusterizados)

Realiza a carga de alvarás.

load("alvaras.rda")
head(alvaras)
dim(alvaras)
## [1] 177106      6
coord = alvaras[,1:2]
names(coord) = c("longitude", "latitude" )
head(coord)
dim(coord)
## [1] 177106      2
head(coord)
head(alvaras)
dim(coord)
## [1] 177106      2
str(coord)  
## 'data.frame':    177106 obs. of  2 variables:
##  $ longitude: num  -51.2 -51.2 -51.2 -51.2 -51.2 ...
##  $ latitude : num  -30.1 -30 -30 -30 -30 ...

Realiza o subset para as classes serviço e comércio.

servico         = alvaras[alvaras$V5 == "Servico", ]
names(servico)  = c("longitude", "latitude" )
servico         = servico[,1:2]
head(servico)
dim(servico)
## [1] 108449      2
comercio        = alvaras[alvaras$V5 == "Comercio", ]
comercio        = comercio[,1:2]
names(comercio) = c("longitude", "latitude" )
head(comercio)
dim(comercio)
## [1] 68657     2
alvaras_m       = alvaras[,1:2]
names(alvaras_m) = c("longitude", "latitude" )
head(alvaras_m)
dim(alvaras_m)
## [1] 177106      2

Realiza as iterações para identificar o número de alvaras de comércio e serviço num raio de 100 metros de cada parquímetro.

for(i in 1:length(parquimetros_clusterizados$log)){
  alvaras_df <- data.frame(alvaras_m, 
                           resultado = geosphere::distHaversine(
                             alvaras_m, 
                             c(parquimetros_clusterizados$Lon[i], parquimetros_clusterizados$Lat[i])
                           ) / 1000 < 0.1)    
  alv = as.data.frame(table(alvaras_df$resultado))
  parquimetros_clusterizados$alvaras[i] = alv[2,2]
}
for(i in 1:length(parquimetros_clusterizados$log)){
  comercio_df <- data.frame(comercio, 
                            resultado = geosphere::distHaversine(
                              comercio, 
                              c(parquimetros_clusterizados$Lon[i], parquimetros_clusterizados$Lat[i])
                            ) / 1000 < 0.1)    
  com = as.data.frame(table(comercio_df$resultado))
  parquimetros_clusterizados$comercio[i] = com[2,2]
}
for(i in 1:length(parquimetros_clusterizados$log)){
  servico_df <- data.frame(servico, 
                           resultado = geosphere::distHaversine(
                             servico, 
                             c(parquimetros_clusterizados$Lon[i], parquimetros_clusterizados$Lat[i])
                           ) / 1000 < 0.1)    
  ser = as.data.frame(table(servico_df$resultado))
  parquimetros_clusterizados$servico[i] = ser[2,2]
}

Viasualiza o resultado.

head(parquimetros_clusterizados)

Elimina os parâmetros desbecessários

parquimetros_clusterizados[,1:8] = NULL
parquimetros_clusterizados[,c(2, 4:10)] = NULL
head(parquimetros_clusterizados)

Cria o atributo com os níveis de ocupação.

levels(parquimetros_clusterizados$faixas_ocupacao) <- c(1:10)
perc_oc = parquimetros_clusterizados$faixas_ocupacao
parquimetros_clusterizados = cbind(perc_oc, parquimetros_clusterizados)
head(parquimetros_clusterizados)

Realiza os demais typecasts necessários.

parquimetros_clusterizados$perc_oc= as.numeric(parquimetros_clusterizados$perc_oc)
parquimetros_clusterizados$faixas_ocupacao= as.numeric(parquimetros_clusterizados$faixas_ocupacao)
parquimetros_clusterizados$ocupacao= as.numeric(parquimetros_clusterizados$ocupacao)
parquimetros_clusterizados$area= as.numeric(parquimetros_clusterizados$area)
parquimetros_clusterizados$ocorrencias= as.numeric(parquimetros_clusterizados$ocorrencias)
parquimetros_clusterizados$alvara_km2= as.numeric(parquimetros_clusterizados$alvara_km2)
parquimetros_clusterizados$distancia_medoide= as.numeric(parquimetros_clusterizados$distancia_medoide)
parquimetros_clusterizados$distancia_cemtroide= as.numeric(parquimetros_clusterizados$distancia_cemtroide)
parquimetros_clusterizados$alvaras= as.numeric(parquimetros_clusterizados$alvaras)
parquimetros_clusterizados$comercio= as.numeric(parquimetros_clusterizados$comercio)
parquimetros_clusterizados$servico= as.numeric(parquimetros_clusterizados$servico)
parquimetros_clusterizados$servico = parquimetros_clusterizados$servico/parquimetros_clusterizados$alvaras
parquimetros_clusterizados$comercio = parquimetros_clusterizados$comercio/parquimetros_clusterizados$alvaras
parquimetros_clusterizados$perc_oc = 0

Classifica parquímetros com mais de 30% de ocupação como clace Zerp e com ocupação igual ou inferior a 30% como Um.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:Hmisc':
## 
##     src, summarize
## The following objects are masked from 'package:data.table':
## 
##     between, first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
parquimetros_clusterizados = parquimetros_clusterizados %>%
  mutate(perc_oc=replace(perc_oc, faixas_ocupacao==1, 1)) %>%
  as.data.frame()
table(parquimetros_clusterizados$perc_oc)
## 
##   0   1 
## 198  22
parquimetros_clusterizados = parquimetros_clusterizados %>%
  mutate(perc_oc=replace(perc_oc, faixas_ocupacao==2, 1)) %>%
  as.data.frame()
table(parquimetros_clusterizados$perc_oc)
## 
##   0   1 
## 176  44
parquimetros_clusterizados = parquimetros_clusterizados %>%
  mutate(perc_oc=replace(perc_oc, faixas_ocupacao==3, 1)) %>%
  as.data.frame()
table(parquimetros_clusterizados$perc_oc)
## 
##   0   1 
## 154  66
parquimetros_clusterizados = parquimetros_clusterizados %>%
  mutate(perc_oc=replace(perc_oc, faixas_ocupacao==4, 1)) %>%
  as.data.frame()
table(parquimetros_clusterizados$perc_oc)
## 
##   0   1 
## 132  88
parquimetros_clusterizados = parquimetros_clusterizados %>%
  mutate(perc_oc=replace(perc_oc, faixas_ocupacao==4, 1)) %>%
  as.data.frame()
table(parquimetros_clusterizados$perc_oc)
## 
##   0   1 
## 132  88

Transforma as variáveis de desfecho em categóricas.

parquimetros_clusterizados$perc_oc = as.factor(parquimetros_clusterizados$perc_oc)
parquimetros_clusterizados$faixas_ocupacao = as.factor(parquimetros_clusterizados$faixas_ocupacao)
parquimetros_clusterizados$ocupacao = as.factor(parquimetros_clusterizados$ocupacao)
head(parquimetros_clusterizados)

Realiza a divisão em datasets de treino e teste, sendo 85% para treino e 15% para teste do algorítimo.

library(caTools)
set.seed(1)
divisao = sample.split(parquimetros_clusterizados$faixas_ocupacao, SplitRatio = 0.85)
treino = subset(parquimetros_clusterizados, divisao == TRUE)
teste = subset(parquimetros_clusterizados, divisao == FALSE)
dim(treino)
## [1] 190  12
dim(teste)
## [1] 30 12
save(parquimetros_clusterizados, file = "parquimetros_clusterizados.Rda")
save(treino, file = "treino.Rda")
save(teste, file = "teste.Rda")

Ir para Fase 9.