Gráficos
Questão 1
options(scipen = 5) # evita notação científica nos eixos
clock <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)
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)
# Layout: gráfico de linhas ocupa a 1ª linha inteira;
# abaixo, os 5 gráficos de barras em grade 2 colunas
graphics::layout(matrix(c(1, 1,
2, 3,
4, 5,
6, 0), nrow = 4, byrow = TRUE),
heights = c(1.4, 1, 1, 1))
# --- Gráfico 1: linhas -----------------------------------------------------
cores <- c("black", "yellow", "red", "blue", "purple", "green")
pchs <- c(4, 0, 1, 2, 5, 4)
todos <- list(MRT_1F, MRT_3F, MRT_5F, MRT_10F, MRT_15F, MRT_sem_F)
par(mar = c(4.5, 4.5, 2, 1))
plot(clock, MRT_1F, type = "o", col = cores[1], pch = pchs[1],
ylim = range(unlist(todos)),
xlab = "Time between Things requests (seconds)",
ylab = "Response Time (sec.)")
for (i in 2:6) {
lines(clock, todos[[i]], type = "o", col = cores[i], pch = pchs[i])
}
legend("topright",
legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
col = cores, pch = pchs, lty = 1, cex = 0.8)
# --- Gráficos 2-6: barras com escala logarítmica ---------------------------
barras <- function(MRT_F, rotulo, xlab = "Time between Things requests") {
dados <- rbind(MRT_sem_F, MRT_F)
barplot(dados, beside = TRUE, log = "y",
col = c("#E6E6E6", "#666666"),
names.arg = clock,
ylim = c(min(dados) / 2, max(dados) * 2),
xlab = xlab, ylab = "Response time (s)",
legend.text = c("w/o Fog", rotulo),
args.legend = list(x = "topright", cex = 0.8))
}
par(mar = c(4.5, 4.5, 1, 1))
barras(MRT_1F, "1 Fog")
barras(MRT_3F, "3 Fogs")
barras(MRT_5F, "5 Fogs")
barras(MRT_10F, "10 Fogs")
barras(MRT_15F, "15 Fogs")

graphics::layout(1) # restaura o layout padrão
Questão 2
refeicao <- 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,
dimnames = list(c("Good", "Very Good", "Excellent"),
c("$10-19", "$20-29", "$30-39", "$40-49")))
par(mar = c(5, 5, 4, 2))
barplot(refeicao,
col = c("#9ecae1", "#4292c6", "#08519c"),
main = "Qualidade da refeição por faixa de preço",
xlab = "Preço da refeição (Meal Price)",
ylab = "Percentual (%)",
ylim = c(0, 100),
legend.text = rownames(refeicao),
args.legend = list(x = "topright", title = "Quality Rating",
bg = "white", cex = 0.9))

Questão 3
maio <- subset(airquality, Month == 5)
temp_c <- (maio$Temp - 32) / 1.8 # °F -> °C
hist(temp_c, freq = FALSE, col = "lightblue", border = "white",
main = "Histograma das temperaturas de maio (airquality)",
xlab = "Temperatura (°C)",
ylab = "Densidade")
lines(density(temp_c), col = "red", lwd = 2)

Questão 4
Questão 5
boxplot(count ~ spray, data = InsectSprays,
outline = FALSE, # sem outliers
col = "yellow",
main = "Contagem de insetos por tipo de inseticida",
xlab = "Tipo de inseticida",
ylab = "Número de insetos")

