Introdução

O tema da violência urbana suscita debates na imprensa, redes sociais e casa legislativa. A par da relevância eleitoral, suscitada pela exploração da política do medo, publicações científicas sérias divulgam estudos elaborados com rigor metodológico.

O Atlas da Violência, produzido pelo Instituto de Pesquisa Econômica Aplicada (Ipea) e pelo Fórum Brasileiro de Segurança Pública (FBSP), fornece dados para compreender a evolução da violência no país, a partir de 1996.

Com base nesse estudo, buscamos representar graficamente a evolução da taxa de homicídios dos municípios mineiros, com população acima de 200 mil habitantes.

Para tanto, utilizamos o RStudio, interface funcional e amigável para o R, linguagem para cálculo estatístico e visualização gráfica, largamente utilizada por estatísticos e cientistas de dados.

Pré-requisitos

Bibliotecas

Para adicionar funcionalidades extras, necessárias para baixar e ler páginas web, manipular dados e ler arquivos em diversos formatos, dentre outras utilidades, carregamos as seguintes bibilotecas:

library(tidyverse)
library(reshape2)
library(stringr)
library(ggthemes)
library(RColorBrewer)
library(rvest)

Definição do diretório de trabalho

Definimos o diretório de trabalho, onde serão salvos os arquivos importados:

setwd("/home/gf/Downloads/")

Recursos

Taxa de homicídios por município

Baixamos manualmente o arquivo no formato csv, disponível em http://www.ipea.gov.br/atlasviolencia/dados-series/20, contendo a série histórica da taxa de violência de todos os municípios brasileiros, de 1996 a 2016.

Listagem de municípios por população

Para identificar os municípios com o perfil desejado, utilizamos uma listagem disponível no seguinte endereço: https://pt.wikipedia.org/wiki/Lista_de_munic%C3%ADpios_do_Brasil_por_popula%C3%A7%C3%A3o.

Tarefas de pré-processamento

Coleta de dados

Extração da série histórica

Após definirmos o diretório de trabalho, importamos o arquivo no formato csv, renomeamos os cabeçalhos das colunas e arredondamos a taxa:

homicidios <- read.csv2('/home/gf/Downloads/taxa-homicidios-1996-01-15-2016-01-15.csv', header=TRUE, sep=';', stringsAsFactors = FALSE)
homicidios <- plyr::rename(homicidios, c("cod"="COD", "nome"="Município", "período"="Ano", "valor"="Taxa"))
homicidios$Taxa <- round(as.numeric(homicidios$Taxa))
Extração da tabela de municípios x população

Para lermos a página web, utilizamos uma função que retorna todas as informações do arquivo html:

url <- "https://pt.wikipedia.org/wiki/Lista_de_munic%C3%ADpios_do_Brasil_por_popula%C3%A7%C3%A3o"
page <- read_html(url)

Consultamos a quantidade de tabelas disponíveis na página:

tbls <- html_nodes(page, "table")
length((tbls))
## [1] 1
head(tbls)
## {xml_nodeset (1)}
## [1] <table class="wikitable sortable" style="text-align: center;"><tbody ...

Em seguida, extraimos o conteúdo da única tabela existente:

tab <- as.data.frame(html_table(page, fill = FALSE))

Inspecionamos o objeto e efetuamos as modificações desejadas; como por exemplo, simplificar os nomes das variáveis, para facilitar a manipulação:

