Estatística descritiva em Pesquisas de Opinião

EST024 - Pesquisa de Opinião e Mercado

Helgem de Souza

Introdução

Antes de iniciar nossa aula:

  1. Abra o RStudio.

  2. Crie um novo script.

  3. Crie uma pasta na área de trabalho com seu nome.

  4. Defina a pasta como diretório de trabalho

  5. Salve o script criado na pasta com o nome "aula12_est024.R".

  6. Baixe do Moodle o arquivo Pesquisa Secom 07/2022.rar e extraia na pasta criada.

  7. Leia o arquivo Rodada 02_F2F_BDvFinal.xlsx para o objeto pesquisa_secom e limpe os nomes com a função clean_names do pacote janitor.

Estatística Descritiva

Estatística Descritiva é um conjunto de metodologias utilizada para explorar e descrever características presentes em conjuntos de dados.

De modo geral, podemos dividí-la em algumas classes de objetos utilizados com a finalidade de descrever as referidas características:

  • Medidas de resumo (média, variância, proporção, moda)

  • Gráficos (barras, boxplots, histogramas, …)

  • Tabelas

O tipo de objeto utilizado para a descrição de uma variável depende de sua natureza, sobretudo de sua escala: qualitativa nominal, qualitativa ordinal, quantitativa discreta ou quantitativa contínua.

Estatística Descritiva em POM

Em Pesquisa de Opinião e Mercado, em função da natureza das variáveis, existe uma preponderância de variáveis qualitativas em detrimento das quantitativas. Por exemplo, são muito utilizados dados em escalas do tipo Likert.

Nesse sentido, as estatísticas descritivas mais utilizadas são aquelas baseadas em frequências:

  • Gráficos: Barras, setores, e suas variações.

  • Tabelas: Frequência simples, frequência acumulada, frequência cruzada.

Vamos explorar alguns pacotes voltados para apresentação de dados dessa natureza, com algum nível de sofisticação, em relação às opções oferecidas nativamente pelo R e pelo tidyverse.

Estatística Descritiva em POM

  • Para tabelas utilizaremos o pacote gt, um pacote voltado para a construção de tabelas com visual mais refinado, além de pacotes complementares como o gtsummary.

  • Para dados de escala Likert, utilizaremos o pacote likert, que apresenta uma série de opções que facilitam a análise de dados desse tipo de escala ordinal.

Pacote gt

