Minicurso R - 2019


1 tidyr, dplyr e ggplot2

São os pacotes de maior representatividade do conjunto pertencente ao tidyverse pois apenas com estes é possível: ajustar o conjunto de dados para o formato de interesse, manipular os dados (filtrar linhas, selecionar colunas, sumarizar informações, etc) e produzir visualizações. Estas etapas são consideradas as etapas mais trabalhosas e desgastantes do processo para análise de dados.


2 tidyr

O pacote dispõe de funções para formatação adequada dos dados para análise. Tem como principais funções:

  • gather() - empilha.
  • spread() - desempilha.
  • separate() - separar caracteres.
  • unite() - unir caracteres.
  • drop_na() - retirar dados ausentes.
  • replace_na() - substituir dados ausentes.

2.1 gather() e spread()

São as funções do tidyr para empilhar e desempilhar os dados. É comum, em situações em que os dados são coletados ao longo do tempo, que cada coluna represente uma coleta. No formato ideal, espera-se que haja uma variável categórica que marque a ordem de coleta e uma variável com os valores observados na coleta. Sendo assim, a gather() e spread() tem como funcionalidade empilhar e desempilhar dados conforme a necessidade do usuário.

library(tidyverse)
## -- Attaching packages ---------------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.1       v purrr   0.3.2  
## v tibble  2.1.1       v dplyr   0.8.0.1
## v tidyr   0.8.3       v stringr 1.4.0  
## v readr   1.3.1       v forcats 0.4.0
## -- Conflicts ------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
td <- tibble(
  id = rep(1:50),
  jan = rnorm(50, rpois(1,(runif(1)*10))),
  fev = rnorm(50, rpois(1,(runif(1)*10))),
  mar = rnorm(50, rpois(1,(runif(1)*10))),
  abr = rnorm(50, rpois(1,(runif(1)*10))),
  mai = rnorm(50, rpois(1,(runif(1)*10))),
  jun = rnorm(50, rpois(1,(runif(1)*10))),
  jul = rnorm(50, rpois(1,(runif(1)*10))),
  ago = rnorm(50, rpois(1,(runif(1)*10))),
  set = rnorm(50, rpois(1,(runif(1)*10))),
  out = rnorm(50, rpois(1,(runif(1)*10))),
  nov = rnorm(50, rpois(1,(runif(1)*10))),
  dez = rnorm(50, rpois(1,(runif(1)*10))))

td
## # A tibble: 50 x 13
##       id   jan    fev     mar   abr    mai   jun   jul   ago    set   out
##    <int> <dbl>  <dbl>   <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>
##  1     1  6.15 -0.572  1.07    8.02 -0.720  9.33  2.21  7.92 -3.16   7.76
##  2     2  5.44  1.52  -0.368   8.89  0.884  8.17  1.29  7.79 -1.29   6.06
##  3     3  3.88 -0.359  0.779   9.19  1.41   7.01  1.03  8.51 -0.424  5.76
##  4     4  4.88 -0.187  0.397   9.12  0.715  7.13  1.53  8.73  0.116  5.91
##  5     5  5.14  0.401  0.490   9.75 -0.291  8.88  3.29  7.61  0.459  6.04
##  6     6  3.54  0.686  0.364   9.58 -0.231  8.05  2.58  7.90  0.689  5.65
##  7     7  4.55 -0.687 -0.216   9.43  0.377  7.86  1.76  8.29  0.595  5.52
##  8     8  5.12  0.608  1.32    9.63  0.814  8.45  2.34  8.47  0.863  7.90
##  9     9  2.72  0.451  0.0844  8.23 -0.883  8.89  5.00  9.11 -1.07   6.64
## 10    10  4.41  0.833 -1.75    9.44 -0.224  8.27  1.09  7.78  0.847  7.02
## # ... with 40 more rows, and 2 more variables: nov <dbl>, dez <dbl>
td_gat <- td %>% gather(key = 'mes', value = 'valor', jan:dez)
td_gat
## # A tibble: 600 x 3
##       id mes   valor
##    <int> <chr> <dbl>
##  1     1 jan    6.15
##  2     2 jan    5.44
##  3     3 jan    3.88
##  4     4 jan    4.88
##  5     5 jan    5.14
##  6     6 jan    3.54
##  7     7 jan    4.55
##  8     8 jan    5.12
##  9     9 jan    2.72
## 10    10 jan    4.41
## # ... with 590 more rows
td_gat %>% spread(key=mes, value = valor)
## # A tibble: 50 x 13
##       id   abr   ago   dez    fev   jan   jul   jun    mai     mar   nov
##    <int> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>   <dbl> <dbl>
##  1     1  8.02  7.92  13.2 -0.572  6.15  2.21  9.33 -0.720  1.07    6.17
##  2     2  8.89  7.79  13.8  1.52   5.44  1.29  8.17  0.884 -0.368   6.57
##  3     3  9.19  8.51  12.9 -0.359  3.88  1.03  7.01  1.41   0.779   6.60
##  4     4  9.12  8.73  13.3 -0.187  4.88  1.53  7.13  0.715  0.397   4.14
##  5     5  9.75  7.61  11.3  0.401  5.14  3.29  8.88 -0.291  0.490   6.81
##  6     6  9.58  7.90  13.7  0.686  3.54  2.58  8.05 -0.231  0.364   5.56
##  7     7  9.43  8.29  12.4 -0.687  4.55  1.76  7.86  0.377 -0.216   6.37
##  8     8  9.63  8.47  10.7  0.608  5.12  2.34  8.45  0.814  1.32    6.78
##  9     9  8.23  9.11  12.9  0.451  2.72  5.00  8.89 -0.883  0.0844  6.61
## 10    10  9.44  7.78  11.9  0.833  4.41  1.09  8.27 -0.224 -1.75    6.38
## # ... with 40 more rows, and 2 more variables: out <dbl>, set <dbl>

