Introdução ao R
Visualização de dados
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
<-
apontada para a variávelDeclaração de variáveis
numerico <- 123 double <- 123.2 inteiro <- 321L complexo <- 321i booleano <- TRUE caractere <- "Bem-vindos"
<-
apontada para a variávelDeclaraçã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"
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"
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
R 4 Data Science - Hadley
v1 <- c(FALSE, "tipo", 5)
v1 <- c(FALSE, "tipo", 5)v1## [1] "FALSE" "tipo" "5"
v1 <- c(FALSE, "tipo", 5)v1## [1] "FALSE" "tipo" "5"
v2 <- c(32, 1, 5i)
v1 <- c(FALSE, "tipo", 5)v1## [1] "FALSE" "tipo" "5"
v2 <- c(32, 1, 5i)v2## [1] 32+0i 1+0i 0+5i
v1 <- c(FALSE, "tipo", 5)v1## [1] "FALSE" "tipo" "5"
v2 <- c(32, 1, 5i)v2## [1] 32+0i 1+0i 0+5i
typeof(v1)## [1] "character"
typeof(v2)## [1] "complex"
Matriz composta por linhas e colunas, cujas colunas representam as variáveis (atributos) e as linhas representam observações
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"
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"
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"
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
Conjunto de pacotes em R para ciência de dados
Conjunto de pacotes em R para ciência de dados
Processo de ciência de dados
Doing Data Science - Rachel Schutt
Conjunto de pacotes em R para ciência de dados
Processo de ciência de dados
Doing Data Science - Rachel Schutt
Conjunto de pacotes em R para ciência de dados
Processo de ciência de dados
Doing Data Science - Rachel Schutt
Conjunto de pacotes em R para ciência de dados
Processo de ciência de dados
Doing Data Science - Rachel Schutt
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")
Para manipular nosso dataframe, vamos usar o pacote dplyr. Métodos básicos:
R for Data Science - Garrett Grolemund
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>
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
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>
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
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
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))
Dado de série temporal da temperatura da superfície terrestre
Fonte: Berkeley Earth
# 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
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
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?
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
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
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>
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
Fundamentals of Data Visualization - Claus O. Wilke
Mapeamento estético
library(ggplot2) ggplot(iris, aes(x = Petal.Width, y = Petal.Length, color = Species))
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()
Mapeamento estético e objeto geométrico
ggplot(data = diamonds) + stat_count(mapping = aes(x = cut))
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()
Mapeamento estético
from plotnine import *from plotnine.data import mtcars, diamondsggplot(mtcars, aes(x = 'mpg', y = 'disp'))
Mapeamento estético
from plotnine import *from plotnine.data import mtcars, diamondsggplot(mtcars, aes(x = 'mpg', y = 'disp'))
Objeto geométrico
(ggplot(mtcars, aes(x = 'mpg', y = 'disp', color = 'factor(am)')) + geom_point())
Mapeamento estético e objeto geométrico
(ggplot(data = diamonds) + stat_count(mapping = aes(x = 'cut')))
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())
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)))
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))
Extensões do ggplot
(Somente em R)
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")
Obrigado!
Introdução ao R
Visualização de dados
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 |