Cada questão está em uma aba. As questões 1 a 6 usam os gráficos do R tradicional. As questões 7 a 10 usam o Plotly.

Exercício 12

Questão 1

O primeiro gráfico é a linha do tempo de resposta para cada quantidade de nós de névoa. Os cinco seguintes comparam, em barras e com escala logarítmica no eixo y, o cenário sem névoa com cada quantidade de nós. As cores das barras são #E6E6E6 e #666666. O layout() coloca a linha na largura toda e as barras em grade.

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)

layout(matrix(c(
  1, 1,
  2, 3,
  4, 5,
  6, 6
), ncol = 2, byrow = TRUE))
par(mar = c(4.2, 4.2, 1.2, 1))

series <- list(
  "1 Fog" = MRT_1F,
  "3 Fogs" = MRT_3F,
  "5 Fogs" = MRT_5F,
  "10 Fogs" = MRT_10F,
  "15 Fogs" = MRT_15F,
  "w/o Fog" = MRT_sem_F
)
cores_linha <- c("black", "orange", "red", "blue", "forestgreen", "yellowgreen")
simbolos <- c(15, 17, 16, 18, 1, 4)

plot(
  clock, series[[1]], type = "o",
  col = cores_linha[1], pch = simbolos[1],
  ylim = c(0, max(unlist(series))),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (s)"
)
for (i in 2:length(series)) {
  lines(
    clock, series[[i]], type = "o",
    col = cores_linha[i], pch = simbolos[i]
  )
}
legend(
  "topright",
  legend = names(series),
  col = cores_linha,
  pch = simbolos,
  lty = 1,
  cex = 0.8
)

grafico_barras <- function(valores, nome) {
  matriz <- rbind(MRT_sem_F, valores)
  barplot(
    matriz,
    beside = TRUE,
    log = "y",
    ylim = c(min(matriz) * 0.7, max(matriz) * 1.3),
    col = c("#E6E6E6", "#666666"),
    names.arg = clock,
    xlab = "Time between Things requests",
    ylab = "Response time (s)"
  )
  legend(
    "topright",
    legend = c("w/o Fog", nome),
    fill = c("#E6E6E6", "#666666"),
    cex = 0.8
  )
}

grafico_barras(MRT_1F, "1 Fog")
grafico_barras(MRT_3F, "3 Fogs")
grafico_barras(MRT_5F, "5 Fogs")
grafico_barras(MRT_10F, "10 Fogs")
grafico_barras(MRT_15F, "15 Fogs")

Questão 2

A tabela cruza a qualidade da refeição com a faixa de preço. Cada coluna soma 100%. O gráfico empilha essas três categorias em cada faixa.

qualidade <- rbind(
  Good = c(53.8, 33.9, 2.6, 0.0),
  "Very Good" = c(43.6, 54.2, 60.5, 21.4),
  Excellent = c(2.6, 11.9, 36.8, 78.6)
)
colnames(qualidade) <- c("$10-19", "$20-29", "$30-39", "$40-49")
cores_qualidade <- c("#4C78A8", "#F58518", "#54A24B")

barplot(
  qualidade,
  col = cores_qualidade,
  xlab = "Meal Price",
  ylab = "Porcentagem (%)",
  main = "Qualidade da refeição por faixa de preço",
  ylim = c(0, 100)
)
legend(
  "topright",
  legend = rownames(qualidade),
  fill = cores_qualidade,
  title = "Quality Rating"
)

Questão 3

As temperaturas de maio do conjunto airquality estão em Fahrenheit. A conversão é °C = (°F − 32) / 1.8. O histograma usa densidade, na mesma escala da curva.

maio <- airquality[airquality$Month == 5, ]
temp_c <- (maio$Temp - 32) / 1.8

hist(
  temp_c,
  freq = FALSE,
  col = "steelblue",
  border = "white",
  main = "Temperaturas de maio",
  xlab = "Temperatura (°C)",
  ylab = "Densidade"
)
lines(density(temp_c), col = "firebrick", lwd = 2)

Questão 4

As vendas vêm da tabela do enunciado. Cada fatia mostra o país e a porcentagem sobre o total. A legenda repete as cores com legend().

