Tidyverse CrossTable Dplyr Tidyr
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:
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.')
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()
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()
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()
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)
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