Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

texto patocracia #6

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
211 changes: 211 additions & 0 deletions _posts/2020-12-23-patocracia/calcular_proporcoes.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
library(magrittr)

# tjsp candidatos ---------------------------------------------------------

da_tjsp_raw <- readr::read_rds(
"~/Downloads/patocracia/Candidatos 2020/candidatos2020_reus.rds"
)

classes_consideradas <- c(
"Ação Penal - Procedimento Ordinário",
"Ação Penal - Procedimento Sumário",
"Ação Penal - Procedimento Sumaríssimo",
"Ação Penal de Competência do Júri"
)

da_tjsp <- da_tjsp_raw %>%
dplyr::mutate(ano_processo = stringr::str_sub(id_processo, 12, 15)) %>%
dplyr::filter(
classe %in% classes_consideradas,
!stringr::str_detect(distribuicao, "Juizado"),
ano_processo %in% c(2014:2019)
) %>%
dplyr::select(id_processo, cpf_candidato, assunto)

# candidatos --------------------------------------------------------------
da_cand_raw <- vroom::vroom(
"~/Downloads/patocracia/consulta_cand_2020/consulta_cand_2020_SP.csv",
locale = vroom::locale(encoding = "latin1")
) %>% janitor::clean_names()

sit_eleito <- c(c("ELEITO", "ELEITO POR MÉDIA", "ELEITO POR QP"))
da_cand <- da_cand_raw %>%
dplyr::mutate(eleito = dplyr::case_when(
ds_sit_tot_turno %in% sit_eleito ~ "Sim",
TRUE ~ "Não"
)) %>%
dplyr::select(nr_turno, ds_cargo, ds_genero, nr_cpf_candidato, eleito) %>%
dplyr::mutate(tem_processo = dplyr::case_when(
nr_cpf_candidato %in% unique(da_tjsp$cpf_candidato) ~ "Sim",
TRUE ~ "Não"
)) %>%
dplyr::distinct(nr_cpf_candidato, .keep_all = TRUE)

da_tjsp_eleitos <- da_tjsp %>%
dplyr::semi_join(
dplyr::filter(da_cand, eleito == "Sim"),
c("cpf_candidato" = "nr_cpf_candidato")
)

da_tjsp_join <- da_tjsp %>%
dplyr::left_join(da_cand, c("cpf_candidato" = "nr_cpf_candidato")) %>%
dplyr::mutate(assunto = abjutils::rm_accent(toupper(assunto))) %>%
dplyr::count(assunto, eleito, name = "value") %>%
dplyr::mutate(name = dplyr::if_else(
eleito == "Sim", "nproc_eleito", "nproc_neleito"
)) %>%
dplyr::select(-eleito) %>%
tidyr::pivot_wider(values_fill = 0) %>%
dplyr::mutate(nproc_total = nproc_neleito + nproc_eleito) %>%
dplyr::select(-nproc_neleito)

# seade -------------------------------------------------------------------

aux_seade <- readr::read_csv2(
"~/Downloads/patocracia/Projpop/tb_dados.txt",
locale = readr::locale(encoding = "latin1"),
guess_max = 2e4
)

populacao_elegivel <- aux_seade %>%
dplyr::filter(!is.na(mun_id)) %>%
dplyr::group_by(ano) %>%
dplyr::summarise(dplyr::across(FH1:DOM, sum), .groups = "drop") %>%
tidyr::pivot_longer(FH1:DOM) %>%
dplyr::filter(
stringr::str_detect(name, "FH|FM"),
ano == "2020",
!stringr::str_detect(name, "F[HM][1-4]$")
) %>%
dplyr::mutate(sexo = stringr::str_sub(name, 2, 2)) %>%
# dplyr::group_by(sexo) %>%
dplyr::summarise(v = sum(value))


# painel cnj - assunto ----------------------------------------------------

