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