“Chamar um estatístico depois que o experimento foi feito é o mesmo que pedir a ele que faça um exame post-mortem – talvez ele consiga dizer do que o experimento morreu”.

Ronald Fischer

Estatística descritiva

A estatística descritiva é a parte da estatística que trata da organização e descrição dos dados e nos ajuda a descrever e compreender as características de um conjunto de dados específico, fornecendo pequenos resumos sobre a amostra e as medidas desses dados. 

As características de interesse, que chamaremos de variáveis, podem ser do tipo qualitativas ou quantitativas.

A variável qualitativa resulta de uma classificação por tipos ou atributos, enquanto a variável quantitativa é expressa em números.

Figura 1: Classificação de uma variável

Distribuições de frequência

A distribuição de frequência é uma ferramenta usada para resumir e entender um conjunto de dados, especialmente quando estamos lidando com grandes quantidades de valores.

Vamos usar o conjunto de dados hipotético de Morettin (2017), do livro Estatística básica1 para ilustrar a construção de uma tabela de frequência:

Tabela 1: Informações sobre estado civil, grau de instrução, número de filhos, salário (expresso como fração do salário mínimo), idade (medida em anos e meses) e procedência de 36 empregados da seção de orçamentos da Companhia MB.
N estado_civil grau_instrucao n_filhos salario idade_anos idade_meses reg_procedencia
1 solteiro ensino fundamental NA 4.00 26 3 interior
2 casado ensino fundamental 1 4.56 32 10 capital
3 casado ensino fundamental 2 5.25 36 5 capital
4 solteiro ensino médio NA 5.73 20 10 outra
5 solteiro ensino fundamental NA 6.26 40 7 outra
6 casado ensino fundamental 0 6.66 28 0 interior
7 solteiro ensino fundamental NA 6.86 41 0 interior
8 solteiro ensino fundamental NA 7.39 43 4 capital
9 casado ensino médio 1 7.59 34 10 capital
10 solteiro ensino médio NA 7.44 23 6 outra
11 casado ensino médio 2 8.12 33 6 interior
12 solteiro ensino fundamental NA 8.46 27 11 capital
13 solteiro ensino médio NA 8.74 37 5 outra
14 casado ensino fundamental 3 8.95 44 2 outra
15 casado ensino médio 0 9.13 30 5 interior
16 solteiro ensino médio NA 9.35 38 8 outra
17 casado ensino médio 1 9.77 31 7 capital
18 casado ensino fundamental 2 9.80 39 7 outra
19 solteiro superior NA 10.53 25 8 interior
20 solteiro ensino médio NA 10.76 37 4 interior
21 casado ensino médio 1 11.06 30 9 outra
22 solteiro ensino médio NA 11.59 34 2 capital
23 solteiro ensino fundamental NA 12.00 41 0 outra
24 casado superior 0 12.79 26 1 outra
25 casado ensino médio 2 13.23 32 5 interior
26 casado ensino médio 2 13.60 35 0 outra
27 solteiro ensino fundamental NA 13.85 46 7 outra
28 casado ensino médio 0 14.69 29 8 interior
29 casado ensino médio 5 14.71 40 6 interior
30 casado ensino médio 2 15.99 35 10 capital
31 solteiro superior NA 16.22 31 5 outra
32 casado ensino médio 1 16.61 36 4 interior
33 casado superior 3 17.26 43 7 capital
34 solteiro superior NA 18.75 33 7 capital
35 casado ensino médio 2 19.40 48 11 capital
36 casado superior 3 23.30 42 2 interior

A Tabela 1 contém dados de variáves qualitativas e quantitativas. Podemos construir uma tabela de frequência para a variável qualitativa nominal estado_civil.

Tabela 2: Estado civil de 36 empregados da seção de orçamentos da companhia MB.
Estado civil \[ f_i \] \[ f_r \] \[ f_r \% \]
Casado 20 0,5556 55,56
Solteiro 16 0,4444 44,44
Total 36 1,0000 100,00

Podemos observar facilmente que 20 empregados são casados e 16 são solteiros, analisando a frequência simples das categorias da variável Estado civil, representada por \(f_i\) na Tabela 2.

É bastante interessante observar essas mesmas informações em termos de percentuais, então temos a frequência relativa expressa em percentual. Para calcular o percentual de empregados casados, basta fazer \(20/(20+16)*100\).

O mesmo pode ser feito para a variável qualitativa ordinal grau_instrução, como na Tabela 3.

Tabela 3: Grau de instrução de 36 empregados da seção de orçamentos da companhia MB.
Grau de instrução Frequência Proporção Percentual
Ensino Fundamental 12 0.3333 33.33
Ensino Médio 18 0.5000 50.00
Ensino Superior 6 0.1667 16.67

Neste ponto iremos começar a praticar em R. O primeiro passo é ler o conjunto de dados, que deve ser do tipo .txt, .csv ,.xlsou .xlsx. Há outras extensões, mas iremos utilizar o formato .txt, pois acredito ser o mais simples. Primeiro é preciso copiar os dados abaixo para o bloco de notas e salvar com um nome qualquer. Não precisa se preocupar em alterar o conteúdo. Na verdade, é recomendado que não o faça.

N;estado_civil;grau_instrucao;n_filhos;salario;idade_anos;idade_meses;reg_procedencia 1;solteiro;ensino fundamental;;4,00;26;3;interior 2;casado;ensino fundamental;1;4,56;32;10;capital 3;casado;ensino fundamental;2;5,25;36;5;capital 4;solteiro;ensino médio;;5,73;20;10;outra 5;solteiro;ensino fundamental;;6,26;40;7;outra 6;casado;ensino fundamental;0;6,66;28;0;interior 7;solteiro;ensino fundamental;;6,86;41;0;interior 8;solteiro;ensino fundamental;;7,39;43;4;capital 9;casado;ensino médio;1;7,59;34;10;capital 10;solteiro;ensino médio;;7,44;23;6;outra 11;casado;ensino médio;2;8,12;33;6;interior 12;solteiro;ensino fundamental;;8,46;27;11;capital 13;solteiro;ensino médio;;8,74;37;5;outra 14;casado;ensino fundamental;3;8,95;44;2;outra 15;casado;ensino médio;0;9,13;30;5;interior 16;solteiro;ensino médio;;9,35;38;8;outra 17;casado;ensino médio;1;9,77;31;7;capital 18;casado;ensino fundamental;2;9,80;39;7;outra 19;solteiro;superior;;10,53;25;8;interior 20;solteiro;ensino médio;;10,76;37;4;interior 21;casado;ensino médio;1;11,06;30;9;outra 22;solteiro;ensino médio;;11,59;34;2;capital 23;solteiro;ensino fundamental;;12,00;41;0;outra 24;casado;superior;0;12,79;26;1;outra 25;casado;ensino médio;2;13,23;32;5;interior 26;casado;ensino médio;2;13,60;35;0;outra 27;solteiro;ensino fundamental;;13,85;46;7;outra 28;casado;ensino médio;0;14,69;29;8;interior 29;casado;ensino médio;5;14,71;40;6;interior 30;casado;ensino médio;2;15,99;35;10;capital 31;solteiro;superior;;16,22;31;5;outra 32;casado;ensino médio;1;16,61;36;4;interior 33;casado;superior;3;17,26;43;7;capital 34;solteiro;superior;;18,75;33;7;capital 35;casado;ensino médio;2;19,40;48;11;capital 36;casado;superior;3;23,30;42;2;interior

Chamei meu arquivo de dados1.txt. Há mais de uma função para lê-lo no R, aqui usaremos read.table e será armazenado no objeto dados. Existem alguns argumentos que devem ser declarados na função:

Assim, para ler os dados no R, utilizaremos o comando:

dados <- read.table("dados1.txt", header = TRUE,
                    sep = ";", dec = ",")

Antes de qualquer coisa, é preciso analisar a estrutura dos dados e, para isso, podemos usar a função:

str(dados)
## 'data.frame':    36 obs. of  8 variables:
##  $ N              : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ estado_civil   : chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ grau_instrucao : chr  "Ensino Fundamental" "Ensino Fundamental" "Ensino Fundamental" "Ensino Médio" ...
##  $ n_filhos       : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ salario        : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ idade_anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ idade_meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ reg_procedencia: chr  "interior" "capital" "capital" "outra" ...

Com essa função é possível ver que o conjunto de dados é do tipo data.frame, com 36 observações (número de linhas) e 8 variáveis (colunas). As variáveis são do tipo integer, character e numeric.

Outras funções úteis são:

