Regras de Associação no Combate ao Crime no Brasil - Por Flávio Clesio

Não é segredo que vivemos em um país que está lamentavelmente listado como um dos mais violentos do mundo, em que temos 21 cidades entre as 50 mais violentas do mundo.

Se levarmos em consideração que em alguns estados do Brasil a taxa de esclarecimento de homicídios é de menos de 15%, temos um problema grave na segurança pública de maneira geral.

Mas se o crime por si só é a externalidade/consequência de diversos fatores como aspectos socioeconômicos, educacionais, e de ambiente (para citar alguns); o policiamento preventivo, isto é, o ataque direto das causas deve ser o norte de qualquer política de segurança pública; e é sobre isso que se trata esse post.

Através de uma base de dados sintética (extremamente desbalanceada) de dados que poderiam se extraídos de qualquer distrito policial ou mesmo de algum departamento de segurança pública vamos fazer a aplicação de uma técnica de Machine Learning chamada Association Rules ou Regras de Associação para formulação de políticas de segurança pública.

Como vamos iniciar a nossa análise sem nenhum tipo de hipótese e o objetivo é ver o conhecimento intrínseco da base de dados, vamos fazer um aprendizado não-supervisionado.

Contexto colocado, vamos para o R Studio.

Antes de mais nada, vamos limpar o nosso console e na sequência importar a biblioteca _arules_ no R.

[sourcecode language=”r”] # Clear the console cat(“\014”) # Load arules library library(arules) [/sourcecode]

Com a nossa lib importada, vamos realizar carregar a nossa base de dados no R.

[sourcecode language=”r”] # Load Dataset - This is a synthetic dataset, some inconsistencies can be found… as in the real world! ;) crimes <- read.csv(“https://raw.githubusercontent.com/fclesio/learning-space/master/Datasets/01%20-%20Association%20Rules/Crimes.csv”) [/sourcecode]

Com a nossa base de dados importada, vamos agora ver as colunas da base de dados:

[sourcecode language=”r”] # See variables types str(crimes) [/sourcecode]

Temos uma base de dados com 780 crimes com 16 variáveis que são:

  • Crime_id: Número da ocorrência.
  • Zona: Zona da cidade que a ocorrência foi registrada.
  • Periculosidade: Nível de periculosidade da área de acordo com mapeamentos anteriores.
  • Viaturas_Apoio_Forca_Tatica: Indica se tem reforços da Força Tática disponíveis na região. A grosso modo, Força Tática é um destacamento que ‘flutua’ na circulação e tem como objetivo atender a ocorrência mais próxima que a primeira força de atendimento não conseguir solucionar.
  • Patrulhamento: Indica se há patrulhamento pelas viaturas do batalhão mais próximo.
  • Policiamento_Ostensivo: Informa se há operações acontecendo com mais frequência. Um maior nível de policiamento aumenta também o enfrentamento policial, o que pode acarretar em mais óbitos de ambas as partes.
  • Apoio_GCM: Esse campo indica se a Guarda Civil Metropolitana circula na área da ocorrência. Diferente da PM ou da Civil; a GCM apesar das mesmas prerrogativas policiais tem uma função mais voltada à segurança patrimonial de alguns pontos da cidade e escolas.
  • Arma_Fogo: Houve arma de fogo na ocorrência.
  • Qtde_Vitimas: Número de vitimas da ocorrência.
  • Possui_DP: Tem Distrito Policial nas redondezas.
  • Tipo_Policiamento: O tipo de policiamento local influencia também na prática de crimes, em que áreas menos assistidas pelos batalhões podem ter um maior índice de violência em relação à áreas que não tem esse tipo de atendimento com um maior volume de viaturas e policiais.
  • Area_Residencial: Indica se é área residencial ou não.
  • Ocorrencia_Atendida_15_Minutos: Sabe-se que quanto mais demorado for o atendimento da ocorrência, as chances de resolução do evento criminoso em questão converge para a não solução efetiva. Esse campo indica se a ocorrência foi prontamente atendida.
  • Pericia: Informa se houve a perícia para auxiliar nas investigações.
  • Possui_UPP: Mostra se tem Unidade de Polícia Pacificadora instalada nas redondezas do evento criminoso
  • Iluminacao: Informa se o local do crime tinha iluminação ou não.

