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")