Questões
Questão 1
Dados
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)
Gráfico de linhas
# Cada coluna representa uma série.
series <- cbind(
MRT_1F,
MRT_3F,
MRT_5F,
MRT_10F,
MRT_15F,
MRT_sem_F
)
cores <- c("black", "yellow", "red", "blue", "purple", "green")
simbolos <- c(4, 8, 1, 2, 5, 4)
matplot(
clock,
series,
type = "o",
col = cores,
pch = simbolos,
lty = 1,
lwd = 0.8,
cex = 0.8,
xlim = c(0, 3),
ylim = c(0, 520),
xlab = "Time between Things requests (seconds)",
ylab = "Response Time (sec.)"
)
legend(
"topright",
legend = c(
"1 Fog", "3 Fogs", "5 Fogs",
"10 Fogs", "15 Fogs", "w/o Fog"
),
col = cores,
pch = simbolos,
lty = 1,
lwd = 0.8,
cex = 0.9,
bty = "o"
)

Gráficos de barras
local({
parametros <- par(no.readonly = TRUE)
on.exit({
layout(1)
par(parametros)
})
layout(
matrix(
c(1, 2,
3, 4,
5, 0),
nrow = 3,
byrow = TRUE
)
)
par(mar = c(4.5, 4.5, 1.5, 1))
series_fog <- list(
MRT_1F,
MRT_3F,
MRT_5F,
MRT_10F,
MRT_15F
)
nomes_fog <- c(
"1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs"
)
for (i in seq_along(series_fog)) {
# Sem Fog à esquerda e com Fog à direita.
comparacao <- rbind(
MRT_sem_F,
series_fog[[i]]
)
barplot(
comparacao,
beside = TRUE,
log = "y",
col = c("#E6E6E6", "#666666"),
border = "black",
names.arg = clock,
xlab = "Time between Things requests",
ylab = "Response time (s)"
)
legend(
"topright",
legend = c("w/o Fog", nomes_fog[i]),
fill = c("#E6E6E6", "#666666"),
border = "black",
bg = "white",
bty = "o",
cex = 0.8
)
}
})

Questão 2
# Linhas: qualidade da refeição.
# Colunas: faixas de preço.
qualidade <- matrix(
c(
53.8, 33.9, 2.6, 0.0,
43.6, 54.2, 60.5, 21.4,
2.6, 11.9, 36.8, 78.6
),
nrow = 3,
byrow = TRUE
)
rownames(qualidade) <- c("Boa", "Muito boa", "Excelente")
colnames(qualidade) <- c("$10–19", "$20–29", "$30–39", "$40–49")
cores <- c("#A6CEE3", "#1F78B4", "#33A02C")
barplot(
qualidade,
beside = FALSE,
col = cores,
border = "white",
main = "Qualidade da refeição por faixa de preço",
xlab = "Faixa de preço da refeição",
ylab = "Percentual de avaliações (%)",
ylim = c(0, 115),
yaxt = "n"
)
axis(
2,
at = seq(0, 100, by = 20),
labels = paste0(seq(0, 100, by = 20), "%"),
las = 1
)
legend(
"top",
legend = rownames(qualidade),
fill = cores,
border = "white",
horiz = TRUE,
bty = "n"
)

Questão 3
data("airquality")
# Selecionar somente as observações de maio.
dados_maio <- subset(airquality, Month == 5)
# Converter as temperaturas de Fahrenheit para Celsius.
temperaturas_c <- (dados_maio$Temp - 32) / 1.8
# Remover valores ausentes, caso existam.
temperaturas_c <- na.omit(temperaturas_c)
# Calcular a curva de densidade.
densidade <- density(temperaturas_c)
# Histograma na escala de densidade.
hist(
temperaturas_c,
probability = TRUE,
col = "lightblue",
border = "white",
main = "Temperaturas de maio — airquality",
xlab = "Temperatura (°C)",
ylab = "Densidade"
)
# Adicionar a curva de densidade.
lines(
densidade,
col = "red",
lwd = 2
)
legend(
"topright",
legend = "Curva de densidade",
col = "red",
lwd = 2,
bty = "n"
)

Questão 4
sales <-
read.table("https://www.dropbox.com/scl/fi/mpjt4uuqb5vtmfiw38phk/Sales.txt?rlkey=93jlz79xwrrt7ah66d5k403d7&dl=1", header = TRUE)
# Calcular a participação de cada país no total de vendas.
porcentagens <- sales$SALES / sum(sales$SALES) * 100
rotulos <- paste0(round(porcentagens, 1), "%")
# Definir as cores das fatias.
cores <- c(
"#66C2A5", "#FC8D62", "#8DA0CB",
"#E78AC3", "#A6D854", "#FFD92F"
)
# Criar o gráfico de pizza.
pie(
sales$SALES,
labels = rotulos,
col = cores,
border = "white",
main = "Participação de cada país no total de vendas"
)
# Adicionar a legenda.
legend(
"bottom",
legend = sales$COUNTRY,
fill = cores,
border = "white",
horiz = TRUE,
bty = "n",
inset = c(0, -0.2),
xpd = TRUE
)