str(tab) 
## 'data.frame':    5570 obs. of  5 variables:
##  $ Posição           : chr  "1º" "2º" "3º" "4º" ...
##  $ Código.IBGE       : int  3550308 3304557 5300108 2927408 2304400 3106200 1302603 4106902 2611606 4314902 ...
##  $ Município         : chr  "São Paulo" "Rio de Janeiro" "Brasília" "Salvador" ...
##  $ Unidade.federativa: chr  "São Paulo" "Rio de Janeiro" "Distrito Federal" "Bahia" ...
##  $ População         : int  12106920 6520266 3039444 2953986 2627482 2523794 2130264 1908359 1633697 1484941 ...
names(tab)[which(names(tab)=="Código.IBGE")] <- "COD"
names(tab)[which(names(tab)=="Unidade.federativa")] <- "UF"
str(tab)
## 'data.frame':    5570 obs. of  5 variables:
##  $ Posição  : chr  "1º" "2º" "3º" "4º" ...
##  $ COD      : int  3550308 3304557 5300108 2927408 2304400 3106200 1302603 4106902 2611606 4314902 ...
##  $ Município: chr  "São Paulo" "Rio de Janeiro" "Brasília" "Salvador" ...
##  $ UF       : chr  "São Paulo" "Rio de Janeiro" "Distrito Federal" "Bahia" ...
##  $ População: int  12106920 6520266 3039444 2953986 2627482 2523794 2130264 1908359 1633697 1484941 ...

Por fim, extraimos o subconjunto composto pelo municípios pertencentes à UF=MG e população >= 200000 habitantes. No total, treze municípios mineiros atendem ao perfil dos critérios fornecidos.

pop <- tab %>%
  filter(UF == "Minas Gerais" & População >= 200000) %>%
  select(COD, Município, População)

pop
##        COD            Município População
## 1  3106200       Belo Horizonte   2523794
## 2  3170206           Uberlândia    676613
## 3  3118601             Contagem    658580
## 4  3136702         Juiz de Fora    563769
## 5  3106705                Betim    427146
## 6  3143302        Montes Claros    402027
## 7  3154606   Ribeirão das Neves    328871
## 8  3170107              Uberaba    328272
## 9  3127701 Governador Valadares    280901
## 10 3131307             Ipatinga    261203
## 11 3167202          Sete Lagoas    236228
## 12 3122306          Divinópolis    234937
## 13 3157807          Santa Luzia    218897

Conjunto de dados

Construimos o conjunto de dados a ser analisado, a partir da junção de duas tabelas: a primeira tabela, denominada “homicidios”, contendo a série histórica da taxa de homicidios de todos os municípios brasileiros, de 1996 a 2016; a segunda tabela, denominada “pop”, contendo a relação dos municípios mineiros com mais de 200 mil habitantes. Ao mesclar as duas tabelas, tomando como critério de junção a chave “COD”, extraímos um conjunto de dados que é a representação tabular da amostra, resultante do subconjunto definido anteriormente, contendo vinte e uma observações, por município, uma para cada registro das variáveis mapeadas (Ano, Taxa):

pop <- pop %>%
  select(COD, População) %>%
  left_join(homicidios, by = "COD")

Então publicamos o gráfico para visualização da série histórica de todos os municípios mineiros com mais de 200 mil habitantes:

gl <- ggplot(data = pop, aes(x = Ano, y = Taxa, color = Município)) +
theme_economist() +
scale_fill_brewer(palette="Set2") +
geom_line(linetype="solid", size=1.0) +
geom_point() +
scale_y_continuous(breaks=seq(10,100,10)) +
scale_x_discrete(limit=seq(1996,2016,1)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
theme(plot.title = element_text(size = 12, face = "bold")) +
theme(legend.text = element_text(size=7)) +
xlab(" ") +
ylab("Taxa/100 mil habitantes") +
ggtitle("Evolução da taxa de homicídios por município nos últimos 20 anos")

gl

Para termos uma perspectiva individualizada, utilizamos uma função que permite visualizar subconjuntos de dados em gráficos separados, por município:

glf <- gl + 
  geom_line() +
  facet_wrap(~Município, ncol = 4 ) +
theme(strip.text = element_text(size = 7)) +
  scale_y_continuous(breaks=seq(10,100,30)) +
  scale_x_discrete(limit=seq(1996,2016,2)) +
  theme(legend.position = "none")

glf