names(dados)
## [1] "N"               "estado_civil"    "grau_instrucao"  "n_filhos"       
## [5] "salario"         "idade_anos"      "idade_meses"     "reg_procedencia"
head(dados)
##   N estado_civil     grau_instrucao n_filhos salario idade_anos idade_meses
## 1 1     solteiro Ensino Fundamental       NA    4.00         26           3
## 2 2       casado Ensino Fundamental        1    4.56         32          10
## 3 3       casado Ensino Fundamental        2    5.25         36           5
## 4 4     solteiro       Ensino Médio       NA    5.73         20          10
## 5 5     solteiro Ensino Fundamental       NA    6.26         40           7
## 6 6       casado Ensino Fundamental        0    6.66         28           0
##   reg_procedencia
## 1        interior
## 2         capital
## 3         capital
## 4           outra
## 5           outra
## 6        interior
tail(dados)
##     N estado_civil  grau_instrucao n_filhos salario idade_anos idade_meses
## 31 31     solteiro Ensino Superior       NA   16.22         31           5
## 32 32       casado    Ensino Médio        1   16.61         36           4
## 33 33       casado Ensino Superior        3   17.26         43           7
## 34 34     solteiro Ensino Superior       NA   18.75         33           7
## 35 35       casado    Ensino Médio        2   19.40         48          11
## 36 36       casado Ensino Superior        3   23.30         42           2
##    reg_procedencia
## 31           outra
## 32        interior
## 33         capital
## 34         capital
## 35         capital
## 36        interior

Para ver o nome das variáveis, foi usado names;as funções head e tail, mostram as 6 primeiras linhas e 6 últimas colunas do conjunto de dados, respectivamente.

Certificar-se de que o conjunto de dados lido tem a estrutura esperada evita que seja preciso voltar para corrigir variáveis que deveriam ser do tipo numeric mas não são lidas como tal, por exemplo.

Dados faltantes

Muitas vezes encontramos conjuntos de dados com valores faltantes por uma ou outra razão. O R indica um valor faltante como NA (Not Available ou Indisponível).

Veja o que acontece quando você tenta calcular a média para o número de filhos do nosso conjunto de dados:

mean(dados$n_filhos)
## [1] NA

Para encontrar a média, é preciso remover os NAs antes de calcular:

mean(dados$n_filhos, na.rm = TRUE)
## [1] 1.65

Então o rmem na.rm significa “remover” e =TRUE significa “faça isso”. Caso algum dia você tenha que verificar se há ou quais são os dados faltantes em um objeto, a função is.na() fará isso por você:

is.na(dados$n_filhos)
##  [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE
## [13]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
## [25] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE

Fatores

Em R, um fator é um tipo de objeto de dados utilizado para representar variáveis nominais ( também chamadas de categóricas). Ele é uma forma de armazenar dados discretos e finitos, onde os valores possíveis são pré-definidos e não numéricos. Fatores são frequentemente usados para representar categorias, níveis ou grupos em um conjunto de dados.

Vejamos um exemplo do livro Estatística Básica para Leigos, de Schmuller (2017): Suponha que estejamos fazendo uma pesquisa sobre a cor dos olhos das pessoas. Quando registramos a cor do olho de alguém, registramos um número: 1 = amber (âmbar), 2 = blue (azul), 3 = brown (castanho), 4 = gray (acinzentado), 5 = green (verde) e 6 = hazel (mel). Uma maneira de pensar nesse processo é considerar que a cor do olho é um fator e cada cor é um nível desse fator. Então, nesse caso, o fator cor de olho tem seis níveis.

Agora imagine que você tenha usado o código numérico para tabular as cores dos olhos de 14 pessoas e transformou esses códigos em um vetor:

 eye_color <-c(2,2,4,1,5,5,5,6,1,3,6,3,1,4)

Em seguid, usou a função factor() para transformar eye_colorem um fator:

feye_color <- factor(eye_color)

Finalmente, atribuiu níveis ao fator:

levels(feye_color) <-c("amber","blue", "brown","gray","green","hazel")

Agora, se examinarmos os dados de cores dos olhos em termos de níveis de fatores, eles se parecerão com o seguinte:

feye_color
##  [1] blue  blue  gray  amber green green green hazel amber brown hazel brown
## [13] amber gray 
## Levels: amber blue brown gray green hazel

Extraindo dados de um data frame

Suponha que você queira fazer uma verificação rápida da média de idade das pessoas solteiras em comparação com pessoas casadas.

Podemos extrair as idades para cada nível do fator estado_civil e criar vetores:

solteiros <- dados$idade_anos[dados$estado_civil=="solteiro"]
casados <- dados$idade_anos[dados$estado_civil=="casado"]

Observe o sinal de igual duplo == entre os colchetes. É um operador lógico. Pense nele como “se dados$estado_civil for igual a solteiro”.

O sinal de igual duplo a==b distingue o operador lógico (“se a for igual a b”) do operador de atribuição (a=b; “defina a igual a b”).

O vetor de médias será:

medias <-c(mean(solteiros),mean(casados))

Já temos os resultados, mas podemos melhorar a organização:

est.civil <- c("solteiros", "casados")
contagem <- c(length(solteiros),length(casados))

Abaixo temos um data frame de três colunas, com estado civil em uma coluna, a média de idade correspondente na segunda e a contagem de cada nível da variável estado civil na última coluna:

