Sobre a maestria

Tenho um grande amigo que uma vez me disse uma definição de maestria que reproduzo aqui:

“A nota dez na prova não me diz nada sobre a pessoa! Isso só me diz que a pessoa atingiu uma forma de fazer estatística. A maestria vem quando você sabe umas três ou quatro formas de resolver o mesmo problema.”

Ele ainda continuou….

“O ideial é pensar as diferentes abordagens para o problema e o resultado que você pode alcançar. Por exemplo, antes de executar uma metodologia, podemos pensar algo do tipo: posso usar a abordagem bayesiana e chegar mais ou menos aqui, usar um método multivariado e chegar mais ou menos ali, usar um modelo de regressão e alcançar tal resultado, ou ainda usar um Machine learning e fazer tal coisa….

Essa fala dele me fez pensar muito. Não concordo com tudo com que ele disse, mas concordo que é bom saber vários métodos. Assim, penso que podemos essa publicação para explorar várias abordagens na programação no R. Inclusive, poderíamos comparar os métodos R-Base com os métodos tidyverse :)


Como examinar os seus dados

Qual seria a melhor forma de examinar os seus dados? Aqui, apresento as formas que eu mais utilizo para esse fim.

Para isso, vamos criar uma base de dados.

### Banco de dados
Entrada <- ("
 Palestrante Nota
 Stark 3
 Stark 5
 Stark 4
 Stark 4
 Stark 4
 Stark 4
 Stark 4
 Stark 4
 Stark 5
 Stark 5
 Targaryen 2
 Targaryen 4
 Targaryen 2
 Targaryen 2
 Targaryen 1
 Targaryen 2
 Targaryen 3
 Targaryen 2
 Targaryen 2
 Targaryen 3
")

dados <- read.table(textConnection(Entrada), head = TRUE)

Apresento a seguir as principais funções para inspecionar os seus dados.

funções interessantes

head() e summary()

Essas são as funções clássicas para ver a estrutura de dados. Além disso, essas foram as primeiras que aprendi.

head(dados)
  Palestrante Nota
1       Stark    3
2       Stark    5
3       Stark    4
4       Stark    4
5       Stark    4
6       Stark    4
summary(dados)
 Palestrante             Nota     
 Length:20          Min.   :1.00  
 Class :character   1st Qu.:2.00  
 Mode  :character   Median :3.50  
                    Mean   :3.25  
                    3rd Qu.:4.00  
                    Max.   :5.00  

str()

Essa função serve para mostrar a estrutura de dados das variáveis.

str(dados)
'data.frame':   20 obs. of  2 variables:
 $ Palestrante: chr  "Stark" "Stark" "Stark" "Stark" ...
 $ Nota       : int  3 5 4 4 4 4 4 4 5 5 ...

describe()

Função interessante do pacote psych.

library(psych)
describe(dados)
             vars  n mean   sd median trimmed  mad min max range  skew kurtosis
Palestrante*    1 20 1.50 0.51    1.5    1.50 0.74   1   2     1  0.00    -2.10
Nota            2 20 3.25 1.21    3.5    3.25 1.48   1   5     4 -0.12    -1.34
               se
Palestrante* 0.11
Nota         0.27

glimpse()

Função do pacote do dplyr. Eu amo o tidyverse! Se der para usar o tidyverse, use-o.

library(dplyr)
glimpse(dados)
Rows: 20
Columns: 2
$ Palestrante <chr> "Stark", "Stark", "Stark", "Stark", "Stark", "Stark", "Sta~
$ Nota        <int> 3, 5, 4, 4, 4, 4, 4, 4, 5, 5, 2, 4, 2, 2, 1, 2, 3, 2, 2, 3

visualize()

Função um pouco mais visual para o mesmo fim. Ela é do pacote dataMaid.

library(dataMaid)
visualize(dados)

skimr()

Função um pouco mais detalhada. Ela é do pacote skimr. Funciona com o operador pipe.

library(skimr)
skim(dados)
Data summary
Name dados
Number of rows 20
Number of columns 2
_______________________
Column type frequency:
character 1
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Palestrante 0 1 5 9 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Nota 0 1 3.25 1.21 1 2 3.5 4 5 ▁▇▃▇▃

Como fazer um resumo numérico por grupos

Apresento a seguir as principais funções para o cruzamento de variáveis quantitativas e variáveis qualitativas. A ideia aqui será fazer um resumo numérico dos dados quantitativos por uma variável categórica.

As principais funções

describeBy()

Função simples do pacote psych. ótima para os primeiros passos no R.

Vantagem: simples para um aula de estatística báica.
Desvantagem: não é compatível com o operador pipe.

describeBy(dados$Nota, group = dados$Palestrante)

 Descriptive statistics by group 
group: Stark
   vars  n mean   sd median trimmed mad min max range  skew kurtosis  se
X1    1 10  4.2 0.63      4    4.25   0   3   5     2 -0.09    -0.93 0.2
------------------------------------------------------------ 
group: Targaryen
   vars  n mean   sd median trimmed mad min max range skew kurtosis   se
X1    1 10  2.3 0.82      2    2.25   0   1   4     3 0.58    -0.45 0.26

summarise()

Função do pacote dplyr. Com certeza, a função que eu mais uso.

Vantagem: totalmente customizável e pode ser usada com o operador pipe. Além disso, você pode integrá-la ao reactable, flextable, DT, stargazer ou outro pacote de tabelas de sua preferência.

Desvantagem: não é fácil para os alunos que não tem noção de programação.

library(flextable)

dados %>% 
  select(Nota,Palestrante) %>% 
  group_by(Palestrante) %>%
  summarise(nota_média=mean(Nota),desvio_padrão=round(sd(Nota),1),tamanho=n()) %>%  flextable() %>%
  bg(bg = "white") %>%
  bg(bg = "white", part = "header")

get_summary_stats()

Função do pacote rstatix. Descobri essa função na semana passada e é muito semelhante com uma união das duas outras funções. Planejo apresentar essa função para meus os alunos(as) no próximo semestre. Espero que funcione :) .

library(rstatix)

dados %>% 
  select(Nota,Palestrante) %>% 
  group_by(Palestrante) %>%
  get_summary_stats(Nota) %>%  flextable() %>%
  theme_vader()

Outras funções interessantes do mesmo pacote.

# Show only common summary
#get_summary_stats(Nota, type = "common")

# Robust summary statistics
#get_summary_stats(Nota, type = "robust")

# Five number summary statistics
#get_summary_stats(Nota, type = "five_number")

# Compute only mean and sd
#get_summary_stats(Nota, type = "mean_sd")

# Compute full summary statistics but show only mean, sd, median, iqr
#get_summary_stats(Nota, show = c("mean", "sd", "median", "iqr"))

Adendo: modelsummary & datasummary

library(modelsummary)

datasummary_skim(dados, type="categorical")
Palestrante N %
Stark 10 50.0
Targaryen 10 50.0
datasummary(Nota ~ (mean + sd) * Palestrante,data=dados)
mean
sd
Stark Targaryen Stark Targaryen
Nota 4.20 2.30 0.63 0.82
# CROSSTAB
#datasummary_crosstab(species ~ sex, data = dados)

#Counts and Percentages
#datasummary(species * sex + 1 ~ N + Percent(), data = penguins)