MAC 113 — Introdução à
Ciência da Computação
Aula 26
Nelson Lago
1º/2025
Previously on MAC113…
1/36
Dataframes
• Em geral, as operações vetoriais que fazemos em
dataframes/tibbles processam as colunas
▶ Como cada coluna é um vector, sabemos que os
elementos são todos do mesmo tipo
▶ Em geral, coisas como max(), mean(), sum() etc.,
fazem sentido com as colunas
• Para processar as linhas, podemos extrair uma
linha específica por sua coordenada:
▶ df[3,]
• ou, para processar todas, fazer um laço:
▶ for (i in seq_len(nrow(df))) { df[i,] }
• ou usar paste()
•… 2/36
Dataframes
Dataframes/tibbles: Como vivem? Onde moram? De que se alimentam?
• Não tem muita graça digitar os dados de um
dataframe/tibble como parte do programa
• O mais razoável é carregar de um arquivo
• Dataframes são tabelas o arquivo deve representar uma tabela
• O formato mais comumente usado é o CSV
(comma-separated values)
Nome matemática português física história
Alan Turing 9.7 1.4 9.2 8.7
Ada Lovelace 9.8 1.2 10.0 9.2
3/36
Dataframes
Nome,matemática,português,física,história
Alan Turing,9.7,1.4,9.2,8.7
Ada Lovelace,9.8,1.2,10.0,9.2
Nome ,matemática,português,física,história
Alan Turing ,9.7 ,1.4 ,9.2 ,8.7
Ada Lovelace ,9.8 ,1.2 ,10.0 ,9.2
• CSV: “Comma” pode ser qualquer coisa (espaços, tabs…)
Nome;matemática;português;física;história
Alan Turing;9,7;1,4;9,2;8,7
Ada Lovelace;9,8;1,2;10,0;9,2
4/36
Dataframes
• E como ler um arquivo desses?
endereço <- '[Link]
#df <- [Link](endereço, sep=",", header=TRUE) # dataframe
library(readr)
df <- read_delim(endereço, delim=",", col_types = "idd")
names(df)[2] <- "PIBpc"
print(head(df))
# A tibble: 6 × 3
ano PIBpc IPCA
<int> <dbl> <dbl>
1 2000 6913. 7
2 2001 7467 6.8
3 2002 8341. 8.4
4 2003 9507. 14.7
5 2004 10706 6.6
6 2005 11734. 6.9
5/36
Dataframes
endereço <- '[Link]
#df <- [Link](endereço, sep=",", header=TRUE) # dataframe
library(readr)
df <- read_delim(endereço, delim=",", col_types = "idd")
names(df)[2] <- "PIBpc"
p <- ggplot(df, aes(x=ano, y=PIBpc)) +
geom_line() +
geom_point() +
labs(title="PIB per capita anual brasileiro")
print(p)
6/36
Dataframes
PIB per capita anual brasileiro
30000
PIBpc
20000
10000
2000 2005 2010 2015
ano
7/36
Recortes com filtros
• Dado um dataframe df (ou um vector/lista), podemos fazer
um “recorte” usando coordenadas: df[linhas,colunas]
▶ linhas e colunas podem ser valores únicos ou vectors
• Também podemos usar um vector do tipo LOGICAL
vec <- 1:5
cat(vec[c(TRUE, FALSE, FALSE, TRUE, FALSE)], "\n")
1 4
grandes <- vec > 3
cat(grandes, "\n")
FALSE FALSE FALSE TRUE TRUE
cat(vec[grandes], "\n")
4 5
cat(vec[vec > 3], "\n")
4 5
8/36
Recortes com filtros
library(tibble)
df <- tibble(nome=c("Fulano", "Ciclano", "Beltrano"), idade=c(17, 25, 19))
cat("Idade do Fulano:", unlist(df[df$nome == "Fulano","idade"]), "\n")
Idade do Fulano: 17
library(tibble)
df <- tibble(nome=c("Fulano", "Ciclano", "Beltrano"), idade=c(17, 25, 19))
cat("Maiores de idade:", unlist(df[df$idade>=18,]), "\n")
maiores <- df[df$idade>=18,]
cat("Maiores de idade:", paste(maiores$nome, ": ", maiores$idade, sep=""), sep="\n")
Maiores de idade: Ciclano Beltrano 25 19
Maiores de idade:
Ciclano: 25
Beltrano: 19
9/36
Outras coisas sobre R e dataframes
• Para salvar um dataframe em um arquivo:
▶ write_delim(df, file="[Link]", delim=",")
• Para salvar o último gráfico exibido com ggplot2 em um arquivo:
▶ ggsave("[Link]", width=6, height=4) (polegadas)
• Para ler diretamente arquivos do excel ou libreoffice:
▶ biliotecas readxl e readODS (mas prefira usar CSV!)
• Bibliotecas muito úteis e populares:
▶ purrr (operações vetoriais com lists/vectors)
▶ dplyr (operações vetoriais com dataframes/tibbles)
▶ stringr (operações com textos)
» carregue todas (além de ggplot2, tibble…) com library(tidyverse)
• Para acessar a documentação
▶ ?nome-da-função (sobre a função)
▶ vignette("package") (sobre a package)
▶ ??alguma-coisa (busca “alguma-coisa” em toda a documentação)
10/36
And now for more of the same
10/36
Exoplanetas
• Dados sobre exoplanetas
[Link]/exoplanets/exoplanet-catalog/
• Em formato tabular “mastigado”
(Adaptado de [Link]/mwaskom/seaborn-data/blob/master/[Link])
number period mass distance
1 269.3 7.1 77.4
1 874.8 2.2 56.95
1 763.0 2.6 19.84
…
• number Number of planets in the system
period Orbital period in Earth days
mass Mass of the planet in Jupiter masses
distance Distance from Earth in light-years
11/36
Exoplanetas
• [Link]/~lago/dadinhos/[Link]
• Qual o maior número de planetas em um sistema?
• Qual a distância do planeta mais próximo?
• Quais são a massa e o período orbital médios?
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
cat("O maior número de planetas em um sistema é", max(planetas$number), "\n")
cat("A distância até o planeta mais próximo é", min(planetas$distance), "anos-luz\n")
cat("A massa média dos planetas é", mean(planetas$mass), "\n")
cat("O período orbital médio dos planetas é", mean(planetas$period), "\n")
}
main()
12/36
Intermezzo
12/36
ggplot2
• Em um gráfico, representamos dados com formas
geométricas (pontos, linhas, caixas, barras…) e seus
atributos estéticos (posição, forma, tamanho, cor…)
▶ Em um gráfico de linha, a forma é a linha e o atributo estético usado
geralmente é a sua posição no plano cartesiano (coordenadas 𝑥, 𝑦)
• Gráficos com ggplot2 são construídos em camadas
▶ Adicionamos camadas com “+”
▶A primeira “camada” é a área (vazia) do gráfico: ggplot(df)
» (um “atalho” comum é acrescentar o dataframe com os dados aqui também)
▶ As próximas camadas são as formas geométricas:
geom_point(), geom_line() etc.
» E, para cada uma, incluímos as definições dos atributos estéticos: aes()
▶ As próximas camadas definem os demais aspectos visuais, como o
sistema de coordenadas, as escalas dos eixos, títulos, legendas etc.
13/36
ggplot2
• Para cada forma geométrica, é preciso definir como
o dado é representado por aquela forma
▶ Nocaso de linhas, pontos etc., geralmente queremos representar os
dados pela posição das linhas/pontos no sistema de coordenadas:
geom_line(aes(x=blah, y=bleh))
▶ Masa espessura e a cor da linha também podem ser
usadas para representar algum dado:
geom_line(aes(x=blah, y=bleh, color=blih, linewidth=bloh))
14/36
ggplot2
library(tidyverse)
endereço <- '[Link]
df <- read_delim(endereço, delim=",", col_types = "idd")
names(df)[2] <- "PIBpc"
p <- ggplot(df) +
geom_line(aes(x=ano, y=IPCA, linewidth=PIBpc)) +
labs(title="PIB per capita anual brasileiro",
linewidth="PIB per capita") +
scale_x_continuous(breaks=seq(2000, 2019, 2))
print(p)
15/36
ggplot2
PIB per capita anual brasileiro
15
12
PIB per capita
10000
15000
IPCA
9 20000
25000
30000
35000
6
3
2000 2002 2004 2006 2008 2010 2012 2014 2016 2018
ano
16/36
ggplot2
library(tidyverse)
endereço <- '[Link]
df <- read_delim(endereço, delim=",", col_types = "idd")
names(df)[2] <- "PIBpc"
p <- ggplot(df) +
geom_line(aes(x=ano, y=IPCA, color=PIBpc), linewidth=2) +
labs(title="PIB per capita anual brasileiro",
color="PIB per capita") +
scale_x_continuous(breaks=seq(2000, 2019, 2))
print(p)
17/36
ggplot2
PIB per capita anual brasileiro
15
12
PIB per capita
35000
30000
IPCA
9 25000
20000
15000
10000
3
2000 2002 2004 2006 2008 2010 2012 2014 2016 2018
ano
18/36
ggplot2
• Para cada forma geométrica, é preciso definir como
o dado é representado por aquela forma
▶ Nocaso de linhas, pontos etc., geralmente queremos representar os
dados pela posição das linhas/pontos no sistema de coordenadas:
geom_line(aes(x=blah, y=bleh))
▶ Masa espessura e a cor da linha também podem ser
usadas para representar algum dado:
geom_line(aes(x=blah, y=bleh, color=blih, linewidth=bloh))
▶ Isso é totalmente diferente de
geom_line(aes(x=blah, y=bleh), color="green", linewidth=2))
19/36
ggplot2
library(tidyverse)
endereço <- '[Link]
df <- read_delim(endereço, delim=",", col_types = "idd")
names(df)[2] <- "PIBpc"
p <- ggplot(df) +
geom_line(aes(x=ano, y=IPCA), color="green", linewidth=2) +
labs(title="PIB per capita anual brasileiro") +
scale_x_continuous(breaks=seq(2000, 2019, 2))
print(p)
20/36
ggplot2
PIB per capita anual brasileiro
15
12
IPCA
3
2000 2002 2004 2006 2008 2010 2012 2014 2016 2018
ano
21/36
ggplot2
• Para cada forma geométrica, é preciso definir como
o dado é representado por aquela forma
▶ Nocaso de linhas, pontos etc., geralmente queremos representar os
dados pela posição das linhas/pontos no sistema de coordenadas:
geom_line(aes(x=blah, y=bleh))
▶ Masa espessura e a cor da linha também podem ser
usadas para representar algum dado:
geom_line(aes(x=blah, y=bleh, color=blih, linewidth=bloh))
▶ Isso é totalmente diferente de
geom_line(aes(x=blah, y=bleh), color="green", linewidth=2))
» Veja todos os atributos possíveis com vignette('ggplot2-specs')
22/36
Exoplanetas
• Quantos planetas há no sistema de cada planeta? (barras)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
quantidades <- unique(planetas$number)
vizinhança <- integer(length(quantidades))
for (i in seq_len(length(quantidades))) {
q <- quantidades[i]
vizinhança[i] <- nrow(planetas[planetas$number == q,])
}
p <- ggplot(NULL, aes(x=quantidades, y=vizinhança)) +
geom_col() +
labs(title="Número de planetas no sistema",
x="Número de planetas no sistema",
y="Quantidade de planetas") +
scale_x_discrete(limits=[Link](1:6))
print(p)
}
main() 23/36
Número de planetas no sistema
300
Quantidade de planetas
200
100
0
1 2 3 4 5 6
Número de planetas no sistema
24/36
Exoplanetas
• Qual é a distribuição da massa dos planetas? (histograma)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
p <- ggplot(planetas) +
geom_histogram(aes( mass), bins=20, color='black', fill='lightblue') +
labs(title="Massa dos planetas", x="Massa", y="Frequência")
print(p)
}
main()
25/36
Massa dos planetas
150
Frequência
100
50
0
0 10 20
Massa
26/36
Exoplanetas
• Qual é a distribuição da massa dos planetas? (histograma)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
p <- ggplot(planetas) +
geom_histogram(aes(mass), bins=20, color='black', fill='lightblue') +
labs(title="Massa dos planetas", x="Massa", y="Frequência") +
scale_x_continuous(breaks=seq(0,50,5))
print(p)
}
main()
27/36
Massa dos planetas
150
Frequência
100
50
0
0 5 10 15 20 25
Massa
28/36
Exoplanetas
• Qual é a distribuição do período orbital
dos planetas? (histograma)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
p <- ggplot(planetas) +
geom_histogram(aes(period), bins=20, color='black', fill='lightblue') +
labs(title="Período orbital dos planetas", x="Período", y="Frequência") +
scale_y_continuous(transform = 'log10')
print(p)
}
main()
29/36
Período orbital dos planetas
100
Frequência
10
1
0 5000 10000 15000
Período
30/36
Exoplanetas
• Qual é a distribuição da distância dos planetas? (histograma)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
p <- ggplot(planetas) +
geom_histogram(aes(distance), bins=20, color='black', fill='lightblue') +
labs(title="Distância dos planetas à terra",
x="Distância (anos-luz)", y="Frequência") +
scale_y_continuous(transform = 'log10')
print(p)
}
main()
31/36
Distância dos planetas à terra
Frequência 100
10
1
0 100 200 300
Distância (anos-luz)
32/36
Exoplanetas
• Qual é a distribuição da massa dos planetas? (boxplot)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
p <- ggplot(planetas) +
geom_boxplot(aes(x="massa", y=mass)) +
labs(title="Massa dos planetas", x="")
print(p)
}
main()
33/36
Massa dos planetas
25
20
15
mass
10
0
massa
34/36
Exoplanetas
• Existe relação entre a massa dos planetas e seu
período orbital? (dispersão ou scatter)
library(tidyverse)
main <- function() {
arq <- '[Link]
planetas <- read_delim(arq, delim=",", show_col_types = FALSE)
p <- ggplot(planetas) +
geom_point(aes(x=mass, y=period)) +
labs(title="Massa vs período orbital", x="Massa", y="Período") +
scale_x_continuous(transform = 'log10') +
scale_y_continuous(transform = 'log10')
print(p)
}
main()
35/36
Massa vs período orbital
10000
1000
Período
100
10
1
0.01 0.10 1.00 10.00
Massa
36/36