Uma das tarefas mais corriqueiras dos analista de dados é a produção de tabelas. Seja para apresentar frequencias, estatísticas descritivas (media, mediana, moda, …), seja para apresentar resultados de modelos de regressão. Aqui apresentos alguns formas de produzir as frenquencias e estatisticas, e posteriomenter apresentar em uma tabela. Por susposto, que não é um tutorial que dá conta da multiplas formar de fazer essas coisas, e nem dá conta de todos detalhes de cada pacote ou função é mais um guia geral. Em especial, um guia não tidyverse, perdoem os amigos tidy, aqui nesses exemplos não vamos usar tidy (ao menos diretamente rsrsrsr).

criando uma base de dados simulada

dados <- data.frame(id = 1:1000, 
                    idade = sample(18:50, 1000, replace = T),
                    escolaridade = sample(c("Fundamental", "Medio", "Superior"), 1000, replace = T),
                    sexo = sample(c("Masculino", "Feminino"), 1000, replace = T),
                    renda = sample(1212:5*1212, 1000, replace = T)
                    )

criando tabelas de frequencia e outras metricas

fazer uma tabela de frequencia com r-base é extremamente simples, emborar para algumas trabalhos desejam muito uteis. Mas basta um table, e prop.table para gerar a frequencia relativa.

r-base

table(dados$escolaridade) |>
  prop.table() * 100
## 
## Fundamental       Medio    Superior 
##        35.6        32.4        32.0

pacotes

Usando pacotes existe uma infinidade de soluções, a primeira a ser apresentada é a a função freq do pacote descr que gera a frequencia absoluta e a porcentagem (frequencia relativa). Para gerar a tabela para um documento (pdf, word, html) basta usar a função kable do pacote knitr

library(descr)
library(knitr)

freq(dados$sexo, plot = F) |> kable()

No pacote descr tem a função crosstab que gera tabulações cruzadas. A impressao abaixo feita com a funcao xtable não é das mais bonitas (veremos mais abaixo).

tabulação cruzada

library(xtable)

crosstab(dados$escolaridade, dados$sexo, plot = F) |> xtable() |> print(type = "html")

Há na função crosstab opções (argumentos) para gerar as porcentagens.

tabulação cruzada com procentagem

crosstab(dados$escolaridade, dados$sexo, plot = F, prop.r = T) |> xtable() |> print(type = "html")

Podemos usar o pacote crosstable para gerar as frequencia e as tabulações cruzadas. Se inserimos a base de dados e não informamos outros arquementos, por padrão a função crosstable gera a frequencia para variaveis qualitativas, e para variaveis quanitivativa o minino/maximo, a mediana/intervalo interquartil, a média/desvio padrão, e o N/missing value. Usei aqui a funcao kable do pacote kableExtra para gerar a tabela.

library(crosstable)
library(kableExtra)

crosstable(dados[, -1])[-1] |> kable()

A função crosstable quando você informa a(s) coluna(s) e interesse e a variável grupo, ela gerar a tabulação cruzadas das variáveis. Para gerar tabela usei a funcão flextable do pacote de mesmo nome. Este é o meu favorito. Como o nome diz ele é flex, ou seja, por padrão ele gerar tabelas para word, powerpoint, pdf, html sem precisar adicionar alguma parametro especifico.

library(flextable)

crosstable(dados, cols = escolaridade, by = sexo)[-1] |> flextable()
 

Como gosto do flextable la vai outro exemplo com ele mudando a cor da fonte do cabeçario da tabela.

 crosstable(dados, cols = idade, by = sexo)[-1] |> flextable() |>
 color(color = "red", part = "header")

Podemos gerar estatísticas descritiva com o pacote psych, usando a função describe. Que nos retorna a média, desvio padrão, media, minimo, maximo, e erro padrão por exemplo. Para gerar a tabela novamente usei a função flextable e adicionei o tema vader.

library(psych)

describe(dados$idade) |> flextable() |> theme_vader()
 

É possível com o pacote psych gerar essas estatística por algum grupo (variável qualitativa). Mas é claro que gerei a tabela com o flextable usando agora o tema apa.

describeBy(dados$renda, group = dados$escolaridade, mat = T)  |> flextable() |> theme_apa()
 

Como o flextable é o queridinho repeti o exemplo com a funcao crosstab do pacote descr. Adicionando algumas formatações a tabela como o merge na linha que representa a variável categorica.

crosstab(dados$escolaridade, dados$sexo, plot = F, prop.r = T) |> xtable() |>  
  flextable() |> 
   merge_at(i = c(1:2), j = 1) |>
   merge_at(i = c(3:4), j = 1) |>
   merge_at(i = c(5:6), j = 1) |>
 set_header_labels(
   "dados$escolaridade" = "Escolaridade") |>
  theme_vanilla()
 

Quando temos modelo de regressão o primeiro pacote que vem em mente é o stargazer, é fato que em alguma situações não é possível usar ele, como exportar direto para word.

modelo <- lm(renda ~ sexo + escolaridade + idade, dados)

library(stargazer)

stargazer(modelo, type = "html")

O stargazer serve para além das regresões, se colocamos nele nossa base de dados no lugar em modelo, ele gerar algumas estatística descritiva de todas variáveis númericas. Aqui só retirei a coluna id da nossa base de dados, coisa que fiz anteriomente em outras funções, ja que id é o indificador do caso.

stargazer(dados[, -1 ],  type = "html", digit.separator = ".", style = "ajps", digits = 0, 
          title = "Estatistica descritiva com Stargazer")