url_vendas <- paste0(
  "https://www.dropbox.com/scl/fi/mpjt4uuqb5vtmfiw38phk/Sales.txt",
  "?rlkey=93jlz79xwrrt7ah66d5k403d7&dl=1"
)
sales <- tryCatch(
  read.table(url_vendas, header = TRUE),
  error = function(e) read.table("data/Sales.txt", header = TRUE)
)

porcentagem <- round(100 * sales$SALES / sum(sales$SALES), 1)
rotulos <- paste0(sales$COUNTRY, "\n", porcentagem, "%")
cores_paises <- c("#4C78A8", "#F58518", "#54A24B", "#E45756", "#72B7B2", "#B279A2")

par(mar = c(1, 1, 3, 1))
pie(
  sales$SALES,
  labels = rotulos,
  col = cores_paises,
  main = "Porcentagem das vendas totais por país"
)
legend(
  "topright",
  legend = sales$COUNTRY,
  fill = cores_paises
)

Questão 5

InsectSprays traz a contagem de insetos em seis inseticidas. outline = FALSE tira os outliers. Todas as caixas usam a cor yellow.

boxplot(
  count ~ spray,
  data = InsectSprays,
  outline = FALSE,
  col = "yellow",
  main = "Contagem de insetos por inseticida",
  xlab = "Inseticida",
  ylab = "Contagem de insetos"
)

Questão 6

Cada arquivo é o monitoramento de uma carga da máquina virtual. usedMemory mistura MB e GB: o número é separado da unidade por expressão regular, GB vira megabyte multiplicando por 1024 e TB, se aparecer, por 1.000.000. difftime() mede as horas desde a primeira coleta, para o eixo do tempo ficar contínuo. No arquivo de carga 0,5 algumas células repetem a data; essas linhas saem, senão o relógio volta atrás.

memoria_para_mb <- function(texto) {
  texto <- trimws(as.character(texto))
  valor <- as.numeric(sub("^([0-9]*\\.?[0-9]+).*", "\\1", texto))
  unidade <- toupper(sub("^([0-9]*\\.?[0-9]+)\\s*", "", texto))
  ifelse(
    grepl("^TB", unidade), valor * 1000000,
    ifelse(
      grepl("^GB", unidade), valor * 1024,
      ifelse(grepl("^MB", unidade), valor, NA_real_)
    )
  )
}

preparar_monitoramento <- function(caminho) {
  dados <- read.csv(caminho, stringsAsFactors = FALSE, check.names = FALSE)
  uma_data <- !grepl(
    "\\d{4}-\\d{2}-\\d{2}.*\\d{4}-\\d{2}-\\d{2}",
    dados$currentTime
  )
  dados <- dados[uma_data, ]
  instante <- as.POSIXct(
    dados$currentTime,
    format = "%Y-%m-%d %H:%M:%OS",
    tz = "UTC"
  )
  data.frame(
    horas = as.numeric(difftime(instante, min(instante), units = "hours")),
    memoria_mb = memoria_para_mb(dados$usedMemory)
  )
}

arquivos <- c(
  "data/monitoringCloudData_NONE.csv",
  "data/monitoringCloudData_0.1.csv",
  "data/monitoringCloudData_0.5.csv",
  "data/monitoringCloudData_1.csv"
)
titulos <- c(
  "Memory Analysis (None Workload)",
  "Memory Analysis (Workload of 0.1)",
  "Memory Analysis (Workload of 0.5)",
  "Memory Analysis (Workload of 1.0)"
)

layout(matrix(1:4, nrow = 2, byrow = TRUE))
par(mar = c(4.2, 4.2, 2.4, 1))
for (i in seq_along(arquivos)) {
  serie <- preparar_monitoramento(arquivos[i])
  plot(
    serie$horas, serie$memoria_mb, type = "l",
    main = titulos[i],
    xlab = "Time (hour)",
    ylab = "Used Memory (MB)"
  )
}

Questão 7

Entram só os títulos com um único país em country. País vazio ou lista separada por vírgula fica de fora. O gráfico de pizza mostra os dez países com mais títulos.

library(plotly)

netflix <- read.csv(
  "data/netflix_titles.csv",
  stringsAsFactors = FALSE,
  encoding = "UTF-8"
)
pais <- trimws(netflix$country)
um_pais <- netflix[nzchar(pais) & !grepl(",", pais), ]
um_pais$country <- trimws(um_pais$country)

