Questão 1:
# Questão 1 - Visualizações em R base
# Dados fornecidos
MRT_1F <- c(517.1468515630205, 85.13094142168089, 30.333207896694553,
12.694776264558937, 3.3041601673945418, 1.1823111717498882,
1.1892293502386786)
MRT_3F <- c(156.68929936163462, 11.540837783562276, 0.4512835621696538,
0.4509797929766453, 0.4502068233039181, 0.4496185276300172,
0.4543157082191288)
MRT_5F <- c(83.90319666471157, 0.3068151086494968, 0.30522314133037304,
0.3072588968084928, 0.30655265997285697, 0.3055812715727718,
0.3053297166713006)
MRT_10F <- c(29.55430642951759, 0.19832832665772515, 0.1971923924717474,
0.19796648905716516, 0.19615594370806338, 0.2034569237883263,
0.19617420889447737)
MRT_15F <- c(11.317736530583566, 0.167364215666193, 0.16172168266811013,
0.16701085329580515, 0.1598052657153692, 0.1645934043532696,
0.16216563797118075)
MRT_sem_F <- c(11.93430909937736, 0.6095414637034009, 0.6060645101029295,
0.612167181646899, 0.6146761002685637, 0.6096747087200697,
0.6125810476877268)
clock <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)
# --- Preparação das matrizes para plotagem ---
# Organizamos os vetores em uma matriz para manipular com mais facilidade
mat <- rbind(MRT_1F, MRT_3F, MRT_5F, MRT_10F, MRT_15F, MRT_sem_F)
rownames(mat) <- c("MRT_1F","MRT_3F","MRT_5F","MRT_10F","MRT_15F","MRT_sem_F")
# matplot espera colunas = séries ao longo do eixo y, então transponha
mat_t <- t(mat) # agora colunas = cada série
# --- Layout: 2 painéis empilhados (1: séries; 2: barras em escala log) ---
layout(matrix(c(1,2), ncol = 1), heights = c(3, 2)) # mais espaço para o primeiro gráfico
# ----- Gráfico 1: linhas + pontos para cada série ao longo de 'clock' -----
# type="b" desenha linhas e pontos; pch define símbolos; lty linha contínua
matplot(clock, mat_t, type = "b", pch = 1:ncol(mat_t), lty = 1,
xlab = "clock (horas)", ylab = "MRT", main = "MRT por série ao longo do tempo",
xaxt = "n") # desativamos eixo-x padrão para customizar
axis(1, at = clock, labels = clock) # marcar ticks do eixo x com os valores de 'clock'
legend("topright", legend = rownames(mat), col = 1:ncol(mat_t),
pch = 1:ncol(mat_t), lty = 1, bty = "n", cex = 0.9)
# ----- Gráfico 2: barras (média por série) em escala logarítmica -----
# Calcula a média de cada série (linha da matriz)
means <- rowMeans(mat)
# Cores alternadas conforme solicitado; usa repetição para cobrir todos os itens
barcols <- rep(c("#E6E6E6", "#666666"), length.out = length(means))
# barplot com eixo y logarítmico (log = "y")
barplot(means, log = "y", col = barcols, names.arg = rownames(mat),
ylab = "Média do MRT (escala log)", main = "Média do MRT por série (log scale)",
las = 2) # las=2 deixa rótulos do eixo x na vertical para melhor leitura

# Opcional: voltar ao layout padrão após os plots
layout(1)
Questão 2:
# Questão 2 - Gráfico de Barras Empilhadas
# -------------------------------------------------------------
# Criamos a tabela de exemplo
dados <- matrix(c(8, 14, 2,
6, 18, 5,
3, 10, 12),
nrow = 3, byrow = TRUE)
# Nome das linhas e colunas
rownames(dados) <- c("Barato", "Médio", "Caro")
colnames(dados) <- c("Baixa", "Média", "Alta")
# Visualizar a tabela
print(dados)
## Baixa Média Alta
## Barato 8 14 2
## Médio 6 18 5
## Caro 3 10 12
# -------------------------------------------------------------
# Criando o gráfico de barras empilhadas
barplot(t(dados),
beside = FALSE,
col = c("#F4A582", "#92C5DE", "#B2182B"),
main = "Qualidade da Refeição por Categoria de Preço",
xlab = "Categoria de Preço",
ylab = "Quantidade de Avaliações")
# Adiciona legenda
legend("topright",
legend = colnames(dados),
fill = c("#F4A582", "#92C5DE", "#B2182B"),
title = "Qualidade")

