Este projeto teve início em 2016, fruto da parceria entre o Núcleo de Pesquisas, Informações e Políticas Públicas DATAUFF e o Núcleo de Operações da Delegacia de Polícia Federal em Niterói com o objetivo de desenvolver um modelo de banco de dados digital georreferenciado para os registros de ocorrência de crimes de subtração de encomendas postais e a partir destes dados produzir visualização em mapas. A visualização será implementada utilizando pacotes da linguagem R, específicos para esta finalidade. Possibilitando assim uma nova forma de análise e de interpretações da ocorrência de crimes sobre encomendas postais na poligonal de Niterói.
#Banco de dados não disponível, pois os dados são confidenciais da Polícia Federal
dados <- read.csv(file="base_de_dados_em_sigilo")#Quais variáveis possuem dados em branco e quantas células em branco temos por variável:
sapply(dados, function(x) sum(is.na(x)))## RO SIAPRO DT.Assalto
## 0 0 0
## ano dia.semana mês
## 0 18 18
## H.Assalto Logradouro Bairro
## 0 0 0
## Mun CEP Latitude
## 0 0 0
## Longitude Veiculo.assaltante N.Assaltantes
## 0 0 3
## Fisico Cabelo Nasc.vitima
## 0 0 0
## Sexo.vitima Naturalidade G_Instrução.vitima
## 0 0 0
## Veiculo.vitima Sedex PAC
## 0 184 190
- Registros distribuídos por ano:
dAnos <- dados %>% count(ano)
ano <- dAnos %>% pull(ano) %>% as.factor()
freq_ano <- dAnos %>% pull(n) #pull seleciona coluna e retorna como vetor
p1 <- ggplot(data.frame(ano,freq_ano),
aes(x=ano, y=freq_ano, fill=as.factor(freq_ano)))+
geom_bar(stat="identity", width=0.5, position="dodge")+
labs(x="Ano", y="Frequência", fill="Frequência por ano",
title="Número de Assaltos aos Correios por ano"); p1- Registros distribuídos por dia da semana:
dados_sem1 <- na.omit(dados %>% count(dia.semana))
dia <- c("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab")
freq_dias <- dados_sem1 %>% pull(n)
data.frame(dia, freq_dias, perc=round(100*freq_dias/sum(freq_dias),1))## dia freq_dias perc
## 1 Dom 31 14.7
## 2 Seg 40 19.0
## 3 Ter 48 22.7
## 4 Qua 44 20.9
## 5 Qui 31 14.7
## 6 Sex 16 7.6
## 7 Sab 1 0.5
p2 <- ggplot(data.frame(dia, freq_dias),
aes(x=fct_reorder(dia, freq_dias), y=freq_dias, fill=as.factor(freq_dias)))+
geom_bar(stat="identity", width=0.5, position="dodge")+
labs(x="Dia da semana", y="Frequência", fill="Frequência por dia",
title="Número de Assaltos aos Correios"); p2#Omitindo os dados faltantes
ind <- is.na(dados$dia.semana)
dados1 <- dados[ind==FALSE,]
#criando correspondência entre dia da semana e o nome dos dias:
sem <- 1:7
nome.sem <- c("1.Domingo", "2.Segunda", "3.Terça", "4.Quarta", "5.Quinta", "6.Sexta", "7.Sábado")
names(sem) <- nome.sem
sem## 1.Domingo 2.Segunda 3.Terça 4.Quarta 5.Quinta 6.Sexta 7.Sábado
## 1 2 3 4 5 6 7
dia.sem.name <- names(sem)[dados1$dia.semana]
p3 <- ggplot(dados1, aes(x=as.factor(ano), fill=dia.sem.name))+
geom_bar(stat="count", width=0.5,position="dodge")+
labs(x="Anos", y= "frequencia", fill="Dias da semana",
title="Número de Assaltos aos Correios"); p3- Agora vamos utilizar o pacote data.table que foi concebido para facilitar a tabulação dos dados. Neste pacote podemos acessar rapidamente um subconjunto de dados, agrupá-los, atualizá-los e produzir tabelas.
dt=data.table(dados)
#Número de linhas
dt[,.N]## [1] 229
#Variáveis do banco de dados
names(dt)## [1] "RO" "SIAPRO" "DT.Assalto"
## [4] "ano" "dia.semana" "mês"
## [7] "H.Assalto" "Logradouro" "Bairro"
## [10] "Mun" "CEP" "Latitude"
## [13] "Longitude" "Veiculo.assaltante" "N.Assaltantes"
## [16] "Fisico" "Cabelo" "Nasc.vitima"
## [19] "Sexo.vitima" "Naturalidade" "G_Instrução.vitima"
## [22] "Veiculo.vitima" "Sedex" "PAC"
#Quantos níveis distintos em cada variável:
sapply(dt, function(x) length(unique(x)))## RO SIAPRO DT.Assalto
## 225 214 164
## ano dia.semana mês
## 4 8 13
## H.Assalto Logradouro Bairro
## 75 226 91
## Mun CEP Latitude
## 6 137 226
## Longitude Veiculo.assaltante N.Assaltantes
## 227 9 8
## Fisico Cabelo Nasc.vitima
## 195 11 76
## Sexo.vitima Naturalidade G_Instrução.vitima
## 6 25 11
## Veiculo.vitima Sedex PAC
## 12 28 23
#Quantos assaltos por município?
dt[,.N,by=Mun][order(-N)]## Mun N
## 1: São Gonçalo 181
## 2: Niterói 26
## 3: Itaboraí 10
## 4: Magé 8
## 5: Guapimirim 3
## 6: Tanguá 1
#Os seis bairros com maior ocorrência de assalto
head(dt[,.N,by=Bairro][order(-N)])## Bairro N
## 1: Jardim Catarina 27
## 2: Alcântara 11
## 3: Barro Vermelho 10
## 4: Trindade 9
## 5: Mutuá 9
## 6: Laranjal 7
#Simulando as ocorrências de um universo de 1000 assaltos por amostragem sobre os seis bairros com maior ocorrência de assalto
head(dt[sample(1:.N,1000, replace=T), .(mean=mean(.N)), by=Bairro][order(-mean)])## Bairro mean
## 1: Jardim Catarina 120
## 2: Barro Vermelho 50
## 3: Mutuá 44
## 4: Alcântara 38
## 5: Trindade 35
## 6: Laranjal 31
#Contagem de assaltos por mês
na.omit(dt[,.N,by=substr(mês,1,12)][order(-N)])## substr N
## 1: 7 35
## 2: 1 25
## 3: 9 21
## 4: 12 20
## 5: 8 19
## 6: 10 14
## 7: 5 14
## 8: 6 14
## 9: 4 13
## 10: 3 13
## 11: 11 12
## 12: 2 11
#Contagem de assaltos por dia da semana
na.omit(dt[,.N,by=substr(dia.semana,1,7)][order(-N)])## substr N
## 1: 3 48
## 2: 4 44
## 3: 2 40
## 4: 1 31
## 5: 5 31
## 6: 6 16
## 7: 7 1
- Registros distribuídos por bairro:
#Quantos bairros distintos?
dt %>% select(Bairro) %>% distinct() %>% nrow()## [1] 91
#Quantas ocorrencias em cada Bairro?
#modo1
dt %>% group_by(Bairro) %>% summarize(ocorrencia=n()) %>% arrange(desc(ocorrencia))## # A tibble: 91 x 2
## Bairro ocorrencia
## <fct> <int>
## 1 Jardim Catarina 27
## 2 Alcântara 11
## 3 Barro Vermelho 10
## 4 Mutuá 9
## 5 Trindade 9
## 6 Coelho 7
## 7 Laranjal 7
## 8 Rocha 7
## 9 Amendoeira 6
## 10 Fonseca 6
## # ... with 81 more rows
#modo2
dt %>% count(Bairro,sort=TRUE)## # A tibble: 91 x 2
## Bairro n
## <fct> <int>
## 1 Jardim Catarina 27
## 2 Alcântara 11
## 3 Barro Vermelho 10
## 4 Mutuá 9
## 5 Trindade 9
## 6 Coelho 7
## 7 Laranjal 7
## 8 Rocha 7
## 9 Amendoeira 6
## 10 Fonseca 6
## # ... with 81 more rows
Leaflet
O Leaflet é a principal biblioteca JavaScript de código aberto para mapas interativos compatíveis com dispositivos móveis, funciona de maneira eficiente em todas as principais plataformas móveis e de desktop.
getColor <- function(dados) { #entrar com os dados para utilizar a coluna ano (dados$ano) no sapply
sapply(dados$ano, function(ano) {
if(ano == 2013) {
"blue"
} else if(ano == 2014) {
"green"
} else if(ano == 2015) {
"orange"
} else {
"red"
}})
}
icons <- awesomeIcons(
icon = 'ios-close',
iconColor = 'black',
library = 'ion',
markerColor = getColor(dados)
)
leaflet(dados) %>% addTiles() %>%
addAwesomeMarkers(dados$Longitude/10^6, dados$Latitude/10^6,
icon=icons, label=~as.character(ano))