Estrutura de Dados e Funções Estatísticas no R

EST212 - Bioestatística

Helgem de Souza

Introdução

Antes de iniciar nossa aula:

  1. Abra o RStudio.

  2. Crie um novo script.

  3. Crie uma pasta na área de trabalho com seu nome.

  4. Salve o script criado na pasta com o nome "aula2_est212.R".

Estruturas de Dados em R

  • Na Estatística, a fonte de informação são os dados.

  • Para realizar as análises no R, é necessário incluir os dados de alguma forma no software.

  • Entretanto, existe uma lógica na entrada dos dados. É necessário incluí-los conforme uma estrutura.

  • Essas estruturas são variáveis conforme a natureza dos dados e dos problemas em estudo.

  • As principais estruturas de dados em R, e as que mais utilizaremos, são vetores e data frames.

Vetores

  • Um vetor nada mais é do que uma lista de elementos de mesma natureza.

  • Essa lista de elementos define uma estrutura na qual podem ser aplicados operadores e funções de forma conjunta.

  • Essa estrutura facilita a operação com conjuntos de dados de mesma natureza.

  • Em R, definimos um vetor utilizando a função c(). Os elementos devem ser listados dentro da função e separados por vírgula.

  • Assim como as demais variáveis, atribuímos os valores do vetor usando o operador <- . Vejamos o exemplo a seguir. Vamos listar 5 alturas e definir um vetor chamado alturas:

#Vamos definir um vetor com as alturas de 5 pessoas
alturas <- c(1.75, 1.88, 1.55, 1.64, 1.72)

#Imprimindo o vetor de alturas
alturas
[1] 1.75 1.88 1.55 1.64 1.72

Vetores

Do mesmo modo, podemos definir vetores de outros tipos de variáveis, como textos, números inteiros, valores lógicos e fatores.

#Vetor de texto atribuído à variável "nomes"
nomes <- c("Ana", "Paulo", "Letícia", "Francisco", "Pedro")

#Impressão do vetor "nomes"
nomes
[1] "Ana"       "Paulo"     "Letícia"   "Francisco" "Pedro"    
#Vetor de números ímpares, àtribuido à variável "valores"
valores <- c(1, 3, 5, 7, 9)

#Impressão do vetor "valores"
valores
[1] 1 3 5 7 9
# Vetor com número e texto
teste <- c(1.75, "arvore" , 3.7, "casa")

#Impressão do vetor de teste
teste
[1] "1.75"   "arvore" "3.7"    "casa"  

Note que o R converteu todos os valores para texto.

Operações com vetores

  • A grande utilidade dos vetores é a operação com diversos dados ao mesmo tempo;

  • Ao se aplicar operações a vetores, geralmente elas são aplicadas a cada elemento;

  • Podemos aplicar as funções diretamente no vetor, ou na variável atribuída ao vetor.

  • Podemos salvar o resultado das operações em novas variáveis.

  • Vejamos exemplos a seguir.

Operações com vetores

Por exemplo, se utilizarmos a função sqrt() em um vetor, ela aplicará a função a cada elemento:

#Raiz quadrada de um vetor
sqrt(c(1, 4, 9, 16, 25))
[1] 1 2 3 4 5
#Mesma operação, atribuindo o vetor à variável n
n <- c(1, 4, 9, 16, 25)
sqrt(n)
[1] 1 2 3 4 5
#Atribuindo o resultado a uma variável
raiz_n <- sqrt(n)
  • Vamos agora elevar os valores da variável raiz_n ao quadrado:
#Elevando os valores ao quadrado
raiz_n^2
[1]  1  4  9 16 25

Note que em todos os casos, a função foi aplicada a cada valor.

Operações com vetores

Do mesmo modo, podemos aplicar operações com mais de um vetor. Vejamos alguns exemplos:

#Vetor de números ímpares
impares <- c(1, 3, 5, 7, 9)

#Vetor de números ímpares
pares <- c(2, 4, 6, 8, 10)

#Somar os dois vetores
impares + pares
[1]  3  7 11 15 19
#Subtrair os dois vetores
impares - pares
[1] -1 -1 -1 -1 -1
#Multiplicar os dois vetores
impares * pares
[1]  2 12 30 56 90
#Dividir os dois vetores
impares / pares
[1] 0.5000000 0.7500000 0.8333333 0.8750000 0.9000000
  • Perceba que os valores foram calculados termo a termo.

  • Agora vamos aprender a estrutura de dados que mais utilizaremos, o Data frame

