Capítulo 5 Sumarização dos dados

A análise exploratória envolve, além da visualização dos dados, a descrição das variáveis de natureza categórica ou contínuas por meio de algumas métricas específicas, conforme o tipo de variável.

No caso de variáveis categóricas, é comum se calcular os totais ou frequencias absolutas ou relativas (percentual) do número de casos em cada nível ou classe das variáveis, quando for o caso.

No caso de variáveis contínuas, a sumarização é normalmente feita com base em métricas de estimativas de ponto ou posição (média, mediana, moda, etc) ou de variabilidade/dispersão dos dados (variância, desvio padrão, etc). Veremos a seguir como obter algumas estatísticas sumário, condicionada ou não por níveis de variáveis categóricas, após importar e “arrumar” os dados no R no formato “tidy”.

5.1 Conjunto de dados

Continuemos com o conjunto de dados do levantamento de giberela e coleta de isolados do complexo de espécies F. graminearum coletados nos estados do RS e PR, assim como o subconjunto survey_rs, com os dados apenas para o RS.

library(readr)
survey2 <- read_csv ("data/survey2.csv")

library(dplyr)
survey_rs <- filter(survey2, state == "RS")

5.2 Dados categóricos

Para dados categóricos, as funções table e prop.table são muito úteis para sumarizar a frequencia (contagem) de registros. Vamos analisar o conjunto survey2 e contar o número de isolados (cada linha do data frame é um isolado) para uma única variável ou duas variáveis cruzadas, a chamada “tabela de contingência”.

# a função attach "libera" as variáveis do data frame
attach(survey2) 

# Número de isolados por ano 
table(year)
## year
## 2009 2010 2011 
##  270  216  185
# Número de isolados por ano e estado
tab <- table (state, year)
tab
##      year
## state 2009 2010 2011
##    PR  123    0   93
##    RS  147  216   92
str(tab)
##  'table' int [1:2, 1:3] 123 147 0 216 93 92
##  - attr(*, "dimnames")=List of 2
##   ..$ state: chr [1:2] "PR" "RS"
##   ..$ year : chr [1:3] "2009" "2010" "2011"
# podemos transformar a tabela em um dataframe
tab <- table(state, year)
data.frame(tab)
##   state year Freq
## 1    PR 2009  123
## 2    RS 2009  147
## 3    PR 2010    0
## 4    RS 2010  216
## 5    PR 2011   93
## 6    RS 2011   92
# Sumariza os casos em proporção
round((prop.table(tab)*100),1) # casos em proporção
##      year
## state 2009 2010 2011
##    PR 18.3  0.0 13.9
##    RS 21.9 32.2 13.7
prop.table(tab, 1) # proporção nas linhas
##      year
## state      2009      2010      2011
##    PR 0.5694444 0.0000000 0.4305556
##    RS 0.3230769 0.4747253 0.2021978
prop.table(tab, 2) # proporção nas colunas
##      year
## state      2009      2010      2011
##    PR 0.4555556 0.0000000 0.5027027
##    RS 0.5444444 1.0000000 0.4972973
# A função margin.table soma apenas na "margem" da tabela ou seja, para cada uma das variáveis.

# Soma as frequencias dentro do ano
margin.table(table(year,state), 1) 
## year
## 2009 2010 2011 
##  270  216  185
# soma as frequencias dentro do estado
margin.table(table(year,state), 2) 
## state
##  PR  RS 
## 216 455
table(state)
## state
##  PR  RS 
## 216 455

Podemos fazer uma tabela com três entradas incluindo o muncípio de origem do isolado.