Com um pouco mais de trabalho na parte de data wrangling é possível criar mais algumas variáveis, mas como o foco aqui será de fazer uma primeira análise básica vamos seguir com algumas estatísticas básicas em relação a cada uma das variáveis da base de dados.

[sourcecode language=”r”] # See basic stats summary(crimes) [/sourcecode]

Uma olhada rápida no sumário podemos tirar as seguintes informações:

  • Em relação ao tipo de policiamento vemos que temos um patrulhamento feito por diversos batalhões na metade dos casos, o que indica que há uma dispersão de batalhões (i.e. nenhum batalhão cuida específicamente de uma área) nessas áreas mais críticas;
  • 69% das localidades tem algum tipo de Distrito Policial nas redondezas do evento criminoso;
  • Apenas 1% dos locais não tem nenhum tipo de viatura da Força Tática;
  • Quase 70% das ocorrências acontecem com 3 ou mais pessoas. Isso nos faz a crer que pode ter dois tipos de vieses que são a) os crimes coletivos (e.g. arrastões, chacinas, etc.) são os mais reportados ou estão acontecendo de fato, ou b) os crimes menores como roubo de celular não estão sendo notificados;
  • Mais de metade das áreas dos eventos aconteceram em áreas consideradas com o nível de periculosidade altíssimo;
  • Pelos dados a Zona Sul está em chamas;
  • Com 88% dos locais com iluminação, pode ser que essa variável não seja mais a responsável pela inibição dos eventos criminosos;
  • Com apenas 49% dos casos periciados, as atividades de investigação podem em algum momento ter problemas de robustez de provas; e
  • Sendo o índice de patrulhamento em 90% e o policiamento ostensivo 83% nas regiões criminosas há indícios de que os criminosos estão indiferentes à presença policial.

São insights interessantes que nos auxiliam em algumas hipóteses como as levantadas. Neste ponto a análise descritiva básica pode ajudar e muito no início de uma política de segurança efetiva, e não pode ser descartada em nenhum momento. No nosso caso vamos avançar para a parte aplicada de machine learning que é o foco desse post.

Vamos criar um objeto utilizando o algoritmo a priori escolhendo um suporte de 55% (isso é, os conjuntos de itens estarão no mínimo em 55% de todas as transações) e com a confiança de 80% (isso é, a grosso modo é como dizer que há a probabilidade de 80% das transações encontradas serão derivadas dos itens contidos na base do suporte).

Não há uma regra única em relação à utilização do suporte e confiança, mas trazendo aqui uma heurística que eu sempre uso é que se o problema tem um volume de transações muito grande, o suporte será a métrica que vai dar mais robustez para descartar muitas regras redundantes, já se o problema tem uma caracterização com um menor volume de instâncias e se há uma necessidade de entrar mais no detalhe das regras e elas precisam de um grau de assertividade naturalmente maior (e.g. uma campanha de cartas em que há um custo operacional envolvido) aí utiliza-se a confiança. Mas lembrando, tudo isso depende do problema em questão.

Nesse caso, como os recursos a serem empregados são caros e escassos (viaturas e pessoal militar), então partiremos para uma confiança de 80%.

[sourcecode language=”r”] # The most important thing it’s get a good support and a great confidence (This is a wishful thinking, in real world EVERYTHING can be happen!) # The main task here is get a set a most meaningful way, so, shity rules will be discarted. crimes_rulez <- apriori(crimes, parameter = list(minlen=4,maxlen=10, supp=0.55, conf=0.80)) [/sourcecode]

Com o objeto criado, vamos agora reduzir para duas casas decimais as métricas de avaliação dessas regras para fins de simplicidade.

[sourcecode language=”r”] # Reduce the number of digits in measures of quality of the model quality(crimes_rulez) <- round(quality(crimes_rulez), digits=2) [/sourcecode]