2.2 separate() e unite()

As funções separate() e unite() servem para manipulações simples de strings em um tibble. Servem para unir ou separar strings utilizando um delimitador.

td2 <- tibble(nome = c("Lineu Alberto", "João Matheus", "PET Estatística"))
td2
## # A tibble: 3 x 1
##   nome           
##   <chr>          
## 1 Lineu Alberto  
## 2 João Matheus   
## 3 PET Estatística
td3 <- td2 %>% separate(col = 'nome',
                        into = c('primeiro_nome', 'segundo_nome'),
                        sep = ' ')

td3
## # A tibble: 3 x 2
##   primeiro_nome segundo_nome
##   <chr>         <chr>       
## 1 Lineu         Alberto     
## 2 João          Matheus     
## 3 PET           Estatística
td3 %>% unite(col = 'nome',
              sep = ' ')
## # A tibble: 3 x 1
##   nome           
##   <chr>          
## 1 Lineu Alberto  
## 2 João Matheus   
## 3 PET Estatística

2.3 drop_na() e replace_na()

As funções drop_na() e replace_na() servem para tratamento de dados ausentes (missing data).

td4 <- tibble(col1 = 1:10, col2 = c(1,2,NA,4,NA,6,7,NA,9,10))

td4
## # A tibble: 10 x 2
##     col1  col2
##    <int> <dbl>
##  1     1     1
##  2     2     2
##  3     3    NA
##  4     4     4
##  5     5    NA
##  6     6     6
##  7     7     7
##  8     8    NA
##  9     9     9
## 10    10    10
td4 %>% drop_na()
## # A tibble: 7 x 2
##    col1  col2
##   <int> <dbl>
## 1     1     1
## 2     2     2
## 3     4     4
## 4     6     6
## 5     7     7
## 6     9     9
## 7    10    10
td4 %>% replace_na(list(col2 = 0))
## # A tibble: 10 x 2
##     col1  col2
##    <int> <dbl>
##  1     1     1
##  2     2     2
##  3     3     0
##  4     4     4
##  5     5     0
##  6     6     6
##  7     7     7
##  8     8     0
##  9     9     9
## 10    10    10

3 dplyr

O dplyr é o pacote tidyverse destinado à manipulação e sumarização. Ele torna as atividades de manipulação menos custosas devido à sintaxe centralizada das funções. Tem como principais funções:

  • filter() - filtra linhas.
  • select() - seleciona colunas.
  • arrange() - ordena a base.
  • mutate() - cria/modifica colunas.
  • group_by() - agrupa a base.
  • summarise() - sumariza a base.
swiss$names <- rownames(swiss)
dados <- swiss %>% as_tibble()
names(dados)
## [1] "Fertility"        "Agriculture"      "Examination"     
## [4] "Education"        "Catholic"         "Infant.Mortality"
## [7] "names"
dados
## # A tibble: 47 x 7
##    Fertility Agriculture Examination Education Catholic Infant.Mortality
##        <dbl>       <dbl>       <int>     <int>    <dbl>            <dbl>
##  1      80.2        17            15        12     9.96             22.2
##  2      83.1        45.1           6         9    84.8              22.2
##  3      92.5        39.7           5         5    93.4              20.2
##  4      85.8        36.5          12         7    33.8              20.3
##  5      76.9        43.5          17        15     5.16             20.6
##  6      76.1        35.3           9         7    90.6              26.6
##  7      83.8        70.2          16         7    92.8              23.6
##  8      92.4        67.8          14         8    97.2              24.9
##  9      82.4        53.3          12         7    97.7              21  
## 10      82.9        45.2          16        13    91.4              24.4
## # ... with 37 more rows, and 1 more variable: names <chr>

3.1 filter()

filtro1 <- dados %>% filter(Fertility > 70)

filtro2 <- dados %>% filter(Examination > 12 & Agriculture > 30)

filtro3 <- dados %>% filter(Examination > 12 | Agriculture < 30)

filtro4 <- dados %>% filter(names %in% c("Courtelary", "Delemont", "Franches-Mnt"))

3.2 select

names(dados)
## [1] "Fertility"        "Agriculture"      "Examination"     
## [4] "Education"        "Catholic"         "Infant.Mortality"
## [7] "names"
select1 <- dados %>% select(names, Education)
names(select1)
## [1] "names"     "Education"
select2 <- dados %>% select(starts_with("e"))
names(select2)
## [1] "Examination" "Education"
select3 <- dados %>% select(Fertility, Agriculture:Education)
names(select3)
## [1] "Fertility"   "Agriculture" "Examination" "Education"
select4 <- dados %>% select(-Fertility, -names)
names(select4)
## [1] "Agriculture"      "Examination"      "Education"       
## [4] "Catholic"         "Infant.Mortality"

3.3 arrange

df <- letters %>% as_tibble()
## Warning: Calling `as_tibble()` on a vector is discouraged, because the behavior is likely to change in the future. Use `tibble::enframe(name = NULL)` instead.
## This warning is displayed once per session.
df$value
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
df2 <- df %>%  arrange(desc(value))
df2$value
##  [1] "z" "y" "x" "w" "v" "u" "t" "s" "r" "q" "p" "o" "n" "m" "l" "k" "j"
## [18] "i" "h" "g" "f" "e" "d" "c" "b" "a"
df3 <- df2 %>% arrange(value)
df3$value
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"

3.4 mutate

df2 <- tibble(col1 = rnorm(50), col2 = rpois(50, 1))
df2
## # A tibble: 50 x 2
##       col1  col2
##      <dbl> <int>
##  1  1.93       1
##  2  0.125      1
##  3 -0.0771     2
##  4 -0.792      1
##  5  0.111      0
##  6  1.08       1
##  7 -0.527      0
##  8  0.904      0
##  9  1.09       1
## 10  1.82       1
## # ... with 40 more rows
mutate1 <- df2 %>% mutate(col2 = letters[1:10] %>% rep(5))
mutate1
## # A tibble: 50 x 2
##       col1 col2 
##      <dbl> <chr>
##  1  1.93   a    
##  2  0.125  b    
##  3 -0.0771 c    
##  4 -0.792  d    
##  5  0.111  e    
##  6  1.08   f    
##  7 -0.527  g    
##  8  0.904  h    
##  9  1.09   i    
## 10  1.82   j    
## # ... with 40 more rows
mutate2 <- df2 %>% mutate(col3 = 1:nrow(df2))
mutate2
## # A tibble: 50 x 3
##       col1  col2  col3
##      <dbl> <int> <int>
##  1  1.93       1     1
##  2  0.125      1     2
##  3 -0.0771     2     3
##  4 -0.792      1     4
##  5  0.111      0     5
##  6  1.08       1     6
##  7 -0.527      0     7
##  8  0.904      0     8
##  9  1.09       1     9
## 10  1.82       1    10
## # ... with 40 more rows
mutate3 <- df2 %>%  mutate( col3 = col1 + col2,
                            col4 = 1:nrow(df2),
                            col5 = col1 * 10)
mutate3
## # A tibble: 50 x 5
##       col1  col2   col3  col4    col5
##      <dbl> <int>  <dbl> <int>   <dbl>
##  1  1.93       1  2.93      1  19.3  
##  2  0.125      1  1.12      2   1.25 
##  3 -0.0771     2  1.92      3  -0.771
##  4 -0.792      1  0.208     4  -7.92 
##  5  0.111      0  0.111     5   1.11 
##  6  1.08       1  2.08      6  10.8  
##  7 -0.527      0 -0.527     7  -5.27 
##  8  0.904      0  0.904     8   9.04 
##  9  1.09       1  2.09      9  10.9  
## 10  1.82       1  2.82     10  18.2  
## # ... with 40 more rows

3.5 summarise e group_by

dados
## # A tibble: 47 x 7
##    Fertility Agriculture Examination Education Catholic Infant.Mortality
##        <dbl>       <dbl>       <int>     <int>    <dbl>            <dbl>
##  1      80.2        17            15        12     9.96             22.2
##  2      83.1        45.1           6         9    84.8              22.2
##  3      92.5        39.7           5         5    93.4              20.2
##  4      85.8        36.5          12         7    33.8              20.3
##  5      76.9        43.5          17        15     5.16             20.6
##  6      76.1        35.3           9         7    90.6              26.6
##  7      83.8        70.2          16         7    92.8              23.6
##  8      92.4        67.8          14         8    97.2              24.9
##  9      82.4        53.3          12         7    97.7              21  
## 10      82.9        45.2          16        13    91.4              24.4
## # ... with 37 more rows, and 1 more variable: names <chr>
dados %>%
  summarise(mean_fert = mean(Fertility))
## # A tibble: 1 x 1
##   mean_fert
##       <dbl>
## 1      70.1
dados %>%
  summarise(
    media_fert = mean(Fertility),
    mediana_fert = median(Fertility))
## # A tibble: 1 x 2
##   media_fert mediana_fert
##        <dbl>        <dbl>
## 1       70.1         70.4
dados %>%
  group_by(names) %>%
  summarise(mean_fert = mean(Fertility))
## # A tibble: 47 x 2
##    names      mean_fert
##    <chr>          <dbl>
##  1 Aigle           64.1
##  2 Aubonne         66.9
##  3 Avenches        68.9
##  4 Boudry          70.4
##  5 Broye           83.8
##  6 Conthey         75.5
##  7 Cossonay        61.7
##  8 Courtelary      80.2
##  9 Delemont        83.1
## 10 Echallens       68.3
## # ... with 37 more rows
df2%>%
  group_by(col2) %>%
  summarise(mean_col1 = mean(col1))
## # A tibble: 4 x 2
##    col2 mean_col1
##   <int>     <dbl>
## 1     0    0.417 
## 2     1    0.0901
## 3     2    0.354 
## 4     3   -0.330

3.6 sample_n e sample_frac

dados %>% sample_n(10)
## # A tibble: 10 x 7
##    Fertility Agriculture Examination Education Catholic Infant.Mortality
##        <dbl>       <dbl>       <int>     <int>    <dbl>            <dbl>
##  1      76.9        43.5          17        15     5.16             20.6
##  2      44.7        46.6          16        29    50.4              18.2
##  3      71.7        34            17         8     3.3              20  
##  4      74.2        58.1          14         8     5.23             23.8
##  5      60.5        60.8          16        10     7.72             16.3
##  6      75.5        85.9           3         2    99.7              15.1
##  7      72          63.5           6         3     2.56             18  
##  8      55.7        19.4          26        28    12.1              20.2
##  9      56.6        50.9          22        12    15.1              16.7
## 10      69.3        84.9           7         6    99.7              19.8
## # ... with 1 more variable: names <chr>
dados %>% sample_frac(0.1)
## # A tibble: 5 x 7
##   Fertility Agriculture Examination Education Catholic Infant.Mortality
##       <dbl>       <dbl>       <int>     <int>    <dbl>            <dbl>
## 1      55.7        19.4          26        28    12.1              20.2
## 2      92.2        84.6           3         3    99.5              16.3
## 3      79.4        64.9           7         3    98.2              20.2
## 4      60.5        60.8          16        10     7.72             16.3
## 5      56.6        50.9          22        12    15.1              16.7
## # ... with 1 more variable: names <chr>

3.7 joins

3.7.1 inner_join

As funções do tipo join servem para cruzar bases por uma coluna chave. Na inner_join() gera um novo conjunto de dados apenas para os casos em que a chave é verificada nos dois arquivos. A full_join() une todas as linhas e todas as colunas, independente da chave ocorrer nos dois arquivos. Nos casos em que não há correspondência é gerado NA. Na left_join() todas as chaves do primeiro arquivo são mantidas e acrescenta-se valores nos casos em que há compatibilidade de chave. As chaves que são observadas apenas no segundo conjunto de dados são descartados. No right_join() todas as chaves do segundo arquivo são mantidas e acrescenta-se valores nos casos em que há compatibilidade de chave. As chaves que são observadas apenas no primeiro conjunto de dados são descartados.

tb1 <- tibble(codigo = c("001", "002", "003", "004", "005",
                         "006", "007", "008", "009", "010"),
              ocorrencia = rbinom(10,1, prob = 0.5),
              n = rpois(10,2))

tb1
## # A tibble: 10 x 3
##    codigo ocorrencia     n
##    <chr>       <int> <int>
##  1 001             1     1
##  2 002             1     1
##  3 003             0     1
##  4 004             1     2
##  5 005             1     3
##  6 006             0     0
##  7 007             1     3
##  8 008             0     0
##  9 009             0     2
## 10 010             1     1
tb2 <- tibble(code = c("001", "022", "003", "004", "005",
                       "000", "007", "018", "079", "010"),
              year = c(2010, 2011, 2015, 1999, 2000,
                       1996, 1998, 1955, 1971, 2001))
                       
tb2
## # A tibble: 10 x 2
##    code   year
##    <chr> <dbl>
##  1 001    2010
##  2 022    2011
##  3 003    2015
##  4 004    1999
##  5 005    2000
##  6 000    1996
##  7 007    1998
##  8 018    1955
##  9 079    1971
## 10 010    2001
inner_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 6 x 4
##   codigo ocorrencia     n  year
##   <chr>       <int> <int> <dbl>
## 1 001             1     1  2010
## 2 003             0     1  2015
## 3 004             1     2  1999
## 4 005             1     3  2000
## 5 007             1     3  1998
## 6 010             1     1  2001
full_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 14 x 4
##    codigo ocorrencia     n  year
##    <chr>       <int> <int> <dbl>
##  1 001             1     1  2010
##  2 002             1     1    NA
##  3 003             0     1  2015
##  4 004             1     2  1999
##  5 005             1     3  2000
##  6 006             0     0    NA
##  7 007             1     3  1998
##  8 008             0     0    NA
##  9 009             0     2    NA
## 10 010             1     1  2001
## 11 022            NA    NA  2011
## 12 000            NA    NA  1996
## 13 018            NA    NA  1955
## 14 079            NA    NA  1971
left_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 10 x 4
##    codigo ocorrencia     n  year
##    <chr>       <int> <int> <dbl>
##  1 001             1     1  2010
##  2 002             1     1    NA
##  3 003             0     1  2015
##  4 004             1     2  1999
##  5 005             1     3  2000
##  6 006             0     0    NA
##  7 007             1     3  1998
##  8 008             0     0    NA
##  9 009             0     2    NA
## 10 010             1     1  2001
right_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 10 x 4
##    codigo ocorrencia     n  year
##    <chr>       <int> <int> <dbl>
##  1 001             1     1  2010
##  2 022            NA    NA  2011
##  3 003             0     1  2015
##  4 004             1     2  1999
##  5 005             1     3  2000
##  6 000            NA    NA  1996
##  7 007             1     3  1998
##  8 018            NA    NA  1955
##  9 079            NA    NA  1971
## 10 010             1     1  2001

4 ggplot2

Antes de falar sobre o pacote ggplot2 , é importante definir alguns conceitos. Quando finalizamos as etapas de formatação (tidyr) e manipulação (dplyr) dos dados, podemos criar estatísticas e visualizações a partir dos mesmos. Mas o que é Visualização de Dados?

  • Visualização de Dados é a representação de dados em formato gráfico.

Mas o que é um gráfico?

  • O gráfico é uma representação com forma geométrica e que é construída a partir de informações obtidas dos dados.

Isso significa que o gráfico é um desenho que tem dimensões, forma, tamanho, comprimento, area, volume, etc.

Agora que o conceito está definido, podemos trabalhar com as visualizações de dados com ggplot2.

Para fazer visualizações no ggplot2 utilizaremos o dataset tips do pacote reshape2. Essa base de dados foi escolhida pois contém variáveis qualitativas e quantitativas.

