Skip to content

Latest commit

 

History

History
215 lines (170 loc) · 9.12 KB

tutorial13.md

File metadata and controls

215 lines (170 loc) · 9.12 KB

TICDOM - gráficos simples a partir de dados de survey

Nos dois últimos encontros aprendemos como manipular data frames dplyr, utilizar o conhecimento sobre data frames para trabalharmos dados de survey utilizando o pacote srvyr e como produzir visualizações com ggplot2. Vamos combinar o que aprendemos em um exemplo simples de como produzir gráficos com dados de survey, especificamente da TICDOM indivíduos.

Além disso, vamos fazer rapidamente a distinção entre as geometrias geom_bar e geom_col, bastante semelhantes entre si, para notar que a última será bastante mais último que a primeira ao utilizarmos dados de survey.

Carregando e preparando os dados

Vamos começar carregando os pacotes para não perdermos o hábito, lembrando que parte dos pacotes que precisamos, dplyr, ggplot2, readr e mais alguns outos fazem parte do 'guarda-chuva' tidyverse.

library(tidyverse)
library(srvyr)

A seguir, vamos abrir os dados da TICDOM indivíduos, como já fizemos anteriormente:

ticdom_url <- "http://cetic.br/media/microdados/181/ticdom_2017_individuos_base_de_microdados_v1.3.csv"

ticdom <- read_csv2(ticdom_url)

Por se tratar de um survey, precisamos contemplar o desenho amostral na análise de dados. Com srvyr, criamos um novo objeto a partir dos dados carregados designando-o como um objeto de survey:

ticdom_srvy <- ticdom %>%
  as_survey_design(ids = UPA, strata = ESTRATO, weights = PESO)

Pronto! Podemos começar a análise.

Uso de internet no Brasil em 2017

Nosso objetivo é bastante simples: criar um gráfico de barras que represente a proporção de pessoas que responderam "Sim" e "Não" à seguinte pergunta do questionário individual da TICDOM: 'C3: Quando o respondente usou a Internet pela última vez?', cujas respostas possíveis são: '1- Há menos de 3 meses'; '2- Entre 3 meses e 12 meses'; '3- Mais de 12 meses atrás'; e '4- Não se aplica'.

Podemos utilizar a combinação group_by e summarise para produzir uma tabela simples com a contagem para cada resposta:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total())

Nosso desafio agora será trabalhar esses dados para transformá-los em um gráfico interessante.

Geometria de barras ou de colunas?

Nesse momento, convém notar que, diferentemente do que fizemos no tutorial sobre visualização, não podemos utilizar a geometria geom_bar para produzir um gráfico a partir da variável C3. Veja os erros:

ticdom_srvy %>% 
  ggplot() +
  geom_bar(aes(x = C3))

Como estamos trabalhando com um objeto da classe "tbl_svy", não podemos aplicar diretamente a função ggplot, pois esta requer um data frame.

class(ticdom_srvy)

A solução é gerar um tabela, como acabamos de fazer, e produzir o gráfico a partir da tabela. Veja, porém, o erro que geramos ao tentar aplicar geom_bar à tabela:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>% 
  ggplot() +
  geom_bar(aes(x = C3))

O que aconteceu? A geometria geom_bar conta em quantas linha cada resposta aparece. Mas, como nosso data frame é uma tabela que já agrupou as respotas com a respectiva contagem, esse geometria não funciona.

A geometria correta para este caso é geom_col, que não vimos no tutorial sobre visualização de dados. Veja o seu funcionamento:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>% 
  ggplot() +
  geom_col(aes(x = C3,
               y = n))

Além da variável C3, precisamos informar também qual é a variável que contém a contagem de respostas.

Veja que este gráfico é bastante informativo. Porém, é um pouco 'bruto'. Precisamos refiná-lo.

Pipeline, dplyr e ggplot2

Podemos combinar as função dos pacotes dplyr e ggplot2 para produzir gráficos em um único pipeline. Antes de 'entregar' ao ggplot os dados, podemos modificar seus aspectos para facilitar o trabalho de visualização. Além disso, após produzirmos a base dos gráfico, podemos alterar seus aspectos estéticos para produzir gráficos mais claros e informativos.

Vamos trabalhar no nosso exemplo.

Em primeiro lugar, vamos excluir os respondentes aos quais a pergunta não se aplica adicionando um filter:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>% 
  filter(C3 != '99')

Em primeiro lugar, vamos alterar o conteúdo a ser informado. Em vez de contagem de pessoas, vamos calcular o percentual em cada resposta. Fazemos isso adicionando um mutate ao nosso código:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>%
  filter(C3 != '99') %>% 
  mutate(percentual = n / sum(n))