# continuamos usando a função table. Note que a terceira variável é a que fica em primeiro nível de agrupamento. Depois tem os locais e os anos na coluna
tab2 <- table(location, year, state)
tab2
## , , state = PR
## 
##                         year
## location                 2009 2010 2011
##   Agua Santa                0    0    0
##   Antonio Prado             0    0    0
##   Apucarana                 4    0    0
##   Arapongas                 4    0    0
##   Assis Chateaubriand       5    0    0
##   Barreto                   0    0    0
##   Bela Vista do Paraiso     1    0    0
##   Boa Vista das Missoes     0    0    0
##   Cambe                     4    0    0
##   Campo Mourao             11    0    0
##   Cantagalo                 0    0   26
##   Carazinho                 0    0    0
##   Cascavel                  5    0    0
##   Caseiros                  0    0    0
##   Colorado                  0    0    0
##   Condor                    0    0    0
##   Corbelia                  2    0    0
##   Cornelio Procopio         5    0    0
##   Coronel Barros            0    0    0
##   Coxilha                   0    0    0
##   Cruz Alta                 0    0    0
##   Entre-Ijuis               0    0    0
##   Erechim                   0    0    0
##   Ernestina                 0    0    0
##   Estacao                   0    0    0
##   Farol                     2    0    0
##   Formosa do Oeste          4    0    0
##   Ibiaca                    0    0    0
##   Ijui                      0    0    0
##   Janiopolis                3    0    0
##   Jataizinho                5    0    0
##   Jesuitas                  5    0    0
##   Juranda                   5    0    0
##   Lageado do Bugre          0    0    0
##   Lagoa Vermelha            0    0    0
##   Mambore                   3    0    0
##   Manoel Ribas              0    0   20
##   Marau                     0    0    0
##   Maringa                  21    0    0
##   Mato Castelhano           0    0    0
##   Nao-me-Toque              0    0    0
##   Palmeira das Missoes      0    0    0
##   Panambi                   0    0    0
##   Passo Fundo               0    0    0
##   Pato Branco               6    0    0
##   Peabiru                   5    0    0
##   Pejucara                  0    0    0
##   Ponta Grossa              6    0    0
##   Rol<U+008A>ndia             1    0    0
##   Roncador                  0    0   47
##   Sagrada Familia           0    0    0
##   Sananduva                 0    0    0
##   Santa Barbara do Sul      0    0    0
##   Sao Miguel das Missoes    0    0    0
##   Sertaneja                 3    0    0
##   Sertanopolis              4    0    0
##   Sertao                    0    0    0
##   Soledade                  0    0    0
##   Tapejara                  0    0    0
##   Tapera                    0    0    0
##   Tio Hugo                  0    0    0
##   Toledo                    5    0    0
##   Tupassi                   4    0    0
##   Vacaria                   0    0    0
##   Victor Graeff             0    0    0
## 
## , , state = RS
## 
##                         year
## location                 2009 2010 2011
##   Agua Santa                0    9    1
##   Antonio Prado             0    5    0
##   Apucarana                 0    0    0
##   Arapongas                 0    0    0
##   Assis Chateaubriand       0    0    0
##   Barreto                   0    4    0
##   Bela Vista do Paraiso     0    0    0
##   Boa Vista das Missoes     7    0    0
##   Cambe                     0    0    0
##   Campo Mourao              0    0    0
##   Cantagalo                 0    0    0
##   Carazinho                10   28    6
##   Cascavel                  0    0    0
##   Caseiros                  0   13    0
##   Colorado                  0    0    1
##   Condor                    8    0    1
##   Corbelia                  0    0    0
##   Cornelio Procopio         0    0    0
##   Coronel Barros            7    0    0
##   Coxilha                  10   18    0
##   Cruz Alta                11    0    0
##   Entre-Ijuis               4    0    0
##   Erechim                   0    9    0
##   Ernestina                 7    0    0
##   Estacao                   0    5    0
##   Farol                     0    0    0
##   Formosa do Oeste          0    0    0
##   Ibiaca                    0    5    0
##   Ijui                      4    0   25
##   Janiopolis                0    0    0
##   Jataizinho                0    0    0
##   Jesuitas                  0    0    0
##   Juranda                   0    0    0
##   Lageado do Bugre          4    0    0
##   Lagoa Vermelha            0   25    4
##   Mambore                   0    0    0
##   Manoel Ribas              0    0    0
##   Marau                     0    0    3
##   Maringa                   0    0    0
##   Mato Castelhano           0    5    1
##   Nao-me-Toque              7    0    7
##   Palmeira das Missoes     20    0    1
##   Panambi                   8    0   14
##   Passo Fundo               4   15    0
##   Pato Branco               0    0    0
##   Peabiru                   0    0    0
##   Pejucara                  4    0    0
##   Ponta Grossa              0    0    0
##   Rol<U+008A>ndia             0    0    0
##   Roncador                  0    0    0
##   Sagrada Familia           4    0    0
##   Sananduva                 0   10    2
##   Santa Barbara do Sul      4    3    6
##   Sao Miguel das Missoes    6    0    0
##   Sertaneja                 0    0    0
##   Sertanopolis              0    0    0
##   Sertao                    0   13    4
##   Soledade                  0    5    0
##   Tapejara                  0   18    4
##   Tapera                    0    0    2
##   Tio Hugo                  4    0    4
##   Toledo                    0    0    0
##   Tupassi                   0    0    0
##   Vacaria                  10   26    4
##   Victor Graeff             4    0    2
prop.table (table(species, residue))
##        residue
## species        corn      potato     soybean
##    Fasi 0.000000000 0.000000000 0.006637168
##    Faus 0.004424779 0.000000000 0.002212389
##    Fcor 0.017699115 0.000000000 0.019911504
##    Fgra 0.325221239 0.004424779 0.564159292
##    Fmer 0.026548673 0.000000000 0.028761062
prop.table(table(species, year))
##        year
## species        2009        2010        2011
##    Fasi 0.000000000 0.001490313 0.002980626
##    Faus 0.000000000 0.004470939 0.007451565
##    Fcor 0.004470939 0.017883756 0.002980626
##    Fgra 0.342771982 0.278688525 0.208643815
##    Fmer 0.055141580 0.019374069 0.053651267
table(species, genotype)
##        genotype
## species 15-ADON 3-ADON NIV
##    Fasi       0      0   3
##    Faus       0      6   2
##    Fcor       0      3  14
##    Fgra     557      0   0
##    Fmer       1      0  85

5.3 Dados contínuos

No caso de dados numéricos ou contínuos, o interesse maior é em sumarizar uma série de dados em um único valor, sendo mais comumente usada a média aritmética ou a mediana, dependendo da forma de distribuição dos dados. Essas estimativas podem sem obtidas para um conjunto condicionado ou não por níveis categóricos de uma determinada variável. Na visualização, esse foi o caso visto para o uso de boxplots, histogramas e dotplots.

A estatística sumário pode ser calculada condicionada por uma variável categórica que é um tipo de agrupamento. No R podemos usar as funções group_by e summarize para gerar um novo conjunto de dados com os valores sumarizados por determinado grupo. Nesse caso, cada linha do conjunto é o sumário de várias linhas.

Primeiramente, vamos eliminar todos as linhas duplicadas de severidade e incidência com o mesmo valor, deixando apenas um valor para cada campo de trigo. Vamos usar a função unique e select.

library(dplyr)
field_rs <- unique(select(survey_rs, c(1:3,7:9)))

# transforma o ano para factor
field_rs$year <- as.factor(field_rs$year)

Podemos usar a função summary para sumarizar todas as variáveis do conjunto.

summary(field_rs)
##      field         year      location           residue         
##  Min.   : 1.00   2009:51   Length:137         Length:137        
##  1st Qu.:13.00   2010:49   Class :character   Class :character  
##  Median :25.00   2011:37   Mode  :character   Mode  :character  
##  Mean   :25.41                                                  
##  3rd Qu.:38.00                                                  
##  Max.   :59.00                                                  
##       inc             sev        
##  Min.   : 0.00   Min.   : 0.000  
##  1st Qu.:11.50   1st Qu.: 0.550  
##  Median :25.50   Median : 1.490  
##  Mean   :29.46   Mean   : 2.912  
##  3rd Qu.:44.00   3rd Qu.: 3.730  
##  Max.   :89.95   Max.   :18.650

A função summary pode ser também aplicada somente para uma variável usando o $ após o nome do conjunto.

summary(field_rs$sev)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.550   1.490   2.912   3.730  18.650

A função describe do pacote Hmisc oferece uma opção de sumarização.

library(Hmisc)
describe(field_rs$sev)
## field_rs$sev 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      137        0      122        1    2.912    3.441    0.090    0.236 
##      .25      .50      .75      .90      .95 
##    0.550    1.490    3.730    7.464   10.138 
## 
## lowest :  0.00  0.02  0.03  0.05  0.07, highest: 14.10 14.27 17.48 18.51 18.65

Pode-se usar essas funções individualmente como nos exemplos abaixo. Note que, até agora, a estatística foi obtida para todos os valores da variável, sem qualquer agrupamento.

mean(field_rs$sev)
## [1] 2.912482
median(field_rs$sev)
## [1] 1.49
IQR(field_rs$sev)
## [1] 3.18
sd(field_rs$sev)
## [1] 3.719815

Agora iremos obter a estatística sumário por grupos ou níveis de uma variável categórica. Para isso, utilizaremos a função group_by e summarize do pacote dplyr.

# Agrupamento por ano
library(dplyr)
by_year <- group_by(field_rs, year)
head(by_year)
## # A tibble: 6 x 6
## # Groups:   year [2]
##   field year  location      residue   inc   sev
##   <dbl> <fct> <chr>         <chr>   <dbl> <dbl>
## 1    25 2010  Agua Santa    soybean  68.2  9.47
## 2    26 2010  Agua Santa    corn     34    3.73
## 3    36 2011  Agua Santa    soybean  40.5  1.31
## 4    48 2010  Antonio Prado soybean   2    0.02
## 5    49 2010  Antonio Prado corn     11    0.22
## 6    38 2010  Barreto       soybean  13    0.46
str(by_year)
## Classes 'grouped_df', 'tbl_df', 'tbl' and 'data.frame':  137 obs. of  6 variables:
##  $ field   : num  25 26 36 48 49 38 21 22 2 3 ...
##  $ year    : Factor w/ 3 levels "2009","2010",..: 2 2 3 2 2 2 1 1 2 2 ...
##  $ location: chr  "Agua Santa" "Agua Santa" "Agua Santa" "Antonio Prado" ...
##  $ residue : chr  "soybean" "corn" "soybean" "soybean" ...
##  $ inc     : num  68.2 34 40.5 2 11 ...
##  $ sev     : num  9.47 3.73 1.31 0.02 0.22 ...
##  - attr(*, "vars")= chr "year"
##  - attr(*, "drop")= logi TRUE
##  - attr(*, "indices")=List of 3
##   ..$ : int  6 7 16 18 19 24 25 27 28 29 ...
##   ..$ : int  0 1 3 4 5 8 9 10 11 12 ...
##   ..$ : int  2 14 15 17 23 26 50 51 52 53 ...
##  - attr(*, "group_sizes")= int  51 49 37
##  - attr(*, "biggest_group_size")= int 51
##  - attr(*, "labels")='data.frame':   3 obs. of  1 variable:
##   ..$ year: Factor w/ 3 levels "2009","2010",..: 1 2 3
##   ..- attr(*, "vars")= chr "year"
##   ..- attr(*, "drop")= logi TRUE
str(field_rs)
## Classes 'tbl_df', 'tbl' and 'data.frame':    137 obs. of  6 variables:
##  $ field   : num  25 26 36 48 49 38 21 22 2 3 ...
##  $ year    : Factor w/ 3 levels "2009","2010",..: 2 2 3 2 2 2 1 1 2 2 ...
##  $ location: chr  "Agua Santa" "Agua Santa" "Agua Santa" "Antonio Prado" ...
##  $ residue : chr  "soybean" "corn" "soybean" "soybean" ...
##  $ inc     : num  68.2 34 40.5 2 11 ...
##  $ sev     : num  9.47 3.73 1.31 0.02 0.22 ...

Na sequencia, usaremos a função summarize para criar um novo conjunto de dados com o nome “dis_by_year2” onde cada linha conterá o valor da estatística. No exemplo, será calculada a média de severidade e incidência em cada grupo criado no conjunto by_year2.

dis_by_year2 <- summarise(group_by(survey_rs, year), 
          inc_mean = mean(inc), 
          inc_sd = sd(inc),
          sev_mean = mean(sev),
          sev_sd = sd(sev),
          n_fields = length(sev)
                 )
dis_by_year2
##   inc_mean   inc_sd sev_mean   sev_sd n_fields
## 1 30.57743 20.74751 3.172923 4.012563      455