Questão 3:
# Questão 3 - Histograma das temperaturas em maio
# ---------------------------------------------------------------------
# Carregar o dataset airquality
data("airquality")
# Filtrar apenas o mês de maio (Month == 5)
maio <- subset(airquality, Month == 5)
# Converter as temperaturas para graus Celsius
# Fórmula: °C = (°F − 32) / 1.8
maio$Temp_C <- (maio$Temp - 32) / 1.8
# Verificar as primeiras linhas
head(maio)
## Ozone Solar.R Wind Temp Month Day Temp_C
## 1 41 190 7.4 67 5 1 19.44444
## 2 36 118 8.0 72 5 2 22.22222
## 3 12 149 12.6 74 5 3 23.33333
## 4 18 313 11.5 62 5 4 16.66667
## 5 NA NA 14.3 56 5 5 13.33333
## 6 28 NA 14.9 66 5 6 18.88889
# ---------------------------------------------------------------------
# Criar o histograma básico
hist(maio$Temp_C,
main = "Distribuição das Temperaturas em Maio (°C)",
xlab = "Temperatura (°C)",
ylab = "Frequência",
col = "#87CEFA",
border = "white",
freq = FALSE)
# Adicionar a curva de densidade suavizada
lines(density(maio$Temp_C, na.rm = TRUE),
col = "red",
lwd = 2)
# Adicionar legenda
legend("topright",
legend = c("Densidade"),
col = "red",
lwd = 2,
bty = "n")

Questão 4:
# Questão 4 - Gráfico de Pizza das Vendas por País
# ---------------------------------------------------------------------
# Importar os dados
sales <- read.table("https://training-course-material.com/images/8/8f/Sales.txt",
header = TRUE)
# Verificar a estrutura
str(sales)
## 'data.frame': 6 obs. of 2 variables:
## $ COUNTRY: chr "US" "UK" "France" "Poland" ...
## $ SALES : int 340 290 510 820 120 780
head(sales)
## COUNTRY SALES
## 1 US 340
## 2 UK 290
## 3 France 510
## 4 Poland 820
## 5 Japan 120
## 6 China 780
# ---------------------------------------------------------------------
# Agregar vendas por país (soma)
vendas_pais <- aggregate(sales$SALES, by = list(Country = sales$COUNTRY), sum)
# Renomear as colunas
colnames(vendas_pais) <- c("Country", "TotalSales")
# Calcular a porcentagem de cada país
vendas_pais$Perc <- round((vendas_pais$TotalSales / sum(vendas_pais$TotalSales)) * 100, 1)
# Criar rótulos com nome + porcentagem
rotulos <- paste(vendas_pais$Country, "-", vendas_pais$Perc, "%")
# Definir cores
cores <- rainbow(nrow(vendas_pais))
# ---------------------------------------------------------------------
# Criar o gráfico de pizza
pie(vendas_pais$TotalSales,
labels = rotulos,
col = cores,
main = "Percentual das Vendas Totais por País")
# Adicionar legenda
legend("topright",
legend = vendas_pais$Country,
fill = cores,
title = "Países",
cex = 0.9,
bty = "n")

Questão 5:
# Questão 5 - Boxplot das contagens de insetos por tipo de spray
# ---------------------------------------------------------------------
# Carregar dataset padrão do R
data("InsectSprays")
# Visualizar estrutura do dataset
str(InsectSprays)
## 'data.frame': 72 obs. of 2 variables:
## $ count: num 10 7 20 14 14 12 10 23 17 20 ...
## $ spray: Factor w/ 6 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
head(InsectSprays)
## count spray
## 1 10 A
## 2 7 A
## 3 20 A
## 4 14 A
## 5 14 A
## 6 12 A
# ---------------------------------------------------------------------
# Criar boxplot sem outliers (outline = FALSE)
boxplot(count ~ spray,
data = InsectSprays,
main = "Contagem de Insetos por Tipo de Inseticida",
xlab = "Tipo de Inseticida",
ylab = "Número de Insetos",
col = "yellow",
border = "black",
outline = FALSE)
# Adicionar grid para melhor leitura
grid()

by(InsectSprays$count, InsectSprays$spray, summary)
## InsectSprays$spray: A
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.00 11.50 14.00 14.50 17.75 23.00
## ------------------------------------------------------------
## InsectSprays$spray: B
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.00 12.50 16.50 15.33 17.50 21.00
## ------------------------------------------------------------
## InsectSprays$spray: C
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.000 1.500 2.083 3.000 7.000
## ------------------------------------------------------------
## InsectSprays$spray: D
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 3.750 5.000 4.917 5.000 12.000
## ------------------------------------------------------------
## InsectSprays$spray: E
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 2.75 3.00 3.50 5.00 6.00
## ------------------------------------------------------------
## InsectSprays$spray: F
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.00 12.50 15.00 16.67 22.50 26.00
Questão 6:
# Questão 6 - Gráficos de linha: uso de memória x tempo de coleta
# ---------------------------------------------------------------------
# Caminho da pasta onde estão os arquivos
pasta <- "C:/Users/cauaf/OneDrive/Documents/CSVs"
# Lista de arquivos dentro da pasta
arquivos <- c(
file.path(pasta, "monitoringCloudData_0.1.csv"),
file.path(pasta, "monitoringCloudData_0.5.csv"),
file.path(pasta, "monitoringCloudData_1.csv"),
file.path(pasta, "monitoringCloudData_NONE.csv")
)
# Função para ler e tratar cada arquivo
processar_dados <- function(caminho) {
df <- read.csv(caminho, stringsAsFactors = FALSE)
# --- Conversão do tempo para contínuo (em horas) ---
df$currentTime <- as.POSIXct(df$currentTime, format = "%Y-%m-%d %H:%M:%S")
tempo_base <- min(df$currentTime, na.rm = TRUE)
df$tempo_horas <- as.numeric(difftime(df$currentTime, tempo_base, units = "hours"))
# --- Limpeza e conversão da coluna de memória para MB ---
mem_str <- df$usedMemory
# Extrai o valor numérico e a unidade
valores <- as.numeric(sub("([0-9\\.]+).*", "\\1", mem_str))
unidades <- toupper(gsub("[0-9\\.\\s]+", "", mem_str))
# Converter para MB
df$usedMemory_MB <- ifelse(unidades == "TB", valores * 1e6,
ifelse(unidades == "GB", valores * 1024, valores))
return(df)
}
# ---------------------------------------------------------------------
# Ler e processar os quatro datasets
dados_processados <- lapply(arquivos, processar_dados)
nomes <- c("0.1", "0.5", "1", "NONE")
# ---------------------------------------------------------------------
# Layout 2x2 para os gráficos
layout(matrix(1:4, ncol = 2, byrow = TRUE))
par(mar = c(4, 4, 3, 1)) # margens ajustadas
# Plotar cada dataset
for (i in 1:4) {
df <- dados_processados[[i]]
plot(df$tempo_horas, df$usedMemory_MB, type = "l", lwd = 2, col = "blue",
main = paste("Uso de Memória - Configuração", nomes[i]),
xlab = "Tempo (horas)",
ylab = "Memória usada (MB)")
grid()
}