Fácil, não? Mas nossos leitores não saberão ainda o que os códigos numéricos da variável C3 significam. Assim, vamos transformá-la em factor com os textos das possíveis respostas -- por enquanto ele é character, apesar dos códigos serem numéricos. Faremos isso ainda dentro do mutate

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>%
  filter(C3 != '99') %>% 
  mutate(percentual = n / sum(n) * 100,
         C3 = replace(C3, C3 == '1', 'Há menos de 3 meses'),
         C3 = replace(C3, C3 == '2', 'Entre 3 meses e 12 meses'),
         C3 = replace(C3, C3 == '3', 'Mais de 12 meses atrás'),
         C3 = factor(C3, ordered = T, 
                     levels = c('Há menos de 3 meses',
                                'Entre 3 meses e 12 meses',
                                'Mais de 12 meses atrás')))

Bem melhor, não? Pronto, agora os dados estão preparados para a produção de um gráfico mais completo:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>%
  filter(C3 != '99') %>% 
  mutate(percentual = n / sum(n) * 100,
         C3 = replace(C3, C3 == '1', 'Há menos de 3 meses'),
         C3 = replace(C3, C3 == '2', 'Entre 3 meses e 12 meses'),
         C3 = replace(C3, C3 == '3', 'Mais de 12 meses atrás'),
         C3 = factor(C3, ordered = T, 
                     levels = c('Há menos de 3 meses',
                                'Entre 3 meses e 12 meses',
                                'Mais de 12 meses atrás'))) %>% 
  ggplot() +
  geom_col(aes(x = C3, 
               y = percentual))

Finalmente, e sem entrar em detalhes, podemos utilizar diversos recursos do ggplot2 para alterar cor, legenda, título, inserir texto e por aí vai:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>%
  filter(C3 != '99') %>% 
  mutate(percentual = n / sum(n) * 100,
         C3 = replace(C3, C3 == '1', 'Há menos de 3 meses'),
         C3 = replace(C3, C3 == '2', 'Entre 3 meses e 12 meses'),
         C3 = replace(C3, C3 == '3', 'Mais de 12 meses atrás'),
         C3 = factor(C3, ordered = T, 
                     levels = c('Há menos de 3 meses',
                                'Entre 3 meses e 12 meses',
                                'Mais de 12 meses atrás'))) %>% 
  ggplot() +
  geom_col(aes(x = C3, 
               y = percentual,
               fill = C3)) +
  geom_text(aes(x = C3,
                y = percentual,
                label = paste(format(percentual, digits = 2), " %")),
            position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = alpha(c("red", "blue", "yellow"), 0.5)) + 
  ggtitle("Frequência de uso de internet no Brasil - 2017") +
  xlab("Quando o respondente usou a Internet pela última vez?") +
  ylab("Percentual de usuários (%)") +
  theme(legend.position = "none") 

"Ah, puxa, mas era melhor não ter excluído os respondentes para os quais não se aplica a questão. O correto seria considerá-los como pessoas que nunca usaram a internet!"

Não tem problema. Reaproveitamos o código com pequenas modificações, tais como a exclusão do filter, a atribuição de um texto à esta resposta e a escolha de uma cor:

ticdom_srvy %>% 
  group_by(C3) %>%
  summarise(n = survey_total()) %>%
  mutate(percentual = n / sum(n) * 100,
         C3 = replace(C3, C3 == '1', 'Há menos de 3 meses'),
         C3 = replace(C3, C3 == '2', 'Entre 3 meses e 12 meses'),
         C3 = replace(C3, C3 == '3', 'Mais de 12 meses atrás'),
         C3 = replace(C3, C3 == '99', 'Nunca usuou internet'),
         C3 = factor(C3, ordered = T, 
                     levels = c('Há menos de 3 meses',
                                'Entre 3 meses e 12 meses',
                                'Mais de 12 meses atrás',
                                'Nunca usuou internet'))) %>% 
  ggplot() +
  geom_col(aes(x = C3, 
               y = percentual,
               fill = C3)) +
  geom_text(aes(x = C3,
                y = percentual,
                label = paste(format(percentual, digits = 2), " %")),
            position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = alpha(c("red", "blue", "yellow", "green"), 0.5)) + 
  ggtitle("Frequência de uso de internet no Brasil - 2017") +
  xlab("Quando o respondente usou a Internet pela última vez?") +
  ylab("Percentual de usuários (%)") +
  theme(legend.position = "none") 

Uma vez que você têm modelos de gráficos prontos, alterar ou refazer um gráfico, ou mesmo utilizá-lo para outra variável é imediato.