Apenas para fins de visualização, vamos criar alguns objetos de regras ordenando pela confiança e suporte para que possamos identificar de maneira mais efetiva as regras mais interessantes e acionáveis.

[sourcecode language=”r”] # Sort by Confidence and Support and Lift model_srt_confidence <- sort(crimes_rulez, by=”confidence”) model_srt_support <- sort(crimes_rulez, by=”support”) [/sourcecode]

Vamos agora inspecionar as nossas regras, de acordo com a confiança e o suporte:

[sourcecode language=”r”] # Check models (#66 rules) inspect(model_srt_confidence) inspect(model_srt_support) [/sourcecode]

Com esse comando acima, temos algumas regras:

[sourcecode language=”r”] lhs rhs support confidence lift 1 {Apoio_GCM=Nao, Area_Residencial=Sim, Iluminacao=Sim} => {Patrulhamento=Sim} 0.57 0.98 1.09 63 {Area_Residencial=Sim, Ocorrencia_Atendida_15_Minutos=Sim, Iluminacao=Sim} => {Zona=Zona_Sul} 0.55 0.82 0.96 49 {Patrulhamento=Sim, Area_Residencial=Sim, Ocorrencia_Atendida_15_Minutos=Sim, Iluminacao=Sim} => {Policiamento_Ostensivo=Sim} 0.58 0.89 1.08 [/sourcecode]

  • A regra 1 indica que o patrulhamento está funcionando nos locais em que a PM não tem o apoio da GCM em áreas iluminadas de bairros residenciais;
  • A regra de número 63 mostra um primeiro padrão em relação a Zona Sul, em que com 82% de confiança essas ocorrências estão ligadas a lugares com malha residencial, iluminadas e a ocorrência foi feita dentro dos primeiros 15 minutos;
  • Já a regra 49 que o policiamento ostensivo está ocorrendo com 89% de confiança em áreas já patrulhadas em uma malha residencial iluminada em que o evento foi atendido em 15 minutos ou menos.

Com essas poucas regras acima podemos observar que o trabalho de primeiro atendimento está sendo feito dado que grande parte dessas ocorrências (dado o nível de suporte e confiança) estão sendo atendidas em um tempo de 15 minutos.

Outro ponto a ser considerado é que nas áreas residenciais estão ocorrendo muitos eventos criminosos. Isso pode ser um indicativo de que nas áreas de comércio e indústrias podem estar com baixa atratividade criminosa ou mesmo o policiamento nessas áreas está mais efetivo.  Uma estratégia aqui seria ver esses dois aspectos, e caso a segunda hipótese estiver correta replicar as ações de combate ao crime.

Já a Zona Sul que concentra grande parte das ocorrências, parece estar em chamas mesmo com um alto nível de patrulhamento, iluminação e policiamento ostensivo. Neste caso há a hipótese de que são o maior patrulhamento e um policiamento mais ostensivo além de ter uma ação mais rápida - que converge como o fato do atendimento de ocorrências demorar menos de 15 minutos -  ela tem o poder de jogar luz em uma demanda reprimida de registros policiais (i.e. crimes que não seriam registrados por ausência do poder público, ou mesmo por descaso do estado nunca entrariam nas estatísticas oficiais).

Em um segundo caso pode ser mesmo que uma facção criminosa esteja disputando controle direto com a polícia através de confrontos armados, ou mesmo atentados e roubos em áreas que são vigiadas pela polícia; o que sugere uma estratégia de inteligência para desarticular de dentro para fora milícias, grupos criminosos ou quadrilhas free lance que estejam levando terror a essas áreas.

Como são muitas regras e o objetivo é encontrar o máximo de regras específicas, vamos minerar algumas dessas regras usando campos específicos. Sendo assim vamos explorar um pouco mais das ocorrências que apresentaram as características de terem ocorrido na Zona Sul, em lugares iluminados, casos que as ocorrências foram atendidas em menos de 15 minutos ou que tiveram policiamento ostensivo.

