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.
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)
Definimos o diretório de trabalho, onde serão salvos os arquivos importados:
setwd("/home/gf/Downloads/")
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.
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.
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))
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
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