+ - 0:00:00
Notes for current slide
Notes for next slide





Introdução à análise de dados



Adriano Pereira, Felipe Carvalho & Felipe Menino

Maio 2022

1 / 51

Agenda



  • Introdução ao R

    • Tidyverse
  • Visualização de dados


2 / 51




Introdução ao R

3 / 51

História do R

R é uma linguagem de programação de alto nível com ambiente voltado para visualização e análise de dados. Em essência foi inspirada na linguagem de programação S. Foi iniciamente escrita por Ross Ihaka e Robert Gentleman no departamento de estatística da universidade de Auckland.

Robert Gentleman

Ross Ihaka

4 / 51




Conceitos básicos

5 / 51

Conceitos básicos

Atribuimos valor usando uma seta <- apontada para a variável


Declaração de variáveis

numerico <- 123
double <- 123.2
inteiro <- 321L
complexo <- 321i
booleano <- TRUE
caractere <- "Bem-vindos"
6 / 51

Conceitos básicos

Atribuimos valor usando uma seta <- apontada para a variável


Declaração de variáveis

numerico <- 123
double <- 123.2
inteiro <- 321L
complexo <- 321i
booleano <- TRUE
caractere <- "Bem-vindos"

Acessando os valores

print(numerico)
## [1] 123
caractere
## [1] "Bem-vindos"
6 / 51

Tipos de dados estruturados

Podemos declarar um vetor usando c() e uma lista usando list()

Vetores

vetor_int <- c(1, 3, 5)
vetor_char <- c("teste", "teste", "teste")
vetor_bool <- c(TRUE, TRUE, FALSE)
vetor_int
## [1] 1 3 5

Listas

lista_int <- list(1, 3, 5)
lista_lista <- list(1, 2.3, list("tres"))
lista_lista
## [[1]]
## [1] 1
##
## [[2]]
## [1] 2.3
##
## [[3]]
## [[3]][[1]]
## [1] "tres"
7 / 51

Qual é a diferença?

Vetores são atômicos, só aceitam um tipo:

vetor_diferente <- c(1, 2.5, TRUE, "ola")
vetor_diferente
## [1] "1" "2.5" "TRUE" "ola"
is.atomic(vetor_diferente)
## [1] TRUE

Lista não são atômicas, aceitam diversos tipos:

lista_diferente <- list(1, TRUE, "ola")
lista_diferente
## [[1]]
## [1] 1
##
## [[2]]
## [1] TRUE
##
## [[3]]
## [1] "ola"
is.atomic(lista_diferente)
## [1] FALSE
8 / 51

Hierarquia de tipo primitivos

O R possui uma conversão de tipos, sendo assim, garantindo que todo vetor seja atômico.

R 4 Data Science - Hadley

9 / 51

Hierarquia de tipo primitivos

Os tipos mais fortes são:

  1. character
  2. complex
  3. numeric
  4. logical

Conversão:

v1 <- c(FALSE, "tipo", 5)
10 / 51

Hierarquia de tipo primitivos

Os tipos mais fortes são:

  1. character
  2. complex
  3. numeric
  4. logical

Conversão:

v1 <- c(FALSE, "tipo", 5)
v1
## [1] "FALSE" "tipo" "5"
11 / 51

Hierarquia de tipo primitivos

Os tipos mais fortes são:

  1. character
  2. complex
  3. numeric
  4. logical

Conversão:

v1 <- c(FALSE, "tipo", 5)
v1
## [1] "FALSE" "tipo" "5"
v2 <- c(32, 1, 5i)
12 / 51

Hierarquia de tipo primitivos

Os tipos mais fortes são:

  1. character
  2. complex
  3. numeric
  4. logical

Conversão:

v1 <- c(FALSE, "tipo", 5)
v1
## [1] "FALSE" "tipo" "5"
v2 <- c(32, 1, 5i)
v2
## [1] 32+0i 1+0i 0+5i
13 / 51

Hierarquia de tipo primitivos

Os tipos mais fortes são:

  1. character
  2. complex
  3. numeric
  4. logical

Conversão:

v1 <- c(FALSE, "tipo", 5)
v1
## [1] "FALSE" "tipo" "5"
v2 <- c(32, 1, 5i)
v2
## [1] 32+0i 1+0i 0+5i

Tipos:

typeof(v1)
## [1] "character"
typeof(v2)
## [1] "complex"
14 / 51




Data Frame

15 / 51

Data Frame

Matriz composta por linhas e colunas, cujas colunas representam as variáveis (atributos) e as linhas representam observações