[sourcecode language=”r”] # See specific rules of zones (I already mined some rules, but feel free to discover) Zona_Sul <- subset(crimes_rulez, subset = rhs %pin% “Zona=Zona_Sul”) Iluminacao_Sim <- subset(crimes_rulez, subset = rhs %pin% “Iluminacao=Sim”) Ocorrencia_Atendida_15_Minutos_Sim <- subset(crimes_rulez, subset = rhs %pin% “Ocorrencia_Atendida_15_Minutos=Sim”) Policiamento_Ostensivo <- subset(crimes_rulez, subset = rhs %pin% “Policiamento_Ostensivo=Sim”) [/sourcecode]

Esses objetos criados, tem somente as regras em que o RHS (right-hand-side) foram esses campos descritos no parágrafo anterior.

Vamos inspecionar esses objetos.

[sourcecode language=”r”] # Specific Rules inspect(Zona_Sul) inspect(Iluminacao_Sim) inspect(Ocorrencia_Atendida_15_Minutos_Sim) inspect(Policiamento_Ostensivo) [/sourcecode]

Seguindo a mesma lógica da análise acima, podemos ter os seguintes conjuntos de regras específicas:

[sourcecode language=”r”] Zona_Sul 8 {Patrulhamento=Sim, Policiamento_Ostensivo=Sim, Iluminacao=Sim} => {Zona=Zona_Sul} 0.66 0.88 1.03 9 {Patrulhamento=Sim, Area_Residencial=Sim, Iluminacao=Sim} => {Zona=Zona_Sul} 0.66 0.85 0.99 Iluminacao_Sim lhs rhs support confidence lift 12 {Patrulhamento=Sim, Policiamento_Ostensivo=Sim, Area_Residencial=Sim, Ocorrencia_Atendida_15_Minutos=Sim} => {Iluminacao=Sim} 0.58 0.96 1.09 13 {Zona=Zona_Sul, Patrulhamento=Sim, Policiamento_Ostensivo=Sim, Area_Residencial=Sim} => {Iluminacao=Sim} 0.61 0.95 1.08 Ocorrencia_Atendida_15_Minutos_Sim lhs rhs support confidence lift 5 {Zona=Zona_Sul, Area_Residencial=Sim, Iluminacao=Sim} => {Ocorrencia_Atendida_15_Minutos=Sim} 0.55 0.81 1.08 7 {Patrulhamento=Sim, Policiamento_Ostensivo=Sim, Area_Residencial=Sim, Iluminacao=Sim} => {Ocorrencia_Atendida_15_Minutos=Sim} 0.58 0.83 1.11 Policiamento_Ostensivo lhs rhs support confidence lift 10 {Patrulhamento=Sim, Area_Residencial=Sim, Ocorrencia_Atendida_15_Minutos=Sim, Iluminacao=Sim} => {Policiamento_Ostensivo=Sim} 0.58 0.89 1.08 11 {Zona=Zona_Sul, Patrulhamento=Sim, Area_Residencial=Sim, Iluminacao=Sim} => {Policiamento_Ostensivo=Sim} 0.61 0.93 1.12 [/sourcecode]

No caso dessas regras, tudo indica que mesmo com as ocorrências sendo atendidas em menos de 15 minutos em áreas residenciais iluminadas, a Zona Sul está com um problema grave de segurança.

A estratégia nesse caso seria investir de forma intensa em atividades de inteligência, dado que pelo que vimos pelos dados há uma situação de combate intenso com policia na rua e crimes acontecendo mesmo em situações em que os bandidos supostamente estariam intimidados.

Conclusão Usando uma base sintética, vimos que é possível com algumas linhas de código e estatística descritiva básica ter insights sobre uma base de dados mesmo sem um conhecimento prévio.

No caso da nossa análise, vimos que pode haver uma situação de confronto clara em áreas residenciais mesmo com patrulhamento da polícia e policiamento ostensivo acontecendo.

Isso leva a crer que esses crimes estejam sendo reportados pelos aspectos acima, ou mesmo por uma maior disposição dos criminosos em agir em áreas controladas pela polícia. Isso pode indicar que o trabalho da polícia nesse caso não está sendo eficiente, e que uma estratégia de investigação através de atividades de inteligência devem ser colocadas em campo.