Questão 6
# Converte "currentTime" em horas contínuas desde a primeira coleta.
# Obs.: em alguns arquivos (ex.: workload 0.5) há linhas com timestamp
# malformado, como "2020-01-31 2020-01-30 00:00:04.173299", e a data após a
# meia-noite está errada. Por isso usamos apenas a hora do dia (HH:MM:SS) e
# reconstruímos a data detectando a virada de dia (hora que "volta" no tempo).
tempo_em_horas <- function(currentTime) {
hms <- sub(".*(\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)$", "\\1", currentTime)
p <- do.call(rbind, strsplit(hms, ":"))
seg <- as.numeric(p[, 1]) * 3600 + as.numeric(p[, 2]) * 60 + as.numeric(p[, 3])
virada <- c(0, diff(seg) < -12 * 3600) # passou da meia-noite
dia <- cumsum(virada)
data0 <- substr(currentTime[1], 1, 10)
t <- as.POSIXct(data0, tz = "UTC") + dia * 86400 + seg
as.numeric(difftime(t, t[1], units = "hours"))
}
# Converte "usedMemory" (ex.: "247.09MB", "1.01GB", "0.5TB") para megabytes
memoria_em_mb <- function(usedMemory) {
valor <- as.numeric(sub("[A-Za-z]+$", "", usedMemory))
unidade <- sub("^[0-9.]+", "", usedMemory)
fator <- ifelse(unidade == "TB", 1000000,
ifelse(unidade == "GB", 1024,
ifelse(unidade == "KB", 1 / 1024,
ifelse(unidade == "B", 1 / 1024^2, 1)))) # MB = 1
valor * fator
}
prepara <- function(arquivo) {
d <- read.csv(localiza(arquivo), stringsAsFactors = FALSE)
data.frame(hora = tempo_em_horas(d$currentTime),
mem = memoria_em_mb(d$usedMemory))
}
d_none <- prepara("monitoringCloudData_NONE.csv")
d_01 <- prepara("monitoringCloudData_0_1.csv")
d_05 <- prepara("monitoringCloudData_0_5.csv")
d_1 <- prepara("monitoringCloudData_1.csv")
graphics::layout(matrix(1:4, nrow = 2, byrow = TRUE))
par(mar = c(4.5, 4.5, 3, 1))
graf <- function(d, titulo) {
plot(d$hora, d$mem, type = "l",
main = titulo, xlab = "Time (hour)", ylab = "Used Memory (MB)")
}
graf(d_none, "Memory Analysis (None Workload)")
graf(d_01, "Memory Analysis (Workload of 0.1)")
graf(d_05, "Memory Analysis (Workload of 0.5)")
graf(d_1, "Memory Analysis (Workload of 1.0)")

graphics::layout(1)
Questão 7
library(plotly) # Questões 7 a 10 (também exporta o operador %>%)
netflix <- read.csv(localiza("netflix_titles.csv"), stringsAsFactors = FALSE)
# Apenas conteúdos com UM país de origem (não vazio e sem vírgula)
pais <- trimws(netflix$country)
um_pais <- pais[pais != "" & !is.na(pais) & !grepl(",", pais)]
top10 <- sort(table(um_pais), decreasing = TRUE)[1:10]
df_top10 <- data.frame(pais = names(top10), total = as.integer(top10))
plot_ly(df_top10, labels = ~pais, values = ~total, type = "pie",
textinfo = "label+percent") %>%
layout(title = "10 países com mais conteúdo na Netflix (apenas um país de origem)")
Questão 8
plot_ly(
type = "table",
header = list(
values = c("País", "Total de conteúdos"),
fill = list(color = "grey"),
font = list(color = "white"),
align = "center"
),
cells = list(
values = list(df_top10$pais, df_top10$total),
align = "center"
)
)
Questão 9
netflix$decada <- floor(netflix$release_year / 10) * 10
series <- as.data.frame(table(decada = netflix$decada[netflix$type == "TV Show"]),
stringsAsFactors = FALSE)
filmes <- as.data.frame(table(decada = netflix$decada[netflix$type == "Movie"]),
stringsAsFactors = FALSE)
series$decada <- as.numeric(series$decada)
filmes$decada <- as.numeric(filmes$decada)
plot_ly() %>%
add_trace(data = series, x = ~decada, y = ~Freq, type = "scatter",
mode = "lines+markers", name = "TV Series",
line = list(color = "blue"), marker = list(color = "blue")) %>%
add_trace(data = filmes, x = ~decada, y = ~Freq, type = "scatter",
mode = "lines+markers", name = "Movies",
line = list(color = "gold"), marker = list(color = "gold")) %>%
layout(title = "Quantidade de conteúdo por década",
xaxis = list(title = "Década"),
yaxis = list(title = "Qtd. Conteúdo"))
Questão 10
filmes_10 <- subset(netflix, type == "Movie" &
release_year > 2000 & release_year < 2010) # entre 2000 e 2010 (2001-2009)
# Apenas o primeiro gênero descrito em "listed_in"
filmes_10$genero <- trimws(sub(",.*$", "", filmes_10$listed_in))
filmes_10 <- subset(filmes_10,
genero %in% c("Dramas", "Action & Adventure", "Comedies"))
tab <- table(ano = filmes_10$release_year, genero = filmes_10$genero)
anos <- as.numeric(rownames(tab))
plot_ly(x = anos, y = as.numeric(tab[, "Dramas"]),
type = "bar", name = "Drama") %>%
add_trace(y = as.numeric(tab[, "Action & Adventure"]), name = "Ação e Aventura") %>%
add_trace(y = as.numeric(tab[, "Comedies"]), name = "Comédia") %>%
layout(barmode = "group",
title = "Filmes lançados por gênero (entre 2000 e 2010)",
xaxis = list(title = "Ano de Lançamento", dtick = 1),
yaxis = list(title = "Qnt. de Lançamentos"))