Respostas

Questão 1

Dados de tempo médio de resposta (MRT) para diferentes quantidades de Fogs.

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 — tempo de resposta por intervalo entre requisições:

cores   <- c("black", "yellow", "red", "blue", "violet", "green")
simbolos <- c(4, 1, 2, 2, 3, 6)
series  <- list(MRT_1F, MRT_3F, MRT_5F, MRT_10F, MRT_15F, MRT_sem_F)
rotulos <- c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog")

plot(clock, MRT_1F, type = "o", col = cores[1], pch = simbolos[1],
     ylim = c(0, max(MRT_1F)), xaxt = "n",
     xlab = "Time between Things requests (seconds)",
     ylab = "Response Time (sec.)")
axis(1, at = c(0, 0.5, 1, 1.5, 2, 2.5, 3))
for (i in 2:6) {
  lines(clock, series[[i]], type = "o", col = cores[i], pch = simbolos[i])
}
legend("topright", legend = rotulos, col = cores, pch = simbolos, lty = 1)

Gráficos de barras (escala logarítmica) comparando cada configuração com o cenário sem Fog, organizados com layout():

# matriz de layout: 3 linhas x 2 colunas; a última célula fica vazia (0)
graphics::layout(matrix(c(1, 2,
                3, 4,
                5, 0), nrow = 3, byrow = TRUE))

com_fog <- list(MRT_1F, MRT_3F, MRT_5F, MRT_10F, MRT_15F)
nomes   <- c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs")

for (i in seq_along(com_fog)) {
  dados <- rbind(MRT_sem_F, com_fog[[i]])
  barplot(dados, beside = TRUE, log = "y",
          col = c("#E6E6E6", "#666666"),
          names.arg = clock,
          xlab = "Time between Things requests",
          ylab = "Response time (s)",
          legend.text = c("w/o Fog", nomes[i]),
          args.legend = list(x = "topright", cex = 0.8))
}

graphics::layout(1)  # restaura o layout padrão

Questão 2

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,
                    dimnames = list(c("Good", "Very Good", "Excellent"),
                                    c("$10-19", "$20-29", "$30-39", "$40-49")))
qualidade
##           $10-19 $20-29 $30-39 $40-49
## Good        53.8   33.9    2.6    0.0
## Very Good   43.6   54.2   60.5   21.4
## Excellent    2.6   11.9   36.8   78.6
cores_q2 <- c("#F4A582", "#92C5DE", "#0571B0")
par(mar = c(5, 4, 4, 9), xpd = TRUE)   # margem extra à direita para a legenda
barplot(qualidade, col = cores_q2,
        main = "Qualidade da refeição por faixa de preço",
        xlab = "Preço da refeição", ylab = "Percentual (%)",
        ylim = c(0, 100), cex.names = 0.9)
legend("topright", inset = c(-0.28, 0), legend = rownames(qualidade),
       fill = cores_q2, title = "Qualidade")

par(mar = c(5, 4, 4, 2) + 0.1, xpd = FALSE)

Questão 3

maio <- subset(airquality, Month == 5)
temp_celsius <- (maio$Temp - 32) / 1.8

hist(temp_celsius, freq = FALSE, col = "lightblue", border = "white",
     main = "Temperaturas em Nova York — Maio de 1973",
     xlab = "Temperatura (°C)", ylab = "Densidade",
     ylim = c(0, 0.14))
lines(density(temp_celsius), col = "darkred", lwd = 2)

Questão 4

sales <- read.table("https://www.dropbox.com/scl/fi/mpjt4uuqb5vtmfiw38phk/Sales.txt?rlkey=93jlz79xwrrt7ah66d5k403d7&dl=1",
                    header = TRUE)
head(sales)
##   COUNTRY SALES
## 1      US   340
## 2      UK   290
## 3  France   510
## 4  Poland   820
## 5   Japan   120
## 6   China   780
str(sales)
## 'data.frame':    6 obs. of  2 variables:
##  $ COUNTRY: chr  "US" "UK" "France" "Poland" ...
##  $ SALES  : int  340 290 510 820 120 780
# identifica a coluna de país pelo nome (country/país); se não achar,
# usa a primeira coluna de texto
nomes_col <- names(sales)
col_pais <- grep("country|pa[ií]s", nomes_col, ignore.case = TRUE, value = TRUE)[1]
if (is.na(col_pais)) {
  col_pais <- nomes_col[!sapply(sales, is.numeric)][1]
}

# identifica a coluna de vendas pelo nome; se não achar, usa a primeira numérica
col_valor <- grep("sale|venda|total|revenue|amount|valor", nomes_col,
                  ignore.case = TRUE, value = TRUE)
col_valor <- col_valor[col_valor %in% nomes_col[sapply(sales, is.numeric)]][1]
if (is.na(col_valor)) {
  col_valor <- nomes_col[sapply(sales, is.numeric)][1]
}
cat("Coluna de país:", col_pais, "| Coluna de vendas:", col_valor, "\n")
## Coluna de país: COUNTRY | Coluna de vendas: SALES
# total de vendas por país (soma da coluna de vendas; se não houver
# coluna numérica, conta quantas vendas cada país teve)
if (is.na(col_valor)) {
  total_pais <- table(sales[[col_pais]])
} else {
  total_pais <- tapply(sales[[col_valor]], sales[[col_pais]], sum)
}
pct <- round(100 * total_pais / sum(total_pais), 1)
pct
##  China France  Japan Poland     UK     US 
##   27.3   17.8    4.2   28.7   10.1   11.9
cores_q4 <- rainbow(length(pct))
pie(pct, labels = paste0(pct, "%"), col = cores_q4,
    main = "Percentual do total de vendas por país")