# da_assunto <- fs::dir_ls("~/Downloads/patocracia/tjsp_assunto") %>%
# purrr::map_dfr(readxl::read_excel, col_types = "text", .id = "ano", na = "-") %>%
# janitor::clean_names() %>%
# dplyr::mutate(
# ano = basename(tools::file_path_sans_ext(ano)),
# ano = as.character(readr::parse_number(ano))
# ) %>%
# dplyr::filter(assunto_nome1 %in% c("DIREITO PENAL")) %>%
# dplyr::select(
# ano,
# dplyr::starts_with("assunto_nome"),
# x1o_grau, juizado_especial
# ) %>%
# dplyr::mutate(
# dplyr::across(x1o_grau:juizado_especial, as.numeric),
# dplyr::across(x1o_grau:juizado_especial, tidyr::replace_na, 0),
# total_cnj = x1o_grau
# ) %>%
# dplyr::select(-x1o_grau, -juizado_especial) %>%
# tibble::rowid_to_column()
#
# total_assuntos <- da_assunto %>%
# dplyr::select(-assunto_nome1, -assunto_nome2) %>%
# tidyr::pivot_longer(dplyr::starts_with("assunto_"), values_to = "assunto") %>%
# dplyr::filter(!is.na(assunto)) %>%
# dplyr::mutate(assunto = abjutils::rm_accent(toupper(assunto))) %>%
# dplyr::group_by(rowid, name, assunto) %>%
# dplyr::summarise(total_cnj = sum(total_cnj), .groups = "drop") %>%
# dplyr::inner_join(da_tjsp_join, "assunto") %>%
# dplyr::arrange(dplyr::desc(name)) %>%
# dplyr::distinct(rowid, .keep_all = TRUE) %>%
# dplyr::group_by(assunto) %>%
# dplyr::summarise(
# total_cnj = sum(total_cnj),
# dplyr::across(c(nproc_eleito, nproc_total), dplyr::first)
# ) %>%
# dplyr::mutate(
# pop = populacao_elegivel$v,
# pop_cand = nrow(da_cand)
# ) %>%
# dplyr::arrange(dplyr::desc(nproc_total))
#

# assuntos direto do TJSP -------------------------------------------------

assuntos_tjsp <- esaj::cjpg_table("subjects")
classes_tjsp <- esaj::cjpg_table("classes")
assuntos_tjsp_penal <- assuntos_tjsp %>%
dplyr::filter(name0 == "DIREITO PENAL") %>%
tibble::rowid_to_column()

assuntos_tjsp_penal_empilhado <- purrr::map_dfr(
as.character(0:5), ~{
dplyr::select(assuntos_tjsp_penal, rowid, dplyr::ends_with(.x)) %>%
purrr::set_names(c("rowid", "name", "id")) %>%
dplyr::mutate(nivel = .x)
}
) %>%
dplyr::mutate(assunto = toupper(abjutils::rm_accent(name))) %>%
dplyr::inner_join(da_tjsp_join, "assunto") %>%
dplyr::arrange(dplyr::desc(nivel)) %>%
dplyr::distinct(id, assunto, .keep_all = TRUE) %>%
dplyr::select(assunto, id, dplyr::starts_with("nproc"))

tjsp_res_assunto_ano <- function(ano, assunto) {
query_post <- list(
conversationId = "",
dadosConsulta.pesquisaLivre = "",
tipoNumero = "UNIFICADO",
numeroDigitoAnoUnificado = "",
foroNumeroUnificado = "",
dadosConsulta.nuProcesso = "",
# classes de interesse
classeTreeSelection.values = "8657,8803,8804,8656",
assuntoTreeSelection.values = assunto,
contadoragente = 0,
contadorMaioragente = 0,
dadosConsulta.dtInicio = paste0("01/01/", ano),
dadosConsulta.dtFim = paste0("31/12/", ano),
varasTreeSelection.values = "",
dadosConsulta.ordenacao = "DESC"
)
r <- httr::POST(
"https://esaj.tjsp.jus.br/cjpg/pesquisar.do",
body = query_post, httr::config(ssl_verifypeer = FALSE)
)
n_results <- r %>%
xml2::read_html() %>%
xml2::xml_find_all("//*[@id='resultados']/table[1]") %>%
xml2::xml_text() %>%
stringr::str_extract_all(" [0-9]+") %>%
purrr::pluck(1) %>%
stringr::str_trim() %>%
as.numeric() %>%
dplyr::last()
n_results
}

tjsp_res_assunto <- function(assunto) {
message(assunto)
purrr::map_dbl(2014:2019, tjsp_res_assunto_ano, assunto) %>%
sum(na.rm = TRUE)
}

