install.packages("remotes","tidyverse","httr", "jsonlite","usethis","janitor", "here","modelsummary","gt")
remotes::install_github("courtsbr/JurisMiner")16 Aula Prática: Coleta e Análise de Dados sobre Homicídio Qualificado
16.1 Introdução à Aula Prática: Coleta de Dados no DataJud
Nesta aula prática, vamos aprender como coletar dados processuais utilizando a Base Nacional de Dados do Poder Judiciário (DataJud), mantida pelo Conselho Nacional de Justiça (CNJ). O DataJud é o sistema responsável pelo armazenamento centralizado de dados e metadados de todos os processos judiciais brasileiros, físicos ou eletrônicos, e será a base que utilizaremos ao longo do curso.
16.2 Acesso ao DataJud
O DataJud pode ser acessado diretamente no site do CNJ 🔗:
https://www.cnj.jus.br/sistemas/datajud/
A plataforma fornece dados atualizados para diversos os ramos da Justiça brasileira, agrupados e padronizados para permitir análises estatísticas e jurimétricas.
16.3 Autenticação e Chave Pública
Para acessar os dados via API, utilizaremos a API Pública do DataJud, documentada em:
https://datajud-wiki.cnj.jus.br/api-publica/
A autenticação é feita por meio de uma chave pública, disponibilizada pelo DPJ/CNJ. A chave 🔑 pode ser obtida no seguinte endereço:
https://datajud-wiki.cnj.jus.br/api-publica/acesso
Essa chave será utilizada diretamente no código em R (ou Python), permitindo realizar consultas autenticadas aos dados processuais.
16.4 Endpoints, Rotas e Seleção de Tribunais
Para realizar nossas consultas, precisamos escolher os endpoints disponíveis, indicando o tribunal desejado. Os endpoints estão detalhados em:
https://datajud-wiki.cnj.jus.br/api-publica/endpoints
É possível consultar processos de de diversos ramos da Justiça brasileira:
- Tribunais Superiores
- Justiça Federal
- Justiça Estadual
- Justiça do Trabalho
- Justiça Eleitoral
- Justiça Militar
No nosso estudo, utilizaremos os dados do Tribunal de Justiça do Tocantins (TJTO).
16.5 Tipos de Consultas Possíveis
A API permite diferentes modalidades de consulta 🔍, como:
- Pesquisa por número do processo
- Pesquisa paginada
- Pesquisa por classe
- Pesquisa por assunto
- …
O DataJud também disponibiliza exemplos de código em Python e R, acessíveis na aba de exemplos:
16.6 Glossário de Variáveis
O DataJud define nomes específicos para cada uma das variáveis retornadas pela API. O significado de cada termo pode ser consultado no glossário oficial:
https://datajud-wiki.cnj.jus.br/api-publica/glossario
Esse glossário é essencial para interpretar corretamente os dados coletados.
16.7 Seleção do Assunto de Interesse
Em geral, ao iniciar uma pesquisa empírica, precisamos definir o assunto processual a ser analisado. Para isso, utilizamos o Sistema de Gestão de Tabelas Processuais Unificadas:
https://www.cnj.jus.br/sgt/consulta_publica_assuntos.php
No nosso caso, o foco inicial seria Direito Penal/Crimes Contra a Vida, que inclui subcategorias como:
- 10915 — Aborto
- 12091 — Feminicídio
- 12130 — Homicídio Agravado pela Prática de Extermínio de Seres Humanos
- 3371 — Homicídio Privilegiado
- 3372 — Homicídio Qualificado
- 15177 — Homicídio Qualificado Contra Menor de 14 Anos (Lei Henry Borel)
- 3370 — Homicídio Simples
- 3373 — Induzimento, Instigação ou Auxílio a Suicídio
- 3375 — Infanticídio
Poderíamos escolher todas ou algumas dessas categorias para nossa análise.
16.8 Escolha Alternativa: Pesquisa por Classe
Nesta aula, porém, seguiremos um caminho alternativo: em vez de selecionar um assunto específico, trabalharemos com a classe processual.
Selecionamos a seguinte classe:
Processo Criminal → Procedimento Comum → Ação Penal de Competência do Júri
Código: 282
Essa classe captura processos de crimes dolosos contra a vida julgados pelo Tribunal do Júri, alinhados ao nosso objetivo analítico. Entretanto, muitos dos assuntos acima listados estarão presentes. Alám disso, limitamos os nossos processos à Instância de 1º Grau (G1).
16.9 Fase Muito Importante
A etapa que descrevemos até aqui é fundamental em qualquer pesquisa empírica que utilize o DataJud ou outras bases de dados judiciais. As escolhas feitas nesta fase, como a definição do assunto, da classe processual e dos critérios de filtragem, influenciam diretamente o desenho amostral que construiremos.
Uma boa seleção inicial garante maior precisão, consistência e relevância dos resultados. Por isso, é essencial conduzir essa etapa com atenção, calma e organização. Quanto mais cuidadosa for a definição desses parâmetros, melhor será a qualidade da extração dos dados e, consequentemente, das análises que realizaremos nas próximas fases do curso.
16.10 Colocando a Mão na Massa: Coleta de Dados no DataJud
16.10.1 Instalando os pacotes necessários
16.10.2 Carregando os pacotes necessários
library(tidyverse)
library(usethis)
library(janitor)
library(modelsummary)
library(gt)
library(JurisMiner)16.10.3 Criando um projeto para o curso
usethis::create_project("tjtomov")16.10.4 Crie a estrutura do projeto
dir.create("data")
dir.crate("data-raw")16.10.5 Importar a função do datajud
O script abaixo irá carregar na sua sessão do R uma função chamada datajud, que será utilizada para baixar os dados sobre homicídio.
source("https://gist.githubusercontent.com/jjesusfilho/b4634119b2d075ac54107d87fa6f22c7/raw/285fbfbec85223d3f394e00fed9d14804a1e5e89/baixar_datajud.R")
source("https://gist.githubusercontent.com/jjesusfilho/b4634119b2d075ac54107d87fa6f22c7/raw/285fbfbec85223d3f394e00fed9d14804a1e5e89/ler_datajud.R")16.10.6 Baixando os Dados Processuais
O código abaixo extrairá os dados da classe 282 do grau G1 do Tribunal de Justiça do Tocantins e salvará todas essas informações em arquivos jsons.
baixar_datajud(tamanho = 100, codigo_classe = 282, grau = "G1", diretorio = "data-raw")16.10.7 Lendo os dados processuais
dados_basicos <- ler_datajud(diretorio = "data-raw")Agora vamos analisar a estrutura do dados_basicos para identificar onde cada informação relevante está localizada. Esse mapeamento é essencial porque nos permite compreender exatamente como os dados estão organizados e, assim, definir qual tipo de extração precisamos realizar para trabalhar com informações de movimentação, órgãos julgadores, assuntos e outras características presentes no arquivo.
16.10.8 Analisando as Informações Extraídas
Órgão Julgador dos Processos
Vamos criar um banco que contenha o número do processo e o órgão julgador responsável por cada caso. Em seguida, analisaremos a frequência de processos por órgão julgador, tanto considerando apenas processos únicos quanto incluindo processos duplicados.
# Criar um dataframe com número do processo e órgão julgador
julgador <- dados_basicos |>
select(processo = numeroProcesso, orgaoJulgador) |> # Faço a seleção e renomeio a coluna
unnest(orgaoJulgador) |> # Como orgaoJulgador é um dataframe, preciso "desempacotar" os dados
janitor::clean_names() # Deixo os nomes padronizados
nrow(julgador) # número total de processos[1] 8432
Observa-se um total de 8432 processos, mas alguns podem estar duplicados. Vamos investigar essa questão. Abaixo está o código para identificar e analisar processos únicos e duplicados.
# Vamos verificar se existem processos duplicados.
julgador_uni <- julgador |>
distinct(processo, .keep_all = TRUE)
nrow(julgador_uni) # numero total de processos únicos[1] 8287
nrow(julgador) - nrow(julgador_uni) # número de processos duplicados[1] 145
# Vamos analisar os processos duplicados
julgador_dup <- julgador %>%
filter(duplicated(processo) | duplicated(processo, fromLast = TRUE))
## Esse comando pega todas as linhas após a primeira ocorrência ou
## Pega todas as linhas antes da última ocorrência e verifica duplicação
## Vamos ver quantos processos duplicados temos:
nrow(julgador_dup) # número de processos duplicados[1] 289
unique(julgador_dup$processo) |> length() # número de processos únicos que estão duplicados[1] 144
O total de processos únicos foi de 8.287, e identificamos 144 processos duplicados. Agora, vamos verificar se essas duplicações ocorreram em razão de alguma mudança de órgão julgador. Para isso, vamos pivotar os dados e criar uma variável que indique se houve alteração no órgão julgador para cada processo duplicado.
## Analisando se houve troca de orgaõ julgador e por isso é duplicado
# 1. Criar ordem dentro de cada processo 1, para primeira vez e 2 para a segunda vez....
julgador_dup_ord <- julgador_dup %>%
group_by(processo) %>%
mutate(orgao_id = row_number()) %>%
ungroup()
# 2. Pivotar para formato wide, selciono e indico o nome que será dado
julgador_wide <- julgador_dup_ord %>%
select(processo, orgao_id, nome) %>%
pivot_wider(
names_from = orgao_id,
values_from = nome,
names_prefix = "julgador"
)
# 3. Variável indicando mudança
julgador_wide <- julgador_wide %>%
rowwise() %>%
mutate(
mudou_orgao = n_distinct(c_across(starts_with("julgador")), na.rm = TRUE) > 1
) %>%
ungroup()
# - > pega todas as colunas cujo nome começa com "julgador", transforma em vetores e verifica se é distinto
julgador_wide %>%
count(mudou_orgao, sort = TRUE) %>%
mutate(
mudou_orgao = ifelse(mudou_orgao, "Sim", "Não")
) %>%
knitr::kable(
caption = "Frequência de processos que mudaram de órgão julgador"
)| mudou_orgao | n |
|---|---|
| Não | 93 |
| Sim | 51 |
Observamos que 93 processos não mudaram de órgão julgador e 51 passaram por alteração. Agora precisamos definir como trataremos esses casos: se consideraremos apenas o órgão julgador final, se adotaremos o órgão julgador inicial como referência ou excluímos. Mas ainda precisamos observar que há 93 processos que aparecem duplicados, mesmo sem mudança de órgão julgador. O que pode estar acontecendo nesses casos?
LIMPEZA DOS DADOS
Motivos Possíveis: Recursos, mudanças para varas expecializadas, desclassificação, desforamento, entre outros.
Escolha: Vamos excluir os processos que mudaram de órgão julgador, mantendo apenas aqueles que permaneceram no mesmo órgão. Depois analisaremos os processos duplicados restantes.
Justificativa: A mudança de órgão julgador pode indicar transferências ou redistribuições que podem afetar a análise do tempo do processo. Para garantir a consistência dos dados e evitar vieses, mantemos somente aqueles permaneceram no mesmo órgão julgador ao longo do tempo.
# Vamos retirar os processos que mudaram de orgão julgador
db_limpo <- dados_basicos %>%
anti_join(julgador_wide %>% filter(mudou_orgao == TRUE),
by = c("numeroProcesso" = "processo"))Vamos focar nos processos únicos para analisar a frequência de órgãos julgadores e descrever os resultados graficamente e em tabelas.
freq_j_u <- julgador_uni %>%
count(nome) %>%
arrange(desc(n)) %>%
mutate(perc = round(100 * n / sum(n), 1))
ggplot(freq_j_u, aes(x = reorder(nome, n), y = n)) +
geom_col(fill = "#7185cc", color = "white", alpha = 0.7) +
coord_flip() +
labs(
title = "Frequência por Órgão Julgador (Processos Únicos)",
x = "Órgão Julgador",
y = "Frequência"
) +
theme_classic()+
theme(
axis.text.y = element_text(size = 4) # tamanho da letra das categorias
)
freq_j_u |>
gt() |>
tab_header(
title = "Frequência por Órgão Julgador (Processos Únicos)"
) |>
cols_label(
nome = "Órgão Julgador",
n = "Frequência",
perc = "Percentual"
)| Frequência por Órgão Julgador (Processos Únicos) | ||
|---|---|---|
| Órgão Julgador | Frequência | Percentual |
| Juízo da 1ª Vara Criminal de Araguaína | 965 | 11.6 |
| Juizo da 1ª Vara Criminal de Palmas | 846 | 10.2 |
| Juizo da Especializada no Combate à Violência Contra a Mulher e Crimes Dolosos Contra a Vida de Guru | 717 | 8.7 |
| Juízo da 1ª Vara Criminal de Porto Nacional | 477 | 5.8 |
| Juízo da 1ª Vara Criminal de Colinas do Tocantins | 419 | 5.1 |
| Juízo da 1ª Vara Criminal de Paraíso do Tocantins | 326 | 3.9 |
| Juízo da 2ª Vara de Augustinópolis | 309 | 3.7 |
| Juízo da 1ª Vara Criminal de Tocantinópolis | 294 | 3.5 |
| Juízo da 1ª Escrivania Criminal de Itaguatins | 271 | 3.3 |
| Juízo da Vara Criminal, de Violência Doméstica e Juizado Especial Criminal de Dianópolis | 252 | 3.0 |
| Juízo da 1ª Vara Criminal de Miracema do Tocantins | 216 | 2.6 |
| Juízo da 1ª Escrivania Criminal de Colméia | 189 | 2.3 |
| Juízo da Vara Criminal, de Violência Doméstica e Juizado Especial Criminal de Araguatins | 178 | 2.1 |
| Juízo da 1ª Vara Criminal de Guaraí | 177 | 2.1 |
| Juízo da 1ª Escrivania Criminal de Peixe | 163 | 2.0 |
| Juízo da 2ª Vara da Comarca de Cristalândia | 160 | 1.9 |
| Juízo da 1ª Escrivania Criminal de Natividade | 154 | 1.9 |
| Juízo da 1ª Vara Criminal de Taguatinga | 154 | 1.9 |
| Juízo da 1ª Escrivania Criminal de Goiatins | 151 | 1.8 |
| Juízo da 1ª Escrivania Criminal de Formoso do Araguaia | 144 | 1.7 |
| Juízo da 1ª Vara Criminal de Pedro Afonso | 123 | 1.5 |
| Juízo da 1ª Vara Criminal de Arraias | 121 | 1.5 |
| Juízo da 1ª Escrivania Criminal de Miranorte | 113 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Novo Acordo | 113 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Wanderlândia | 113 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Xambioá | 113 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Ananás | 98 | 1.2 |
| Juízo da 1ª Escrivania Criminal de Filadélfia | 95 | 1.1 |
| Juízo da 1ª Escrivania Criminal de Araguacema | 91 | 1.1 |
| Juízo da 1ª Escrivania Criminal de Araguaçu | 88 | 1.1 |
| Juízo da 1ª Escrivania Criminal de Ponte Alta | 87 | 1.0 |
| Juízo da 1ª Escrivania Criminal de Itacajá | 84 | 1.0 |
| Juízo da 1ª Escrivania Criminal de Alvorada | 82 | 1.0 |
| Juízo da 1ª Escrivania Criminal de Palmeiropolis | 70 | 0.8 |
| Juízo da 1ª Escrivania Criminal de Arapoema | 69 | 0.8 |
| Juízo da 1ª Escrivania Criminal de Paranã | 67 | 0.8 |
| Juízo da 1ª Vara Criminal de Dianópolis | 46 | 0.6 |
| Juízo da 1ª Escrivania Criminal de Cristalândia | 41 | 0.5 |
| Juízo da 1ª Vara Criminal de Araguatins | 35 | 0.4 |
| Juízo da 2ª Escrivania de Augustinópolis | 19 | 0.2 |
| Juízo da 1ª Escrivania Criminal de Figueirópolis | 18 | 0.2 |
| Juízo da 1ª Escrivania Criminal de Aurora | 12 | 0.1 |
| Juízo da 1ª Escrivania Criminal de Almas | 11 | 0.1 |
| Juízo da 1ª Escrivania Criminal de Pium | 8 | 0.1 |
| Juízo da Vara de Execuções Penais de Gurupi | 8 | 0.1 |
Questão
Como podemos fazer a nossa análise de movimento considerando que comarcas distintas possuem diferentes volumes de processos? Devemos agrupar as comarcas maiores e as menores? Quais critérios utilizar para isso? Deixamos varas criminais separada de especializadas?
Sistema dos Processos
Aqui avaliamos se os processos pertencem ao sistema sistema eletrônico de processos judiciais EPROC ou a outro sistema.
sistema <- db_limpo |>
select(processo = numeroProcesso, sistema) |>
unnest(sistema) |>
janitor::clean_names()
freq_sistema <- sistema %>%
count(nome) %>%
arrange(desc(n))
freq_sistema |>
gt() |>
tab_header(
title = "Frequência por Sistema (Processos Únicos)"
) |>
cols_label(
nome = "Sistema",
n = "Frequência",
)| Frequência por Sistema (Processos Únicos) | |
|---|---|
| Sistema | Frequência |
| EPROC | 8323 |
| Inválido | 4 |
| Outros | 2 |
Com base na tabela acima, podemos observar a distribuição dos processos entre os sistemas Eletrônico e Físico. Observa-se a existência somente de processos eletrônicos, mas 4 foram declaros inválidos e 2 Outros. O que fazer com esses casos? Devemos excluí-los da análise ou mantê-los?
LIMPEZA DOS DADOS
Motivos Possíveis: Citação em outros estados, entre outros.
Escolha: Vamos excluir todos os processos que não são EPROC.
Justificativa: Não sabemos ao certo os motivos que levaram a um processo ser classificado como inválido ou outros. Além disso, não sabemos como essa classificação afeta a movimentação. Portanton, vamos excluir todos que não foram EPROC e deixar nossa amostra mais homogênea.
# Vamos retirar os processos que mudaram de orgão julgador
db_limpo <- db_limpo %>%
anti_join(sistema %>% filter(!nome == "EPROC"),
by = c("numeroProcesso" = "processo"))Formato do Processo
Aqui avaliamos se os processos são do tipo Eletrônico ou Físico.
formato <- db_limpo |>
select(processo = numeroProcesso, formato) |>
unnest(formato) |>
janitor::clean_names()
freq_formato <- formato %>%
count(nome) %>%
arrange(desc(n))
freq_formato |>
gt() |>
tab_header(
title = "Frequência por Formato (Processos Únicos)"
) |>
cols_label(
nome = "Formato",
n = "Frequência",
)| Frequência por Formato (Processos Únicos) | |
|---|---|
| Formato | Frequência |
| Eletrônico | 8322 |
Observa-se que 100% dos processos estão no formato Eletrônico. Dessa forma, não há necessidade de excluir nenhum processo com base nesse critério.
Classe Processual
Como fizemos nossa busca por classe processual, 282, deveríamos ter somente essa classe. Vamos verificar se há outras classes presentes nos dados.
classe <- db_limpo |>
select(processo = numeroProcesso, classe) |>
unnest(classe) |>
janitor::clean_names()
freq_classe <- classe %>%
count(nome) %>%
arrange(desc(n))
freq_classe |>
gt() |>
tab_header(
title = "Frequência por Classe (Processos Únicos)"
) |>
cols_label(
nome = "Classe",
n = "Frequência",
)| Frequência por Classe (Processos Únicos) | |
|---|---|
| Classe | Frequência |
| Ação Penal de Competência do Júri | 8322 |
Conforme esperado pela nossa consulta inicial, todos os processos pertencem à classe Ação Penal de Competência do Júri (282). Portanto, não há necessidade de excluir nenhum processo com base nesse critério.
Assuntos Processuais
Vamos extrair e analisar os assuntos processuais associados a cada processo. Vamos fazer a extração e veja que o resultado é uma coluna com processo e a outra com o assunto. Se tivermos mais assuntos por processo, esse será duplicado.
# manter só linhas em que 'assuntos' é um data.frame
assuntos <- db_limpo |>
filter(map_lgl(assuntos, is.data.frame)) |>
select(processo = numeroProcesso, assuntos) |>
unnest(assuntos) |>
clean_names()
# Processos únicos
nrow(assuntos %>%
distinct(processo, .keep_all = TRUE)) # número total de processos únicos[1] 8228
freq_assunto <- assuntos |>
count(nome) |>
arrange(desc(n)) |>
mutate(perc_assunto = round(100 * n / sum(n), 1)) |>
mutate(perc_processo = round(100 * n / 8228, 1)) # considerando processos únicos
ggplot(freq_assunto, aes(x = reorder(nome, n), y = n)) +
geom_col(fill = "#7185cc", color = "white", alpha = 0.7) +
coord_flip() +
labs(
title = "Frequência por Assunto (Processos Únicos)",
x = "Assunto",
y = "Frequência"
) +
theme_classic()+
theme(
axis.text.y = element_text(size = 4)) # tamanho da letra das categorias
freq_assunto |>
gt() |>
tab_header(
title = "Frequência dos Assuntos"
) |>
cols_label(
nome = "Assunto",
n = "Frequência",
perc_assunto = "% Assuntos",
perc_processo = "% Processos"
)| Frequência dos Assuntos | |||
|---|---|---|---|
| Assunto | Frequência | % Assuntos | % Processos |
| Homicídio Qualificado | 5933 | 52.5 | 72.1 |
| Crime Tentado | 2733 | 24.2 | 33.2 |
| Homicídio Simples | 1731 | 15.3 | 21.0 |
| Feminicídio | 362 | 3.2 | 4.4 |
| Violência Doméstica Contra a Mulher | 91 | 0.8 | 1.1 |
| Crimes do Sistema Nacional de Armas | 47 | 0.4 | 0.6 |
| Homicídio Privilegiado | 45 | 0.4 | 0.5 |
| Destruição / Subração / Ocultação de Cadáver | 28 | 0.2 | 0.3 |
| Promoção, constituição, financiamento ou integração de Organização Criminosa | 24 | 0.2 | 0.3 |
| Homicidio qualificado | 20 | 0.2 | 0.2 |
| Crimes contra a vida | 18 | 0.2 | 0.2 |
| Crimes Previstos no Estatuto da criança e do adolescente | 17 | 0.2 | 0.2 |
| Ameaça | 15 | 0.1 | 0.2 |
| Aborto provocado por terceiro | 14 | 0.1 | 0.2 |
| Crime / Contravenção contra Criança / Adolescente | 13 | 0.1 | 0.2 |
| Furto | 12 | 0.1 | 0.1 |
| Aborto provocado pela gestante ou com o seu consentimento | 10 | 0.1 | 0.1 |
| Crimes de Trânsito | 10 | 0.1 | 0.1 |
| Leve | 10 | 0.1 | 0.1 |
| Grave | 9 | 0.1 | 0.1 |
| Corrupção de Menores | 8 | 0.1 | 0.1 |
| Contra a Mulher | 7 | 0.1 | 0.1 |
| Fraude processual | 7 | 0.1 | 0.1 |
| Crime Culposo | 6 | 0.1 | 0.1 |
| Dano Qualificado | 6 | 0.1 | 0.1 |
| Roubo Majorado | 6 | 0.1 | 0.1 |
| Estupro de vulnerável | 5 | 0.0 | 0.1 |
| Falsidade ideológica | 5 | 0.0 | 0.1 |
| Falso testemunho ou falsa perícia | 5 | 0.0 | 0.1 |
| Recebimento | 5 | 0.0 | 0.1 |
| Seqüestro e cárcere privado | 5 | 0.0 | 0.1 |
| Tráfico de Drogas e Condutas Afins | 5 | 0.0 | 0.1 |
| Resistência | 4 | 0.0 | 0.0 |
| Violação a Sepultura | 4 | 0.0 | 0.0 |
| Violação de domicílio | 4 | 0.0 | 0.0 |
| Aborto qualificado | 3 | 0.0 | 0.0 |
| Adulteração de Sinal Identificador de Veículo Automotor | 3 | 0.0 | 0.0 |
| Coação no curso do processo | 3 | 0.0 | 0.0 |
| Crime de Descumprimento de Medida Protetiva de Urgência | 3 | 0.0 | 0.0 |
| Crimes de Tortura | 3 | 0.0 | 0.0 |
| Dano | 3 | 0.0 | 0.0 |
| Estupro | 3 | 0.0 | 0.0 |
| Furto Qualificado | 3 | 0.0 | 0.0 |
| Homicídio | 3 | 0.0 | 0.0 |
| Homicídio Agravado pela Prática de Extermínio de Seres Humanos | 3 | 0.0 | 0.0 |
| Latrocínio | 3 | 0.0 | 0.0 |
| Quadrilha ou Bando | 3 | 0.0 | 0.0 |
| Roubo | 3 | 0.0 | 0.0 |
| NA | 3 | 0.0 | 0.0 |
| Crimes Hediondos | 2 | 0.0 | 0.0 |
| Decorrente de Violência Doméstica | 2 | 0.0 | 0.0 |
| Incêndio | 2 | 0.0 | 0.0 |
| Infanticídio | 2 | 0.0 | 0.0 |
| Lesão leve | 2 | 0.0 | 0.0 |
| Associação para a Produção e Tráfico e Condutas Afins | 1 | 0.0 | 0.0 |
| Atentado Violento ao Pudor | 1 | 0.0 | 0.0 |
| Comunicação falsa de crime ou de contravenção | 1 | 0.0 | 0.0 |
| Crime / Contravenção contra Idoso | 1 | 0.0 | 0.0 |
| Crimes Previstos no Estatuto do Idoso | 1 | 0.0 | 0.0 |
| Crimes contra a Fauna | 1 | 0.0 | 0.0 |
| Denunciação caluniosa | 1 | 0.0 | 0.0 |
| Desacato | 1 | 0.0 | 0.0 |
| Descumprimento de Medida Protetiva de Urgência | 1 | 0.0 | 0.0 |
| Estelionato Majorado | 1 | 0.0 | 0.0 |
| Extorsão (art. 158) | 1 | 0.0 | 0.0 |
| Falsa identidade | 1 | 0.0 | 0.0 |
| Furto de coisa comum | 1 | 0.0 | 0.0 |
| Gravíssima | 1 | 0.0 | 0.0 |
| Induzimento, Instigação ou Auxílio a Suicídio | 1 | 0.0 | 0.0 |
| Injúria | 1 | 0.0 | 0.0 |
| Lesão Cometida em Razão da Condição de Mulher | 1 | 0.0 | 0.0 |
| Participação ilícita | 1 | 0.0 | 0.0 |
| Perseguição | 1 | 0.0 | 0.0 |
| Posse de Drogas para Consumo Pessoal | 1 | 0.0 | 0.0 |
| Receptação | 1 | 0.0 | 0.0 |
| Receptação Qualificada | 1 | 0.0 | 0.0 |
| Recurso | 1 | 0.0 | 0.0 |
| Sequestro ou cárcere privado | 1 | 0.0 | 0.0 |
| Vilipêndio a Cadáver | 1 | 0.0 | 0.0 |
| Violência Psicológica contra a Mulher | 1 | 0.0 | 0.0 |
Assuntos tem um total de 11302 processos, sendo que o número de processos únicos é 8228. Isso indica que muitos processos têm mais de um assunto associado. Então a leitura da tabela acima deve considerar esses números. Podemos dizer que 5933 processos tiveram Homicídio Qualificado como assunto, 2733 tiveram Crime Tentado, e assim por diante. Existe sobreposição entre os assuntos.
Fizemos duas colunas, uma com percentual com base no total de assuntos (11302), % Assuntos, e outra com base no total de processos únicos (8228), % Processos. A segunda coluna é mais interessante, pois indica a proporção de processos que tiveram cada assunto.
Agora vamos olhar o assunto por processo, para ver quantos assuntos cada processo tem associado.
assuntos_wide <- assuntos %>%
group_by(processo, nome) %>% # garante uma linha por processo-assunto
summarise(valor = 1, .groups = "drop") %>%
pivot_wider(
names_from = nome,
values_from = valor,
values_fill = list(valor = 0) # preenche com 0 se não ocorreu
)
assuntos_wide %>%
slice_head(n = 10) %>%
select(1:8) %>%
gt() %>%
tab_header(
title = "Assuntos por Processo (Exemplo)"
)| Assuntos por Processo (Exemplo) | |||||||
|---|---|---|---|---|---|---|---|
| processo | Homicídio Simples | Crime Tentado | Homicídio Qualificado | Corrupção de Menores | Feminicídio | Violência Doméstica Contra a Mulher | Homicídio Privilegiado |
| 00000059520148272720 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 00000067320168272732 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 00000072320198272742 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| 00000080820148272734 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 00000081220218272718 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| 00000109320198272736 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 00000121120208272742 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 00000123520158272726 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 00000137020178272719 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 00000170620248272738 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
Agora cada linha é um processo único com todos os assuntos listados. Tivemos um total de 8228. Para o tribunal do Juri tem-se 5 tipos penais: Homicídio Qualificado, Homicídio Simples, Infanticídio, Aborto, Induzimento ao Suicídio e a partir de outubro de 24 o Feminicídio.
Questão:
Devemos incluir todos os assuntos ou focar apenas em alguns? Quais critérios utilizar para essa seleção?
LIMPEZA DOS DADOS
Escolha: Vamos trabalhar somente com homicídio Qualificado, Simples e Feminicídio.
Justificativa: Acreditamos que esse esses processos possuem um perfil semelhante entre si, e diferente do infanticídio, aborto e induzimento ao suicídio.
# Vamos retirar os processos que mudaram de orgão julgador
assuntos_wide_limpo <- assuntos_wide %>%
mutate(
homic_bin = if_any(
c(
"Homicídio Qualificado",
"Homicídio Simples",
"Feminicídio",
"Homicidio qualificado",
"Homicídio",
"Homicídio Privilegiado",
"Crimes contra a vida"
),
~ .x == 1
) * 1
)
db_limpo <- db_limpo %>%
anti_join(assuntos_wide_limpo %>% filter(homic_bin == 0),
by = c("numeroProcesso" = "processo"))
nrow(db_limpo) # número total de processos após limpeza[1] 7921
nrow(db_limpo %>%
distinct(numeroProcesso, .keep_all = TRUE)) # número total de processos únicos[1] 7829
Ao final do procedimento, observamos que o banco de dados original continha 8.432 processos. Após as etapas de limpeza e organização, chegamos a 7.867 registros. No entanto, ainda identificamos a existência de processos duplicados. O total de processos únicos é de 7.775, o que significa que permanecem 92 processos duplicados para os quais ainda precisamos definir um tratamento adequado.
LIMPEZA DOS DADOS
Escolha: Excluir os processos duplicados.
Justificativa: Como não está claro o motivo dessa duplicação e quais seus impactos sobre a movimentação, vamos optar pela exclusão desses processos.Note que poderiamos identificar esses processos e fazermos uma análise mais detalhada sobre eles.
Motivos: Insidente de insanidade mental, por exemplo. Processo separado mas com mesmo número.
# Vamos retirar os processos que mudaram de orgão julgador
db_limpo <- db_limpo %>%
anti_join(julgador_dup,
by = c("numeroProcesso" = "processo"))Concluímos a limpeza com 7.683 processos, que serão a base da análise de movimentação. Antes de prosseguir, vamos reorganizar as tabelas anteriores de julgador, assunto e demais variáveis, usando agora apenas esse banco de dados limpo.
TABELAS FINAIS APÓS LIMPEZA DOS DADOS
Com os dados limpos vamos criar uma data.frame de julgados final. Nesse vamos deixar o processo, o órgão julgador, e criar variáveis que indiquem se o órgão é especializado ou não, e se está entre os 5 com maior volume de processos.
# JULGADOR
julgador_final <- db_limpo |>
select(processo = numeroProcesso, orgaoJulgador) |>
unnest(orgaoJulgador) |>
janitor::clean_names()
# Alterando o nome para facilitar a leitura e excluindo o cod do IBGE
julgador_final <- julgador_final %>%
rename(orgao_julgador = nome) %>%
select(-codigo_municipio_ibge)
# Construindo a tabela final do orgão julgador
freq_j_f <- julgador_final %>%
count(orgao_julgador) %>%
arrange(desc(n)) %>%
mutate(perc = round(100 * n / sum(n), 1))
freq_j_f |>
gt() |>
tab_header(
title = "Frequência por Órgão Julgador (Processos Únicos)"
) |>
cols_label(
orgao_julgador = "Órgão Julgador",
n = "Frequência",
perc = "Percentual"
)| Frequência por Órgão Julgador (Processos Únicos) | ||
|---|---|---|
| Órgão Julgador | Frequência | Percentual |
| Juízo da 1ª Vara Criminal de Araguaína | 948 | 12.3 |
| Juizo da 1ª Vara Criminal de Palmas | 824 | 10.7 |
| Juizo da Especializada no Combate à Violência Contra a Mulher e Crimes Dolosos Contra a Vida de Guru | 690 | 8.9 |
| Juízo da 1ª Vara Criminal de Porto Nacional | 425 | 5.5 |
| Juízo da 1ª Vara Criminal de Colinas do Tocantins | 390 | 5.0 |
| Juízo da 1ª Vara Criminal de Paraíso do Tocantins | 313 | 4.0 |
| Juízo da 2ª Vara de Augustinópolis | 276 | 3.6 |
| Juízo da 1ª Vara Criminal de Tocantinópolis | 271 | 3.5 |
| Juízo da 1ª Escrivania Criminal de Itaguatins | 257 | 3.3 |
| Juízo da Vara Criminal, de Violência Doméstica e Juizado Especial Criminal de Dianópolis | 219 | 2.8 |
| Juízo da 1ª Vara Criminal de Miracema do Tocantins | 203 | 2.6 |
| Juízo da 1ª Escrivania Criminal de Colméia | 180 | 2.3 |
| Juízo da 1ª Vara Criminal de Guaraí | 164 | 2.1 |
| Juízo da 1ª Escrivania Criminal de Peixe | 159 | 2.1 |
| Juízo da Vara Criminal, de Violência Doméstica e Juizado Especial Criminal de Araguatins | 155 | 2.0 |
| Juízo da 1ª Escrivania Criminal de Natividade | 150 | 1.9 |
| Juízo da 2ª Vara da Comarca de Cristalândia | 149 | 1.9 |
| Juízo da 1ª Vara Criminal de Taguatinga | 142 | 1.8 |
| Juízo da 1ª Escrivania Criminal de Formoso do Araguaia | 141 | 1.8 |
| Juízo da 1ª Escrivania Criminal de Goiatins | 137 | 1.8 |
| Juízo da 1ª Vara Criminal de Arraias | 118 | 1.5 |
| Juízo da 1ª Escrivania Criminal de Miranorte | 111 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Wanderlândia | 110 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Xambioá | 110 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Novo Acordo | 108 | 1.4 |
| Juízo da 1ª Vara Criminal de Pedro Afonso | 107 | 1.4 |
| Juízo da 1ª Escrivania Criminal de Filadélfia | 95 | 1.2 |
| Juízo da 1ª Escrivania Criminal de Ananás | 92 | 1.2 |
| Juízo da 1ª Escrivania Criminal de Araguaçu | 82 | 1.1 |
| Juízo da 1ª Escrivania Criminal de Ponte Alta | 77 | 1.0 |
| Juízo da 1ª Escrivania Criminal de Araguacema | 73 | 0.9 |
| Juízo da 1ª Escrivania Criminal de Alvorada | 72 | 0.9 |
| Juízo da 1ª Escrivania Criminal de Arapoema | 68 | 0.9 |
| Juízo da 1ª Escrivania Criminal de Palmeiropolis | 65 | 0.8 |
| Juízo da 1ª Escrivania Criminal de Itacajá | 64 | 0.8 |
| Juízo da 1ª Escrivania Criminal de Paranã | 61 | 0.8 |
| Juízo da 1ª Vara Criminal de Dianópolis | 37 | 0.5 |
| Juízo da 1ª Escrivania Criminal de Cristalândia | 35 | 0.5 |
| Juízo da 1ª Vara Criminal de Araguatins | 27 | 0.3 |
| Juízo da 2ª Escrivania de Augustinópolis | 18 | 0.2 |
| Juízo da Vara de Execuções Penais de Gurupi | 8 | 0.1 |
| Juízo da 1ª Escrivania Criminal de Aurora | 6 | 0.1 |
Identificando a Varas Especializadas e as Varas com Maior Volume de Processos
# Identificando as Varas Especializadas
julgador_final <- julgador_final %>%
mutate(
vara_espec = ifelse(
orgao_julgador %in% c(
"Juizo da Especializada no Combate à Violência Contra a Mulher e Crimes Dolosos Contra a Vida de Guru",
"Juízo da Vara Criminal, de Violência Doméstica e Juizado Especial Criminal de Dianópolis",
"Juízo da Vara Criminal, de Violência Doméstica e Juizado Especial Criminal de Araguatins"
),
1, 0
)
)
# Identificando as varas com maior volume de processos (top 5)
julgador_final <- julgador_final %>%
mutate(
volume_top5 = ifelse(
orgao_julgador %in% c(
"Juízo da 1ª Vara Criminal de Araguaína",
"Juizo da 1ª Vara Criminal de Palmas",
"Juízo da 1ª Vara Criminal de Porto Nacional",
"Juízo da 1ª Vara Criminal de Colinas do Tocantins",
"Juízo da 1ª Vara Criminal de Paraíso do Tocantins"
),
1, 0
)
)Agora começaremos a montar o banco de dados final, agregando todos os bancos que já organizamos. Vamos unir as informações de órgão julgador, sistema, formato, classe e assunto além das variáveis binárias que criamos anteriormente.
sistema_final <- db_limpo |>
select(processo = numeroProcesso, sistema) |>
unnest(sistema) |>
janitor::clean_names()
sistema_final <- sistema_final %>%
rename(sistema = nome)
bd_final <- julgador_final |>
left_join(sistema_final, by = c("processo" = "processo")) |>
left_join(formato, by = c("processo" = "processo")) |>
left_join(classe, by = c("processo" = "processo"))
bd_final <- bd_final %>%
rename(
cod_julgador = codigo.x,
cod_sistema = codigo.y,
cod_formato = codigo.x.x,
cod_classe = codigo.y.y,
formato = nome.x,
classe = nome.y
)Agora vamos organizar o banco de dados de assuntos. Vamos utilizar o nosso assunto_wide para trazer para o nosso banco de dados final e crarmos variáveis binárias.
Primeiro vamos ver se todos os assuntos estão presentes e depois vamos deixar somente aqueles que possuem soma maior que zero.
bd_final <- bd_final |>
left_join(assuntos_wide_limpo, by = c("processo" = "processo"))
tabela_somas <- bd_final %>%
summarise(across(where(is.numeric), ~ sum(.x, na.rm = TRUE))) %>%
pivot_longer(cols = everything(),
names_to = "variavel",
values_to = "soma")
# Mantém todas as não numéricas
# Identifica colunas numéricas com soma > 0
# Mantém apenas numéricas cuja soma > 0
bd_final <- bd_final |>
select(
where(~ !is.numeric(.x)),
where(~ is.numeric(.x) && sum(.x, na.rm = TRUE) > 0)
) |>
janitor::clean_names()
# Essa variável criada anteriormente era apenas para apoio
table(bd_final$homic_bin)
1
7735
# Vamos retirar
bd_final <- bd_final %>%
select(-homic_bin)
# Variáveis que identificam tipos de homicídio
bd_final <- bd_final %>%
mutate(
hq = ifelse(homicidio_qualificado == 1 | homicidio_qualificado_2 == 1, 1, 0),
hs = ifelse(homicidio_simples == 1, 1, 0),
fem = ifelse(feminicidio == 1, 1, 0)
)Trouxemos a tabela assuntos_wide_limpo e identificamos que algumas colunas estavam completamente zeradas. Isso ficou claro a partir da tabela de somas. Assim, removemos apenas as variáveis numéricas com soma igual a zero, mantendo todas as variáveis não numéricas.
Também excluímos a variável homic_bin, usada apenas como apoio na etapa anterior.
Por fim, criamos variáveis binárias para identificar três categorias principais de homicídio: homicídio qualificado, homicídio simples e feminicídio. É importante notar que essas categorias podem se sobrepor em alguns processos.
16.10.9 Análise da Movimentação Processual
Agora vamos analisar a movimentação processual. Para isso, precisamos extrair e organizar os dados de movimentação de cada processo. Vamos calcular o tempo decorrido entre cada movimentação e, em seguida, focar na análise do tempo até a baixa definitiva do processo.
movimento <- db_limpo |>
select(processo = numeroProcesso, movimentos) |>
unnest(movimentos) |>
janitor::clean_names() |>
select(-complementos_tabelados) |>
mutate(data_hora = parse_datetime(data_hora))
movimento <- movimento |>
arrange(processo, desc(data_hora)) |>
JurisMiner::tempo_movimentacao(data = data_hora)
movimento <- movimento |>
rename(movimento = nome,
cod_movimento = codigo
) 16.10.9.1 Tempo até a Baixa Definitiva
Vamos selecionar todos os processos para os quais conseguimos extrair a baixa definitiva. No código abaixo, buscamos manter apenas a primeira baixa de cada processo. Note que alguns processos apresentaram múltiplas baixas definitivas. Portanto, vamos considerar a última baixa definitiva que o processo teve.
# Tempo até a baixa definitiva
tempo_baixa <- movimento |>
filter(movimento == "Baixa Definitiva")
# número total de processos únicos
nrow(tempo_baixa %>%
distinct(processo, .keep_all = TRUE)) [1] 4633
# Vamos analisar os processos duplicados
# Esse comando pega todas as linhas após a primeira ocorrência ou
# Pega todas as linhas antes da última ocorrência e verifica duplicação
t_baixa_dup <- tempo_baixa %>%
filter(duplicated(processo) | duplicated(processo, fromLast = TRUE))
## Vamos ver quantos processos duplicados temos:
# número de processos únicos que estão duplicados
unique(julgador_dup$processo) |> length() [1] 144
## Deixamossomente o que tem a maior decorrência acumulada
tempo_baixa_unico <- tempo_baixa |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()Observe que agora temos um total de 4595 processos com baixa definitiva. Iniciamos com 8432 processos, e após a limpeza dos dados, restaram 7683 processos. Desses, conseguimos identificar a baixa definitiva em 4595 processos. Note uma redução significativa, representando um grupo específico de processos que chegaram à baixa definitiva.
Questão:
Os 4.595 representam bem a realidade dos processos de júri? Ao considerar esses processos estamos selecionando um grupo específico?
Juntando os Dados de Baixa com o Banco Final
Agora, vamos juntar com o nosso banco de dados, que criamos na parte anterior, e que contém assunto, classe e as demais variáveis binárias que geramos.
baixa_uni_comp <- tempo_baixa_unico |>
left_join(bd_final, by = c("processo" = "processo"))
# Verificar se criou uma coluna NA
sum(is.na(baixa_uni_comp$fem))[1] 0
A junção não criou nenhuma coluna com valores NA, indicando que todos os processos com baixa definitiva foram corretamente integrados ao banco de dados final.
Análise Descritiva Geral
Primeiramente, vamos descrever ou realizar a análise descritiva do tempo até a baixa definitiva do processo. Neste momento, estamos considerando todos os 4.595 processos.
# Estatísticas descritivas para a variável decorrencia_acumulada
tempo_stats <- baixa_uni_comp %>%
summarise(
media = mean(decorrencia_acumulada, na.rm = TRUE),
mediana = median(decorrencia_acumulada, na.rm = TRUE),
desvio = sd(decorrencia_acumulada, na.rm = TRUE),
variancia = var(decorrencia_acumulada, na.rm = TRUE),
q1 = quantile(decorrencia_acumulada, 0.25, na.rm = TRUE),
q3 = quantile(decorrencia_acumulada, 0.75, na.rm = TRUE),
minimo = min(decorrencia_acumulada, na.rm = TRUE),
maximo = max(decorrencia_acumulada, na.rm = TRUE)
) |>
pivot_longer(
cols = everything(),
names_to = "Estatística",
values_to = "Valor"
)
# Tabela GT
tempo_stats %>%
gt() %>%
tab_header(
title = "Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva",
subtitle = "Variável: decorrencia_acumulada"
) %>%
fmt_number(
columns = Valor,
decimals = 2
)| Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva | |
|---|---|
| Variável: decorrencia_acumulada | |
| Estatística | Valor |
| media | 1,278.51 |
| mediana | 1,026.75 |
| desvio | 951.49 |
| variancia | 905,332.99 |
| q1 | 552.81 |
| q3 | 1,760.87 |
| minimo | 0.00 |
| maximo | 4,808.92 |
A média do tempo do processo até a baixa definitiva é de 1.280 dias, com desvio-padrão de 950 dias, mostrando grande variação nos tempos processuais. A mediana é de 1.030 dias, indicando que metade dos processos dura menos do que isso.
Distribuição dos tempos
- 25% dos processos são concluídos em até 554 dias.
- 50% (intervalo interquartil) estão entre 554 e 1.762 dias.
- 25% dos processos duram mais de 1.762 dias.
Visualmente
Vamos analisar também o tempo de forma gráfica, utilizando diferentes tipos de gráficos. Primeiro, apresentamos o gráfico conhecido como BoxPlot; em seguida, o gráfico chamado ViolinPlot. Depois, construímos os gráficos de densidade: inicialmente o histograma e, em seguida, a densidade contínua. Eles estão apresentados abaixo.
O Box Plot
O boxplot é um gráfico que traz muitas informações e pode ser visto como a distribuição de probabilidade dos dados.
Como visto acima, o gráfico representa a distribuição do tempo até a baixa definitiva e a sua concentração.
A caixa do boxplot mostra o intervalo interquartil: a parte inferior está em 554 dias, a mediana aparece ao redor de 1.030 dias e o terceiro quartil está em 1.761 dias. Esses valores compõem o interior da caixa, indicando onde se concentra 50% dos processos.
Observa-se também um número significativo de outliers, representados por pontos acima de aproximadamente 3.600 dias. Esses processos podem ser classificados como atípicos, pois apresentam tempos de duração muito superiores ao padrão da distribuição.
ggplot(baixa_uni_comp, aes(y = decorrencia_acumulada)) +
geom_boxplot(fill = "#7185cc", color = "#c2986f", alpha=0.7, # Linhas tracejadas no boxplot
outlier.shape = 16, outlier.color = "red", outlier.size = 3) + # Boxplot com preenchimento azul e bordas pretas
labs(
title = "Boxplot do Tempo do Processo até Baixa Definitiva", # Título do gráfico
x = "", # Sem rótulo no eixo x
y = "Tempo" # Rótulo do eixo y
) +
coord_flip() + # Inverte os eixos para horizontalidade
theme_bw() + # Tema limpo e moderno
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), # Centraliza e estiliza o título
axis.text.y = element_text(size = 10), # Ajusta o tamanho do texto no eixo y
axis.title.y = element_text(size = 12) # Ajusta o tamanho do rótulo do eixo y
)
O box ou caixa contém 50% dos dados. O limite superior indica o percentil de 75% (Q3) e o limite inferior indica o percentil de 25% (Q1). A linha que corta o box indica a mediana, ou seja, Q2. Os bigodes são calculados com base na distância interquantílica, ou seja,
Limite inferior: Q1-1,5(Q3-Q1)
Limite superior:Q3+1,5(Q3-Q1)
Dados fora desses limites são classificados como suspeitos de serem outliers. Podemos observar a assimetria dos dados quando a mediana não está no meio da caixa, indicando maior densidade na menor distância entre os quartis Q1 ou Q3 e a mediana Q2.
Gráfico de Densidade
Visualizar a distribuição empírica dos dados fornece uma grande quantidade de informação. Um gráfico básico em análise descritiva é o histograma, o qual fornece a distribuição de probabilidade empírica dos dados em um formato de barras. O histograma mostra a frequência de processos em cada faixa de duração até a baixa definitiva. A altura de cada barra indica quantos processos estão naquela faixa de dias.
ggplot(baixa_uni_comp, aes(x = decorrencia_acumulada)) +
geom_histogram(bins = 30, fill = "#7185cc", color = "white", alpha = 0.7) +
geom_vline(aes(xintercept = mean(decorrencia_acumulada)), color = "#c2986f", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 1400, y = 300, vjust = -0.5, label = "Média", color = "#c2986f", fontface = "bold", size = 4) +
geom_vline(aes(xintercept = median(decorrencia_acumulada)), color = "#c77878ff", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 900, y = 400, vjust = -0.5, label = "Mediana", color = "#c77878ff", fontface = "bold", size = 4) +
labs(
x = "Tempo do Processo",
y = "Frequência",
title = "Histograma do Tempo do Processo até Baixa Definitiva"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10))
Observa-se que há um número relevante de processos com poucos dias até a baixa definitiva. Pfecisamos decidir o que fazer com esses processos. Devemos excluí-los?
A distribuição é assimétrica à direita, com uma cauda longa, o que significa que existe um grupo menor de processos que dura muito mais tempo, esses valores elevados puxam a média para cima.
A maior concentração de processos ocorre entre 800 e 900 dias, e aproximadamente metade dos processos é concluída em até 1.000 dias. A partir desse ponto, a frequência diminui gradualmente, até alcançar valores próximos de 4.000 dias, onde a cauda longa se torna evidente.
Uma outra maneira de visualizar os dados é utilizando uma distribuição continua e não mais a discreta. Para isso, utiliza-se a densidade de Kernel para visualização da distribuição de probabilidade da taxa de feminicídio. Vejamos:
ggplot(baixa_uni_comp, aes(x = decorrencia_acumulada)) +
geom_density(fill = "#7185cc", alpha = 0.4, color = "#7185cc", linewidth = 1) +
geom_vline(aes(xintercept = mean(decorrencia_acumulada)), color = "#c2986f", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 1400, y = 0.00005, vjust = -0.5, label = "Média", color = "#c2986f", fontface = "bold", size = 4) +
geom_vline(aes(xintercept = median(decorrencia_acumulada)), color = "#c77878ff", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 900, y = 0.00005, vjust = -0.5, label = "Mediana", color = "#c77878ff", fontface = "bold", size = 4) +
labs(
x = "Tempo do Processo",
y = "Frequência",
title = "Histograma do Tempo do Processo até Baixa Definitiva"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10))
Análise por Órgão Julgador
Vamos analisar agora por órgão julgador, os 5 maiores em relação aos demais.
# Estatísticas descritivas estratificadas por volume_top5
tempo_stats_grupo <- baixa_uni_comp %>%
group_by(volume_top5) %>%
summarise(
media = mean(decorrencia_acumulada, na.rm = TRUE),
mediana = median(decorrencia_acumulada, na.rm = TRUE),
desvio = sd(decorrencia_acumulada, na.rm = TRUE),
variancia = var(decorrencia_acumulada, na.rm = TRUE),
q1 = quantile(decorrencia_acumulada, 0.25, na.rm = TRUE),
q3 = quantile(decorrencia_acumulada, 0.75, na.rm = TRUE),
minimo = min(decorrencia_acumulada, na.rm = TRUE),
maximo = max(decorrencia_acumulada, na.rm = TRUE)
) %>%
pivot_longer(
cols = -volume_top5,
names_to = "Estatística",
values_to = "Valor"
)%>%
pivot_wider(
names_from = volume_top5,
values_from = Valor
)
# Tabela GT
tempo_stats_grupo %>%
gt(groupname_col = "volume_top5") %>%
tab_header(
title = "Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva",
subtitle = "Estratificadas 5 maiores órgãos julgadores )"
) %>%
fmt_number(
columns = where(is.numeric),
decimals = 2
) %>%
cols_label(
Estatística = "Estatística",
`0` = "Demais",
`1` = "Top 5"
)| Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva | ||
|---|---|---|
| Estratificadas 5 maiores órgãos julgadores ) | ||
| Estatística | Demais | Top 5 |
| media | 1,323.58 | 1,192.65 |
| mediana | 1,032.56 | 1,014.74 |
| desvio | 1,016.59 | 806.57 |
| variancia | 1,033,446.72 | 650,561.17 |
| q1 | 529.45 | 595.42 |
| q3 | 1,839.32 | 1,640.99 |
| minimo | 0.00 | 0.33 |
| maximo | 4,808.92 | 4,414.10 |
Observamos que as cinco maiores varas apresentam uma média de 1.194 dias até a baixa definitiva, enquanto as demais varas possuem uma média de 1.325 dias. Há, portanto, uma diferença entre as médias dos dois grupos.
Também se verifica diferença na dispersão: nas cinco maiores varas, o desvio-padrão é de 802 dias, ao passo que nas demais varas ele chega a 1.015 dias. Isso indica que, além de terem um tempo médio menor, as cinco maiores varas apresentam uma duração dos processos mais concentrada e com menor variabilidade em comparação às demais comarcas.
Vejamos a distribuição graficamente:
# Garantir que seja fator
baixa_uni_comp$volume_top5_factor <- factor(baixa_uni_comp$volume_top5, levels = c(1, 0), labels = c("Top5", "Demais"))
ggplot(baixa_uni_comp, aes(x = decorrencia_acumulada, fill = volume_top5_factor, group = volume_top5_factor)) +
geom_density(alpha = 0.4, linewidth = 1) +
labs(
x = "Tempo do Processo",
y = "Densidade",
title = "Distribuição do Tempo do Processo até Baixa Definitiva"
) +
scale_fill_manual(
name = "Grupo de Volume",
values = c("Top5" = "#7185cc", "Demais" = "#c77878ff") # cores específicas
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
Para avaliar se a diferença entre as médias dos dois grupos é estatisticamente significativa, realizamos um teste t de diferença de médias. O resultado foi significativo, indicando que as médias dos dois grupos são, de fato, diferentes.
Em termos práticos, isso significa que, em média, as cinco varas com maior volume de processos apresentam um tempo médio de tramitação menor do que o observado nas demais varas.
t.test(
decorrencia_acumulada ~ volume_top5,
data = baixa_uni_comp,
var.equal = FALSE) # teste de Welch (padrão e mais seguro)
Welch Two Sample t-test
data: decorrencia_acumulada by volume_top5
t = 4.7872, df = 3927.7, p-value = 1.753e-06
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
77.31067 184.55563
sample estimates:
mean in group 0 mean in group 1
1323.583 1192.650
Vamos agora analisar por vara especializada versus não especializada.
# Estatísticas descritivas estratificadas por vara especializada
tempo_stats_grupo_espec <- baixa_uni_comp %>%
group_by(vara_espec) %>%
summarise(
media = mean(decorrencia_acumulada, na.rm = TRUE),
mediana = median(decorrencia_acumulada, na.rm = TRUE),
desvio = sd(decorrencia_acumulada, na.rm = TRUE),
variancia = var(decorrencia_acumulada, na.rm = TRUE),
q1 = quantile(decorrencia_acumulada, 0.25, na.rm = TRUE),
q3 = quantile(decorrencia_acumulada, 0.75, na.rm = TRUE),
minimo = min(decorrencia_acumulada, na.rm = TRUE),
maximo = max(decorrencia_acumulada, na.rm = TRUE)
) %>%
pivot_longer(
cols = -vara_espec,
names_to = "Estatística",
values_to = "Valor"
)%>%
pivot_wider(
names_from = vara_espec,
values_from = Valor
)
# Tabela GT
tempo_stats_grupo_espec %>%
gt(groupname_col = "volume_top5") %>%
tab_header(
title = "Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva",
subtitle = "Estratificadas Especializada (1) e Demais (0)"
) %>%
fmt_number(
columns = where(is.numeric),
decimals = 2
) %>%
cols_label(
Estatística = "Estatística",
`0` = "Demais",
`1` = "Especializada"
)| Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva | ||
|---|---|---|
| Estratificadas Especializada (1) e Demais (0) | ||
| Estatística | Demais | Especializada |
| media | 1,299.61 | 1,140.40 |
| mediana | 1,053.10 | 860.15 |
| desvio | 947.31 | 967.88 |
| variancia | 897,400.40 | 936,782.63 |
| q1 | 578.03 | 456.03 |
| q3 | 1,778.93 | 1,609.66 |
| minimo | 0.00 | 0.02 |
| maximo | 4,808.92 | 4,660.03 |
Neste caso, observamos uma diferença ainda maior entre os grupos: enquanto as demais varas apresentam tempo médio de 1.302 dias, as varas especializadas têm média de 1.138 dias.
t.test(
decorrencia_acumulada ~ vara_espec,
data = baixa_uni_comp,
var.equal = FALSE) # teste de Welch (padrão e mais seguro)
Welch Two Sample t-test
data: decorrencia_acumulada by vara_espec
t = 3.8068, df = 802.93, p-value = 0.0001515
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
77.11211 241.29481
sample estimates:
mean in group 0 mean in group 1
1299.606 1140.402
O teste de diferença de média mostra que os processos tramitam mais rapidamente nas varas especializadas em relação as demais e é estatisticamente significativo a 1%.
Vamos agora repetir a mesma análise, mas classificando os processos por assunto. Começaremos examinando os casos de homicídio qualificado, comparando-os com os demais processos.
O objetivo é verificar se os processos de homicídio qualificado apresentam um padrão distinto de duração.
# Estatísticas descritivas estratificadas por Homicídio Qualificado
tempo_stats_grupo1 <- baixa_uni_comp %>%
group_by(hq) %>%
summarise(
media = mean(decorrencia_acumulada, na.rm = TRUE),
mediana = median(decorrencia_acumulada, na.rm = TRUE),
desvio = sd(decorrencia_acumulada, na.rm = TRUE),
variancia = var(decorrencia_acumulada, na.rm = TRUE),
q1 = quantile(decorrencia_acumulada, 0.25, na.rm = TRUE),
q3 = quantile(decorrencia_acumulada, 0.75, na.rm = TRUE),
minimo = min(decorrencia_acumulada, na.rm = TRUE),
maximo = max(decorrencia_acumulada, na.rm = TRUE)
) %>%
pivot_longer(
cols = -hq,
names_to = "Estatística",
values_to = "Valor"
)%>%
pivot_wider(
names_from = hq,
values_from = Valor
)
# Tabela GT
tempo_stats_grupo1 %>%
gt(groupname_col = "volume_top5") %>%
tab_header(
title = "Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva",
subtitle = "Estratificadas Homicídio Qualificado (1) e Demais (0)"
) %>%
fmt_number(
columns = where(is.numeric),
decimals = 2
) %>%
cols_label(
Estatística = "Estatística",
`0` = "Demais",
`1` = "Homic Qualificado"
)| Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva | ||
|---|---|---|
| Estratificadas Homicídio Qualificado (1) e Demais (0) | ||
| Estatística | Demais | Homic Qualificado |
| media | 1,312.37 | 1,264.99 |
| mediana | 1,028.42 | 1,025.19 |
| desvio | 1,021.29 | 921.96 |
| variancia | 1,043,026.56 | 850,013.08 |
| q1 | 528.80 | 563.88 |
| q3 | 1,836.54 | 1,725.29 |
| minimo | 0.03 | 0.00 |
| maximo | 4,808.92 | 4,759.90 |
Observamos agora que as médias dos dois grupos são mais próximas: os processos de homicídio qualificado apresentam tempo médio de 1.264 dias, enquanto os demais processos têm média de 1.319 dias. Da mesma forma, os desvios-padrão também são semelhantes: cerca de 921 dias para homicídio qualificado e 1.017 dias para os demais assuntos.
Portanto, ao contrário do que vimos no caso das varas, não há uma diferença tão acentuada.
t.test(
decorrencia_acumulada ~ hq,
data = baixa_uni_comp,
var.equal = FALSE) # teste de Welch (padrão e mais seguro)
Welch Two Sample t-test
data: decorrencia_acumulada by hq
t = 1.4652, df = 2226.5, p-value = 0.143
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
-16.0330 110.7958
sample estimates:
mean in group 0 mean in group 1
1312.368 1264.987
O teste de média s indicou que a diferença entre os dois grupos não é estatisticamente significativa a 5%. Isso sugere que, em termos práticos, o tempo médio de tramitação dos processos de homicídio qualificado não difere significativamente dos demais processos.
Vejamos agora os processos de feminicídio, comparando-os com os demais processos. O objetivo é verificar se os processos de feminicídio apresentam um padrão distinto de duração em relação aos outros tipos de homicídio.
# Estatísticas descritivas estratificadas por Feminicídio
tempo_stats_grupo2 <- baixa_uni_comp %>%
group_by(fem) %>%
summarise(
media = mean(decorrencia_acumulada, na.rm = TRUE),
mediana = median(decorrencia_acumulada, na.rm = TRUE),
desvio = sd(decorrencia_acumulada, na.rm = TRUE),
variancia = var(decorrencia_acumulada, na.rm = TRUE),
q1 = quantile(decorrencia_acumulada, 0.25, na.rm = TRUE),
q3 = quantile(decorrencia_acumulada, 0.75, na.rm = TRUE),
minimo = min(decorrencia_acumulada, na.rm = TRUE),
maximo = max(decorrencia_acumulada, na.rm = TRUE)
) %>%
pivot_longer(
cols = -fem,
names_to = "Estatística",
values_to = "Valor"
)%>%
pivot_wider(
names_from = fem,
values_from = Valor
)
# Tabela GT
tempo_stats_grupo2 %>%
gt(groupname_col = "volume_top5") %>%
tab_header(
title = "Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva",
subtitle = "Estratificadas Feminicídio (1) e Demais (0)"
) %>%
fmt_number(
columns = where(is.numeric),
decimals = 2
) %>%
cols_label(
Estatística = "Estatística",
`0` = "Demais",
`1` = "Feminicídio"
)| Estatísticas Descritivas — Tempo do Processo até Baixa Definitiva | ||
|---|---|---|
| Estratificadas Feminicídio (1) e Demais (0) | ||
| Estatística | Demais | Feminicídio |
| media | 1,283.80 | 1,135.06 |
| mediana | 1,034.71 | 837.78 |
| desvio | 955.92 | 811.98 |
| variancia | 913,780.13 | 659,305.10 |
| q1 | 553.48 | 531.84 |
| q3 | 1,764.05 | 1,643.99 |
| minimo | 0.00 | 1.51 |
| maximo | 4,808.92 | 4,414.10 |
t.test(
decorrencia_acumulada ~ fem,
data = baixa_uni_comp,
var.equal = FALSE) # teste de Welch (padrão e mais seguro)
Welch Two Sample t-test
data: decorrencia_acumulada by fem
t = 2.2951, df = 181.2, p-value = 0.02288
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
20.86379 276.62156
sample estimates:
mean in group 0 mean in group 1
1283.804 1135.062
Observamos que os processos classificados como feminicídio apresentam uma média de duração menor do que aqueles não classificados dessa forma. A diferença entre as médias é de aproximadamente 150 dias, e é estatisticamente significativa a 5%
Vamos tentar analisar por meio de um modelo linear multivariado, que considera todas as variáveis anteriores.
lm_model <- lm(decorrencia_acumulada ~ volume_top5 + vara_espec + hq + fem, data = baixa_uni_comp)
modelsummary(
lm_model,
output = "gt",
statistic = c("std.error", "p.value"),
shape = term ~ statistic,
fmt=2,
gof_map = tribble(
~raw, ~clean, ~fmt,
"adj.r.squared","R² ajustado", 3,
"nobs", "N. de observações", 0,
"fstatistic", "Estatística F", 3
),
stars = TRUE,
title = "Modelo de Regressão Linear",
notes = "S.E.: Erro padrão."
)
(1)
|
|||
|---|---|---|---|
| Est. | S.E. | p | |
| (Intercept) | 1409.94*** | 29.32 | <0.01 |
| volume_top5 | -171.91*** | 30.60 | <0.01 |
| vara_espec | -234.12*** | 42.79 | <0.01 |
| hq | -49.72 | 31.11 | 0.11 |
| fem | -159.88* | 75.64 | 0.03 |
| R² ajustado | 0.011 | ||
| N. de observações | 4633 | ||
| + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |||
| S.E.: Erro padrão. | |||
Observe-se que o intercepto do nosso modelo é de 1.418 dias. Esse valor representa o tempo médio dos processos que não estão entre as cinco varas de maior volume, não tramitam em varas especializadas e não são classificados como homicídio qualificado ou feminicídio. Ou seja, é o valor esperado quando todas as demais variáveis do modelo são iguais a zero. Esta é a interpretação básica do intercepto.
Em relação a esse grupo de referência, observamos reduções importantes no tempo médio do processo:
- Nas cinco varas de maior volume, o tempo médio é cerca de 171 dias menor do que o valor do intercepto (1.418 dias).
- Nas varas especializadas, a redução é ainda maior, aproximadamente 238 dias a menos em relação ao intercepto.
- Para os processos classificados como feminicídio, há também uma diminuição média de 164 dias.
Esses valores indicam quanto cada característica reduz o tempo esperado em comparação com o grupo base definido pelo intercepto.
16.10.9.2 Analisando as Fases do Processo de Júri
A estratégia de análise será a seguinte:
flowchart LR A[Distribuição] --> B[Recebimento da Denúncia] B --> C[Aud. Instrução e Julgamento] C --> D[Dec. Pronúncia] D --> E[Seç. Trib. do Júri]
- Distribuição:
- Recebimento da Denúncia: 391
- Audiência de Instrução e Julgamento: 12750
- Decisão de Pronúncia: 10953
- Seção do Tribunal do Júri: 313
Montando os bancos de dados para cada fase do processo
Vamos montar os bancos e organizar um banco único para cada fase do processo de júri.
# Montar as bases e selecionar apenas as variáveis desejadas em cada base
# Tempo até a denuncia
t_denuncia <- movimento |>
filter(cod_movimento == "391")
## Deixamos somente a primeira denuncia
t_denuncia_unico <- t_denuncia |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_denuncia_unico <- t_denuncia_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_denuncia=cod_movimento,
deco_denuncia = decorrencia_acumulada,
data_denuncia = data_hora)
# Tempo até a Instrução e Julgamento
t_int_julg <- movimento |>
filter(cod_movimento == "12750")
## Deixamos somente a primeira instrução e julgamento
t_int_julg_unico <- t_int_julg |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_int_julg_unico <- t_int_julg_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_instr=cod_movimento,
deco_intjulg = decorrencia_acumulada,
data_intjulg = data_hora)
# Tempo até a pronuncia
t_pronun <- movimento |>
filter(cod_movimento == "10953")
## Deixamos somente a primeira denuncia
t_pronun_unico <- t_pronun |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_pronun_unico <- t_pronun_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_pronun=cod_movimento,
deco_pronun = decorrencia_acumulada,
data_pronun = data_hora)
# Tempo até a juri
t_juri <- movimento |>
filter(cod_movimento == "313")
## Deixamos somente a primeira denuncia
t_juri_unico <- t_juri |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_juri_unico <- t_juri_unico %>%
distinct(processo, .keep_all = TRUE)
t_juri_unico <- t_juri_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_juri=cod_movimento,
deco_juri = decorrencia_acumulada,
data_juri = data_hora)
tempo_baixa_unico <- tempo_baixa_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_baixa=cod_movimento,
deco_baixa = decorrencia_acumulada,
data_baixa = data_hora)
mov_final <- bd_final |>
left_join(t_denuncia_unico, by ="processo")|>
left_join(t_int_julg_unico, by = "processo") |>
left_join(t_pronun_unico, by = "processo") |>
left_join(t_juri_unico, by = "processo") |>
left_join(tempo_baixa_unico, by ="processo")
mov_final <- mov_final |>
drop_na(deco_intjulg, deco_baixa, deco_juri, deco_pronun, deco_denuncia)Agora que juntamos todas as movimentações e eliminamos os casos com valores ausentes e chegamos a um total de 1.034 processos.
Partimos originalmente de 8.432 processos no banco básico. Portanto, houve uma redução substancial da base analítica, com a exclusão de aproximadamente 7.400 processos.
Essa redução levanta uma questão central para a análise:
os 1.034 processos restantes são representativos do conjunto original ou formam um grupo com características muito diferentes?
Para evitar viés de seleção, vamos seguir olhando cada variável individualmente e comparando as estatísticas descritivas de cada fase do processo.
# 1. Função para gerar estatísticas descritivas
make_stats <- function(x) {
tibble::tibble(
Estatística = c(
"media", "mediana", "desvio", "variancia",
"q1", "q3", "minimo", "maximo"
),
Valor = c(
mean(x, na.rm = TRUE),
median(x, na.rm = TRUE),
sd(x, na.rm = TRUE),
var(x, na.rm = TRUE),
quantile(x, 0.25, na.rm = TRUE),
quantile(x, 0.75, na.rm = TRUE),
min(x, na.rm = TRUE),
max(x, na.rm = TRUE)
)
)
}
# Tempo até a denuncia
t_denuncia <- movimento |>
filter(cod_movimento == "391")
t_denuncia_unico <- t_denuncia |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_denuncia_unico <- t_denuncia_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_denuncia=cod_movimento,
deco_denuncia = decorrencia_acumulada,
data_denuncia = data_hora)
# Tempo até a Instrução e Julgamento
t_int_julg <- movimento |>
filter(cod_movimento == "12750")
t_int_julg_unico <- t_int_julg |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_int_julg_unico <- t_int_julg_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_instr=cod_movimento,
deco_intjulg = decorrencia_acumulada,
data_intjulg = data_hora)
# Tempo até a pronuncia
t_pronun <- movimento |>
filter(cod_movimento == "10953")
t_pronun_unico <- t_pronun |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_pronun_unico <- t_pronun_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_pronun=cod_movimento,
deco_pronun = decorrencia_acumulada,
data_pronun = data_hora)
# Tempo até a juri
t_juri <- movimento |>
filter(cod_movimento == "313")
t_juri_unico <- t_juri |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
ungroup()
t_juri_unico <- t_juri_unico %>%
distinct(processo, .keep_all = TRUE)
t_juri_unico <- t_juri_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_juri=cod_movimento,
deco_juri = decorrencia_acumulada,
data_juri = data_hora)
tempo_baixa_unico <- tempo_baixa_unico |>
select(processo, cod_movimento, decorrencia_acumulada, data_hora) |>
rename(cod_baixa=cod_movimento,
deco_baixa = decorrencia_acumulada,
data_baixa = data_hora)
# 2. Gerar estatísticas para cada banco
stats_denuncia <- make_stats(t_denuncia_unico$deco_denuncia)
stats_intjulg <- make_stats(t_int_julg_unico$deco_intjulg)
stats_pronun <- make_stats(t_pronun_unico$deco_pronun)
stats_juri <- make_stats( t_juri_unico$deco_juri)
stats_baixa <- make_stats(tempo_baixa_unico$deco_baixa)
# 3. Juntar tudo em uma única tabela
stats_baixa <- stats_baixa %>% rename(Baixa = Valor)
stats_intjulg <- stats_intjulg %>% rename(Instr_Julg = Valor)
stats_pronun <- stats_pronun %>% rename(Pronuncia = Valor)
stats_juri <- stats_juri %>% rename(Juri = Valor)
stats_denuncia <- stats_denuncia %>% rename(Denuncia = Valor)
all_stats <- stats_denuncia %>%
left_join(stats_intjulg, by = "Estatística") %>%
left_join(stats_pronun, by = "Estatística") %>%
left_join(stats_juri, by = "Estatística") %>%
left_join(stats_baixa, by = "Estatística")
# 4. Gerar tabela final
all_stats %>%
gt() %>%
fmt_number(
columns = where(is.numeric), # aplica a todas as colunas numéricas
decimals = 2
) %>%
tab_header(
title = "Estatísticas Descritivas — Todas as Fases do Processo"
)| Estatísticas Descritivas — Todas as Fases do Processo | |||||
|---|---|---|---|---|---|
| Estatística | Denuncia | Instr_Julg | Pronuncia | Juri | Baixa |
| media | 32.40 | 491.02 | 678.65 | 1,016.68 | 1,278.51 |
| mediana | 2.99 | 161.77 | 346.08 | 730.96 | 1,026.75 |
| desvio | 169.50 | 760.26 | 787.45 | 884.97 | 951.49 |
| variancia | 28,731.29 | 577,997.75 | 620,083.62 | 783,173.29 | 905,332.99 |
| q1 | 0.88 | 65.28 | 176.15 | 368.87 | 552.81 |
| q3 | 9.85 | 559.70 | 882.12 | 1,396.07 | 1,760.87 |
| minimo | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
| maximo | 3,377.73 | 4,668.86 | 4,434.01 | 4,784.91 | 4,808.92 |
Nessa tabela tem-se uma visão geral das estatísticas descritivas para cada fase do processo. Observa-se que o tempo médio da distribuição até o Recebimento da Denúncia é de 32,51 dias. Já o tempo médio da distribuição até a Audiência de Instrução e Julgamento é de 490,23 dias.
16.10.9.3 Da distribuição até o Recebimento da Denúncia
Primeiro vamos analisar o tempo entre a distribuição do processo e o recebimento da denúncia. Graficamente tem-se:
t_denuncia_unico <- t_denuncia_unico
ggplot(t_denuncia_unico, aes(x = deco_denuncia)) +
geom_histogram(bins = 3000, fill = "#7185cc", color = "white", alpha = 0.7) +
geom_vline(aes(xintercept = mean(deco_denuncia)), color = "#c2986f", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 37, y = 500, vjust = -0.5, label = "Média", color = "#c2986f", fontface = "bold", size = 4) +
geom_vline(aes(xintercept = median(deco_denuncia)), color = "#c77878ff", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 7, y = 500, vjust = -0.5, label = "Mediana", color = "#c77878ff", fontface = "bold", size = 4) +
labs(
x = "Tempo em dias (até 50 dias)",
y = "Frequência",
title = "Histograma do Tempo da Distribuição até a Denúncia"
) +
coord_cartesian(xlim = c(0, 50)) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10))
Observa-se que 50% dos processos duram menos de 3 dias entre a distribuição e o recebimento da denúncia. Entretanto, a média é bem maior, em torno de 32 dias.
Essa diferença indica que existem processos com duração muito longa, alguns com mais de 100 dias, que puxam a média para cima. Ou seja, a distribuição é assimétrica, com uma cauda longa à direita.
# Contar quantos processos têm soma maior que 30 dias
t_denuncia_unico %>%
filter(deco_denuncia > 30) %>%
summarise(n = n(),
percentual = n() / nrow(t_denuncia_unico) * 100,
media= mean(deco_denuncia))# A tibble: 1 × 3
n percentual media
<int> <dbl> <dbl>
1 499 11.6 244.
Observa-se que aproximadamente 12% dos processos levam mais de 30 dias entre a distribuição e o recebimento da denúncia e possuem média de 245 dias nesse grupo.
Para entender melhor essa diferença, iremos investigar os atos ordinatórios e outros atos, pois eles podem estar contribuindo significativamente para o aumento do tempo entre distribuição e denúncia.
Movimentação até Recebimento da Denúncia
Vamos analisar a movimentação do processo desde a distribuição até o recebimento da denúncia. Vamos criar um banco específico para essa análise.
# 1. Identificar o tempo da denúncia para cada processo
tempo_denuncia <- movimento |>
filter(cod_movimento == "391") |>
group_by(processo) |>
slice_min(decorrencia_acumulada, n = 1) |>
select(processo, deco_denuncia=decorrencia_acumulada)
# 2. Selecionar todos os atos até a denúncia
atos_ate_denuncia <- movimento %>%
left_join(tempo_denuncia, by = "processo") %>%
filter(decorrencia_acumulada <= deco_denuncia) Criamos um banco que possui todos os movimentos processuais desde a distribuição até o recebimento da denúncia. Agora, vamos analisar a frequência dos movimentos processuais.
freq_movimento <- atos_ate_denuncia %>%
count(movimento, sort = TRUE) # conta por descrição do movimento
freq_movimento %>%
gt() %>%
tab_header(
title = "Frequência de Movimentos até a Denúncia"
) %>%
fmt_number(
columns = "n",
decimals = 0
) %>%
cols_label(
movimento = "Movimento",
n = "Frequência"
)| Frequência de Movimentos até a Denúncia | |
|---|---|
| Movimento | Frequência |
| Conclusão | 4,688 |
| Distribuição | 4,367 |
| Denúncia | 4,313 |
| Ato ordinatório | 4,014 |
| Remessa | 1,802 |
| Documento | 934 |
| Protocolo de Petição | 886 |
| Expedida/certificada | 575 |
| Expedição de documento | 445 |
| Confirmada | 432 |
| Mero expediente | 360 |
| Mandado | 273 |
| Mudança de Assunto Processual | 260 |
| Recebimento | 245 |
| Mudança de Parte | 169 |
| Expedida/Certificada | 161 |
| Mudança de Classe Processual | 144 |
| Redistribuição | 99 |
| Decurso de Prazo | 84 |
| Movimentação processual | 67 |
| Retificação de Classe Processual | 44 |
| Inclusão no Juízo 100% Digital | 42 |
| Réu revel citado por edital | 34 |
| Queixa | 33 |
| de Instrução e Julgamento | 20 |
| Outras Decisões | 15 |
| Publicação | 15 |
| Levantamento da Suspensão ou Dessobrestamento | 11 |
| deferimento | 11 |
| Incompetência | 8 |
| Aditamento da denúncia | 6 |
| Desarquivamento | 6 |
| Disponibilização no Diário da Justiça Eletrônico | 6 |
| Ofício | 6 |
| Por decisão judicial | 6 |
| Suspeição | 6 |
| Impedimento ou Suspeição | 5 |
| Cumprimento de Levantamento da Suspensão | 4 |
| Incidente de Insanidade Mental | 4 |
| Registro Processual | 4 |
| Sessão do Tribunal do Júri | 4 |
| Audiência | 3 |
| Com efeito suspensivo | 3 |
| Liberdade provisória | 3 |
| Sem efeito suspensivo | 3 |
| de Custódia | 3 |
| Cadastramento | 2 |
| Decisão anterior | 2 |
| Depósito de Bens/Dinheiro | 2 |
| Julgamento em Diligência | 2 |
| Requisição de Informações | 2 |
| Revogação da Suspensão do Processo | 2 |
| Suspensão ou Sobrestamento | 2 |
| de Instrução | 2 |
| Baixa Definitiva | 1 |
| Comparecimento do Réu/Apenado | 1 |
| Desmembramento de Feitos | 1 |
| Em Secretaria | 1 |
| Impedimento | 1 |
| Improcedência | 1 |
| Indeferimento | 1 |
| Liberdade Provisória | 1 |
| Liminar | 1 |
| Morte do agente | 1 |
| Prisão | 1 |
| Prisão em flagrante | 1 |
| Procedência | 1 |
| Pronúncia | 1 |
| Suspensão Condicional do Processo | 1 |
| de Interrogatório | 1 |
ATOS ORDINATÓRIOS
E abaixo vamos somar o tempo de cada ato ordinatório por processo.
# Filtra somente atos ordinatórios e soma por processo
bdsoma_ordinatorios <- atos_ate_denuncia %>%
filter(cod_movimento == 11383) %>% # filtra apenas atos ordinatórios
group_by(processo) %>% # agrupa por processo
summarise(soma_ordinatorios = sum(decorrencia, na.rm = TRUE))Agora temos um banco com a soma do tempo dos atos ordinatórios para cada processo, desde a distribuição até o recebimento da denúncia. Vamos analisar as estatísticas descritivas dessa variável.
# Estatísticas descritivas para a variável decorrencia_acumulada
tempo_stats <- bdsoma_ordinatorios %>%
summarise(
media = mean(soma_ordinatorios, na.rm = TRUE),
mediana = median(soma_ordinatorios, na.rm = TRUE),
desvio = sd(soma_ordinatorios, na.rm = TRUE),
variancia = var(soma_ordinatorios, na.rm = TRUE),
q1 = quantile(soma_ordinatorios, 0.25, na.rm = TRUE),
q3 = quantile(soma_ordinatorios, 0.75, na.rm = TRUE),
minimo = min(soma_ordinatorios, na.rm = TRUE),
maximo = max(soma_ordinatorios, na.rm = TRUE)
) |>
pivot_longer(
cols = everything(),
names_to = "Estatística",
values_to = "Valor"
)
# Tabela GT
tempo_stats %>%
gt() %>%
tab_header(
title = "Estatísticas Descritivas — Tempo médios dos Atos Ordinatórios até a Denúncia",
subtitle = "Variável: decorrencia"
) %>%
fmt_number(
columns = Valor,
decimals = 2
)| Estatísticas Descritivas — Tempo médios dos Atos Ordinatórios até a Denúncia | |
|---|---|
| Variável: decorrencia | |
| Estatística | Valor |
| media | 3.55 |
| mediana | 0.12 |
| desvio | 26.61 |
| variancia | 707.94 |
| q1 | 0.01 |
| q3 | 0.83 |
| minimo | 0.00 |
| maximo | 969.77 |
Observa-se que a mediana do tempo dos atos ordinatórios é muito baixa, cerca de 0,12 dias (aproximadamente 3 horas).
Entretanto, a média é significativamente maior, em torno de 3,5 dias, indicando que existem processos com atos ordinatórios muito longos, que elevam o valor médio. O desvio-padrão também é alto, reforçando que há grande variação entre os processos.
Esses resultados sugerem que é importante analisar mais detalhadamente os atos ordinatórios, especialmente nos processos que apresentam tempos excepcionalmente longos, para entender o que está causando essa discrepância.
Graficamente, a distribuição do tempo dos atos ordinatórios até a denúncia pode ser visualizada da seguinte forma:
ggplot(bdsoma_ordinatorios, aes(x = soma_ordinatorios)) +
geom_histogram(bins = 3000, fill = "#7185cc", color = "white", alpha = 0.7) +
geom_vline(aes(xintercept = mean(soma_ordinatorios)), color = "#c2986f", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 5, y = 750, vjust = -0.5, label = "Média", color = "#c2986f", fontface = "bold", size = 4) +
geom_vline(aes(xintercept = median(soma_ordinatorios)), color = "#c77878ff", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 2, y = 1000, vjust = -0.5, label = "Mediana", color = "#c77878ff", fontface = "bold", size = 4) +
labs(
x = "Tempo do Atos Ordinatórios",
y = "Frequência",
title = "Histograma do Tempo Atos Ordinatórios até a Denúncia"
) +
coord_cartesian(xlim = c(0, 25)) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10))
Como já visto a mediana da participação dos atos ordinatórios é 0,12 dias (aproximadamente 3 horas), enquanto a média é de 3,5 dias. A distribuição apresenta uma cauda longa à direita, evidenciando a presença de processos com atos ordinatórios excepcionalmente longos, que merecem análise detalhada.
Passamos a estudar a participação dos atos ordinatórios no tempo total entre distribuição e recebimento da denúncia.
O objetivo é entender:
- Quanto maior a participação, maior o tempo gasto entre a distribuição e denúncia?
- Como o tempo dos atos ordinatórios se relaciona com o tempo até a denúncia?
Para isso, abaixo apresentamos uma tabela que mostra, para cada processo, a participação dos atos ordinatórios e o tempo total entre distribuição e denúncia.
part_atos_ord <- t_denuncia_unico |>
left_join(bdsoma_ordinatorios, by = "processo") |>
mutate(
soma_ordinatorios = replace_na(soma_ordinatorios, 0),
participacao = (soma_ordinatorios) / deco_denuncia * 100)Agora temos um banco que mostra a participação dos atos ordinatórios no tempo total entre a distribuição e o recebimento da denúncia. Vamos analisar as estatísticas descritivas dessa participação.
# Scatterplot: Participação vs Deco_denúncia
ggplot(part_atos_ord, aes(x = soma_ordinatorios, y = deco_denuncia)) +
geom_point(color = "#7185cc", alpha = 0.6, size = 2) +
geom_smooth(method = "lm", color = "#c2986f", se = FALSE, linetype = "dashed") + # linha de tendência
labs(
x = "Participação dos Atos Ordinatórios (%)",
y = "Tempo até Denúncia (dias)",
title = "Relação entre Participação dos Atos Ordinatórios e Tempo até a Denúncia"
) +
coord_cartesian(xlim = c(0, 25), ylim = c(0, 100)) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
# Correlação entre participação e deco_denuncia
correlation <- cor(part_atos_ord$soma_ordinatorios, part_atos_ord$deco_denuncia, use = "complete.obs")
correlation[1] 0.5247109
Observa-se que há uma relação positiva entre a participação dos atos ordinatórios e o tempo até a denúncia. Ou seja, quanto maior a participação dos atos ordinatórios, maior tende a ser o tempo até a denúncia. Entretanto a correlação não é alta, cerca de 0,52, indicando que outros fatores também influenciam o tempo até a denúncia.
Agora vamos explorar visiualmente se quanto maior a participação dos atos ordinatórios, maior é o tempo total até a denúncia. Primeiramente vamos analisar os processos com soma dos atos ordinatórios > 3 dias.
# Filtrar processos com soma dos atos ordinatórios > 30 dias
part_mais_3 <- part_atos_ord %>%
filter(soma_ordinatorios > 3)
# Histograma da participação
ggplot(part_mais_3, aes(x = participacao )) +
geom_histogram(binwidth = 5, fill = "#7185cc", color = "#7185cc", alpha = 0.4) +
labs(
x = "Participação dos Atos Ordinatórios (%)",
y = "Número de Processos",
title = "Distribuição da Participação dos Atos Ordinatórios (somente >3 dias)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
Observa-se que não há nenhum padrão claro, mostrando que a participação é próxima de uma distribuição uniforme para os processos com soma dos atos ordinatórios maior que 3 dias.
Abaixo mostramos nos processos com soma dos atos ordinatórios entre 1 e 3 dias.
# Filtrar processos com soma dos atos ordinatórios > 30 dias
part_menos_3 <- part_atos_ord %>%
filter(soma_ordinatorios <= 3 & soma_ordinatorios > 1)
# Histograma da participação
ggplot(part_menos_3, aes(x = participacao )) +
geom_histogram(binwidth = 5, fill = "#7185cc", color = "#7185cc", alpha = 0.4) +
labs(
x = "Participação dos Atos Ordinatórios (%)",
y = "Número de Processos",
title = "Distribuição da Participação dos Atos Ordinatórios (somente entre 1 e 3 dias)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
Novamente, observa-se que não há nenhum padrão claro para os processos com soma dos atos ordinatórios entre 1 e 3 dias.
REMESSA
Vamos somar o tempo de cada remessa por processo.
# Filtra somente atos ordinatórios e soma por processo
bdsoma_remessa <- atos_ate_denuncia %>%
filter(cod_movimento == 123) %>% # filtra apenas remessas
group_by(processo) %>% # agrupa por processo
summarise(soma_remessa = sum(decorrencia, na.rm = TRUE))Agora temos um banco com a soma do tempo das remessas para cada processo, desde a distribuição até o recebimento da denúncia. Vamos analisar as estatísticas descritivas dessa variável.
# Estatísticas descritivas para a variável decorrencia_acumulada
tempo_stats_r <- bdsoma_remessa %>%
summarise(
media = mean(soma_remessa, na.rm = TRUE),
mediana = median(soma_remessa, na.rm = TRUE),
desvio = sd(soma_remessa, na.rm = TRUE),
variancia = var(soma_remessa, na.rm = TRUE),
q1 = quantile(soma_remessa, 0.25, na.rm = TRUE),
q3 = quantile(soma_remessa, 0.75, na.rm = TRUE),
minimo = min(soma_remessa, na.rm = TRUE),
maximo = max(soma_remessa, na.rm = TRUE)
) |>
pivot_longer(
cols = everything(),
names_to = "Estatística",
values_to = "Valor"
)
# Tabela GT
tempo_stats_r %>%
gt() %>%
tab_header(
title = "Estatísticas Descritivas — Tempo médios das Remessas até a Denúncia",
subtitle = "Variável: decorrencia"
) %>%
fmt_number(
columns = Valor,
decimals = 2
)| Estatísticas Descritivas — Tempo médios das Remessas até a Denúncia | |
|---|---|
| Variável: decorrencia | |
| Estatística | Valor |
| media | 12.70 |
| mediana | 0.00 |
| desvio | 73.70 |
| variancia | 5,431.73 |
| q1 | 0.00 |
| q3 | 0.11 |
| minimo | 0.00 |
| maximo | 1,009.18 |
Observa-se que a mediana do tempo dos das remessas é muito baixa, em zero 0,00 dias (aproximadamente 3 horas).
Entretanto, a média é significativamente maior, em torno de 12,76 dias, indicando que existem processos com remessas muito longos, que elevam o valor médio. O desvio-padrão também é alto, reforçando que há grande variação entre os processos.
Graficamente, a distribuição do tempo dos atos ordinatórios até a denúncia pode ser visualizada da seguinte forma:
ggplot(bdsoma_remessa, aes(x = soma_remessa)) +
geom_histogram(bins = 3000, fill = "#7185cc", color = "white", alpha = 0.7) +
geom_vline(aes(xintercept = mean(soma_remessa)), color = "#c2986f", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 5, y = 750, vjust = -0.5, label = "Média", color = "#c2986f", fontface = "bold", size = 4) +
geom_vline(aes(xintercept = median(soma_remessa)), color = "#c77878ff", size = 1, alpha = 0.7,linetype = "dashed") +
annotate("text", x = 2, y = 1000, vjust = -0.5, label = "Mediana", color = "#c77878ff", fontface = "bold", size = 4) +
labs(
x = "Tempo do Atos Ordinatórios",
y = "Frequência",
title = "Histograma do Tempo Atos Ordinatórios até a Denúncia"
) +
coord_cartesian(xlim = c(0, 25)) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10))
Como já visto a mediana da participação dos atos ordinatórios é 0,12 dias (aproximadamente 3 horas), enquanto a média é de 3,5 dias. A distribuição apresenta uma cauda longa à direita, evidenciando a presença de processos com atos ordinatórios excepcionalmente longos, que merecem análise detalhada.
Passamos a estudar a participação dos atos ordinatórios no tempo total entre distribuição e recebimento da denúncia.
O objetivo é entender:
- Quanto maior a participação, maior o tempo gasto entre a distribuição e denúncia?
- Como o tempo dos atos ordinatórios se relaciona com o tempo até a denúncia?
Para isso, abaixo apresentamos uma tabela que mostra, para cada processo, a participação dos atos ordinatórios e o tempo total entre distribuição e denúncia.
part_remessa_ord <- part_atos_ord |>
left_join(bdsoma_remessa, by = "processo") |>
mutate(
soma_remessa = replace_na(soma_remessa, 0),
part_remessa = (soma_remessa) / deco_denuncia * 100)part_remessa_ord$soma_remessa[is.na(part_remessa_ord$soma_remessa)] <- 0
part_remessa_ord$part_remessa[is.na(part_remessa_ord$part_remessa)] <- 0Agora temos um banco que mostra a participação dos atos ordinatórios no tempo total entre a distribuição e o recebimento da denúncia. Vamos analisar as estatísticas descritivas dessa participação.
# Scatterplot: Participação vs Deco_denúncia
ggplot(part_remessa_ord, aes(x = soma_remessa, y = deco_denuncia)) +
geom_point(color = "#7185cc", alpha = 0.6, size = 2) +
geom_smooth(method = "lm", color = "#c2986f", se = FALSE, linetype = "dashed") + # linha de tendência
labs(
x = "Participação dos Atos Ordinatórios (%)",
y = "Tempo até Denúncia (dias)",
title = "Relação entre Participação dos Atos Ordinatórios e Tempo até a Denúncia"
) +
coord_cartesian(xlim = c(0, 25), ylim = c(0, 100)) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
# Correlação entre participação e deco_denuncia
correlation <- cor(part_remessa_ord$soma_remessa, part_remessa_ord$deco_denuncia, use = "complete.obs")
correlation[1] 0.3784582
Observa-se que há uma relação positiva entre a participação das remessas e o tempo até a denúncia. Ou seja, quanto maior a participação dos atos ordinatórios, maior tende a ser o tempo até a denúncia. Entretanto a correlação não é alta, cerca de 0,37, indicando que outros fatores também influenciam o tempo até a denúncia.
Agora vamos explorar visiualmente se quanto maior a participação dos atos ordinatórios, maior é o tempo total até a denúncia. Primeiramente vamos analisar os processos com soma dos remessas > 5 dias.
# Filtrar processos com soma dos atos ordinatórios > 30 dias
part_mais_3_r <- part_remessa_ord %>%
filter(soma_remessa > 10)
# Histograma da participação
ggplot(part_mais_3_r, aes(x = part_remessa )) +
geom_histogram(binwidth = 5, fill = "#7185cc", color = "#7185cc", alpha = 0.4) +
labs(
x = "Participação dos Atos Ordinatórios (%)",
y = "Número de Processos",
title = "Distribuição da Participação dos Atos Ordinatórios (somente >3 dias)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
Observa-se que não há nenhum padrão claro, mostrando que a participação é próxima de uma distribuição uniforme para os processos com soma dos atos ordinatórios maior que 3 dias.
Abaixo mostramos nos processos com soma dos atos ordinatórios entre 2 e 10 dias.
# Filtrar processos com soma dos atos ordinatórios
part_menos_10_r <- part_remessa_ord %>%
filter(soma_remessa <= 10 & soma_remessa > 2)
# Histograma da participação
ggplot(part_menos_10_r, aes(x = participacao )) +
geom_histogram(binwidth = 5, fill = "#7185cc", color = "#7185cc", alpha = 0.4) +
labs(
x = "Participação dos Atos Ordinatórios (%)",
y = "Número de Processos",
title = "Distribuição da Participação dos Atos Ordinatórios (somente entre 1 e 3 dias)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 10)
)
Vamos analisar juntos os Atos Ordinatórios e as Remessas para entender melhor o que está acontecendo nesses processos que apresentam tempos longos entre a distribuição e o recebimento da denúncia.
contagens <- atos_ate_denuncia |>
summarise(
n_remessa = sum(cod_movimento == 123),
n_ordinatorio = sum(cod_movimento == 11383),
.by = processo
)
part_remessa_ord <- part_remessa_ord |>
left_join(contagens, by = "processo")
dados_q <- part_remessa_ord |>
mutate(
quantil_tempo = ntile(deco_denuncia, 4) # cria Q1..Q4
)
resumo_quantil <- dados_q |>
summarise(
media_tempo_total = mean(deco_denuncia, na.rm = TRUE),
media_soma_remessa = mean(soma_remessa, na.rm = TRUE),
media_soma_ordinatorio = mean(soma_ordinatorios, na.rm = TRUE),
media_n_remessa = mean(n_remessa, na.rm = TRUE),
media_n_ordinatorio = mean(n_ordinatorio, na.rm = TRUE),
.by = quantil_tempo
)
resumo_quantil |>
arrange(quantil_tempo) |>
gt() |>
tab_header(
title = "Processos mais longos têm mais remessas e atos ordinatórios?"
) |>
fmt_number(
columns = where(is.numeric),
decimals = 2
) |>
cols_label(
quantil_tempo = "Quantil Tempo",
media_tempo_total = "Tempo Denúncia (média)",
media_soma_remessa = "Tempo Remessa (média)",
media_soma_ordinatorio = "Tempo Atos Ordin. (média)",
media_n_remessa = "Nº de Remessas (média)",
media_n_ordinatorio = "Nº de Atos Ordin. (média)"
)