legend("topright", legend = names(pct), fill = cores_q4, cex = 0.8)

Questão 5

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

# converte strings como "102.94MB", "3.35GB", "1.2TB" para megabytes
para_megabytes <- function(x) {
  valor   <- as.numeric(gsub("[A-Za-z]", "", x))
  unidade <- gsub("[0-9.]", "", x)
  fator <- ifelse(unidade == "TB", 1000000,
           ifelse(unidade == "GB", 1024,
           ifelse(unidade == "MB", 1,
           ifelse(unidade == "KB", 1 / 1024,
           ifelse(unidade == "B",  1 / 1024^2, NA)))))
  valor * fator
}

ler_monitoramento <- function(arquivo) {
  dados <- read.csv(arquivo, stringsAsFactors = FALSE)
  tempo <- as.POSIXct(dados$currentTime, format = "%Y-%m-%d %H:%M:%OS")
  dados$horas <- as.numeric(difftime(tempo, tempo[1], units = "hours"))
  dados$memoria_mb <- para_megabytes(dados$usedMemory)
  dados
}

pasta <- "monitoringCloudData"
none <- ler_monitoramento(file.path(pasta, "monitoringCloudData_NONE.csv"))
w01  <- ler_monitoramento(file.path(pasta, "monitoringCloudData_0.1.csv"))
w05  <- ler_monitoramento(file.path(pasta, "monitoringCloudData_0.5.csv"))
w1   <- ler_monitoramento(file.path(pasta, "monitoringCloudData_1.csv"))

head(w01[, c("currentTime", "horas", "usedMemory", "memoria_mb")])
##                  currentTime      horas usedMemory memoria_mb
## 1 2020-01-28 19:05:24.696535 0.00000000   247.09MB     247.09
## 2 2020-01-28 19:06:24.960884 0.01674010   247.34MB     247.34
## 3 2020-01-28 19:07:25.178265 0.03346715   247.29MB     247.29
## 4 2020-01-28 19:08:25.422138 0.05020156   247.02MB     247.02
## 5 2020-01-28 19:09:25.684460 0.06694109   245.26MB     245.26
## 6 2020-01-28 19:10:25.946943 0.08368067   247.49MB     247.49
graphics::layout(matrix(1:4, nrow = 2, byrow = TRUE))

graf_memoria <- function(d, titulo) {
  plot(d$horas, d$memoria_mb, type = "l",
       main = titulo, xlab = "Time (hour)", ylab = "Used Memory (MB)")
}

graf_memoria(none, "Memory Analysis (None Workload)")
graf_memoria(w01,  "Memory Analysis (Workload of 0.1)")
graf_memoria(w05,  "Memory Analysis (Workload of 0.5)")
graf_memoria(w1,   "Memory Analysis (Workload of 1.0)")

graphics::layout(1)

Questão 7

netflix <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE,
                    encoding = "UTF-8")

# apenas conteúdos com UM país de origem (sem vírgula e não vazio)
um_pais <- netflix[netflix$country != "" & !grepl(",", netflix$country), ]
top10 <- head(sort(table(um_pais$country), decreasing = TRUE), 10)
top10 <- data.frame(pais = names(top10), total = as.vector(top10))

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

Questão 8

plot_ly(
  type = "table",
  header = list(
    values = c("<b>País</b>", "<b>Total de conteúdos</b>"),
    fill   = list(color = "grey"),
    font   = list(color = "white", size = 14),
    align  = "center"
  ),
  cells = list(
    values = list(top10$pais, top10$total),
    align  = "center"
  )
)

Questão 9

netflix$decada <- floor(netflix$release_year / 10) * 10
por_decada <- as.data.frame(table(netflix$decada, netflix$type))
names(por_decada) <- c("decada", "tipo", "qtd")
por_decada$decada <- as.numeric(as.character(por_decada$decada))

series <- subset(por_decada, tipo == "TV Show")
filmes <- subset(por_decada, tipo == "Movie")

plot_ly() %>%
  add_trace(data = series, x = ~decada, y = ~qtd, type = "scatter",
            mode = "lines+markers", name = "TV Series",
            line = list(color = "blue"), marker = list(color = "blue")) %>%
  add_trace(data = filmes, x = ~decada, y = ~qtd, type = "scatter",
            mode = "lines+markers", name = "Movies",
            line = list(color = "gold"), marker = list(color = "gold")) %>%
  layout(xaxis = list(title = "Década"),
         yaxis = list(title = "Qnt. Conteúdo"))

Questão 10

filmes <- netflix[netflix$type == "Movie", ]
filmes$genero <- trimws(sub(",.*", "", filmes$listed_in))  # 1º gênero listado

generos <- c("Dramas", "Action & Adventure", "Comedies")
sel <- filmes[filmes$release_year > 2000 & filmes$release_year < 2010 &
              filmes$genero %in% generos, ]

contagem <- as.data.frame(table(ano = sel$release_year, genero = sel$genero))
contagem$ano <- as.numeric(as.character(contagem$ano))

drama   <- subset(contagem, genero == "Dramas")
acao    <- subset(contagem, genero == "Action & Adventure")
comedia <- subset(contagem, genero == "Comedies")

plot_ly() %>%
  add_bars(data = drama,   x = ~ano, y = ~Freq, name = "Drama") %>%
  add_bars(data = acao,    x = ~ano, y = ~Freq, name = "Ação e Aventura") %>%
  add_bars(data = comedia, x = ~ano, y = ~Freq, name = "Comédia") %>%
  layout(barmode = "group",
         xaxis = list(title = "Ano de Lançamento"),
         yaxis = list(title = "Qnt. de Lançamentos"))