Conforme descrito em sua página (https://gt.rstudio.com/), o pacote gt é votado para o desenvolvimento de tabelas bonitas e funcionais de forma simplificada.

Uma tabela gerada pelo pacote gt parte de um conjunto de dados e gera um objeto em formato HTML, LaTex ou RTF (Word e afins)

Para ilustrar as funcionalidades, do pacote, vamos partir de uma tabela simples.

Pacote gt - Tabela básica

A principal função do pacote é homônima: gt. Ela transforma um dataframe, tibble ou objeto similar em um objeto do tipo gt.

Vamos utilizar nosso banco de dados pesquisa_secom para criar uma tabela de frequência com os 5 estados commais participantes, em ordem decrescente.

#Top 5 estados com mais respostas
pesquisa_secom %>% #Objeto principal
  group_by(uf) %>% #Agrupa por uf
  summarise(n = n()) %>% #Conta casos por uf
  slice_max(n, n = 5) %>% #Seleciona os 5 primeiros casos
  gt #Cria a tabela gt
uf n
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 104

Pacote gt - Elementos adicionais

A partir de uma tabela básica, podemos incluir novos elementos, de acordo com o esquema a seguir:

Vejamos a função responsável pela adição de cada elemento

Pacote gt - Elementos adicionais

  • Título e subtítulo - tab_header()

  • Fontes e outras informações sobre os dados - tab_source_note()

  • Notas de rodapé - tab_footnote()

  • Grupos de linhas coluna - funções tab_row_group() e tab_spanner()

Cada uma dessas funções apresenta seus próprios parâmetros. Para entender seu funcionamento, vamos incluir alguns elementos em nossa tabela simples.

Vamos salvar nossa tabela base no objeto tab_uf:

#Top 5 estados com mais respostas
tab_uf <- pesquisa_secom %>% #Objeto principal
  group_by(uf) %>% #Agrupa por uf
  summarise(n = n()) %>% #Conta casos por uf
  slice_max(n, n = 5) %>% #Seleciona os 5 primeiros casos
  gt #Cria a tabela gt

Pacote gt - Cabeçalho

Vamos incluir os seguintes elementos em nossa tabela:

  • Título: Entrevistas por estado

  • Subtítulo: Cinco estados com mais entrevistas

tab_uf %>% 
  tab_header(title = "Entrevistas por estado",
             subtitle = "Cinco estados com mais entrevistas")
Entrevistas por estado
Cinco estados com mais entrevistas
uf n
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 104

Pacote gt - Cabeçalho

O pacote também aceita formatação Markdown, por meio da função md(). Por exemplo, vamos dar ênfase em algumas palavras de nossos títulos com negrito (**) e itálico (*), além de armazenar a tabela atualizada.

tab_uf <- tab_uf %>% 
  tab_header(title = md("Entrevistas por *estado*"),
             subtitle = md("Cinco estados **com mais** entrevistas"))
tab_uf
Entrevistas por estado
Cinco estados com mais entrevistas
uf n
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 104

Pacote gt - Fonte e informações

Vamos incluir agora as seguintes informações relacionada à fonte dos dados:

  • Fonte: Governo Federal - Secretaria de Comunicação (SECOM)

  • Pesquisa realizada em julho de 2022

    tab_uf <- tab_uf %>% 
      tab_source_note(source_note = "Fonte: Governo Federal - Secretaria de Comunicação (SECOM)") %>% 
      tab_source_note(source_note = "Pesquisa realizada em julho de 2022")
    
    tab_uf
    Entrevistas por estado
    Cinco estados com mais entrevistas
    uf n
    São Paulo 452
    Minas Gerais 211
    Rio de Janeiro 156
    Bahia 143
    Rio Grande do Sul 104
    Fonte: Governo Federal - Secretaria de Comunicação (SECOM)
    Pesquisa realizada em julho de 2022

Pacote gt - Notas de rodapé

Notas de rodapé são informações específicas relacionadas a uma ou mais células. Por esse motivo, elas geralmente são adicionadas com base em algum critério e sinalizadas na tabela e na fonte com algum elemento de identificação.

No pacote gt elas são adicionadas por meio da função tab_footnote(). Como se trata de células específicas, é necessário indicar a que célula se refere a nota. Para tal, existem algumas possibilidades de indicação:

  • nomes de linhas e colunas.

  • índices de células.

  • comparação lógica.

Tais parâmetros devem ser passados por meio do parâmetro locations, dentro da função cells_body(). Na função cells_body(), os parâmetros rows e columns indicam o local das notas rnorm(2).

Pacote gt - Notas de rodapé

Vamos incluir as seguintes notas de rodapé usando os métodos de identificação listados anteriormente:

  1. Estado mais populoso do país (SP)

  2. Melhor estado do país (MG)

  3. Estado com menor número de entrevistas (RS)

Pacote gt - Notas de rodapé

tab_uf <- tab_uf %>% 
  tab_footnote(footnote = "Estado mais populoso do país",
               locations = cells_body(columns =  uf, rows = 1)) %>% 
  tab_footnote(footnote = "Melhor estado do país",
               locations = cells_body(columns = uf, rows = uf == "Minas Gerais")) %>% 
  tab_footnote(footnote = "Estado com menor número de entrevistas",
               locations = cells_body(columns = n, rows = n == min(n)))

tab_uf
Entrevistas por estado
Cinco estados com mais entrevistas
uf n
São Paulo1 452
Minas Gerais2 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 3 104
Fonte: Governo Federal - Secretaria de Comunicação (SECOM)
Pesquisa realizada em julho de 2022
1 Estado mais populoso do país
2 Melhor estado do país
3 Estado com menor número de entrevistas

Pacote gt - Agrupamento de variáveis

Ao se trabalhar com tabelas, em alguns momentos é interessante segmentar nossos dados em grupos.

Nesse contexto, é possível agrupar os dados por linhas e colunas.

Vamos trabalhar o agrupamento por linhas e colunas em uma nova tabela, que considerará o número de entrevistas dos 10 estados com mais entrevistas

Pacote gt - Agrupamento de variáveis

pesquisa_secom %>% #Objeto principal
  group_by(uf) %>% #Agrupa por uf
  summarise(n = n()) %>% #Conta casos por uf
  slice_max(n, n = 10) %>% #Seleciona os 5 primeiros casos
  gt #Cria a tabela gt
uf n
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 104
Paraná 89
Pernambuco 80
Santa Catarina 80
Ceará 79
Pará 78

Pacote gt - Trabalhando com Linhas

Primeiramente, vamos transformar a coluna uf em rótulo. Para isso, basta utilizar o parâmetro rowname_col na função gt().

pesquisa_secom %>% #Objeto principal
  group_by(uf) %>% #Agrupa por uf
  summarise(n = n()) %>% #Conta casos por uf
  slice_max(n, n = 10) %>% #Seleciona os 5 primeiros casos
  gt(rowname_col = "uf") #Cria a tabela gt
n
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 104
Paraná 89
Pernambuco 80
Santa Catarina 80
Ceará 79
Pará 78

Pacote gt - Trabalhando com Linhas

Perceba que a coluna não possui mais o rótulo uf. Podemos atribuir um novo rótulo por meio da função tab_stubhead(). A partir desse momento, a coluna Estado não é mais tratada como variável.

tab_uf10 <- pesquisa_secom %>%  
  group_by(uf) %>%  
  summarise(n = n()) %>% 
  slice_max(n, n = 10) %>% 
  gt(rowname_col = "uf") %>%  
  tab_stubhead(label = "Estado")

tab_uf10
Estado n
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156
Bahia 143
Rio Grande do Sul 104
Paraná 89
Pernambuco 80
Santa Catarina 80
Ceará 79
Pará 78

Pacote gt - Trabalhando com Linhas

Para criar um grupo de linhas, basta utilizar a função tab_row_group(). Assim como nas notas de rodapé, devemos informar quais linhas compõe cada grupo, por meio do índice, rótulos ou comparação.

tab_uf10 %>% 
  tab_row_group(label = "Região Sudeste", rows = 1:3) %>% 
  tab_row_group(label = "Região Nordeste", rows = c("Bahia", "Pernambuco", "Ceará")) %>% 
  tab_row_group(label = "Região Sul", rows = c(5, 6, 8)) %>% 
  tab_row_group(label = "Região norte", rows = contains("Pará"))
Estado n
Região norte
Pará 78
Região Sul
Rio Grande do Sul 104
Paraná 89
Santa Catarina 80
Região Nordeste
Bahia 143
Pernambuco 80
Ceará 79
Região Sudeste
São Paulo 452
Minas Gerais 211
Rio de Janeiro 156

Pacote gt - Trabalhando com Colunas

Assim como podemos criar grupos de linhas, podemos agrupar variáveis por colunas, com a função tab_spanner(). Para ilustrar, vamos criar algumas estatísticas descritivas com a idade e a avaliação da educação estadual informada pelos participantes (pf1 e p32).

descritiva <- pesquisa_secom %>% 
  dplyr::filter(p32 %in% c("Regular", "Boa", "Ótima", "Péssima", "Ruim")) %>% 
  mutate(p32 = factor(p32, levels = c("Péssima", "Ruim", "Regular", "Boa", "Ótima", ""))) %>% 
  group_by(p32) %>% 
  summarise(media = mean(pf2), mediana = median(pf2),
            variancia = var(pf2), desvio = sd(pf2)) %>% 
  gt(rowname_col = "p32") %>% 
  tab_stubhead(label = "Avaliação da educação estadual") %>% 
  tab_header(title = "Avaliação da educação estadual - Comparativo por idade",
             subtitle = "Estatísticas descritivas")

descritiva
Avaliação da educação estadual - Comparativo por idade
Estatísticas descritivas
Avaliação da educação estadual media mediana variancia desvio
Péssima 43.84848 43 260.8943 16.15222
Ruim 36.63399 35 195.7467 13.99095
Regular 41.74165 39 278.9655 16.70226
Boa 41.85421 41 279.2559 16.71095
Ótima 40.80874 40 234.1335 15.30142

Pacote gt - Trabalhando com Colunas

Para agrupar as estatísticas descritivas em tendência central e dispersão, podemos usar a função tab_spanner(). O rótulo deve ser inserido no parâmetro label e as colunas que ficaram agrupadas em cada rórulo devem ser informadas no parâmetro column.

descritiva <- descritiva %>% 
  tab_spanner(label = "Tendencia central",
              columns = c(media, mediana)) %>% 
  tab_spanner(label = "Dispersão",
              columns = c(variancia, desvio))

descritiva
Avaliação da educação estadual - Comparativo por idade
Estatísticas descritivas
Avaliação da educação estadual
Tendencia central
Dispersão
media mediana variancia desvio
Péssima 43.84848 43 260.8943 16.15222
Ruim 36.63399 35 195.7467 13.99095
Regular 41.74165 39 278.9655 16.70226
Boa 41.85421 41 279.2559 16.71095
Ótima 40.80874 40 234.1335 15.30142

Trabalhando com colunas

Por fim, para nossa tabela ficar em um formato final, podemos corrigir o nome das colunas, por meio da funçãoo cols_label():

descritiva %>% 
  cols_label(media = "Média", 
             mediana = "Mediana",
             variancia = "Variância",
             desvio = "Desvio Padrão")
Avaliação da educação estadual - Comparativo por idade
Estatísticas descritivas
Avaliação da educação estadual
Tendencia central
Dispersão
Média Mediana Variância Desvio Padrão
Péssima 43.84848 43 260.8943 16.15222
Ruim 36.63399 35 195.7467 13.99095
Regular 41.74165 39 278.9655 16.70226
Boa 41.85421 41 279.2559 16.71095
Ótima 40.80874 40 234.1335 15.30142

Pacote gt

Existem outras funções adicionais, voltadas para formatação, mas não entraremos em detalhes nessa aula.

Detalhes sobre formatação podem ser encontrados no link https://gt.rstudio.com/reference/tab_style.html

Caso queiram se aprofundar nas funções do pacote, existem muitos materiais disponíveis na própria página do pacote: https://gt.rstudio.com/

Pacotes gt + gtsummary

Conforme vimos, o pacote gt apresenta opções excelentes para a criação de tabelas complexas e com excelente formatação.

o pacote gtsummary expande essas características e facilita a construção de tabelas com estatísticas descritivas.

Hoje apresentaremos apenas uma introdução às funções básicas do pacote. Nas próximas aulas exploraremos mais suas funções.

Pacotes gt + gtsummary - Estatísticas descritivas

Ao utilizar a função tbl_summary, criamos com facilidade uma tabela de estatísticas descritivas de variáveis de nosso banco de dados. Ela detecta automaticamente o tipo de variável. Veja o exemplo a seguir:

#Descritivas de idade e sexo
pesquisa_secom %>% 
  tbl_summary(include = c(pf1, pf2)) 
Characteristic N = 2,0311
pf1
    Feminino 1,027 (51%)
    Masculino 1,004 (49%)
pf2 40 (27, 54)
1 n (%); Median (Q1, Q3)

Nas próximas aulas testaremos outras funcionalidades do pacote gtsummary.

Visualização de dados em escala Likert

Dados em escala Likert usualmente se apresentam como uma combinação de variáveis que utilizam uma mesma escala de intensidade.

Apesar dessa combinação, muitas vezes se analisa cada variável de maneira isolada, seja por desconhecimento dos métodos, seja por limitação dos pacotes de visualização.

Para facilitar a análise descritiva desse tipo de dados, podemos utilizar o pacote likert.

Pacote likert

O pacote likert permite a comparação de variáveis em uma mesma escala, por meio de diversos tipos de gráficos e opções de classificação, como ordenação por intensidade, agrupamento por variável, dentre outras.

Vamos explorar algumas possibilidades com a variável p29, que avalia a satisfação com a saúde pública. Ela possui uma escala likert com os seguintes níveis:

  • Muito satisfeito

  • Satisfeito

  • Mais ou menos satisfeito

  • Pouco satisfeito

  • Nada satisfeito

Pacote likert

A função básica do pacote é homônima: likert(). Ela converte um grupo de variáveis em um objeto do tipo likert. Mas antes vamos converter nossa variável em fator para facilitar o trabalho. Além disso, vamos alterar o nome das variáveis, dado que elas estão rotuladas.

Também é necessário converter nosso banco de dados para dataframe, pois o pacote não trabalha com tibble.

niveis <- c("Nada satisfeito", "Pouco satisfeito", "Mais ou menos satisfeito", "Satisfeito", "Muito Satisfeito")

rotulos <- c("Nada satisfeito", "Pouco satisfeito", "Mais ou menos satisfeito", "Satisfeito", "Muito Satisfeito")

nomes <- c("Hospital Público", "Pronto Socorro Público", "Posto de saúde público", "Campanhas de vacinação", "SAMU")

saude <- pesquisa_secom %>% 
  mutate(across(starts_with("p29"), function(x)factor(x, levels = niveis, labels = rotulos))) %>% 
  select(starts_with("p29")) %>%
  set_names(nomes) %>% 
  as.data.frame() 

Pacote likert

O primeiro passo é converter os dados em um objeto likert.

lik_saude <- saude %>% 
  likert

lik_saude
                    Item Nada satisfeito Pouco satisfeito
1       Hospital Público       21.359716        24.353120
2 Pronto Socorro Público       21.641026        21.282051
3 Posto de saúde público       18.049271        19.557567
4 Campanhas de vacinação        4.270109         6.206554
5                   SAMU       14.467849        15.188470
  Mais ou menos satisfeito Satisfeito Muito Satisfeito
1                 26.48402   25.01268         2.790462
2                 28.20513   25.89744         2.974359
3                 25.38964   33.18250         3.821016
4                 11.22145   62.95929        15.342602
5                 19.51220   43.79157         7.039911

Note que os dados foram convertidos em percentuais. A partir desse objeto podemos criar nossas visualizações.

Pacote likert - Resumo

A primeira coisa que podemos visualizar é o resumo. O pacote entende pelo número de níveis e seu ordenamento se a avaliação é positiva, neutra ou negativa:

summary(lik_saude) %>% 
  pander
  Item low neutral high mean sd
4 Campanhas de vacinação 10.48 11.22 78.3 3.789 0.9242
5 SAMU 29.66 19.51 50.83 3.137 1.197
3 Posto de saúde público 37.61 25.39 37 2.852 1.175
2 Pronto Socorro Público 42.92 28.21 28.87 2.673 1.162
1 Hospital Público 45.71 26.48 27.8 2.635 1.152

Perceba que os dados foram automaticamente ordenados.

Pacote likert - Gráfico

Se dermos um plot no objeto lik_saude, teremos o gráfico padrão:

lik_saude %>% 
  plot()

A partir desse gráfico, é possível aplicar algumas variações.

Pacote likert - Gráfico

Variações do gráfico likert são geradas por meio de parâmetros:

  • ordered - Define se o gráfico será ordenado

  • centered - Define se o gráfico será centrado na avaliação neutra

  • center - Define qual a categoria central. Útil para escalas assimétricas.

  • include.center - A categoria central deve ser exibida? Útil para omitir avaliações neutras

  • grouping - Define uma variável de agrupamento.

  • low.color e high.color - Altera as cores das escalas.

Vamos ver alguns exemplos dos nossos dados utilizando esses parâmetros.

Pacote likert - Gráfico

lik_saude %>% 
  plot(ordered = F)

Pacote likert - Gráfico

lik_saude %>% 
  plot(centered = F)

Pacote likert - Gráfico

Nesse caso, apenas a pior avaliação seria considerada negativa

lik_saude %>% 
  plot(center = 1.5)

Pacote likert - Gráfico

Aqui omitimos a classe neutra

lik_saude %>% 
  plot(include.center = F)

Pacote likert - Gráfico

Aqui alteramos as cores e a localização da escala.

lik_saude %>% 
  plot(low.color = "brown", high.color = "darkseagreen", legend.position = "right")

Pacote likert - Gráfico

Vamos agrupar os dados por sexo. Pra isso precisamos agrupar os dados por uma segunda variável:

saude %>% 
  likert(grouping = pesquisa_secom$pf1) %>% 
  plot

Pacote likert - Gráfico

Também podemos plotar o mapa de calor e a densidade dos dados

lik_saude %>% 
  plot(type = 'heat')

Pacote likert - Gráfico

lik_saude %>% 
  plot(type = 'density')

Conclusão

  • Ambos os pacotes são bastante úteis na análise de dados categóricos, em especial em dados de pesquisa de opinião.

  • O objetivo deste material é apresentar opções. Os pacotes possuem uma série de opções que podem e devem ser exploradas.

  • No decorrer do curso exploraremos mais algumas opções desses pacotes.

Exercícios

  1. Usando o pacot gt, elabore uma tabela que contenha as frequências relativas das variáveis idade e escolaridade (pf3). Inclua um título e um subtítulo, a fonte dos dados e notas de rodapé nas classes com maior e menor frequência.
  2. Crie os gráficos da variável pf15 - avaliação do governo federal em diferentes áreas. Crie duas versões, uma com a escala neutra, outra sem a presença da escala neutra.
  3. Gere o gráfico da variável pf35 - avaliação da educação pública, agrupados por sexo.