16 / 51

Data Frame

Matriz composta por linhas e colunas, cujas colunas representam as variáveis (atributos) e as linhas representam observações

Podemos criar um dataframe usando data.frame()

meu_df <- data.frame(
nome=c("Ana", "João"),
idade=c(23, 24),
cargo=c("Cientista", "Analista")
)
meu_df
## nome idade cargo
## 1 Ana 23 Cientista
## 2 João 24 Analista

Acessando os atributos

meu_df$nome
## [1] "Ana" "João"

Tipo

typeof(meu_df)
## [1] "list"

Classe

class(meu_df)
## [1] "data.frame"
17 / 51

Estrutura de decisão

O if do R é bem parecido com o do Java

valor_a <- 21
valor_b <- 42
if(valor_a < valor_b){
print("Valor A menor do que o valor B")
} else if(valor_a == valor_b){
print("Valor A é igual ao valor B")
} else {
print("Valor A é maior do que o valor B")
}
## [1] "Valor A menor do que o valor B"
18 / 51

Estrutura de decisão

O if do R é bem parecido com o do Java

valor_a <- 21
valor_b <- 42
if(valor_a < valor_b){
print("Valor A menor do que o valor B")
} else if(valor_a == valor_b){
print("Valor A é igual ao valor B")
} else {
print("Valor A é maior do que o valor B")
}
## [1] "Valor A menor do que o valor B"

Dica

ifelse(42 > TRUE, "Verdade universal", "Fake news")
## [1] "Verdade universal"
18 / 51

Estrutura de repetição

Por outro lado, o for do R parece com a sintaxe do Python

meu_vetor <- c(1, 2, 3)
for(i in meu_vetor){
print(i)
}
## [1] 1
## [1] 2
## [1] 3
19 / 51





Tidyverse

20 / 51

Tidyverse

Conjunto de pacotes em R para ciência de dados

http://www.seec.uct.ac.za/r-tidyverse

21 / 51

Tidyverse

Conjunto de pacotes em R para ciência de dados

http://www.seec.uct.ac.za/r-tidyverse

Processo de ciência de dados

Doing Data Science - Rachel Schutt

21 / 51

Tidyverse

Conjunto de pacotes em R para ciência de dados

http://www.seec.uct.ac.za/r-tidyverse

Processo de ciência de dados

Doing Data Science - Rachel Schutt

22 / 51

Tidyverse

Conjunto de pacotes em R para ciência de dados

http://www.seec.uct.ac.za/r-tidyverse

Processo de ciência de dados

Doing Data Science - Rachel Schutt

23 / 51

Tidyverse

Conjunto de pacotes em R para ciência de dados

http://www.seec.uct.ac.za/r-tidyverse

Processo de ciência de dados

Doing Data Science - Rachel Schutt

24 / 51

Leitura e escrita de dados - readr

Leitura

library(readr)
# Leitura dos dados
star_wars <-
readr::read_csv(file = "data/starwars.csv")
## Rows: 87 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): name, hair_color, skin_color, eye_color, gender, homeworld, species
## dbl (3): height, mass, birth_year
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Escrita

# escrita
readr::write_csv(x = star_wars,
path = "data/dado.csv")
25 / 51

Manipulação de dados - dplyr

Para manipular nosso dataframe, vamos usar o pacote dplyr. Métodos básicos:

R for Data Science - Garrett Grolemund

26 / 51

Seleção e Filtro

Para facilitar a seleção dos atributos e tirar $, vamos usar o select():

library(dplyr)
selecao <-
dplyr::select(star_wars, name, hair_color)
head(selecao, 3)
## # A tibble: 3 × 2
## name hair_color
## <chr> <chr>
## 1 Luke Skywalker blond
## 2 C-3PO <NA>
## 3 R2-D2 <NA>

Para filtrar por um valor específico, usamos filter():

filtro <-
dplyr::filter(star_wars, species == "Droid" & skin_color == "gold")
filtro
## # A tibble: 1 × 10
## name height mass hair_color skin_color eye_color birth_year gender homeworld
## <chr> <dbl> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 C-3PO 167 75 <NA> gold yellow 112 <NA> Tatooine
## # … with 1 more variable: species <chr>
27 / 51

Agrupamento e agregação

Para criar grupos usamos a função group_by()

agrupamento <-
dplyr::group_by(star_wars, species)
head(agrupamento, 3)
## # A tibble: 3 × 10
## # Groups: species [2]
## name height mass hair_color skin_color eye_color birth_year gender homeworld
## <chr> <dbl> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 172 77 blond fair blue 19 male Tatooine
## 2 C-3PO 167 75 <NA> gold yellow 112 <NA> Tatooine
## 3 R2-D2 96 32 <NA> white, bl… red 33 <NA> Naboo
## # … with 1 more variable: species <chr>