contagem_paises <- sort(table(um_pais$country), decreasing = TRUE)
top10 <- as.data.frame(contagem_paises[1:10])
names(top10) <- c("pais", "total")

plot_ly(
  top10,
  labels = ~pais,
  values = ~total,
  type = "pie",
  textinfo = "label+percent",
  sort = FALSE
) %>%
  layout(title = "Os 10 países com mais conteúdo na Netflix")

Questão 8

A mesma contagem da questão 7, agora em tabela. O cabeçalho tem fundo cinza e letra branca. País e total ficam centralizados.

plot_ly(
  type = "table",
  header = list(
    values = c("País", "Total de conteúdos"),
    align = c("center", "center"),
    fill = list(color = "gray"),
    font = list(color = "white", size = 14),
    line = list(color = "white")
  ),
  cells = list(
    values = list(top10$pais, top10$total),
    align = c("center", "center"),
    fill = list(color = "white"),
    font = list(color = "black", size = 13),
    line = list(color = "#dddddd")
  )
)

Questão 9

A década é o bloco de XXX0 a XXX9: 2000 reúne 2000 a 2009. A linha azul é a das séries e a amarela é a dos filmes. Décadas sem título de um dos tipos entram com zero, para a linha não quebrar.

netflix$decada <- (netflix$release_year %/% 10) * 10
netflix$decada <- factor(
  netflix$decada,
  levels = seq(min(netflix$decada), max(netflix$decada), by = 10)
)
netflix$type <- factor(netflix$type, levels = c("TV Show", "Movie"))

por_decada <- as.data.frame(table(netflix$decada, netflix$type))
names(por_decada) <- c("decada", "tipo", "quantidade")
series <- por_decada[por_decada$tipo == "TV Show", ]
filmes <- por_decada[por_decada$tipo == "Movie", ]

plot_ly() %>%
  add_trace(
    data = series, x = ~decada, y = ~quantidade,
    type = "scatter", mode = "lines+markers", name = "Séries",
    line = list(color = "blue"), marker = list(color = "blue")
  ) %>%
  add_trace(
    data = filmes, x = ~decada, y = ~quantidade,
    type = "scatter", mode = "lines+markers", name = "Filmes",
    line = list(color = "gold"), marker = list(color = "gold")
  ) %>%
  layout(
    title = "Conteúdo da Netflix por década",
    xaxis = list(title = "Década"),
    yaxis = list(title = "Quantidade de conteúdo")
  )

Questão 10

Só filmes lançados de 2000 a 2010. Quando listed_in traz vários gêneros, vale o primeiro. As barras ficam lado a lado para Dramas, Action & Adventure e Comedies.

filmes_periodo <- netflix[
  netflix$type == "Movie" &
    netflix$release_year >= 2000 &
    netflix$release_year <= 2010,
 ]
filmes_periodo$genero <- trimws(sub(",.*$", "", filmes_periodo$listed_in))
generos <- c("Dramas", "Action & Adventure", "Comedies")
filmes_periodo <- filmes_periodo[filmes_periodo$genero %in% generos, ]
filmes_periodo$genero <- factor(filmes_periodo$genero, levels = generos)
filmes_periodo$release_year <- factor(
  filmes_periodo$release_year,
  levels = 2000:2010
)

por_genero <- as.data.frame(table(
  filmes_periodo$release_year,
  filmes_periodo$genero
))
names(por_genero) <- c("ano", "genero", "quantidade")
rotulo <- c(
  "Dramas" = "Drama",
  "Action & Adventure" = "Ação e Aventura",
  "Comedies" = "Comédia"
)
por_genero$genero <- unname(rotulo[as.character(por_genero$genero)])

plot_ly(
  data = por_genero,
  x = ~ano,
  y = ~quantidade,
  color = ~genero,
  colors = c(
    "Drama" = "#1f77b4",
    "Ação e Aventura" = "#ff7f0e",
    "Comédia" = "#2ca02c"
  ),
  type = "bar"
) %>%
  layout(
    barmode = "group",
    title = "Filmes lançados por gênero entre 2000 e 2010",
    xaxis = list(title = "Ano de lançamento"),
    yaxis = list(title = "Quantidade de lançamentos")
  )