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 |            | 
-------------------------|------------|------------|------------|

 

ideia original e fonte: Analytics with R