Para criarmos uma agregação do nosso agrupamento, usamos summarise() e para ordenarmos arrange():

media_grupo <-
dplyr::summarise(agrupamento,
media = mean(height, na.rm = TRUE))
media_grupo_order <-
dplyr::arrange(media_grupo, desc(media))
head(media_grupo_order, 3)
## # A tibble: 3 × 2
## species media
## <chr> <dbl>
## 1 Quermian 264
## 2 Wookiee 231
## 3 Kaminoan 221
28 / 51

Transformação de atributos

Para criar/transformar novos atributos, usa-se mutate():

# conversão de cm para metros
star_wars <-
dplyr::mutate(star_wars, height = height/100)
head(star_wars, 3)
## # A tibble: 3 × 10
## name height mass hair_color skin_color eye_color birth_year gender homeworld
## <chr> <dbl> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 1.72 77 blond fair blue 19 male Tatooine
## 2 C-3PO 1.67 75 <NA> gold yellow 112 <NA> Tatooine
## 3 R2-D2 0.96 32 <NA> white, bl… red 33 <NA> Naboo
## # … with 1 more variable: species <chr>
29 / 51

Aplicando os métodos

Seleção

selecao <-
dplyr::select(star_wars, -hair_color, -mass)

Filtro

filtro <-
dplyr::filter(selecao, eye_color == "blue")

Agrupamento

agrupamento <-
dplyr::group_by(filtro, species)

Agregação

media_grupo <-
dplyr::summarise(agrupamento, media = mean(height, na.rm = TRUE))

Ordenação

media_grupo_order <-
dplyr::arrange(media_grupo, desc(media))
## # A tibble: 3 × 2
## species media
## <chr> <dbl>
## 1 Wookiee 2.31
## 2 Chagrian 1.96
## 3 Tholothian 1.84
30 / 51

Facilitando a vida com o operador pipe (%>%)

O pipe passa a resposta da primeira atribuição para o primeiro parâmetro da função seguinte:

library(magrittr)
media_grupo <- star_wars %>%
dplyr::select(-hair_color, -mass) %>%
dplyr::filter(eye_color == "blue") %>%
dplyr::group_by(species) %>%
dplyr::summarise(media =
mean(height, na.rm = TRUE)) %>%
dplyr::arrange(desc(media))
head(media_grupo, 2)
## # A tibble: 2 × 2
## species media
## <chr> <dbl>
## 1 Wookiee 2.31
## 2 Chagrian 1.96
31 / 51

Facilitando a vida com o operador pipe (%>%)

Sem pipe

# Seleção
selecao <-
dplyr::select(star_wars, -hair_color, -mass)
# Filtro
filtro <-
dplyr::filter(selecao, eye_color == "blue")
# Agrupamento
agrupamento <-
dplyr::group_by(filtro, species)
# Agregação
media_grupo <-
dplyr::summarise(agrupamento,
media = mean(height, na.rm = TRUE))
# Ordenação
media_grupo_order <-
dplyr::arrange(media_grupo, desc(media))

Com pipe

media_grupo <- star_wars %>%
dplyr::select(-hair_color, -mass) %>%
dplyr::filter(eye_color == "blue") %>%
dplyr::group_by(species) %>%
dplyr::summarise(media =
mean(height, na.rm = TRUE)) %>%
dplyr::arrange(desc(media))
32 / 51




Exemplo de análise de dados

33 / 51

Exemplo de análise de dados

Dado de série temporal da temperatura da superfície terrestre

Fonte: Berkeley Earth

34 / 51

Exemplo de análise

# Leitura dos dados de mudança climática
temperature_countries <-
readr::read_csv("./data/GlobalLandTemperaturesByCountry.csv")
# Leitura e seleção dos dados de continentes
continent <-
readr::read_csv("./data/countryContinent.csv") %>%
dplyr::select(country, continent) # Seleção do atributo continente
head(temperature_countries, 2)
## # A tibble: 2 × 4
## dt AverageTemperature AverageTemperatureUncertainty Country
## <date> <dbl> <dbl> <chr>
## 1 1743-11-01 4.38 2.29 Åland
## 2 1743-12-01 NA NA Åland
tail(temperature_countries, 2)
## # A tibble: 2 × 4
## dt AverageTemperature AverageTemperatureUncertainty Country
## <date> <dbl> <dbl> <chr>
## 1 2013-08-01 19.8 0.717 Zimbabwe
## 2 2013-09-01 NA NA Zimbabwe
35 / 51

