Introdução: Da Visão Geral ao Foco Específico
Após uma análise exploratória inicial das principais categorias de crimes, é hora de aprofundar nossa investigação em uma variável específica para prepará-la para a modelagem de previsão. Escolhemos a série de “homicídios por intervenção policial” por sua relevância social e complexidade. Antes de tentar prever o futuro, um cientista de dados deve dissecar o passado, entendendo a estrutura fundamental da série temporal: sua tendência, sazonalidade, autocorrelação e a presença de anomalias.
Nesta seção do tutorial, vamos conduzir uma análise diagnóstica completa. Começaremos visualizando a série e sua tendência, depois a decomporemos em seus componentes fundamentais. Em seguida, investigaremos a distribuição estatística dos dados e, por fim, aplicaremos técnicas mais avançadas, como a análise de autocorrelação e testes de estacionariedade, que são pré-requisitos cruciais para a construção de modelos de previsão robustos como o ARIMA.
Quer ver a vídeoaula do tutorial deste exercício? E receber o código que o produziu? 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. Preparação dos Dados
A primeira etapa consiste em carregar as bibliotecas necessárias e os dados, além de realizar a limpeza básica que já fizemos anteriormente, garantindo que tenhamos uma coluna de data pronta para a análise de séries temporais.
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…
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
2. Análise Visual da Série Temporal
A forma mais intuitiva de começar a análise é simplesmente plotar os dados ao longo do tempo. Isso nos dá uma primeira impressão sobre tendências de longo prazo, ciclos e possíveis pontos de mudança.
Ao plotar a série de homicídios por intervenção policial ao longo do tempo, a primeira conclusão é imediata: a série é não-estacionária. Suas propriedades estatísticas, como a média, mudam drasticamente ao longo do tempo. Observamos períodos distintos: uma relativa estabilidade em níveis mais baixos até meados dos anos 2000, seguida por um crescimento acentuado, um vale por volta de 2013-2015, e um pico histórico alarmante por volta de 2018. Recentemente, a série mostra uma tendência de queda, mas com alta volatilidade.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
A presença de uma tendência clara e variável significa que o modelo precisa ser capaz de aprender e se adaptar a essas mudanças de longo prazo. O segundo gráfico, com a linha de tendência suavizada (geom_smooth), remove o “ruído” mensal e torna essa dinâmica de longo prazo ainda mais evidente, confirmando os picos e vales que definem a história recente da segurança pública no Rio de Janeiro.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
3. Decomposição da Série Temporal
A decomposição é uma técnica que separa uma série temporal em três componentes: tendência (movimento de longo prazo), sazonalidade (padrões repetitivos em períodos fixos) e resíduo (o que sobra, incluindo ruído e anomalias).
Para isso, primeiro convertemos nosso dataframe para um objeto tsibble, que é um formato especializado para séries temporais, e usamos as funções model e components do pacote fabletools, parte da família de pacote tidyverts, para facilmente criar a decomposição.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
- Componente
trend(Tendência): Confirma matematicamente o que observamos visualmente. Ele isola o movimento de longo prazo da série, mostrando claramente a ascensão, o pico em 2018 e a queda subsequente. Para a previsão, modelar essa tendência é o desafio principal. - Componente
season_year(Sazonalidade): Revela um padrão anual consistente. Independentemente da tendência geral (se os números estão altos ou baixos), existe um ritmo previsível ao longo do ano. Alguns meses consistentemente apresentam mais ocorrências do que outros. Essa regularidade é uma informação valiosa, pois um bom modelo preditivo pode “aprender” esse padrão sazonal para melhorar a precisão das previsões de curto prazo. - Componente
remainder(Resíduo): Representa o que sobra após a remoção da tendência e da sazonalidade. Em um mundo perfeito, seria apenas ruído aleatório. No nosso caso, vemos que a maior parte dos resíduos se concentra em torno do zero, mas existem pontos extremos (picos e vales acentuados). Esses são os outliers, eventos atípicos não explicados pelos padrões gerais, que merecem investigação e podem representar choques pontuais no sistema de segurança.
4. Análise da Distribuição
Entender a distribuição estatística dos valores mensais nos ajuda a identificar a faixa de ocorrências mais comum, a simetria dos dados e a presença de valores extremos (outliers).
4.1 Histograma
O histograma mostra a frequência com que os valores ocorrem dentro de determinados intervalos.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
4.2 Boxplot
O boxplot sintetiza a distribuição dos dados ao representar, de forma compacta, a mediana, os quartis e os valores atípicos. Assim, ele permite comparar os valores atuais e recentes da série com seu comportamento histórico, ajudando a responder questões como: o valor atual está acima da mediana? Em qual quartil se encontra? O ponto mais recente pode ser considerado um outlier?
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Podemos também usar boxplots para visualizar a distribuição para cada mês do ano, o que nos dá outra perspectiva sobre a sazonalidade.
Ao contrário de apenas ver um padrão ondulado na decomposição, aqui podemos comparar as distribuições de cada mês. Observamos que meses como março e maio tendem a ter medianas mais altas, enquanto outros, como setembro, podem ter uma variabilidade maior (caixas mais longas). Para a previsão, isso reforça a importância de incluir um componente sazonal no modelo, pois o “mês do ano” é, de fato, uma variável relevante.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
5. Diagnóstico para Modelagem
Finalmente, realizamos testes e visualizações que informam diretamente a escolha e a configuração de modelos de previsão.
5.1 Análise de Autocorrelação
Os gráficos ACF (Função de Autocorrelação) e PACF (Função de Autocorrelação Parcial) medem a correlação da série com seus próprios valores passados (lags).
Eles são essenciais para identificar a estrutura de dependência temporal e para parametrizar modelos como o ARIMA.
5.2 Teste de Estacionariedade
Muitos modelos de previsão exigem que a série seja estacionária (sua média e variância não mudam ao longo do tempo). O teste de Dickey-Fuller Aumentado (ADF) é um teste estatístico formal para verificar essa propriedade.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Augmented Dickey-Fuller Test
data: dados_ts$hom_por_interv_policial
Dickey-Fuller = -2.2897, Lag order = 6, p-value = 0.4544
alternative hypothesis: stationary
5.3 Análise de Resíduos para Detecção de Outliers
Os resíduos da decomposição STL representam a parte dos dados que não é explicada pela tendência ou pela sazonalidade. Plotar esses resíduos pode nos ajudar a identificar visualmente os outliers, que são pontos no tempo com comportamento atípico.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
6. Modelagem e Previsão com ARIMA
Com a análise diagnóstica concluída, estamos prontos para a etapa de modelagem.
Nosso objetivo é construir um modelo estatístico que aprenda os padrões da série temporal (tendência, sazonalidade, autocorrelação) para que possamos usá-lo para prever valores futuros.
Dada a estrutura que observamos — tendência não-estacionária e dependência temporal (indicada pelos gráficos ACF/PACF) — o modelo ARIMA (Autoregressive Integrated Moving Average) é uma escolha clássica. O fato de ser um modelo univariado, isto é, que depende únicamente dos próprios valores da série temporal para gerar a previsão, torna-o uma escolha melhor ainda pelo fato de não necessitar de outras variáveis para realizar o forecast.
Felizmente, não precisamos determinar manualmente os complexos parâmetros (p, d, q) do ARIMA. Utilizaremos o pacote fable, que faz parte do ecossistema tidyverts, para encontrar automaticamente o melhor modelo ARIMA com base nos dados.
O algoritmo testará diversas combinações e selecionará aquela que minimiza um critério de informação (como o AICc), garantindo um modelo robusto e bem ajustado.
6.1 Ajuste do Modelo ARIMA Automático
O primeiro passo é ajustar o modelo aos nossos dados tsibble. A função ARIMA() do pacote fable lida com a diferenciação (para tornar a série estacionária), a busca pelos termos AR e MA, e o ajuste da sazonalidade, tudo em um único comando.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Series: hom_por_interv_policial
Model: ARIMA(0,1,4)(0,0,1)[12]
Coefficients:
ma1 ma2 ma3 ma4 sma1
-0.4977 -0.0295 -0.0245 -0.1896 0.1822
s.e. 0.0546 0.0626 0.0603 0.0540 0.0528
sigma^2 estimated as 417.8: log likelihood=-1470.86
AIC=2953.72 AICc=2953.98 BIC=2976.55
6.2 Diagnóstico do Modelo (Análise de Resíduos)
Um bom modelo deve capturar toda a estrutura previsível dos dados, deixando para trás apenas ruído aleatório. Esses “restos” são chamados de resíduos. Se o modelo for bom, os resíduos não devem ter padrões discerníveis: devem ser não correlacionados e, idealmente, seguir uma distribuição normal com média zero. A função gg_tsresiduals() é perfeita para verificar isso, gerando um painel com os gráficos de diagnóstico essenciais.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
6.3 Geração e Visualização da Previsão
Com o modelo ajustado e validado, podemos finalmente realizar a previsão. Usaremos a função forecast() para projetar os valores futuros. Neste exemplo, vamos prever os próximos 24 meses (2 anos). A visualização da previsão, juntamente com os intervalos de confiança, nos dá uma ideia da incerteza associada às estimativas futuras.
CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
Considerações Finais
Ao longo deste tutorial, percorremos o ciclo completo de análise de dados aplicado a um problema real e complexo. Partimos de dados brutos disponibilizados pelo ISP, realizamos a limpeza e a transformação necessárias, e conduzimos uma análise exploratória aprofundada para entender a estrutura da série temporal de homicídios por intervenção policial. Utilizamos técnicas de decomposição, análise de distribuição e diagnóstico de séries temporais para preparar o terreno para a modelagem.
Finalmente, construímos um modelo de previsão ARIMA, que aprendeu os padrões históricos dos dados para projetar cenários futuros. Este processo, que vai da coleta de dados à comunicação de uma previsão, exemplifica o poder da ciência de dados para transformar números em insights e ferramentas de tomada de decisão. Os próximos passos poderiam incluir a incorporação de variáveis externas (como indicadores socioeconômicos) para criar modelos mais sofisticados (ARIMAX) ou a comparação do ARIMA com outras técnicas, como modelos de machine learning.