# Restaurar layout padrão
layout(1)
Questão 7:
# Questão 7 - Gráfico de pizza interativo (Plotly)
# ---------------------------------------------------------------------
# Instalar e carregar bibliotecas, se necessário
library(plotly)
## Warning: pacote 'plotly' foi compilado no R versão 4.5.2
## Carregando pacotes exigidos: ggplot2
##
## Anexando pacote: 'plotly'
## O seguinte objeto é mascarado por 'package:ggplot2':
##
## last_plot
## O seguinte objeto é mascarado por 'package:stats':
##
## filter
## O seguinte objeto é mascarado por 'package:graphics':
##
## layout
library(dplyr)
##
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
# ---------------------------------------------------------------------
# Leitura do dataset Netflix
netflix <- read.csv("C:/Users/cauaf/OneDrive/Documents/netflix_titles.csv")
# Verificar as colunas disponíveis
str(netflix)
## 'data.frame': 7787 obs. of 12 variables:
## $ show_id : chr "s1" "s2" "s3" "s4" ...
## $ type : chr "TV Show" "Movie" "Movie" "Movie" ...
## $ title : chr "3%" "7:19" "23:59" "9" ...
## $ director : chr "" "Jorge Michel Grau" "Gilbert Chan" "Shane Acker" ...
## $ cast : chr "João Miguel, Bianca Comparato, Michel Gomes, Rodolfo Valente, Vaneza Oliveira, Rafael Lozano, Viviane Porto, Me"| __truncated__ "Demián Bichir, Héctor Bonilla, Oscar Serrano, Azalia Ortiz, Octavio Michel, Carmen Beato" "Tedd Chan, Stella Chung, Henley Hii, Lawrence Koh, Tommy Kuan, Josh Lai, Mark Lee, Susan Leong, Benjamin Lim" "Elijah Wood, John C. Reilly, Jennifer Connelly, Christopher Plummer, Crispin Glover, Martin Landau, Fred Tatasc"| __truncated__ ...
## $ country : chr "Brazil" "Mexico" "Singapore" "United States" ...
## $ date_added : chr "August 14, 2020" "December 23, 2016" "December 20, 2018" "November 16, 2017" ...
## $ release_year: int 2020 2016 2011 2009 2008 2016 2019 1997 2019 2008 ...
## $ rating : chr "TV-MA" "TV-MA" "R" "PG-13" ...
## $ duration : chr "4 Seasons" "93 min" "78 min" "80 min" ...
## $ listed_in : chr "International TV Shows, TV Dramas, TV Sci-Fi & Fantasy" "Dramas, International Movies" "Horror Movies, International Movies" "Action & Adventure, Independent Movies, Sci-Fi & Fantasy" ...
## $ description : chr "In a future where the elite inhabit an island paradise far from the crowded slums, you get one chance to join t"| __truncated__ "After a devastating earthquake hits Mexico City, trapped survivors from all walks of life wait to be rescued wh"| __truncated__ "When an army recruit is found dead, his fellow soldiers are forced to confront a terrifying secret that's haunt"| __truncated__ "In a postapocalyptic world, rag-doll robots hide in fear from dangerous machines out to exterminate them, until"| __truncated__ ...
# ---------------------------------------------------------------------
# Filtrar apenas registros com um único país (sem vírgulas na coluna "country")
netflix_filtrado <- netflix %>%
filter(!is.na(country)) %>%
filter(!grepl(",", country)) # mantém apenas 1 país por registro
# Agrupar por país e contar quantidade de conteúdos
conteudos_pais <- netflix_filtrado %>%
group_by(country) %>%
summarise(total = n()) %>%
arrange(desc(total)) %>%
head(10) # top 10 países
# ---------------------------------------------------------------------
# Criar o gráfico de pizza interativo
fig <- plot_ly(conteudos_pais,
labels = ~country,
values = ~total,
type = "pie",
textinfo = "label+percent", # mostra nome + porcentagem
insidetextorientation = "radial") %>%
layout(title = "Top 10 Países com Mais Conteúdos na Netflix (2019)",
legend = list(title = list(text = "<b>Países</b>")),
showlegend = TRUE)
# Exibir gráfico
fig
Questão 8:
# Questão 8 - Tabela interativa com Plotly
# ---------------------------------------------------------------------
library(plotly)
library(dplyr)
# Se ainda não estiver definido, reusamos o dataframe da questão anterior:
# netflix_filtrado e conteudos_pais
if (!exists("conteudos_pais")) {
netflix <- read.csv("C:/Users/cauaf/OneDrive/Documents/netflix_titles.csv")
netflix_filtrado <- netflix %>%
filter(!is.na(country)) %>%
filter(!grepl(",", country))
conteudos_pais <- netflix_filtrado %>%
group_by(country) %>%
summarise(total = n()) %>%
arrange(desc(total)) %>%
head(10)
}
# ---------------------------------------------------------------------
# Criar tabela Plotly
fig_tabela <- plot_ly(
type = 'table',
header = list(
values = c("<b>País</b>", "<b>Total de Conteúdos</b>"),
fill = list(color = "#808080"), # fundo cinza
font = list(color = "white", size = 13),
align = "center" # texto centralizado no cabeçalho
),
cells = list(
values = rbind(conteudos_pais$country, conteudos_pais$total),
fill = list(color = "white"),
align = "center" # texto centralizado nas células
)
)
# Adicionar título
fig_tabela <- fig_tabela %>%
layout(title = "Top 10 Países com Mais Conteúdos na Netflix (Tabela)")
# Exibir tabela
fig_tabela
Questão 9:
# Questão 9 - Gráfico de linha: quantidade de conteúdo por década (Plotly)
# ---------------------------------------------------------------------
library(dplyr)
library(plotly)
# ---------------------------------------------------------------------
# Leitura do dataset Netflix
netflix <- read.csv("C:/Users/cauaf/OneDrive/Documents/netflix_titles.csv")
# Filtrar linhas válidas (ano conhecido)
netflix <- netflix %>% filter(!is.na(release_year))
# Criar uma nova coluna indicando a década
netflix <- netflix %>%
mutate(decada = floor(release_year / 10) * 10)
# Agrupar por tipo (Movie/TV Show) e década
conteudo_decada <- netflix %>%
group_by(type, decada) %>%
summarise(total = n(), .groups = "drop")
# ---------------------------------------------------------------------
# Gráfico de linha interativo
fig <- plot_ly(conteudo_decada,
x = ~decada,
y = ~total,
color = ~type,
colors = c("yellow", "blue"),
type = 'scatter',
mode = 'lines+markers') %>%
layout(title = "Quantidade de Conteúdos por Década (Netflix)",
xaxis = list(title = "Década"),
yaxis = list(title = "Quantidade de Conteúdos"),
legend = list(title = list(text = "<b>Tipo de Conteúdo</b>")),
plot_bgcolor = "#f9f9f9",
paper_bgcolor = "#f9f9f9")
# Exibir o gráfico
fig
Questão 10:
# Questão 10 - Gráfico de barras lado a lado (Plotly)
# ---------------------------------------------------------------------
library(dplyr)
library(plotly)
# ---------------------------------------------------------------------
# Leitura do dataset Netflix
netflix <- read.csv("C:/Users/cauaf/OneDrive/Documents/netflix_titles.csv")
# ---------------------------------------------------------------------
# Filtrar apenas filmes e anos de 2000 a 2010
netflix_filmes <- netflix %>%
filter(type == "Movie", release_year >= 2000, release_year <= 2010)
# Extrair apenas o primeiro gênero listado
netflix_filmes <- netflix_filmes %>%
mutate(primeiro_genero = trimws(sapply(strsplit(as.character(listed_in), ","), `[`, 1)))
# Manter apenas os gêneros solicitados
generos_desejados <- c("Dramas", "Action & Adventure", "Comedies")
filmes_filtrados <- netflix_filmes %>%
filter(primeiro_genero %in% generos_desejados)
# ---------------------------------------------------------------------
# Contar número de filmes por ano e gênero
contagem <- filmes_filtrados %>%
group_by(release_year, primeiro_genero) %>%
summarise(total = n(), .groups = "drop")
# ---------------------------------------------------------------------
# Criar gráfico de barras lado a lado (grouped bar chart)
fig <- plot_ly(contagem,
x = ~release_year,
y = ~total,
color = ~primeiro_genero,
colors = c("red", "blue", "gold"),
type = "bar") %>%
layout(barmode = "group", # barras lado a lado
title = "Quantidade de Filmes por Gênero (2000–2010)",
xaxis = list(title = "Ano de Lançamento"),
yaxis = list(title = "Quantidade de Filmes"),
legend = list(title = list(text = "<b>Gênero</b>")))
# Exibir gráfico
fig