Exemplo de análise

Filtro a partir do ano 2000 e extração da média anual

year_temperature <- temperature_countries %>%
dplyr::filter(dt > "2000-01-01") %>%
dplyr::mutate(dt = lubridate::year(dt)) %>%
dplyr::group_by(Country, dt) %>%
dplyr::summarise(year_mean = mean(AverageTemperature))
## # A tibble: 3 × 3
## # Groups: Country [1]
## Country dt year_mean
## <chr> <dbl> <dbl>
## 1 Afghanistan 2000 16.7
## 2 Afghanistan 2001 15.8
## 3 Afghanistan 2002 15.5

Junção dos continentes com cada país

continent_temperature <- year_temperature %>%
dplyr::rename(country = Country) %>%
dplyr::left_join(continent, by="country") %>%
dplyr::filter(!is.na(continent))
## # A tibble: 3 × 4
## # Groups: country [1]
## country dt year_mean continent
## <chr> <dbl> <dbl> <chr>
## 1 Afghanistan 2000 16.7 Asia
## 2 Afghanistan 2001 15.8 Asia
## 3 Afghanistan 2002 15.5 Asia
36 / 51

Exemplo de análise

Filtro a partir do ano 2000 e extração da média anual

year_temperature <- temperature_countries %>%
dplyr::filter(dt > "2000-01-01") %>%
dplyr::mutate(dt = lubridate::year(dt)) %>%
dplyr::group_by(Country, dt) %>%
dplyr::summarise(year_mean = mean(AverageTemperature))
## # A tibble: 3 × 3
## # Groups: Country [1]
## Country dt year_mean
## <chr> <dbl> <dbl>
## 1 Afghanistan 2000 16.7
## 2 Afghanistan 2001 15.8
## 3 Afghanistan 2002 15.5

Junção dos continentes com cada país

continent_temperature <- year_temperature %>%
dplyr::rename(country = Country) %>%
dplyr::left_join(continent, by="country") %>%
dplyr::filter(!is.na(continent))
## # A tibble: 3 × 4
## # Groups: country [1]
## country dt year_mean continent
## <chr> <dbl> <dbl> <chr>
## 1 Afghanistan 2000 16.7 Asia
## 2 Afghanistan 2001 15.8 Asia
## 3 Afghanistan 2002 15.5 Asia

Qual o continente que registrou a maior temperatura anual?

Qual o ano com a maior média de temperatura registrada?

36 / 51

Exemplo de análise

Qual o continente que registrou a maior temperatura anual?

continent_temperature %>%
dplyr::group_by(continent) %>%
summarise(maior_temp = max(year_mean, na.rm = TRUE))
## # A tibble: 5 × 2
## continent maior_temp
## <chr> <dbl>
## 1 Africa 30.3
## 2 Americas 29.0
## 3 Asia 29.7
## 4 Europe 20.3
## 5 Oceania 27.9

Qual foi o ano com a maior média de temperatura registrada??

continent_temperature %>%
dplyr::group_by(dt, continent) %>%
dplyr::summarise(maior_temp = max(year_mean, na.rm = TRUE)) %>%
dplyr::arrange(desc(maior_temp)) %>%
head(5)
## # A tibble: 5 × 3
## # Groups: dt [5]
## dt continent maior_temp
## <dbl> <chr> <dbl>
## 1 2000 Africa 30.3
## 2 2010 Africa 30.1
## 3 2012 Africa 29.9
## 4 2009 Africa 29.9
## 5 2011 Africa 29.8
37 / 51



Visualização de dados

38 / 51

Pacotes de visualização

As bibliotecas de visualização de dados ggplot2 e plotnine são baseadas na obra The Grammar of Graphics, a qual apresenta uma grámatica para elaboração de gráficos. Tal gramática é composta por camadas, as quais descrevem os componentes do gráfico.

Camadas de componentes gráficos

39 / 51

Pacotes de visualização

As bibliotecas de visualização de dados ggplot2 e plotnine são baseadas na obra The Grammar of Graphics, a qual apresenta uma grámatica para elaboração de gráficos. Tal gramática é composta por camadas, as quais descrevem os componentes do gráfico.

Camadas de componentes gráficos

Sintaxe do ggplot/plotnine