Questão 5
data("InsectSprays")
# Boxplots dos seis inseticidas, sem exibir os outliers.
boxplot(
count ~ spray,
data = InsectSprays,
outline = FALSE,
col = "yellow",
main = "Contagem de insetos por tipo de inseticida",
xlab = "Tipo de inseticida",
ylab = "Contagem de insetos"
)

Questão 6
Leitura e tratamento dos dados
# Converter os valores de memória para MB.
converter_mb <- function(memoria) {
numero <- as.numeric(gsub("[^0-9.]", "", memoria))
unidade <- toupper(gsub("[^[:alpha:]]", "", memoria))
# Fatores definidos conforme o enunciado.
fatores <- c(
MB = 1,
GB = 1024,
TB = 1000000
)
unname(numero * fatores[unidade])
}
# Ler e preparar cada arquivo.
preparar_dados <- function(arquivo) {
dados <- read.csv(
arquivo,
header = TRUE,
stringsAsFactors = FALSE
)
# Extrair somente o horário, inclusive nas linhas com datas duplicadas.
horario <- sub(".* ", "", dados$currentTime)
# Usar uma data comum para calcular diferenças entre horários.
instantes <- as.POSIXct(
paste("2000-01-01", horario),
format = "%Y-%m-%d %H:%M:%OS",
tz = "UTC"
)
# Diferença em horas em relação ao primeiro horário.
horas <- as.numeric(
difftime(instantes, instantes[1], units = "hours")
)
# Quando o horário diminui, ocorreu uma virada de dia.
viradas_dia <- cumsum(c(0, diff(horas) < 0))
# Tempo contínuo desde o início da coleta.
dados$currentTime <- horas + 24 * viradas_dia
# Padronizar a memória usada em megabytes.
dados$usedMemory <- converter_mb(dados$usedMemory)
return(dados)
}
arquivos <- c(
"monitoringCloudData_0.1.csv",
"monitoringCloudData_0.5.csv",
"monitoringCloudData_1.csv",
"monitoringCloudData_NONE.csv"
)
dados_monitoramento <- lapply(arquivos, preparar_dados)
names(dados_monitoramento) <- c("0.1", "0.5", "1", "NONE")
Gráficos
local({
parametros <- par(no.readonly = TRUE)
on.exit({
layout(1)
par(parametros)
})
# Organização:
# NONE | 0.1
# 0.5 | 1.0
layout(matrix(1:4, nrow = 2, byrow = TRUE))
par(
mar = c(5, 5, 4, 2),
cex.main = 1.1
)
ordem <- c("NONE", "0.1", "0.5", "1")
titulos <- c(
"Memory Analysis (None Workload)",
"Memory Analysis (Workload of 0.1)",
"Memory Analysis (Workload of 0.5)",
"Memory Analysis (Workload of 1.0)"
)
for (i in seq_along(ordem)) {
dados <- dados_monitoramento[[ordem[i]]]
plot(
dados$currentTime,
dados$usedMemory,
type = "l",
col = "black",
lwd = 1,
main = titulos[i],
xlab = "Time (hour)",
ylab = "Used Memory (MB)",
xlim = c(0, 72),
xaxt = "n"
)
axis(
1,
at = seq(0, 70, by = 10)
)
}
})