Data Frame

  • Como vimos, vetores são ótimos para armazenar elementos, mas trabalham de forma isolada.

  • Entretanto, geralmente os dados são organizados em tabelas:

    Id Nome Idade Sexo
    1 Pedro 22 M
    2 Maria 19 F
    3 João 17 M
    4 Ana 25 F
    5 Beatriz 24 F
  • Perceba que cada coluna poderia ser representada como um vetor:

    id <- c(1, 2, 3, 4, 5)
    nome <- c("Pedro", "Maria", "João", "Ana", "Beatriz")
    idade <- c(22, 19, 17, 25, 24)
    sexo <- c("M", "F", "M", "F", "F")

Data Frame

  • Porém, gostaríamos de criar uma tabela que concatenasse os dados.

  • Para isso usamos a função data.frame().

  • Um data frame, cuja tradução literal seria quadro de dados, representará exatamente essa tabela:

#Variáveis isoladas
id <- c(1, 2, 3, 4, 5)
nome <- c("Pedro", "Maria", "João", "Ana", "Beatriz")
idade <- c(22, 19, 17, 25, 24)
sexo <- c("M", "F", "M", "F", "F")

#Variáveis organizadas em um dataframe
alunos <- data.frame(id, nome, idade, sexo)

#Impressão do dataframe
alunos
  id    nome idade sexo
1  1   Pedro    22    M
2  2   Maria    19    F
3  3    João    17    M
4  4     Ana    25    F
5  5 Beatriz    24    F
  • Agora todas as variáveis estão organizadas em uma tabela chamada alunos.

Data Frame

  • O Data frame nada mais é do que uma coleção de vetores, organizados em colunas.

  • Podemos acessar os vetores individualmente utilizando o caractere cifrão ($). Ou seja, podemos acessar cada coluna individualmente.

  • Logo, nosso data frame alunos é composto 4 variáveis (ou colunas): id, nome, idade e sexo. Vejamos como acessá-las individualmente.

Data Frame

Acesso à cada vetor de forma individual

#Data frame completo
alunos
  id    nome idade sexo
1  1   Pedro    22    M
2  2   Maria    19    F
3  3    João    17    M
4  4     Ana    25    F
5  5 Beatriz    24    F
#Acesso a cada vetor separadamente
alunos$id
[1] 1 2 3 4 5
alunos$nome
[1] "Pedro"   "Maria"   "João"    "Ana"     "Beatriz"
alunos$idade
[1] 22 19 17 25 24
alunos$sexo
[1] "M" "F" "M" "F" "F"

Data Frame

  • Assim, um data frame compõe o que chamamos de conjunto de dados:

    • cada coluna representa uma variável

    • cada linha representa um indivíduo

  • Podemos verificar um resumo dos dados por meio da função str():

#Verificando a estrutura dos dados
str(alunos)
'data.frame':   5 obs. of  4 variables:
 $ id   : num  1 2 3 4 5
 $ nome : chr  "Pedro" "Maria" "João" "Ana" ...
 $ idade: num  22 19 17 25 24
 $ sexo : chr  "M" "F" "M" "F" ...
  • Note que nosso conjunto de dados contém 5 observações de 4 variáveis. as variáveis id e idade são numéricas, enquanto nome e sexo são caracteres.

Prática - Vetores e Data Frames

A tabela a seguir apresenta dados de pacientes, com respectivos peso e altura

Altura (m) Peso (cm)
1,70 60
1,68 68
1,75 85
1,68 67
1,65 68
1,80 102
  • Vamos criar um data frame no RStudio com esses dados. A base de dados se chamará pacientes.

  • Após isso, vamos usar os dados pra criar a variável IMC (peso dividido pelo quadrado da altura)

Prática - Vetores e Data Frames

#Criação do vetor altura
altura <- c(1.7, 1.68, 1.75, 1.68, 1.65, 1.8)

#Criação do vetor peso
peso <- c(60, 68, 85, 67, 68, 102)

#Criação do data frame
pacientes <- data.frame(altura, peso)

#Impressão do data frame
pacientes
  altura peso
