atividade = read_projectdata()

Temos bastante NA

Quando um parlamentar não tem conta no twitter, o valor da coluna twitter é NA, Not Available. Quando você estiver interessado apenas em quem tem twitter, é preciso filtrá-los.

atividade %>% 
  filter(!is.na(twitter))
## # A tibble: 549 x 19
##    id_parlamentar casa  nome_eleitoral partido UF    twitter seguidores
##    <chr>          <chr> <chr>          <chr>   <chr> <chr>        <dbl>
##  1 204554         câma… ABÍLIO SANTANA PR      BA    Abilio…         NA
##  2 204521         câma… ABOU ANNI      PSL     SP    abouan…         NA
##  3 204379         câma… ACÁCIO FAVACHO PROS    AP    Favach…         NA
##  4 204560         câma… ADOLFO VIANA   PSDB    BA    Adolfo…         NA
##  5 204528         câma… ADRIANA VENTU… NOVO    SP    adrian…       4652
##  6 121948         câma… ADRIANO DO BA… PP      GO    Adrian…         NA
##  7 74646          câma… AÉCIO NEVES    PSDB    MG    AecioN…         NA
##  8 160508         câma… AFONSO FLOREN… PT      BA    Afonso…         NA
##  9 136811         câma… AFONSO HAMM    PP      RS    depafo…         NA
## 10 178835         câma… AFONSO MOTTA   PDT     RS    afonso…         NA
## # … with 539 more rows, and 12 more variables: segue <dbl>,
## #   n_proprio <dbl>, n_retweet <dbl>, engaj_total <dbl>,
## #   engaj_total_proprio <dbl>, engaj_total_retweet <dbl>,
## #   engaj_mediano <dbl>, engaj_mediano_proprio <dbl>,
## #   engaj_mediano_retweet <dbl>, engaj_max <dbl>, engaj_max_proprio <dbl>,
## #   engaj_max_retweet <dbl>
atividade %>% 
  mutate(tem_twitter = !is.na(twitter)) %>% 
  summarise(proporcao_com_twitter = sum(tem_twitter) / n()) # n diz o número de linhas do grupo
## # A tibble: 1 x 1
##   proporcao_com_twitter
##                   <dbl>
## 1                 0.903
atividade %>% 
  mutate(tuitou = !is.na(twitter) & (n_proprio + n_retweet > 0)) %>% 
  summarise(proporcao_ativa = sum(tuitou) / n()) # n diz o número de linhas do grupo
## # A tibble: 1 x 1
##   proporcao_ativa
##             <dbl>
## 1           0.609

Visualizando muitos nomes em um eixo

Muitos nomes no eixo horizontal é impraticável:

atividade %>% 
  filter(!is.na(seguidores), UF == "PB") %>% 
  ggplot(aes(x = nome_eleitoral, y = seguidores)) + 
  geom_col()

A solução é “flipar” os eixos:

atividade %>% 
  filter(!is.na(seguidores), UF == "PB") %>% 
  ggplot(aes(x = nome_eleitoral, y = seguidores)) + 
  geom_col() + 
  coord_flip()

Nomes nos eixos

atividade %>% 
  filter(!is.na(seguidores)) %>% 
  ggplot(aes(x = UF, y = seguidores)) + 
  geom_jitter(width = .1) + 
  labs(
    x = "UF do parlamentar", 
    y = "Seguidores no twitter"
  )

Ordenar os eixos categóricos

atividade %>% 
  filter(!is.na(seguidores)) %>% 
  ggplot(aes(x = reorder(UF, seguidores, mean), y = seguidores)) + 
  geom_jitter(width = .1, alpha = .5) + 
  labs(
    x = "UF do parlamentar", 
    y = "Seguidores no twitter"
  )

Transforme antes de visualizar

Para visualizar a mediana do número de seguidores por estado, por exemplo:

atividade %>%
  filter(!is.na(seguidores)) %>%
  group_by(UF) %>%
  summarise(mediana_seguidores = median(seguidores)) %>% 
  ggplot(aes(x = reorder(UF, mediana_seguidores), y = mediana_seguidores)) +
  geom_point() +
  labs(x = "UF do parlamentar",
       y = "Mediana de seguidores dos parlamentares")

O summarise pode gerar mais de uma variável. E a função n() diz o número de linhas no grupo, o que é muito útil:

atividade %>%
  filter(!is.na(seguidores)) %>%
  group_by(UF) %>%
  summarise(mediana_seguidores = median(seguidores),
            parlamentares = n()) %>%
  ggplot(aes(
    x = reorder(UF, mediana_seguidores),
    y = mediana_seguidores,
    size = parlamentares
  )) +
  geom_point(alpha = .8) +
  coord_flip() +
  labs(x = "UF do parlamentar",
       y = "Mediana de seguidores dos parlamentares", 
       size = "Ativos no twitter")

Mostrar resumo e dados

Primeiro gere os dados transformados que são o resumo que você quer mostrar junto com os detalhes.

ne_no_twitter = atividade %>%
  filter(UF %in% c("PB", "PE", "RN", "BA", "CE", "MA", "PI", "SE", "AL"),
         !is.na(seguidores)) 
  
ne_sumario = ne_no_twitter %>% 
  group_by(UF) %>% 
  summarise(media = mean(seguidores))

glimpse(ne_sumario)
## Observations: 9
## Variables: 2
## $ UF    <chr> "AL", "BA", "CE", "MA", "PB", "PE", "PI", "RN", "SE"
## $ media <dbl> 27661.000, 13964.471, 18376.692, 6464.214, 11964.375, 1817…

Depois sobreponha os dois. Repare no parâmetro data, e que o mapping é diferente nas diferentes camadas.

ggplot() + 
  geom_jitter(data = ne_no_twitter, 
              mapping = aes(x = reorder(UF, seguidores), y = seguidores), 
              width = .3, 
              alpha = .4) + 
  geom_point(data = ne_sumario, 
             mapping = aes(x = UF, y = media), 
             color = "red", 
             size = 3)

O boxplot ou density plots são um atalho…

atividade %>% 
  filter(!is.na(seguidores), 
         UF %in% c("PB", "PE", "RN", "BA", "CE", "MA", "PI", "SE", "AL")) %>% 
  ggplot(aes(x = reorder(UF, seguidores, mean), y = seguidores)) + 
  geom_boxplot(width = .5, coef = 1000, color = "grey30") + 
  geom_jitter(width = .1, alpha = .7, color = "orange") + 
  coord_flip() + 
  labs(
    x = "UF do parlamentar", 
    y = "Seguidores no twitter"
  )