data(tips, package = 'reshape2') ## Carregando os dados
str(tips)     ## Estrutura da base de dados
## 'data.frame':    244 obs. of  7 variables:
##  $ total_bill: num  17 10.3 21 23.7 24.6 ...
##  $ tip       : num  1.01 1.66 3.5 3.31 3.61 4.71 2 3.12 1.96 3.23 ...
##  $ sex       : Factor w/ 2 levels "Female","Male": 1 2 2 2 1 2 2 2 2 2 ...
##  $ smoker    : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ day       : Factor w/ 4 levels "Fri","Sat","Sun",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ time      : Factor w/ 2 levels "Dinner","Lunch": 1 1 1 1 1 1 1 1 1 1 ...
##  $ size      : int  2 3 3 2 4 4 2 4 2 2 ...
head(tips)    ## Seis primeiras linhas
##   total_bill  tip    sex smoker day   time size
## 1      16.99 1.01 Female     No Sun Dinner    2
## 2      10.34 1.66   Male     No Sun Dinner    3
## 3      21.01 3.50   Male     No Sun Dinner    3
## 4      23.68 3.31   Male     No Sun Dinner    2
## 5      24.59 3.61 Female     No Sun Dinner    4
## 6      25.29 4.71   Male     No Sun Dinner    4
summary(tips) ## Calcula estatísticas
##    total_bill         tip             sex      smoker      day    
##  Min.   : 3.07   Min.   : 1.000   Female: 87   No :151   Fri :19  
##  1st Qu.:13.35   1st Qu.: 2.000   Male  :157   Yes: 93   Sat :87  
##  Median :17.80   Median : 2.900                          Sun :76  
##  Mean   :19.79   Mean   : 2.998                          Thur:62  
##  3rd Qu.:24.13   3rd Qu.: 3.562                                   
##  Max.   :50.81   Max.   :10.000                                   
##      time          size     
##  Dinner:176   Min.   :1.00  
##  Lunch : 68   1st Qu.:2.00  
##               Median :2.00  
##               Mean   :2.57  
##               3rd Qu.:3.00  
##               Max.   :6.00

A estrutura padrão dos gráficos em ggplot2 segue a forma:

ggplot(data = <“DADOS”>, mapping = aes(<“MAPEAMENTO DAS VARIÁVEIS”>)) + <“GEOM_FUNÇÃO”>()

A componente <DADOS> deve ser utilizada para importar os dados (geralmente de um data.frame). Já a componente <MAPEAMENTO DAS VARIÁVEIS> deve ser utilizada para estabelecer se alguma variável irá aparecer no eixo x ou y. Essa também pode ser utilizada por outras variáveis que serão representadas por cores, tamanhos ou formas diferentes. Para selecionar o tipo de gráfico que será plotado, deve-se usar as funções com prefixo geom. A lista com os diferentes tipos de funções com prefixo geom está logo abaixo.

##  [1] "geom_abline"          "geom_area"            "geom_bar"            
##  [4] "geom_bin2d"           "geom_blank"           "geom_boxplot"        
##  [7] "geom_col"             "geom_contour"         "geom_count"          
## [10] "geom_crossbar"        "geom_curve"           "geom_density"        
## [13] "geom_density_2d"      "geom_density2d"       "geom_dotplot"        
## [16] "geom_errorbar"        "geom_errorbarh"       "geom_freqpoly"       
## [19] "geom_hex"             "geom_histogram"       "geom_hline"          
## [22] "geom_jitter"          "geom_label"           "geom_line"           
## [25] "geom_linerange"       "geom_map"             "geom_path"           
## [28] "geom_point"           "geom_pointrange"      "geom_polygon"        
## [31] "geom_qq"              "geom_qq_line"         "geom_quantile"       
## [34] "geom_raster"          "geom_rect"            "geom_ribbon"         
## [37] "geom_rug"             "geom_segment"         "geom_sf"             
## [40] "geom_sf_label"        "geom_sf_text"         "geom_smooth"         
## [43] "geom_spoke"           "geom_step"            "geom_text"           
## [46] "geom_tile"            "geom_violin"          "geom_vline"          
## [49] "update_geom_defaults"

4.1 Construção dos Gráficos

Para a construção do primeiro gráfico, escolhemos a variável total_bill.

g2 <- ggplot(mapping = aes(x = total_bill),  data = tips) # Mapeamento
g2

