Visualização em mapa dos Assaltos aos Serviços Postais do Leste da Região Metropolitana Fluminense

Jerônimo José da Silva Júnior

Luciane Ferreira Alcoforado

Luiz Fernando Coelho Passos

Marlon Magalhães de Moraes

31/05/2018

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