ggplot(data = <DATA>, aes(<MAPPINGS>)) +
<GEOM_FUNCTION>(
mapping = aes(<MAPPINGS>),
stat = <STAT>,
position = <POSITION>) +
<COORDINATE_FUNCTION> +
<FACET_FUNCTION>
39 / 51

Mapeamento estético

A estética descreve cada aspecto de um dado elemento gráfico. Descrevemos as posições (position) por um valor x e y, mas outros sistemas de coordenadas são possíveis. É possível alterar a forma (shape), tamanho (size) e cor (size) dos elementos.

Fundamentals of Data Visualization - Claus O. Wilke

40 / 51

Objetos geométricos

Fundamentals of Data Visualization - Claus O. Wilke

41 / 51

Exemplo com R - Gráfico de dispersão

Mapeamento estético

library(ggplot2)
ggplot(iris, aes(x = Petal.Width, y = Petal.Length, color = Species))

42 / 51

Exemplo com R - Gráfico de dispersão

Mapeamento estético

library(ggplot2)
ggplot(iris, aes(x = Petal.Width, y = Petal.Length, color = Species))

Objeto geométrico

ggplot(iris, aes(x = Petal.Width, y = Petal.Length, color = Species)) +
geom_point()

42 / 51

Exemplo com R - Gráfico de colunas

Mapeamento estético e objeto geométrico

ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))

43 / 51

Exemplo com R - Gráfico de colunas

Mapeamento estético e objeto geométrico

ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))

Sistema de coordenadas

ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut)) +
coord_flip()

43 / 51

Exemplo com Python - Gráfico de dispersão

Mapeamento estético

from plotnine import *
from plotnine.data import mtcars, diamonds
ggplot(mtcars, aes(x = 'mpg', y = 'disp'))

44 / 51

Exemplo com Python - Gráfico de dispersão

Mapeamento estético

from plotnine import *
from plotnine.data import mtcars, diamonds
ggplot(mtcars, aes(x = 'mpg', y = 'disp'))

Objeto geométrico

(ggplot(mtcars, aes(x = 'mpg', y = 'disp', color = 'factor(am)'))
+ geom_point())

44 / 51

Exemplo com Python - Gráfico de colunas

Mapeamento estético e objeto geométrico

(ggplot(data = diamonds) +
stat_count(mapping = aes(x = 'cut')))

45 / 51

Exemplo com Python - Gráfico de colunas

Mapeamento estético e objeto geométrico

(ggplot(data = diamonds) +
stat_count(mapping = aes(x = 'cut')))

Sistema de coordenadas

(ggplot(data = diamonds) +
stat_count(mapping = aes(x = 'cut')) +
coord_flip())

45 / 51



Indo além

46 / 51

Exemplo - Gráfico de coordenadas paralelas




iris %>% dplyr::mutate(id = 1:nrow(iris)) %>%
tidyr::gather(atributos, valores, -Species, -id) %>%
ggplot(., aes(x = atributos, y = valores, color = Species, group = id)) +
geom_line(size=0.55) +
labs(x = "Atributos",
y = "Valores",
title = "Coordenadas Paralelas - Iris",
caption = "Fonte: dataAt") +
theme_bw() +
theme(plot.title = element_text(hjust= 0.5, margin = margin(b = 7)))

47 / 51

Exemplo - Gráfico de coordenadas paralelas




iris %>% dplyr::mutate(id = 1:nrow(iris)) %>%
tidyr::gather(atributos, valores, -Species, -id) %>%
ggplot(., aes(x = atributos, y = valores, color = Species, group = id)) +
geom_line(size=0.55) +
facet_grid(~Species) +
labs(x = "Atributos",
y = "Valores",
title = "Coordenadas Paralelas - Iris") +
theme_bw() +
theme(plot.title = element_text(hjust= 0.5, margin = margin(b = 7)), axis.text.x = element_text(angle = 90))

48 / 51



Extensões do ggplot
(Somente em R)

49 / 51

Lemon package




amost_diam %>%
ggplot(., aes(x = as.factor(cut), y = price, color = clarity)) +
geom_point(position=position_jitter(width=0.08)) +
coord_flex_cart(bottom=brackets_horisontal(), left=capped_vertical('both')) +
theme_light() +
theme(panel.border=element_blank(), axis.line = element_line(),
plot.title = element_text(hjust= 0.5, margin = margin(b = 7))) +
labs(x = "Qualidade do corte",
y = "Preço em US",
title = "Gráfico de bolhas - Diamonds")

50 / 51



Obrigado!

51 / 51

Agenda



  • Introdução ao R

    • Tidyverse
  • Visualização de dados


2 / 51
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow