Análise de dados com a Linguagem R: Segurança no Rio de Janeiro

Introdução ao Ciclo de Análise de Dados

A análise de dados é um processo estruturado que transforma informações brutas em conhecimento útil, orientando decisões mais embasadas. Esse processo é comumente representado como um ciclo composto por etapas interligadas, que vão desde a obtenção dos dados até a comunicação dos resultados. Dominar cada uma dessas etapas é essencial para qualquer profissional que deseje extrair valor dos dados — seja em contextos acadêmicos, corporativos ou governamentais. As fases clássicas incluem a coleta, o tratamento (ou limpeza), a análise exploratória, a modelagem e a apresentação dos resultados.

ciclo de análise de dados

Neste tutorial, aplicaremos o ciclo de análise de dados a um caso real e de grande relevância social: a segurança pública no estado do Rio de Janeiro. Utilizaremos a base de dados mensal de criminalidade, disponibilizada pelo Instituto de Segurança Pública (ISP). O objetivo é investigar as tendências de diferentes tipos de crimes ao longo das últimas décadas, identificando padrões e criando visualizações que facilitem a compreensão do cenário da criminalidade no estado.

Para conduzir a análise, utilizaremos a linguagem R em conjunto com o Quarto, uma ferramenta de publicação de código aberto que integra texto, código e visualizações em um único documento dinâmico e reprodutível. Ao longo das próximas seções, você será guiado passo a passo — desde o carregamento dos dados diretamente da fonte até a criação de gráficos que revelam as principais narrativas escondidas nos números. O propósito é capacitá-lo a reproduzir e adaptar esse fluxo de trabalho em suas próprias análises.

Nesta primeira etapa, o foco será apresentar o processo inicial da análise de dados, com ênfase na coleta e em uma exploração preliminar das informações. Em tutoriais futuros, aprofundaremos a investigação aplicando técnicas de séries temporais ao conjunto de dados, com destaque para a série “Homicídios por Intervenção Policial”. Também exploraremos o framework tidyverts, que permite construir modelos de previsão de maneira organizada e eficiente. Nosso objetivo central é ensinar como estruturar um framework de análise de dados claro, acessível e facilmente adaptável a diferentes contextos.

Para obter o tutorial deste exercício faça parte do Clube AM e receba toda semana os códigos em R/Python, vídeos, tutoriais e suporte completo para dúvidas.

1. Coleta e Carregamento dos Dados

A primeira etapa do nosso ciclo é a coleta. Aqui, nosso objetivo é importar os dados para o nosso ambiente de análise em R. Os dados do ISP estão convenientemente disponíveis online em um formato CSV (Comma-Separated Values), o que facilita o carregamento direto. Utilizaremos o pacote readr, parte do ecossistema tidyverse, para ler o arquivo. Desta forma, é simples o processo de simplesmente “plugar” o link de download do arquivo diretamente na função, de modo que o processo esteja automatizado.

Após o carregamento, é uma boa prática inspecionar a estrutura dos dados para entender suas colunas, tipos de variáveis e as primeiras linhas.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Rows: 417
Columns: 56
$ ano                        <dbl> 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1…
$ mes                        <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2…
$ hom_doloso                 <dbl> 657, 732, 713, 634, 650, 647, 558, 557, 542…
$ lesao_corp_morte           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ latrocinio                 <dbl> 15, 17, 25, 20, 20, 14, 14, 11, 19, 21, 13,…
$ cvli                       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ hom_por_interv_policial    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ letalidade_violenta        <dbl> 672, 749, 738, 654, 670, 661, 572, 568, 561…
$ tentat_hom                 <dbl> 162, 175, 216, 200, 146, 201, 201, 209, 146…
$ lesao_corp_dolosa          <dbl> 3051, 3421, 3613, 3211, 3051, 2977, 2784, 3…
$ estupro                    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ hom_culposo                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ lesao_corp_culposa         <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ roubo_transeunte           <dbl> 967, 963, 963, 1186, 931, 831, 797, 813, 80…
$ roubo_celular              <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ roubo_em_coletivo          <dbl> 381, 432, 422, 354, 335, 342, 308, 299, 281…
$ roubo_rua                  <dbl> 1348, 1395, 1385, 1540, 1266, 1173, 1105, 1…
$ roubo_veiculo              <dbl> 1174, 1097, 1265, 1415, 1449, 1354, 1365, 1…
$ roubo_carga                <dbl> 63, 64, 71, 81, 82, 82, 82, 71, 91, 83, 94,…
$ roubo_comercio             <dbl> 350, 357, 443, 425, 553, 518, 496, 498, 473…
$ roubo_residencia           <dbl> 188, 171, 191, 199, 231, 178, 186, 189, 199…
$ roubo_banco                <dbl> 37, 35, 43, 36, 27, 37, 25, 29, 12, 16, 26,…
$ roubo_cx_eletronico        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ roubo_conducao_saque       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ roubo_apos_saque           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ roubo_bicicleta            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ outros_roubos              <dbl> 158, 142, 131, 112, 147, 81, 94, 88, 90, 10…
$ total_roubos               <dbl> 3318, 3261, 3529, 3808, 3755, 3423, 3353, 3…
$ furto_veiculos             <dbl> 2009, 1850, 2084, 2085, 2185, 1992, 1978, 1…
$ furto_transeunte           <dbl> 1147, 1066, 1062, 1195, 723, 673, 700, 794,…
$ furto_coletivo             <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ furto_celular              <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ furto_bicicleta            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ outros_furtos              <dbl> 3561, 3309, 3573, 3290, 3546, 3519, 3604, 3…
$ total_furtos               <dbl> 6717, 6225, 6719, 6570, 6454, 6184, 6282, 6…
$ sequestro                  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ extorsao                   <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ sequestro_relampago        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ estelionato                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ apreensao_drogas           <dbl> 133, 127, 80, 133, 163, 157, 203, 215, 179,…
$ posse_drogas               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ trafico_drogas             <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ apreensao_drogas_sem_autor <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ recuperacao_veiculos       <dbl> 872, 751, 789, 787, 845, 802, 870, 809, 756…
$ apf                        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ aaapai                     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ cmp                        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ cmba                       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ ameaca                     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ pessoas_desaparecidas      <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ encontro_cadaver           <dbl> 217, 209, 188, 140, 78, 111, 126, 79, 71, 9…
$ encontro_ossada            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ pol_militares_mortos_serv  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ pol_civis_mortos_serv      <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ registro_ocorrencias       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ fase                       <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3…

Neste caso, observamos que o conjunto de dados possui colunas separadas para ano e mês, que juntas representam o contexto temporal da série. No entanto, linguagens de programação como o R não reconhecem automaticamente essa combinação como uma variável de tempo. Para contornar isso, é necessário realizar um pequeno tratamento, criando uma nova coluna do tipo Date, de modo que a linguagem consiga interpretar corretamente o componente temporal e permitir análises de séries históricas.

Em relação às demais variáveis (colunas), não há grandes complicações: todos os valores numéricos foram corretamente identificados como do tipo double, o que dispensa ajustes imediatos. Ainda assim, seria recomendável incluir um sanity check, já que dados extraídos diretamente de fontes públicas podem sofrer alterações ou inconsistências ao longo do tempo — embora, neste tutorial, não faremos essa verificação detalhada.

O principal ponto de atenção está nos valores ausentes (NA). Esse tipo de ocorrência é bastante comum em séries temporais brasileiras. No caso em questão, os valores faltantes concentram-se principalmente no início da série, o que é relativamente fácil de lidar. Já a presença de NAs ao longo de todo o período seria um problema mais sério, exigindo técnicas específicas de imputação ou tratamento, que poderão ser exploradas em etapas futuras da análise.

2. Tratamento e Limpeza dos Dados

Com os dados carregados, a próxima etapa é o tratamento, também conhecido como limpeza ou pré-processamento. Raramente os dados brutos estão prontos para a análise. Nesta fase, focamos em ajustar formatos, lidar com valores ausentes e criar novas variáveis que possam ser úteis. Para nossa análise de séries temporais, é crucial ter uma coluna de data adequada. Os dados originais possuem colunas separadas para ano e mês. Vamos combiná-las para criar uma única coluna de data, facilitando a plotagem e a análise temporal.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

3. Análise Exploratória e Visualização

Agora que nossos dados estão limpos e organizados, podemos iniciar a fase de análise exploratória. O objetivo aqui é investigar os dados para descobrir padrões, anomalias e tendências. A visualização de dados é a ferramenta mais poderosa nesta etapa. Vamos criar gráficos de séries temporais para observar a evolução de diferentes categorias de crimes ao longo do tempo.

3.1. Crimes Violentos

Primeiro, vamos focar em um grupo de crimes de alta letalidade e violência, como homicídio doloso, latrocínio e lesão corporal seguida de morte. Para visualizar todos esses crimes de forma comparável, precisamos antes remodelar nossos dados. Atualmente, cada tipo de crime está em uma coluna diferente (formato wide). Vamos transformá-los para o formato long, onde teremos uma coluna para o tipo de crime e outra para o número de ocorrências. Isso nos permite usar a função facet_wrap() do ggplot2 para criar um gráfico para cada crime.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Evolução dos crimes violentos no estado do Rio de Janeiro (1991–2025)

Cada série apresenta um comportamento distinto ao longo do tempo. Algumas mostraram tendência de crescimento consistente ao longo dos anos — como os casos de estupro e tentativa de homicídio, embora esta última apresente uma queda mais recente. Outras séries exibem variações de curto prazo, mas mantêm relativa estabilidade no longo prazo, como o latrocínio e a lesão corporal seguida de morte, que permanecem praticamente estáveis durante boa parte do período, com leve redução nos últimos anos.

Por outro lado, observamos séries com tendências de queda mais consistentes, especialmente os casos de letalidade violenta, homicídio doloso e homicídio culposo, indicando um movimento de redução gradual ao longo das últimas décadas.

3.2. Crimes de Roubo

Seguindo a mesma abordagem, agora vamos analisar a evolução dos crimes de roubo. Esta categoria inclui roubo de veículo, de celular, a transeunte, entre outros. O processo é idêntico: selecionamos as colunas de interesse, remodelamos os dados para o formato long e, em seguida, criamos um gráfico facetado para visualizar a tendência de cada tipo de roubo ao longo do tempo.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Crimes associados a roubos no estado do RJ (1991–2025)

Considerações Finais

A análise realizada mostrou como o ciclo de análise de dados pode ser aplicado, de forma estruturada e reprodutível, para investigar fenômenos sociais complexos — neste caso, a evolução dos crimes violentos no estado do Rio de Janeiro. A partir de uma base pública e acessível, foi possível percorrer todas as etapas fundamentais do processo analítico: desde a coleta e tratamento dos dados até a exploração e visualização dos resultados.

Nos próximos passos, poderemos aprofundar a investigação utilizando técnicas de modelagem de séries temporais, com o objetivo de construir previsões e compreender melhor as dinâmicas de longo prazo dos diferentes tipos de crime. Essa abordagem permitirá não apenas descrever o passado, mas também antecipar possíveis cenários futuros, ampliando o poder analítico do processo iniciado aqui.

Quer aprender mais?

Conheça nossa Formação do Zero à Análise de Dados Econômicos e Financeiros usando R. Aprenda do ZERO a coletar, tratar, construir modelos e apresentar dados econômicos e financeiros com o uso de Python e IA.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

O papel da credibilidade do Banco Central na desinflação da economia

O objetivo deste trabalho é mensurar a credibilidade da política monetária brasileira através de diferentes métricas e verificar empiricamente se uma maior credibilidade contribui para a redução da inflação. Realizamos a modelagem econométrica usando o pacote {systemfit} disponível na linguagem. Ao fim, criamos um relatório reprodutível com a combinação Quarto + R.

Análise de Criptomoedas com Python

Aprenda a estruturar um pipeline de dados financeiros com Python. Ensinamos a construção de um dashboard automatizado para coleta, tratamento e visualização de criptomoedas via API.

Como Construir um Monitor de Política Monetária Automatizado com Python?

Descubra como transformar dados do Banco Central em inteligência de mercado com um Monitor de Política Monetária Automatizado. Neste artigo, exploramos o desenvolvimento de uma solução híbrida (Python + R) que integra análise de sentimento das atas do COPOM, cálculo da Regra de Taylor e monitoramento da taxa Selic. Aprenda a estruturar pipelines ETL eficientes e a visualizar insights econômicos em tempo real através de um dashboard interativo criado com Shiny, elevando o nível das suas decisões de investimento.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.