# DEMORA
assuntos_tjsp_esaj <- assuntos_tjsp_penal_empilhado %>%
dplyr::mutate(n_esaj = purrr::map_dbl(id, tjsp_res_assunto))

assuntos_tjsp_esaj_filter <- assuntos_tjsp_esaj %>%
dplyr::filter(n_esaj > 0) %>%
dplyr::distinct(assunto, .keep_all = TRUE) %>%
dplyr::mutate(
pop = populacao_elegivel$v,
pop_cand = nrow(da_cand)
)

# resultados --------------------------------------------------------------

# prop_geral <- scales::percent(total_classe / populacao_elegivel, .001)
# prop_cand <- da_cand %>%
# with(scales::percent(mean(tem_processo == "Sim"), .001))
# prop_cand_eleito <- da_cand %>%
# dplyr::filter(eleito == "Sim") %>%
# with(scales::percent(mean(tem_processo == "Sim"), .001))

Binary file added _posts/2020-12-23-patocracia/da_cand.rds
Binary file not shown.
140 changes: 140 additions & 0 deletions _posts/2020-12-23-patocracia/patocracia.Rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
---
title: "Patocracia"
description: |
Preliminar.
author:
- name: Julio Trecenti
url: https://twitter.com/jtrecenti
- name: Marcelo Guedes Nunes
date: 12-23-2020
output:
distill::distill_article:
self_contained: false
---


```{r setup, include=FALSE}
knitr::opts_chunk$set(
echo = FALSE
)
library(magrittr, include.only = "%>%")
da_cand <- readr::read_rds("da_cand.rds")
assuntos_tjsp_esaj_filter <- readr::read_rds("assuntos_tjsp_esaj_filter.rds")
```

A presente análise busca identificar se políticos são mais propensos a figurarem em processos criminais em São Paulo. Além disso, investigamos se os candidatos com mais processos têm maior probabilidade de vencer as eleições, além da relação entre os crimes mais comuns e as condenações que geram inelegebilidade.

Para verificar se candidatos têm mais processos criminais que a população geral, precisamos calcular a proporção de pessoas que possuem processos na base de candidatos e na população geral.

A base de candidatos foi obtida do TSE. Os CPFs dos candidatos foram pesquisados na consulta processual do TJSP. Variáveis indicadoras foram criadas para identificar se o candidato tem processo e se foi eleito. Para permitir a comparabilidade com os dados da população geral, consideramos nesse levantamento apenas processos distribuídos entre 2014 e 2019 e as classes processuais abaixo.

- Ação Penal - Procedimento Ordinário
- Ação Penal - Procedimento Sumário
- Ação Penal - Procedimento Sumaríssimo
- Ação Penal de Competência do Júri

## Análise 1: eleitos contra não eleitos

A Tabela \@ref(tab:eleitos) mostra a proporção de candidados eleitos e não eleitos com processos criminais no TJSP. Pela tabela, é possível notar que a proporção de processos judiciais dentre os eleitos é quase o dobro do que candidatos que não foram eleitos.

```{r eleitos}
# da_cand %>%
# dplyr::select(-nr_cpf_candidato) %>%
# readr::write_rds("da_cand.rds", compress = "xz")
da_cand %>%
dplyr::bind_rows(dplyr::mutate(da_cand, eleito = "Total")) %>%
dplyr::count(eleito, tem_processo) %>%
dplyr::group_by(eleito) %>%
dplyr::mutate(
ntot = sum(n),
p = n/ntot,
c1 = pmax(p - qnorm(.975) * sqrt(p*(1-p)/ntot), 0),
c2 = p + qnorm(.975) * sqrt(p*(1-p)/ntot),
dplyr::across(c(p, c1, c2), scales::percent, .01)
) %>%
dplyr::filter(tem_processo == "Sim") %>%
dplyr::transmute(
eleito, ntot,
pct = stringr::str_glue("{p} ({c1}-{c2})")
) %>%
dplyr::ungroup() %>%
purrr::set_names(
c("Eleito", "N Candidatos", "% processo")
) %>%
knitr::kable(caption = "Proporção de processos em candidatos eleitos e não eleitos.")
```

## Análise 2: homens e mulheres

A Tabela \@ref(tab:eleitos-sexo) mostra a proporção de candidados com processos criminais no TJSP, separando por sexo. Pela tabela, é possível notar que a proporção de processos judiciais dentre os homens é de quatro vezes a quantidade de processos dentre as mulheres.

