5.2 Finalizando análise das câmaras
Agora vamos fazer gráficos!
5.2.1 Como se distribuem os assuntos em cada câmara?
Gráfico fraqueza:
d_cjsg %>%
separate(class_subject, c('classe', 'assunto'),
sep = ' / ', extra = 'merge', fill = 'right') %>%
ggplot(aes(x = court, fill = assunto)) +
geom_bar(colour = 'black', position = "fill", show.legend = FALSE)
Gráfico bacana:
d_cjsg %>%
## transformacao -------------------------------------------------------------
# tirar NA (não tem problema pois são aqueles casos que não existem)
filter(!is.na(court)) %>%
separate(class_subject, c('classe', 'assunto'), sep = ' / ',
extra = 'merge', fill = 'right') %>%
# categorizar os assuntos e mudar a ordem
mutate(assunto = assunto %>%
str_wrap(19) %>%
fct_infreq() %>% # ordena o factor decrescente
fct_rev() %>%
fct_lump(n = 11, other_level = "Outros")) %>%
# pega somente os números das câmaras e coloca zeros à esquerda
mutate(num = parse_number(court),
num = str_pad(num, 2, pad = "0")) %>%
# grafico --------------------------------------------------------------------
ggplot(aes(x = num, fill = assunto)) +
geom_bar(colour = 'black', position = "fill") +
guides(fill = guide_legend(reverse = TRUE)) +
# coisas cosméticas
theme_minimal(14) +
scale_y_continuous(labels = scales::percent) +
labs(x = 'Órgão julgador',
y = 'Proporção de \nprocessos por assunto',
fill = "") +
theme(legend.position = "bottom")
5.2.2 Quantas decisões proferidas por semana?
O segundo mostra a proporção de decisões antes e depois da virada do ano.
Primeiro, vamos montar a função que classifica as decisões (da aula passada)
# essa é a classificação final
negaram <- regex('negara?m|nega-se|negam-se', ignore_case = TRUE)
parcial <- regex('parcial', ignore_case = TRUE)
deram <- regex('deram|mantiv|dá-se|nul|conhec', ignore_case = TRUE)
extinto <- regex('extin', ignore_case = TRUE)
tipos_decisao <- function(decisoes) {
case_when(
str_detect(decisoes, negaram) ~ 'negado',
str_detect(decisoes, parcial) ~ 'parcial',
str_detect(decisoes, deram) ~ 'provido',
str_detect(decisoes, extinto) ~ 'extinto',
TRUE ~ "outros")
}
Agora, vamos pegar apenas os casos em que as pessoas entraram com recursos de apelação contra o Ministério Público.
partes_apelacoes <- d_cposg %>%
select(id, id_lawsuit, parts) %>%
unnest(parts) %>%
filter(part == 'Apelado', str_detect(name, '[Mm]inist')) %>%
# Exercício: por que usamos distinct aqui?
distinct(id_lawsuit)
Agora, montamos a base de decisões
d_decisoes <- d_cposg %>%
select(id, id_lawsuit, decisions) %>%
unnest(decisions) %>%
# Exercício: o que faz semi_join()?
semi_join(partes_apelacoes, "id_lawsuit") %>%
arrange(desc(date)) %>%
group_by(id_lawsuit) %>%
# Exercício: o que faz slice()?
slice(1) %>%
ungroup()
# write_rds(d_decisoes, glue("{path}/d_decisoes.rds"), compress = "bz2")
decisoes <- d_decisoes %>%
mutate(tipo_decisao = tipos_decisao(decision)) %>%
select(id_lawsuit, tipo_decisao)
Agora vamos juntar d_cjsg
com a base de decisoes
para fazer o gráfico.
decisoes_semana <- d_cjsg %>%
inner_join(decisoes, 'id_lawsuit') %>%
mutate(data = dmy(dt_registration)) %>%
arrange(desc(data)) %>%
distinct(id_lawsuit, .keep_all = TRUE) %>%
mutate(semana = floor_date(data, 'week')) %>%
# o que faz between()?
filter(between(semana, as.Date("2017-10-01"), as.Date("2018-01-18")))
Gráfico fraqueza:
decisoes_semana %>%
count(semana, tipo_decisao) %>%
ggplot(aes(x = semana, y = n, colour = tipo_decisao)) +
geom_line()
Exercício:
- Qual o problema principal desse gráfico?
Para resolver esse problema, podemos utilizar a função complete()
decisoes_semana %>%
count(semana, tipo_decisao) %>%
complete(semana, tipo_decisao)
Mas ainda temos datas em que não houve nenhuma decisão! Para resolver isso, precisamos de full_seq()
decisoes_semana %>%
count(semana, tipo_decisao) %>%
complete(semana = full_seq(semana, 7), tipo_decisao, fill = list(n = 0))
Gráfico bacana:
decisoes_semana %>%
# mudar ordem
mutate(tipo_decisao = fct_infreq(tipo_decisao)) %>%
count(semana, tipo_decisao) %>%
# completar com zeros
complete(semana = full_seq(semana, 7), tipo_decisao, fill = list(n = 0)) %>%
# gráfico
ggplot(aes(x = semana, y = n, colour = tipo_decisao)) +
geom_line() +
# perfumaria
labs(x = "Semana", y = "Quantidade de decisões", colour = "Decisão") +
scale_x_date(breaks = scales::date_breaks("1 week"),
labels = scales::date_format("%b %d")) +
theme_minimal(16)
5.2.3 Qual a proporção de decisões por câmara?
Gráfico fraqueza:
d_cjsg %>%
distinct(id_lawsuit, .keep_all = TRUE) %>%
inner_join(decisoes, 'id_lawsuit') %>%
ggplot(aes(x = court, fill = tipo_decisao)) +
geom_bar(position = "fill")
Gráfico bacana:
prop_negados <- function(x) {
sum(x == "negado") / length(x)
}
d_cjsg %>%
distinct(id_lawsuit, .keep_all = TRUE) %>%
inner_join(decisoes, 'id_lawsuit') %>%
mutate(num = court %>%
parse_number() %>%
str_pad(width = 2, pad = "0") %>%
fct_reorder(tipo_decisao, prop_negados) %>%
fct_rev()) %>%
mutate(tipo_decisao = fct_infreq(tipo_decisao) %>% fct_rev()) %>%
# grafico
ggplot(aes(x = num, fill = tipo_decisao)) +
geom_bar(colour = 'black', position = 'fill', size = .3) +
geom_hline(yintercept = 1:4 / 4, linetype = 2, alpha = .4) +
scale_y_continuous(labels = scales::percent) +
coord_flip() +
# perfumaria
guides(fill = guide_legend(reverse = TRUE)) +
theme_minimal(16) +
theme(legend.position = "bottom") +
labs(x = "Câmara",
y = 'Proporção de processos por tipo de decisão',
fill = "Decisão")