Perceba como essa primeira parte da construção do gráfico não está utilizando a componente <GEOM_FUNÇÃO>. Somente está sendo delimitado que a variável total_bill irá aparecer no eixo x. Por conta disso, nenhum gráfico foi plotado.

4.1.1 Histograma

Para a construção de um histograma, basta acrescentar ao mapeamento armazenado no objeto g2 a função geom_histogram(). No exemplo abaixo, três elementos adicionais foram acrescentados a função geom_histogram, sendo:

  • col: Cor de Contorno

  • fill: Cor de Preenchimento

  • alpha: Quantidade Desejada de Transparência

g3 <- geom_histogram(col='gray50',fill=3,alpha=0.8) # Estrutura
g2 + g3
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Além desses elementos mencionados, também é possível adicionar outros elementos específicos para cada tipo de geom. Como exemplo, o argumento bins da geom_histogram que controla o número de barras será alterado.

g3 <- geom_histogram(col='gray50',fill=3,alpha=0.8,bins=8)
g2 + g3

Como curiosidade, também foi adicionada a função geom_rug().

g2 + g3 + geom_rug()

4.1.2 Densidade

Para construir um gráfico de densidade no ggplot2, basta adicionar a função geom_density à estrutura mapeada anteriormente. Novamente, adicionamos a função geom_rug foi adicionada como curiosidade

g3 <- geom_density(col='red',fill='blue',alpha=0.3)
g2 + g3

g2 + g3 + geom_rug(col=2)

4.1.3 Boxplot

Pensando em análise univariada (uma variável), também é possível criar boxplots pelo pacote. Entretanto, o mapeamento deve ser alterado do eixo x (que foi utilizado no histograma e no gráfico de densidade) para o eixo y. Por conta disso, a função ggplot foi utilizada novamente.

g2 <- ggplot(mapping = aes(y = total_bill),  data = tips)
g3 <- geom_boxplot(col=4, fill=3, alpha=0.4)
g2 + g3

Quando o assunto é análise bivariada (duas variáveis), podemos adicionar uma nova variável no eixo x e fazer um boxplot para cada nível dessa variável.

g2 <- ggplot(aes(x = smoker, y = total_bill), data = tips)
g3 <- geom_boxplot()
g2+g3

Também podemos modificar as cores de contorno ou de preenchimento por essa mesma variável.

g2 <- ggplot(aes(x = smoker, y = total_bill, col=smoker), data = tips)
g3 <- geom_boxplot()
g2+g3

g2 <- ggplot(aes(x = smoker, y = total_bill, fill=smoker), data = tips)
g3 <- geom_boxplot()
g2+g3

4.1.4 Gráfico de Barras

Um gráfico de barras pode ser utilizado quando desejamos observar as frequências absolutas ou frequências relativas de um conjunto de dados. Entretanto, esse tipo de gráfico necessita de um mapeamento com pelo menos duas variáveis, sendo uma no eixo x (Variável sendo observada) e outra no eixo y (Frequência Absoluta ou Frequência Relativa)

tips_auxiliar <- as.data.frame(table(tips$size))
colnames(tips_auxiliar) <- c("size","Contagem")

g2 <- ggplot(mapping = aes(x = size, y=Contagem),  data = tips_auxiliar)
g3 <- geom_col(fill='gray50')
g2+g3

Adicionalmente, a função coord_flip() pode ser utilizada para alternar os eixos do gráfico.

g2+g3 + coord_flip()

4.1.5 Gráfico de Setores

Para a criação de um gráfico de setores, inicialmente é necessário que um gráfico de coluna empilhada seja criado.

g2 <- ggplot(tips_auxiliar, aes(x="", y=Contagem, fill=size))
g3 <- geom_bar(stat = "identity")
g2+g3

Adicionalmente a esse gráfico, deve-se alterar a coordenada do eixo y com a função coord_polar("y", start=0).

g6 <- coord_polar("y", start=0) # Coordenada
g2+g3+g6

4.1.6 Gráfico de Dispersão

Agora pensando em duas variáveis, também é possível criar um gráfico de dispersão. O comando geom_point() deve ser utilizado para a criação desse gráfico.

g2 <- ggplot(aes(x = total_bill, y = tip), data = tips)
g3 <- geom_point()
g2+g3

Também é possível mapear uma variável categórica à cor dos pontos. Isso é muito útil quando deseja-se comparar um ou mais grupos.

g2 <- ggplot(aes(x = total_bill, y = tip, col=sex), data = tips)
g3 <- geom_point()
g2+g3

