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"))