```{r eleitos-sexo}
da_cand %>%
dplyr::bind_rows(dplyr::mutate(da_cand, ds_genero = "Total")) %>%
dplyr::count(ds_genero, tem_processo) %>%
dplyr::group_by(ds_genero) %>%
dplyr::mutate(
ntot = sum(n),
p = n/ntot,
c1 = pmax(p - qnorm(.975) * sqrt(p*(1-p)/ntot), 0),
c2 = p + qnorm(.975) * sqrt(p*(1-p)/ntot),
dplyr::across(c(p, c1, c2), scales::percent, .01)
) %>%
dplyr::filter(tem_processo == "Sim") %>%
dplyr::ungroup() %>%
dplyr::transmute(
sexo = dplyr::case_when(
ds_genero == "MASCULINO" ~ "Masculino",
ds_genero == "FEMININO" ~ "Feminino",
TRUE ~ "Total"
),
ntot,
pct = stringr::str_glue("{p} ({c1}-{c2})")
) %>%
purrr::set_names(
c("Sexo", "N Candidatos", "% processo")
) %>%
knitr::kable(caption = "Proporção de processos em candidatos eleitos e não eleitos.")
```

## Análise 3: Comparação com a população

Para comparar com a população, precisamos obter mais duas bases de dados

- Quantidade de processos por assunto no TJSP, obtida da consulta de julgados de primeiro grau do TJSP. Infelizmente o painel do Justiça em Números é muito inconsistente, e não existe uma maneira fácil de descobrir quantos casos novos temos por assunto. Por isso usamos as sentenças.
- População em 2020 de pessoas com 20 anos ou mais, a partir dos dados da Fundação Seade.

No total, temos `r sum(assuntos_tjsp_esaj_filter$n_esaj)` sentenças entre 2014 e 2019, considerando os mesmos assuntos que aparecem na base dos candidatos. Dividindo pela população, temos uma taxa de `r scales::percent(sum(assuntos_tjsp_esaj_filter$n_esaj) / assuntos_tjsp_esaj_filter$pop[1], .001)`, quase 5 vezes a taxa observada para os candidatos.

Ao quebrar a taxa por assuntos, temos os resultados da Tabela \@ref(tab:esaj-assuntos). Mostramos apenas os casos que têm 10 ou mais processos envolvendo os candidatos. É possível notar que a proporção na população geral é maior que a proporção de pessoas candidatas quando o assunto não é relacionado a cargos públicos, e menor quanto o assunto é relacionado a cargos públicos. O mesmo resultado é observado considerando apenas pessoas eleitas, mas a tabela foi omitida por conta da pequena quantidade de observações.

```{r esaj-assuntos}
assuntos_tjsp_esaj_filter %>%
dplyr::filter(nproc_total >= 10) %>%
dplyr::transmute(
assunto,
sentencas = n_esaj,
sentencas_pop = sentencas / pop * 1e5,
processos = nproc_total,
processos_pop = processos / pop_cand * 1e5,
razao = sentencas_pop / processos_pop
) %>%
dplyr::arrange(dplyr::desc(processos)) %>%
purrr::set_names(c(
"Assunto",
"Sentenças", "Sentenças/10M pop",
"Processos", "Processos/10M cand",
"Razão das taxas"
)) %>%
knitr::kable(caption = "Processos e taxas populacionais por assunto.", digits = 2)
```

## Conclusões preliminares

- Candidatas mulheres têm menor proporção de processos.
- Pessoas eleitas têm maior proporção de processos.
- Pessoas candidatas têm menor proporção de processos que a população em geral para assuntos não relacionados a cargos públicos. Já em assuntos relacionados a cargos públicos, a proporção de processos é maior.

Pela análise realizada, temos que a proporção de pessoas em geral com processos criminais é maior do que a proporção de pessoas candidatas com processos criminais, seja esse candidato eleito ou não. Isso de certa forma refutaria a hipótese da patocracia, pelo menos nessa análise preliminar.

Para futuras análises, uma sugestão seria considerar uma amostra de pessoas, com verificação manual dos processos, para permitir o controle pela renda. Dessa forma, será possível identificar se pessoas candidatas ricos estão em mais processos criminais do que pessoas comuns ricas, por exemplo.
Loading