Tidyverse CrossTable Dplyr Tidyr



Introdução

Você não precisa usar o R, mas provavelmente é uma boa ideia.


Existem muitas opções para produzir tabelas de contingência e tabelas de resumo em R.

No passado, para fazer uma tabela cruzada, era utilizado um comando do tipo:

table(bancodedados$variavel1,bancodedados$variavel2)

Para fazer uma proporção, era necessário fazer algo parecido com:

pro.table(table(bancodedados$variavel1,bancodedados$variavel2),2)*100)

Vamos revisar esse e outros métodos. Pretendo fazer hoje algo do tipo:

  • Produzir tabelas de resumo usando dplyr & tidyr.
  • Produzir tabelas de frequência e proporção.
  • Produzir valores de frequência e proporção.

Dplyr & Tidyr

O uso do dplyr para produzir estatísticas permite que você continue o código sem problemas na próxima tarefa (filtragem, plotagem, etc.).

Os comandos group_by(), resume() e spread() são uma combinação útil para produzir valores agregados ou resumidos de um bancos de dados.

Primeiro, vamos carregar os dois pacotes dplyr & tidyr.

library(dplyr)
library(tidyr)

Usaremos o banco de dados CARROS para essas atividades.

source('https://raw.githubusercontent.com/DATAUNIRIO/Miscellaneous_Functions_Rstats/master/CARROS.R',encoding = "UTF-8")
library(DT)
CARROS %>% datatable(options = list(pageLength = 5, dom = 'tip'),fillContainer = FALSE,
caption = 'Tabela 1: Base de dados CARROS.')

dplyr & tidyr: Total de carros por variável categórica

Aqui, podemos obter o número total de carros com cada combinação de Tipo de combustível (var:“Tipodecombustivel”) e Tipo de Marcha (var:“TipodeMarcha”) usando group_by() e summarize().

CARROS %>%
  group_by(Tipodecombustivel,TipodeMarcha) %>%
  summarize(n=n()) %>%
  datatable()

dplyr & tidyr: Tabela Cruzada (Crosstabs)

Para transformar esses dados em uma tabela de cruzada ou de contingência, precisamos que a variável A (Tipodecombustivel) seja listada por linha e a variável B (TipodeMarcha) seja listada por coluna.

Podemos conseguir isso incluindo o comando spread(), para criar colunas para cada valor da variável TipodeMarcha, com n como o valor de resposta da tabela cruzada.

CARROS %>%
  group_by(Tipodecombustivel,TipodeMarcha)  %>%
  summarise(n=n()) %>%
  spread(TipodeMarcha, n) %>%
  datatable()

dplyr & tidyr: proporções

Podemos encontrar proporções criando uma nova variável calculada, dividindo a frequência da linha pela frequência da tabela.

CARROS %>%
  group_by(Tipodecombustivel)  %>%
  summarise(n=n()) %>%
  mutate(prop=n/sum(n)*100) %>% 
  datatable()

Podemos criar uma tabela de contingência de proporção aplicando o mesmo comando spread de antes. Varie os argumentos group_by() e spread() para produzir proporções de diferentes variáveis.

CARROS %>%
  group_by(Tipodecombustivel,TipodeMarcha)  %>%
  summarise(n=n()) %>%
  mutate(prop=n/sum(n)*100) %>% 
  subset(select=c("Tipodecombustivel","TipodeMarcha","prop")) %>%   #drop the frequency value
  spread(Tipodecombustivel, prop) %>%
  datatable()

Sobre o comando table do R básico

O comando table funciona bem para contagens, por exemplo:

table(CARROS$Tipodecombustivel,CARROS$TipodeMarcha) %>% datatable(rownames = FALSE)

Todavia, acho anti-intuitivo quando trabalhamos com proporções.

data.frame(round(
  prop.table(table(CARROS$Tipodecombustivel,CARROS$TipodeMarcha),2)*100,2)) %>% datatable(rownames = FALSE)

CrossTable com o pacote gmodels

Se você precisar de algo rápido, execute o comando CrossTable() com duas variáveis.

Instale e carregue o pacote gmodels

install.packages("gmodels")
library(gmodels)
CrossTable(CARROS$Tipodecombustivel,CARROS$TipodeMarcha)

 
   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  32 

 
                         | CARROS$TipodeMarcha 
CARROS$Tipodecombustivel | Automático |     Manual |  Row Total | 
-------------------------|------------|------------|------------|
                Gasolina |         12 |          6 |         18 | 
                         |      0.161 |      0.236 |            | 
                         |      0.667 |      0.333 |      0.562 | 
                         |      0.632 |      0.462 |            | 
                         |      0.375 |      0.188 |            | 
-------------------------|------------|------------|------------|
                  Álcool |          7 |          7 |         14 | 
                         |      0.207 |      0.303 |            | 
                         |      0.500 |      0.500 |      0.438 | 
                         |      0.368 |      0.538 |            | 
                         |      0.219 |      0.219 |            | 
-------------------------|------------|------------|------------|
            Column Total |         19 |         13 |         32 | 
                         |      0.594 |      0.406 |            | 
-------------------------|------------|------------|------------|

 

CrossTable com o pacote flexpivot

Pacote que visa facilitar ainda mais a construção de crosstable. Ele tem um addin semelhante ao esquisse.

# remotes::install_github("DATAUNIRIO/flexpivot")
library(flexpivot)
pivot_addin(CARROS)

Cilindros

TipodeMarcha

Statistic

4

6

8

Total

Automático

N

3

4

12

19

%

9.4%

12.5%

37.5%

59.4%

Col %

27.3%

57.1%

85.7%

59.4%

Row %

15.8%

21%

63.2%

100%

Manual

N

8

3

2

13

%

25%

9.4%

6.2%

40.6%

Col %

72.7%

42.9%

14.3%

40.6%

Row %

61.5%

23.1%

15.4%

100%

Total

N

11

7

14

32

%

34.4%

21.9%

43.8%

100%

Col %

100%

100%

100%

100%

Row %

34.4%

21.9%

43.8%

100%

Atividades para meus alunos

  1. (warm up) Responda: Você consegue indentificar qual são as variáveis quantitativas e quais são as variáveis qualitativas?
  2. Responda: quantos alunos namoram? é mais ou menos que os alunos que não namoram?
  3. Faça uma tabela com a proporção de alunos em cada turma da base de dados questionário estresse
  4. Faça uma tabela cruzada da turma com o trabalho na base de dados questionário estresse. Com essa tabela responda: em qual turma as alunas e os alunos mais estudam?

Para fazer o download do banco de dados questionário estresse (e outros), copie e cole no R um desses dois códigos abaixo.

Código 1 - sem instalação de pacotes (para usuários do windows)

source('https://raw.githubusercontent.com/DATAUNIRIO/aulauniriov2/master/download_das_bases_de_dados_do_curso_de_estatistica.R')

Código 2 - necessário instalar o pacote usethis (para usuários do macOS/apple, linux ou windows)

install.packages("usethis")
usethis::use_course("https://github.com/DATAUNIRIO/Base_de_dados/archive/master.zip")

ideia original e fonte: Analytics with R