Também podemos mapear uma variável contínua à cor dos pontos.

ggplot(tips, aes(x = size, y = tip, colour = total_bill)) + geom_point()

Uma outra possibilidade é ajustar um modelo de regressão linear geral ou por grupo.

g5 <- geom_smooth(method = 'lm', col=4)
g2+g3+g5

g5 <- geom_smooth(aes(group=sex),method = 'lm',se=F)
g2+g3+g5

4.2 Explorando as outras camadas

4.2.1 Alterando os eixos e título

Assim como é feito nos gráficos do pacote básico do R, também podemos alterar os nomes dos eixos, nome do título e posição do título com as funções xlab, ylab, ggtitle e theme(plot.title = element_text(hjust = 'posição')) respectivamente. A posição deste último varia entre 0 e 1, sendo 0.5 o valor do meio.

g2 <- ggplot(mapping = aes(x = total_bill),  data = tips)
g3 <- geom_histogram(col='gray50',fill=3,bins=8)
g2+g3

g2+g3 + xlab("Total da Conta") + ylab("Frequência") +
        ggtitle("Histograma - Total da Conta") +
        theme(plot.title = element_text(hjust = 0.5)) # Centraliza o título

4.2.2 Legendas

Quando temos um gráfico com legenda, também podemos modificar o nome do título e sua posição com as funções labse theme(legend.position = "posição"). As posições mais utilizadas são: ‘left’, ‘right’,‘bottom’,‘top’.

g2 <- ggplot(aes(x = smoker, y = total_bill, fill=smoker), data = tips)
g3 <- geom_boxplot()
g2+g3

g2+g3 + labs(fill = "Fumante")

g2+g3 + labs(fill = "Fumante") + theme(legend.position = "top")

4.2.3 Facets

A função facet_wrap possibilita a criação de gráficos em que faz-se a distinção entre os níveis de um fator.

g2 <- ggplot(aes(x = total_bill, y = tip, col=sex), data = tips)
g3 <- geom_point()
g2+g3+facet_grid(smoker~.)

g2+g3+facet_grid(.~smoker)

4.2.4 Modificando Temas

O ggplot2 também tem funções que permitem modificar os temas do gráfico. Para modificar o tema, basta acrescentar ao gráfico a função theme_(nome_do_tema).

##  [1] "theme_bw"       "theme_classic"  "theme_dark"     "theme_get"     
##  [5] "theme_gray"     "theme_grey"     "theme_light"    "theme_linedraw"
##  [9] "theme_minimal"  "theme_replace"  "theme_set"      "theme_test"    
## [13] "theme_update"   "theme_void"
x1 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_gray() + ggtitle('theme_gray')
x2 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_bw() + ggtitle('theme_bw')
x3 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_minimal() + ggtitle('theme_minimal')
x4 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_get() + ggtitle('theme_get')
x5 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_test() + ggtitle('theme_test')
x6 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_light() + ggtitle('theme_light')
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine

4.2.5 Gráficos em Painel

Quando queremos adicionar vários gráficos em um mesmo painel nos pacotes básicos do R, utilizamos a função par(mfrow=c()). Entretanto, isso não é possível de ser realizado no pacote ggplot2. Para que isso seja possível, devemos utilizar a função grid.arrange da função gridExtra. Para isso, quatro gráficos foram armazenados.

grafico1 <- ggplot(aes(x = total_bill, y = tip, col=sex), data = tips) +
  geom_point() +
  geom_smooth(method = 'lm', col=4)

grafico2 <- data.frame(y=rnorm(1000)) %>%
  ggplot(data=., mapping = aes(x=y)) +
  geom_density(col=4, fill=2, alpha=0.3)

grafico3 <- ggplot(data=mpg, aes(displ, hwy)) +
            geom_point() +
            facet_wrap(~manufacturer)
grafico4 <- plot_result
grid.arrange(grafico1,grafico2,grafico3,grafico4,
             nrow=2,ncol=2)

5 Gráficos Interativos

Além dos gráficos estáticos gerados pelo ggplot2, é possível converter esses gráficos para gráficos interativos com o uso da função ggplotly do pacote plotly.

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
ggplotly(grafico1)
ggplotly(grafico2)
ggplotly(grafico3)
ggplotly(grafico4)

João Matheus S. K. T. Hneda

Lineu Alberto C. de Freitas

Aula 3 - 11/05/2019 - PET-Estatística (UFPR)