Estrutura básica

O forcats é um pacote bastante simples. Ele é composto por funções de apenas dois tipos:

fator_1 <- factor(c("a","b","c"))
fator_2 <- factor(c("d","e"))

fator_3_sem_sentido <- c(fator_1, fator_2)

fator_3_sem_sentido

fator_3_com_sentido <- forcats::fct_c(fator_1, fator_2)

fator_3_com_sentido
fator <- factor(c("a","b","c"))

novos_niveis <- c("c", "b", "a")

fator <- forcats::lvls_revalue(fator, novos_niveis)

Principais funções

Nesta seção, vamos estudar o funcionamento das principais funções do forcats utilizando como motivação a visualização dos dados de uma base analisada pela Associação Brasileira de Jurimetria. A base foi simplificada para otimizar seu uso neste curso. Além disso, os dados passaram por um processo de anonimização, pois os resultados ainda não foram divulgados.

A base contém informações sobre uma amostra de vítimas de homicídios no município de São Paulo e é composta pelas seguintes variáveis:

Modificar níveis de fatores

A tabela abaixo ilustra a distribuição dos valores da variável instrumento.usado.

bd_enasp_abj %>% 
  count(instrumento.usado) %>% 
  arrange(desc(n)) %>% 
  rename(`Frequência` = n) %>% 
  knitr::kable(digits = 0)

Como existe uma grande variabilidade de instrumentos, vamos reclassificar a variável instrumento.usado em um fator com níveis menos gerais.

Para realizar essa tarefa, vamos utilizar a função fct_collapse e a função fct_lump. A função fct_collapse é uma generalização de uma outra função chamada fct_recode. A função fct_collapse recebe um fator e uma série nomeada de vetores de strings, enquanto a função fct_recode recebe um fator e uma série de strings nomeadas. Já a função fct_lump transforma os níveis menos frequentes de um fator em um nível "Outros".

Abaixo exemplificamos a utilização das três funções mencionadas no parágrafo anterior:

fator <- factor(c("a","a","a","b","b", "c", "d", "e"))

fct_collapse(fator, b2 = c("b", "c"), a2 = c("a", "d"))
fct_recode(fator, b2 = "b", b2 = "c", a2 = "a", a2 = "d")

fct_lump(fator, 2, other_level = "Outros")

Voltando à nossa aplicação, vamos utilizar a função fct_collapse para recodificar a variável instrumento.usado. Após essa reclassificação, os níveis com poucas contagens serão convertidos em "Outros" por meio da função fct_lump:

bd_enasp_abj <- bd_enasp_abj %>% 
  mutate(instrumento.usado = fct_collapse(instrumento.usado,
    `Arma branca` = c("Faca", "Fio elétrico", "Fio elétrico (vítima foi estrangulada)", "Fogo"),
    `Arma de Fogo` = c("Pistola", "Revólver", "Arma de fogo","38")),
    instrumento.usado = fct_lump(instrumento.usado, 2, other_level = "Outros"))

Após a reclassificação a distribuição fica:

bd_enasp_abj %>% 
  count(instrumento.usado) %>% 
  knitr::kable()

Reordenar níveis de fatores

Vamos visualizar a tabela anterior como um gráfico.

bd_enasp_abj %>% 
  ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + 
  geom_bar() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Frequência") + 
  theme(legend.position = 'none')

A ordem das barras nesse gráfico não está muito intuitiva, pois uma arma de fogo é um instrumento de crime mais perigoso do que uma arma branca, mas o eixo das abscissas não transmite essa informação.

Alterar a relação de ordem entre os níveis de um fator pode ser feito de duas maneiras:

bd_teste <- bd_enasp_abj

levels(bd_teste$instrumento.usado) <- c("Outros", "Arma branca", "Arma de Fogo")

bd_teste %>% 
  ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + 
  geom_bar() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Frequência") + 
  theme(legend.position = 'none')

Mudar diretamente os níveis também mudou as labels impressas! Mesmo que os níveis do novo fator bd_teste$instrumento.usado estejam na ordem correta, os rótulos também foram alterados.

O problema da reordenação pode ser resolvido conforme ilustrado no código abaixo:

bd_teste <- bd_enasp_abj

novos_niveis <- c("Outros", "Arma branca", "Arma de Fogo")

bd_teste$instrumento.usado <- factor(bd_teste$instrumento.usado, novos_niveis)

bd_teste %>% 
  ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + 
  geom_bar() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Frequência") + 
  theme(legend.position = 'none')

No forcats, a reordenação equivalente a criar o fator novamente pode ser feita de três maneiras:

fator <- factor(letters)

#altera a ordem dos fatores de crescente para decrescente
lvls_reorder(fator, length(letters):1)
fator <- factor(c("a","a","a","b","b","c"))
vetor <- c(1,2,3,1,1,1.2)

#ordena os níveis de acordo com a média da variável vetor em cada nível
fct_reorder(fator, vetor, fun = mean)
fator <- factor(c("a","a","a","b","b","c"))

#"puxa" os níveis "b" e "c" para o começo
fct_relevel(fator, "b","c")

Na nossa aplicação, podemos utilizar tanto a função lvls_reorder quanto a função fct_relevel. O gráfico resultante ordena os níveis de instrumento.usado como queríamos.

bd_enasp_abj %>%
  mutate(instrumento.usado = lvls_reorder(instrumento.usado, c(3, 2, 1))) %>% 
  ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + 
  geom_bar() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Frequência") + 
  theme(legend.position = 'none')

Fazendo tudo de uma vez

Nesta sessão, vamos utilizar as funções para exemplificar utilizações do pacote forcats para visualizações.

A visualização abaixo ordena os níveis de "instrumento.usado" de acordo com a mediana da idade das vítimas de homicídio.

bd_enasp_abj %>%
  mutate(instrumento.usado = fct_reorder(instrumento.usado, `idade.vítima`, fun = median)) %>% 
  ggplot(aes(x = instrumento.usado, y = `idade.vítima`, fill = instrumento.usado)) + 
  geom_boxplot() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Idade") + 
  theme(legend.position = 'none')

A visualização abaixo exemplifica um caso em que a ordem dos facets foi invertida reordenando o fator sexo.vítima.

bd_enasp_abj %>%
  mutate(instrumento.usado = fct_reorder(instrumento.usado, `idade.vítima`, fun = median),
         `sexo.vítima` = fct_recode(`sexo.vítima`, Homem = "M", Mulher = "F")) %>% 
  ggplot(aes(x = instrumento.usado, y = `idade.vítima`, fill = instrumento.usado)) + 
  geom_boxplot() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Idade") + 
  facet_wrap(~`sexo.vítima`) +
  theme(legend.position = 'none')
bd_enasp_abj %>%
  mutate(instrumento.usado = fct_reorder(instrumento.usado, `idade.vítima`, fun = median),
         `sexo.vítima` = fct_recode(`sexo.vítima`, Homem = "M", Mulher = "F"),
         `sexo.vítima` = fct_relevel(`sexo.vítima`, "Homem", "Mulher")) %>% 
  ggplot(aes(x = instrumento.usado, y = `idade.vítima`, fill = instrumento.usado)) + 
  geom_boxplot() +
  theme_bw(15) +
  xlab("Intrumento usado") + 
  ylab("Idade") + 
  facet_wrap(~`sexo.vítima`) +
  theme(legend.position = 'none')


curso-r/pu.forcats documentation built on May 14, 2019, 12:52 p.m.