Questão 7
netflix <- read.csv(
"netflix_titles.csv",
stringsAsFactors = FALSE,
fileEncoding = "UTF-8",
na.strings = c("", "NA")
)
# Remover espaços no início e no final dos nomes.
netflix$country <- trimws(netflix$country)
# Manter apenas conteúdos com país informado e sem vírgulas:
# uma vírgula indica mais de um país de origem.
netflix_um_pais <- subset(
netflix,
!is.na(country) &
nzchar(country) &
!grepl(",", country, fixed = TRUE)
)
# Contar os conteúdos por país e selecionar os dez maiores.
contagem <- sort(
table(netflix_um_pais$country),
decreasing = TRUE
)
top10 <- head(contagem, 10)
top10_paises <- data.frame(
pais = names(top10),
quantidade = as.integer(top10)
)
# Criar o gráfico de pizza interativo.
grafico <- plotly::plot_ly(
data = top10_paises,
labels = ~pais,
values = ~quantidade,
type = "pie",
height = 650,
automargin = TRUE,
sort = FALSE,
textinfo = "label+percent",
textposition = "outside",
marker = list(
line = list(color = "white", width = 1)
),
hovertemplate = paste0(
"%{label}<br>",
"Conteúdos: %{value}<br>",
"Participação: %{percent}",
"<extra></extra>"
)
)
plotly::layout(
grafico,
title = list(
text = "10 países com mais conteúdos de origem única"
),
margin = list(t = 80, b = 140, l = 80, r = 180)
)
Questão 8
tabela <- plotly::plot_ly(
type = "table",
height = 420,
columnwidth = c(200, 180),
# Formatação do cabeçalho.
header = list(
values = c("País", "Total de conteúdos"),
align = "center",
fill = list(color = "#666666"),
font = list(color = "white", size = 14),
line = list(color = "white", width = 1),
height = 35
),
# Dados e formatação das células.
cells = list(
values = list(
top10_paises$pais,
top10_paises$quantidade
),
align = "center",
fill = list(color = "white"),
font = list(color = "black", size = 13),
line = list(color = "#CCCCCC", width = 1),
height = 30
)
)
plotly::layout(
tabela,
title = "10 países com mais conteúdos de origem única",
margin = list(t = 60, b = 20, l = 20, r = 20)
)
Questão 9
# Calcular a década: 2000 a 2009 -> 2000, por exemplo.
decada <- floor(netflix$release_year / 10) * 10
# Incluir todas as décadas entre o primeiro e o último lançamento.
decadas <- seq(
min(decada, na.rm = TRUE),
max(decada, na.rm = TRUE),
by = 10
)
# Contar séries e filmes em cada década.
# Combinações sem conteúdos recebem contagem zero.
contagem_decadas <- table(
decada = factor(decada, levels = decadas),
tipo = factor(netflix$type, levels = c("TV Show", "Movie"))
)
resumo_decadas <- data.frame(
decada = decadas,
series = as.integer(contagem_decadas[, "TV Show"]),
filmes = as.integer(contagem_decadas[, "Movie"])
)
# Linha azul: séries.
grafico_decadas <- plotly::plot_ly(
data = resumo_decadas,
x = ~decada,
y = ~series,
type = "scatter",
mode = "lines+markers",
name = "TV Series",
line = list(color = "#1F77B4", width = 2),
marker = list(color = "#1F77B4", size = 6),
height = 550
)
# Linha amarela: filmes.
grafico_decadas <- plotly::add_trace(
grafico_decadas,
x = ~decada,
y = ~filmes,
type = "scatter",
mode = "lines+markers",
name = "Movies",
line = list(color = "#FFD700", width = 2),
marker = list(color = "#FFD700", size = 6)
)
plotly::layout(
grafico_decadas,
xaxis = list(
title = "Década",
tickmode = "linear",
tick0 = min(decadas),
dtick = 20,
gridcolor = "#EEEEEE",
zeroline = FALSE
),
yaxis = list(
title = "Qtd. conteúdo",
rangemode = "tozero",
dtick = 500,
gridcolor = "#EEEEEE"
),
plot_bgcolor = "white",
paper_bgcolor = "white",
legend = list(x = 1.02, y = 1),
margin = list(l = 70, r = 120, t = 20, b = 60)
)
Questão 10
# Selecionar somente filmes no intervalo.
filmes <- subset(
netflix,
type == "Movie" &
release_year >= 2000 &
release_year <= 2010
)
# Considerar apenas o primeiro gênero de cada filme.
filmes$genero <- trimws(sub(",.*$", "", filmes$listed_in))
generos <- c("Dramas", "Action & Adventure", "Comedies")
filmes <- subset(filmes, genero %in% generos)
# Contar os filmes por ano e gênero.
contagem_generos <- table(
ano = factor(filmes$release_year, levels = 2000:2010),
genero = factor(filmes$genero, levels = generos)
)
resumo_generos <- data.frame(
ano = 2000:2010,
drama = as.integer(contagem_generos[, "Dramas"]),
acao = as.integer(contagem_generos[, "Action & Adventure"]),
comedia = as.integer(contagem_generos[, "Comedies"])
)
# Barras azuis: drama.
grafico_generos <- plotly::plot_ly(
data = resumo_generos,
x = ~ano,
y = ~drama,
type = "bar",
name = "Drama",
marker = list(color = "#1F77B4"),
height = 550
)
# Barras laranjas: ação e aventura.
grafico_generos <- plotly::add_trace(
grafico_generos,
y = ~acao,
name = "Ação e Aventura",
marker = list(color = "#FF7F0E")
)
# Barras verdes: comédia.
grafico_generos <- plotly::add_trace(
grafico_generos,
y = ~comedia,
name = "Comédia",
marker = list(color = "#2CA02C")
)
plotly::layout(
grafico_generos,
barmode = "group",
bargap = 0.2,
xaxis = list(
title = "Ano de Lançamento",
tickmode = "linear",
tick0 = 2002,
dtick = 2,
showgrid = FALSE
),
yaxis = list(
title = "Qtd. de Lançamentos",
rangemode = "tozero",
dtick = 5,
gridcolor = "#EEEEEE"
),
plot_bgcolor = "white",
paper_bgcolor = "white",
legend = list(x = 1.02, y = 1),
margin = list(l = 70, r = 150, t = 20, b = 60)
)