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