media.idade <- data.frame(est.civil   = est.civil,
                          media.idade = medias,
                          n = contagem)

Depois de organizado, temos:

media.idade
##   est.civil media.idade  n
## 1 solteiros      33.875 16
## 2   casados      35.150 20

A função aggregate economiza linhas de comando se estivermos interessados em obter as médias de idade da variáve estado civil.

media.idade2 <- aggregate(data=dados, 
                          cbind(idade_anos) ~ estado_civil, 
                          FUN = mean)

 Essa função agrega as informações de um dataframe, incluindo alguma função que é especificada por um parâmetro chamado FUN. Como queremos a média, usamos a função sum.

media.idade2
##   estado_civil idade_anos
## 1       casado     35.150
## 2     solteiro     33.875

Podemos agregar a variável grau de instrução utilizando o sinal +:

media.idade3 <- aggregate(data=dados, 
                          cbind(idade_anos) ~ estado_civil +
                            grau_instrucao,FUN = mean)

Então é possível saber a média de idade de índivíduos casados e solteiros, segundo o grau de instrução.

media.idade3
##   estado_civil     grau_instrucao idade_anos
## 1       casado Ensino Fundamental   35.80000
## 2     solteiro Ensino Fundamental   37.71429
## 3       casado       Ensino Médio   34.41667
## 4     solteiro       Ensino Médio   31.50000
## 5       casado    Ensino Superior   37.00000
## 6     solteiro    Ensino Superior   29.66667

Gráficos

Um gráfico é uma representação visual de dados ou informações que ajuda a transmitir padrões, tendências, relações e comparações de forma mais clara e compreensível. Podemos verificar o padrão da distribuição do salário dos empregados da Companhia MB fazendo um histograma de frequência.

hist(dados$salario)

É intressante melhorar a aparrência desse gráfico, e faremos isso modificando as argumentos da função.

hist(dados$salario,
     main="Salário dos empregados da Companhia MB",
     ylab="Salário (em salários mínimos)",
     col = "turquoise3")

Outra maneira de mostrar as informações do histograma é pensar nos dados como probabilidades, em vez de frequências. Então, em vez da frequência de uma faixa de salários específica, colocamos no gráfico a probabilidade de que um salário daquela faixa seja selecionado nos dados. Para isso, adicione probability = TRUE . Então temos um gráfico de densidade.

Um gráfico de densidade, também conhecido como gráfico de distribuição de densidade, é uma representação visual da distribuição de probabilidade de um conjunto de dados contínuos. Ele mostra como os valores dos dados estão distribuídos ao longo de um intervalo contínuo e ajuda a identificar padrões, picos, assimetrias e outros aspectos da distribuição dos dados.

Esse tipo de gráfico é especialmente útil quando se deseja entender a forma da distribuição de dados e obter insights sobre a concentração de valores em diferentes partes do intervalo. Ele é particularmente eficaz para comparar diferentes distribuições e analisar a sobreposição entre elas.

Um gráfico de densidade geralmente consiste em uma curva suave que traça a densidade de probabilidade em relação aos valores dos dados. A área sob a curva representa a probabilidade total de ocorrência dos dados dentro do intervalo.

Depois de criar o gráfico, é possível usar uma função adicional chamada lines()para adicionar uma linha ao gráfico de densidade:

hist(dados$salario,
     main="Salário dos empregados da Companhia MB",
     xlab="Salário (em saláios mínimos)",
     ylab = "Densidade",
     col = "orchid3",
     probability = TRUE)
lines(density(dados$salario), lty=2, col= "darkgreen", lwd=2 )

Perceba que a função linestambém possui argumentos: lty é o tipo, col é a cor e lwd, a espessura da linha.

Ao criar um histograma, R calcula qual é o melhor número de colunas para uma boa aparência. Aqui, R decidiu que 10 é um bom número. É possível variar o número de colunas adicionando um argumento chamado breaks e declarando seu valor.

R nem sempre lhe dá o valor a ser atribuído, mas fornece algo próximo e tenta manter uma boa aparência. Adicione esse argumento, declare seu valor (breaks =4, por exemplo) e entenderá o que quero dizer.

Sugiro que modifique também os demais argumentos e verifique aqueles que não foram utilizados aqui.

Morettin, Wilton O, Pedro A e Bussab. 2017. Estatı́stica básica. Saraiva Educação SA.
Schmuller, Joseph. 2017. Statistical Analysis with r for Dummies. John Wiley & Sons.

  1. Este texto faz parte de notas de aula, cujos livros-textos serão frequentemente reproduzidos e, algumas vezes adaptados. As referências são citadas acima.↩︎