1   1.70   60
2   1.68   68
3   1.75   85
4   1.68   67
5   1.65   68
6   1.80  102
#Criação da variável IMC
imc <- pacientes$peso / pacientes$altura^2
imc
[1] 20.76125 24.09297 27.75510 23.73866 24.97704 31.48148

Prática - Vetores e Data Frames

  • E se quisermos incorporar o IMC ao nosso banco de dados?

  • Basta usar novamente o operador cifrão e atribuir uma nova variável ao data frame.

  • Ao utilizar o cifrão, o software entenderá que estamos atribuindo a variável ao data frame.

Prática - Vetores e Data Frames

#Impressão do data frame original
pacientes
  altura peso
1   1.70   60
2   1.68   68
3   1.75   85
4   1.68   67
5   1.65   68
6   1.80  102
#Atribuição da variável IMC ao data frame
pacientes$imc <- pacientes$peso / pacientes$altura^2

#Impressão do data frame após inclusão
pacientes
  altura peso      imc
1   1.70   60 20.76125
2   1.68   68 24.09297
3   1.75   85 27.75510
4   1.68   67 23.73866
5   1.65   68 24.97704
6   1.80  102 31.48148

Leitura de arquivos externos

  • Conforme vimos, os data frames são estruturas úteis para a criação de banco de dados;

  • Entretanto, muitas vezes as bases de dados são grandes demais para serem digitadas.

  • Outras vezes, podemos receber dados externos de outras fontes:

    • Pesquisadores externos

    • Fontes de informação oficiais (SUS, IBGE, ICMBio, etc)

    • Dados de questionários

    • Estudos anteriores, dentre outras possibilidades.

  • Para casos como esse, o R permite a leitura de arquivos externos

Leitura de arquivos externos

  • O R é capaz de ler documentos de diversos formatos.

  • Entretanto nessa disciplina focaremos apenas em um tipo, o CSV.

  • Arquivos CSV são planilhas no estilo Excel, cujos dados são separados por vírgula.

  • No Moodle está disponível um arquivo chamado Bacalhau.csv. Salve-o na pasta que criamos no início da aula.

Leitura de arquivos externos

  • Antes de efetuarmos a leitura do arquivo, precisamos informar ao R em que local ele está armazenado.

  • Quando trabalhamos com o R, é importante organizarmos os arquivos de um projeto em um lugar de fácil acesso e que todos os arquivos relacionados estejam em um só lugar.

  • Esse lugar é chamado diretório de trabalho.

  • Vamos definir a pasta que criamos no início da aula como nosso diretório de trabalho.

Leitura de arquivos externos

Para definir o diretório de trabalho, siga o caminho Session -> Set Working Directory -> Choose Directory...

  • Escolha a pasta em que está trabalhando. No nosso caso, a pasta criada no início da aula.
  • Agora o R sabe onde estão salvos nossos arquivos e onde salvaremos novos arquivos.

Leitura de arquivos externos

  • Para ler nosso arquivo para o R, usaremos as funções read.csv() e read.csv2().

  • Essas funções efetuam a leitura de arquivos no formato CSV para o ambiente do R.

  • Usamos read.csv() quando os dados são separados por vírgula (,);

  • Usamos read.csv2() quando os dados são separados por ponto e vírgula (;);

  • Para isso, basta informarmos o nome do arquivo como parâmetro da função, entre aspas.

  • Vamos efetuar a leitura do arquivo Bacalhau.csv.

Leitura de arquivos externos

  • Leitura do arquivo Bacalhau.csv para o R
#Vamos informar o nome do arquivo a ser lido dentro da função
read.csv("Bacalhau.csv")
   Bacalhau.Area.Idade.Sexo.Peso.Compr.Estagio.Tripanosomas
1                      1;Mageroya;6;Fêmea;1548;59;Imaturo;1
2                        2;Soroya;4;Fêmea;1382;51;Imaturo;0
3                         3;Soroya;5;Macho;4336;76;Maduro;3
4                  4;Varangerfjord;4;Fêmea;986;48;Imaturo;0
5                      5;Mageroya;6;Macho;4292;77;Imaturo;0
6                      6;Mageroya;5;Fêmea;1746;56;Imaturo;0
7                         7;Soroya;8;Fêmea;6934;93;Maduro;0
8                  8;Varangerfjord;1;Fêmea;130;26;Imaturo;0
9                      9;Tanafjord;7;Macho;2900;75;Maduro;0
10                       10;Soroya;6;Fêmea;3948;72;Maduro;0
11                11;Varangerfjord;8;Macho;2814;66;Maduro;0
12                   12;Tanafjord;10;Macho;8426;92;Maduro;0
13                13;Varangerfjord;4;Macho;760;44;Imaturo;4
14                14;Soroya;6;Macho;2404;61;Intermediário;2
15                    15;Tanafjord;2;Fêmea;240;31;Imaturo;0
16                    16;Tanafjord;6;Fêmea;3426;68;Maduro;0
17                    17;Mageroya;5;Macho;3888;71;Imaturo;0
18                     18;Mageroya;2;Fêmea;440;36;Imaturo;0
19              19;Mageroya;6;Fêmea;1316;49;Intermediário;0
20                   20;Tanafjord;3;Macho;1108;51;Imaturo;0
21                21;Soroya;5;Macho;1726;54;Intermediário;0
22                       22;Soroya;6;Fêmea;3042;69;Maduro;0
23                     23;Mageroya;3;Macho;968;49;Imaturo;2
24                    24;Mageroya;6;Macho;1608;54;Imaturo;0
25                   25;Tanafjord;6;Fêmea;1680;58;Imaturo;1
26                    26;Mageroya;6;Macho;2410;62;Imaturo;1
27              27;Tanafjord;2;Macho;178;28;Intermediário;0
28                   28;Tanafjord;4;Macho;1154;52;Imaturo;0
29                      29;Soroya;6;Macho;1824;57;Imaturo;0
30                      30;Soroya;4;Macho;1354;55;Imaturo;0
31                    31;Tanafjord;5;Macho;3412;74;Maduro;3
32                     32;Mageroya;3;Fêmea;844;45;Imaturo;0
33                    33;Tanafjord;3;Macho;612;40;Imaturo;0
34                     34;Mageroya;2;Macho;220;30;Imaturo;0
35                   35;Tanafjord;4;Macho;1522;55;Imaturo;0
36                36;Varangerfjord;3;Macho;794;44;Imaturo;0
37                37;Varangerfjord;3;Fêmea;554;40;Imaturo;2
38                38;Varangerfjord;7;Fêmea;6044;84;Maduro;1
39                       39;Soroya;7;Macho;3266;72;Maduro;0
40                    40;Tanafjord;3;Macho;544;38;Imaturo;0
41                41;Varangerfjord;6;Fêmea;4076;76;Maduro;2
42                      42;Soroya;5;Macho;2710;69;Imaturo;3
43                     43;Mageroya;4;Fêmea;982;47;Imaturo;0
44                      44;Soroya;6;Macho;1072;51;Imaturo;1
45             45;Tanafjord;6;Fêmea;2508;63;Intermediário;0
46                   46;Tanafjord;6;Macho;2280;62;Imaturo;0
47                    47;Mageroya;4;Fêmea;1276;53;Imaturo;1
48                      48;Soroya;3;Macho;1070;48;Imaturo;1
49                    49;Tanafjord;3;Fêmea;856;46;Imaturo;0
50                50;Soroya;7;Fêmea;2724;65;Intermediário;0
51                    51;Tanafjord;8;Fêmea;4130;73;Maduro;0
52             52;Tanafjord;6;Fêmea;4228;76;Intermediário;0
53             53;Tanafjord;5;Fêmea;3618;70;Intermediário;0
54                   54;Tanafjord;6;Fêmea;1346;55;Imaturo;0
  • Note que os dados estão separados por ponto e vírgula. Então devemos usar a função read.csv2()

Leitura de arquivos externos

Perceba que agora os dados foram lidos corretamente.

#Vamos usar a função read.csv2
read.csv2("Bacalhau.csv")
   Bacalhau          Area Idade  Sexo Peso Compr       Estagio Tripanosomas
1         1      Mageroya     6 Fêmea 1548    59       Imaturo            1
2         2        Soroya     4 Fêmea 1382    51       Imaturo            0
3         3        Soroya     5 Macho 4336    76        Maduro            3
4         4 Varangerfjord     4 Fêmea  986    48       Imaturo            0
5         5      Mageroya     6 Macho 4292    77       Imaturo            0
6         6      Mageroya     5 Fêmea 1746    56       Imaturo            0
7         7        Soroya     8 Fêmea 6934    93        Maduro            0
8         8 Varangerfjord     1 Fêmea  130    26       Imaturo            0
9         9     Tanafjord     7 Macho 2900    75        Maduro            0
10       10        Soroya     6 Fêmea 3948    72        Maduro            0
11       11 Varangerfjord     8 Macho 2814    66        Maduro            0
12       12     Tanafjord    10 Macho 8426    92        Maduro            0
13       13 Varangerfjord     4 Macho  760    44       Imaturo            4
14       14        Soroya     6 Macho 2404    61 Intermediário            2
15       15     Tanafjord     2 Fêmea  240    31       Imaturo            0
16       16     Tanafjord     6 Fêmea 3426    68        Maduro            0
17       17      Mageroya     5 Macho 3888    71       Imaturo            0
18       18      Mageroya     2 Fêmea  440    36       Imaturo            0
19       19      Mageroya     6 Fêmea 1316    49 Intermediário            0
20       20     Tanafjord     3 Macho 1108    51       Imaturo            0
21       21        Soroya     5 Macho 1726    54 Intermediário            0
22       22        Soroya     6 Fêmea 3042    69        Maduro            0
23       23      Mageroya     3 Macho  968    49       Imaturo            2
24       24      Mageroya     6 Macho 1608    54       Imaturo            0
25       25     Tanafjord     6 Fêmea 1680    58       Imaturo            1
26       26      Mageroya     6 Macho 2410    62       Imaturo            1
27       27     Tanafjord     2 Macho  178    28 Intermediário            0
28       28     Tanafjord     4 Macho 1154    52       Imaturo            0
29       29        Soroya     6 Macho 1824    57       Imaturo            0
30       30        Soroya     4 Macho 1354    55       Imaturo            0
31       31     Tanafjord     5 Macho 3412    74        Maduro            3
32       32      Mageroya     3 Fêmea  844    45       Imaturo            0
33       33     Tanafjord     3 Macho  612    40       Imaturo            0
34       34      Mageroya     2 Macho  220    30       Imaturo            0
35       35     Tanafjord     4 Macho 1522    55       Imaturo            0
36       36 Varangerfjord     3 Macho  794    44       Imaturo            0
37       37 Varangerfjord     3 Fêmea  554    40       Imaturo            2
38       38 Varangerfjord     7 Fêmea 6044    84        Maduro            1
39       39        Soroya     7 Macho 3266    72        Maduro            0
40       40     Tanafjord     3 Macho  544    38       Imaturo            0
41       41 Varangerfjord     6 Fêmea 4076    76        Maduro            2
42       42        Soroya     5 Macho 2710    69       Imaturo            3
43       43      Mageroya     4 Fêmea  982    47       Imaturo            0
44       44        Soroya     6 Macho 1072    51       Imaturo            1
45       45     Tanafjord     6 Fêmea 2508    63 Intermediário            0
46       46     Tanafjord     6 Macho 2280    62       Imaturo            0
47       47      Mageroya     4 Fêmea 1276    53       Imaturo            1
48       48        Soroya     3 Macho 1070    48       Imaturo            1
49       49     Tanafjord     3 Fêmea  856    46       Imaturo            0
50       50        Soroya     7 Fêmea 2724    65 Intermediário            0
51       51     Tanafjord     8 Fêmea 4130    73        Maduro            0
52       52     Tanafjord     6 Fêmea 4228    76 Intermediário            0
53       53     Tanafjord     5 Fêmea 3618    70 Intermediário            0
54       54     Tanafjord     6 Fêmea 1346    55       Imaturo            0

Leitura de arquivos externos

  • Efetuamos a leitura do arquivo, mas apenas imprimimos o banco de dados em tela. Precisamos salvá-lo para uso posterior.

  • Para isso, basta atribuir o resultado da leitura a um objeto, assim como fazemos com vetores.

  • Vamos salvar os dados no objeto bacalhau:

#Atribuindo os dados ao objeto bacalhau
bacalhau <- read.csv2("Bacalhau.csv")
  • Note que o objeto está salvo e é formado por 8 vetores e 54 linhas:
#Uso da função str para exibir os atributos do data frame
str(bacalhau)
'data.frame':   54 obs. of  8 variables:
 $ Bacalhau    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Area        : chr  "Mageroya" "Soroya" "Soroya" "Varangerfjord" ...
 $ Idade       : int  6 4 5 4 6 5 8 1 7 6 ...
 $ Sexo        : chr  "Fêmea" "Fêmea" "Macho" "Fêmea" ...
 $ Peso        : int  1548 1382 4336 986 4292 1746 6934 130 2900 3948 ...
 $ Compr       : int  59 51 76 48 77 56 93 26 75 72 ...
 $ Estagio     : chr  "Imaturo" "Imaturo" "Maduro" "Imaturo" ...
 $ Tripanosomas: int  1 0 3 0 0 0 0 0 0 0 ...

Leitura de arquivos externos

  • Agora que o arquivo foi importado e salvo, podemos usar seus dados em análises.

  • Utilizaremos bastante essa rotina de importação em nossas aulas. Por isso é muito importante que o processo esteja bem claro a todos.

  • Agora que sabemos os principais modos de ingressar com dados no R, vamos começar a trabalhar algumas análises estatísticas básicas.

Análises estatísticas com o R

  • Como já foi visto, o R é focado principalmente em análise estatística

  • As principais funções estatísticas são as seguintes:

  • Soma: sum()

  • Média: mean()

  • Variância: var()

  • Mediana: median()

  • Desvio Padrão: sd()

  • Valor mínimo: min()

  • Valor máximo: max()

  • Amplitude: range()

  • Quantis: quantile(, probs)

  • Tabela de frequências: table()

  • Essas funções podem necessitar de parâmetros adicionais, como a função quantile().

  • Para acessar o detalhamento e os parêmetros de uma função, podemos usar o sinal de ? antes da função.

  • Vamos verificar a função quantile(), digitando no console ?quantile

Prática - Análises estatísticas com o R

Vamos utilizar o conjunto de dados bacalhau para fazer alguns exemplos:

  1. Some o peso de todos os bacalhaus ;

  2. Calcule a média, a mediana, a variância e o desvio padrão das idades dos bacalhaus;

  3. Qual o comprimento do menor bacalhau? E do maior?

  4. Faça uma tabela de frequência do número de bacalhaus de cada área?

Prática - Análises estatísticas com o R

Resolução dos exemplos

#Soma do peso dos bacalhaus
sum(bacalhau$Peso)
[1] 119656
#Média das idades
mean(bacalhau$Idade)
[1] 4.944444
#Mediana das idades
median(bacalhau$Idade)
[1] 5
#Variância das idades
var(bacalhau$Idade)
[1] 3.41195
#Desvio padrão das idades
sd(bacalhau$Idade)
[1] 1.847146

Prática - Análises estatísticas com o R

Resolução dos exemplos

# Comprimento do menor bacalhau
min(bacalhau$Compr)
[1] 26
# Comprimento do maior bacalhau
max(bacalhau$Compr)
[1] 93
#Tabela de frequências de bacalhaus por área
table(bacalhau$Area)

     Mageroya        Soroya     Tanafjord Varangerfjord 
           13            14            19             8 

Análises estatísticas com o R

  • Com essa aula, encerramos o tópico de introdução ao R;

  • No decorrer das aulas práticas, aprenderemos novas funcionalidades, como novas funções, geração de gráficos, uso de modelos, dentre outras.

  • Caso tenha alguma dúvida ou dificuldade nas noções básicas de R, retorne sempre às aulas 1 e 2 ou tire suas dúvidas com o professor ou monitor da disciplina.

Exercício prático 2

  1. Crie um script e salve com o nome atv2_est212

  2. Leia os dados do arquivo Bacalhau.csv;

  3. Calcule o Peso médio e o desvio padrão do Peso dos bacalhaus;

  4. Faça tabelas de frequência das variáveis Sexo e Estagio;

  5. Verifique qual o número máximo de Tripanosomas encontrado nos bacalhaus;

  6. Calcule o coeficiente de variação do Peso e do comprimento (Compr) dos bacalhaus. Lembrando que o coeficiente de variação é calculado da seguinte forma:

    \[ CV = \dfrac{\text{desvio padrão}}{\text{média}} \]