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:

  1. 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")