Questões

Questão 1 — Fog x Tempo entre requisições (R base)

# Dados fornecidos
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)

a) Linha — Tempo de resposta vs. Clock (todas as configurações)

Requisito: usar R base. Gráfico de linhas com todas as séries (1, 3, 5, 10, 15 Fogs e sem Fog).

# Primeiro traça um canvas
plot(clock, MRT_1F, type="b", pch=4, lty=1, col="black", ylim=c(0, max(MRT_1F)),
     xlab="Time between Things requests (seconds)",
     ylab="Response Time (sec.)")

# Adiciona cada série
lines(clock, MRT_3F, type="b", pch=8, col="yellow")
lines(clock, MRT_5F, type="b", pch=1, col="red")
lines(clock, MRT_10F, type="b", pch=2, col="blue")
lines(clock, MRT_15F, type="b", pch=5, col="purple")
lines(clock, MRT_sem_F, type="b", pch=4, col="green")

# Adiciona legenda
legend("topright",
       legend=c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
       col=c("black", "yellow", "red", "blue", "purple", "green"),
       pch=c(4,8,1,2,5,4),
       lty = 1,
       bty="n")

b) Barras (log no eixo y) — comparação w/o Fog vs. n Fog

Requisitos:
- R base
- Barras lado a lado com beside = TRUE
- Escala logarítmica no eixo y: log = "y"
- Cores obrigatórias: col = c("#E6E6E6", "#666666")
- Organizar subgráficos com layout() (cinco painéis).

# Definindo colunas
cols <- c("#E6E6E6", "#666666")

# Função para generalizar gráficos
painel_barras <- function(y_fog, rotulo, ylim_max){
  y_mat <- rbind(MRT_sem_F, y_fog)
  barplot(y_mat,
          beside = TRUE,
          col = cols,
          names.arg = clock,
          log = "y",
          ylim = c(0.1, ylim_max),  # <-- limites específicos (varia de gráfico para gráfico)
          ylab = "Response time (s)",
          xlab = "Time between Things requests")
  legend("topright", legend = c("w/o Fog", rotulo), fill = cols, bty = "n")
}

## Layout 3 x 2 (última célula vazia)
graphics::layout(matrix(c(1,2,3,4,5,0), nrow = 3, byrow = TRUE))
op <- par(mar = c(4,4,2,1))

# 1) ylim até 500
painel_barras(MRT_1F,  "1 Fog",  500)

# 2) e 3) ylim até 50
painel_barras(MRT_3F,  "3 Fogs", 50)
painel_barras(MRT_5F,  "5 Fogs", 50)

# 4) e 5) ylim até 5
painel_barras(MRT_10F, "10 Fogs", 5)
painel_barras(MRT_15F, "15 Fogs", 5)

par(op)

# Reseta layout ao final
graphics::layout(1)

Questão 2 — Qualidade de refeição

# Dados
tab <- matrix(
  c(53.8, 33.9,  2.6,  0.0,   # Good
    43.6, 54.2, 60.5, 21.4,   # Very Good
    2.6, 11.9, 36.8, 78.6),  # Excellent
  nrow = 3, byrow = TRUE
)
rownames(tab) <- c("Good", "Very Good", "Excellent")
colnames(tab) <- c("$10–19", "$20–29", "$30–39", "$40–49")

# Cores
cols <- c("#E6E6E6", "#999999", "#4D4D4D")

# Gráfico
par(mar = c(5,5,3,7), xpd = NA)  # margem direita maior p/ legenda fora
bp <- barplot(tab,
              col = cols,
              ylim = c(0, 100),
              xlab = "Meal Price",
              ylab = "Percent (%)",
              main = "Meal Quality Rating by Meal Price")

# Legenda fora, à direita, na ordem do topo (Excellent) para base (Good)
legend(x = max(bp) + 0.8, y = 100,
       legend = rev(rownames(tab)),
       fill   = rev(cols),
       bty = "n", cex = 0.9)

Questão 3 - Mês de Maio

# Usa o dataset padrão do R
data("airquality")

# Filtra apenas o mês de maio (Month == 5)
maio <- subset(airquality, Month == 5)

# Converte temperatura de Fahrenheit para Celsius
temp_c <- (maio$Temp - 32) / 1.8

# Cria o histograma com cor, título e rótulos dos eixos
hist(
  temp_c,
  breaks = 10,
  col = "skyblue",
  main = "Histograma das Temperaturas em Maio (°C)",
  xlab = "Temperatura (°C)",
  ylab = "Frequência",
  prob = TRUE  # para permitir sobreposição da curva de densidade
)

# Adiciona a curva de densidade
lines(density(temp_c), col = "red", lwd = 2)

# Adiciona uma legenda
legend("topright", legend = c("Densidade"), col = "red", lwd = 2, bty = "n")

Questão 4 - Vendas por país

# Carrega os dados
sales <- read.table("https://training-course-material.com/images/8/8f/Sales.txt", header = TRUE)

# Calcula total de vendas por país
sales_total <- aggregate(SALES ~ COUNTRY, data = sales, sum)

# Calcula as porcentagens
percent <- round((sales_total$SALES / sum(sales_total$SALES)) * 100, 1)

# Cria rótulos com porcentagem
labels <- paste(sales_total$COUNTRY, "-", percent, "%")

# Define uma paleta de cores
cores <- rainbow(nrow(sales_total))

# Gráfico de Pizza
pie(
  sales_total$SALES,      # Corrigido: usa SALES em maiúsculo
  labels = paste0(percent, "%"),
  col = cores,
  main = "Porcentagem das Vendas por País"
)

# Adiciona legenda
legend(
  "topright",
  legend = labels,
  fill = cores,
  title = "Países"
)

Questão 5 - InsectSprays

# Carrega o conjunto de dados padrão do R
data("InsectSprays")

# Cria o boxplot sem outliers
boxplot(
  count ~ spray,            # variável resposta vs. fator (6 tipos de inseticida)
  data = InsectSprays,
  main = "Contagem de Insetos por Tipo de Inseticida",
  xlab = "Tipo de Inseticida",
  ylab = "Número de Insetos",
  col = "yellow",           # cor das caixas
  outline = FALSE           # remove os outliers
)

Questão 6 - Memory Analysis

# Função para ler, ajustar e converter os dados
processa_dados <- function(file) {
  # Lê o CSV
  dados <- read.csv(file, header = TRUE)
  
  # --- Ajuste do tempo (deve estar em formato datetime) ---
  # Converte para objeto de tempo
  dados$currentTime <- as.POSIXct(dados$currentTime)
  
  # Calcula o tempo contínuo em horas desde o início
  tempo_horas <- as.numeric(difftime(dados$currentTime, dados$currentTime[1], units = "hours"))
  
  # --- Conversão da memória para MB ---
  # Remove espaços
  dados$usedMemory <- trimws(dados$usedMemory)
  
  # Extrai valores numéricos
  valores <- as.numeric(gsub("[^0-9\\.]", "", dados$usedMemory))
  
  # Extrai unidade (MB, GB, TB)
  unidade <- gsub("[0-9\\.]", "", dados$usedMemory)
  
  # Converte todas as unidades para MB
  memoria_mb <- ifelse(grepl("GB", unidade, ignore.case = TRUE), valores * 1024,
                       ifelse(grepl("TB", unidade, ignore.case = TRUE), valores * 1000000,
                              valores))
  
  # Retorna os dados prontos
  data.frame(time = tempo_horas, usedMemoryMB = memoria_mb)
}

# --- Lê e processa os quatro datasets ---
none <- processa_dados("monitoringCloudData_NONE.csv")
w01  <- processa_dados("monitoringCloudData_0.1.csv")
w05  <- processa_dados("monitoringCloudData_0.5.csv")
w1   <- processa_dados("monitoringCloudData_1.csv")

# --- Organiza o layout 2x2 ---
graphics::layout(matrix(1:4, nrow = 2, ncol = 2, byrow = TRUE))

# --- Gráfico 1: None ---
plot(none$time, none$usedMemoryMB, type = "l", 
     main = "Memory Analysis (None Workload)",
     xlab = "Time (hour)", ylab = "Used Memory (MB)")

# --- Gráfico 2: Workload 0.1 ---
plot(w01$time, w01$usedMemoryMB, type = "l", 
     main = "Memory Analysis (Workload of 0.1)",
     xlab = "Time (hour)", ylab = "Used Memory (MB)")

# --- Gráfico 3: Workload 0.5 ---
plot(w05$time, w05$usedMemoryMB, type = "l", 
     main = "Memory Analysis (Workload of 0.5)",
     xlab = "Time (hour)", ylab = "Used Memory (MB)")

# --- Gráfico 4: Workload 1.0 ---
plot(w1$time, w1$usedMemoryMB, type = "l", 
     main = "Memory Analysis (Workload of 1.0)",
     xlab = "Time (hour)", ylab = "Used Memory (MB)")

Questão 7 - Mais conteúdo (países)

# Leitura
netflix <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE)

# Limpeza de 'country': remove NAs, tira espaços, descarta vazios
netflix <- netflix %>%
  mutate(country = trimws(country)) %>%
  filter(!is.na(country), nzchar(country))

# Mantém apenas títulos com UM país (sem vírgulas após limpeza)
netflix_1pais <- netflix %>%
  filter(!grepl(",", country))

# Conta e seleciona Top 10 países
top_paises <- netflix_1pais %>%
  count(country, sort = TRUE) %>%
  slice(1:10)

# Gráfico de pizza
fig_pizza <- plot_ly(
  data = top_paises,
  labels = ~country,
  values = ~n,
  type = "pie",
  textinfo = "label+percent",
  insidetextorientation = "radial",
  marker = list(line = list(color = "#FFFFFF", width = 2))
) %>%
  layout(
    title = "Top 10 Países com Mais Conteúdos na Netflix (1 país por título)",
    showlegend = TRUE
  )
fig_pizza %>%
  config(displayModeBar = FALSE)

Questão 8 - Tabela Países

# Tabela formatada
tabela <- plot_ly(
  type = "table",
  header = list(
    values = c("País", "Total de conteúdos"),
    fill   = list(color = "gray"),
    font   = list(color = "white", size = 14),
    align  = "center"
  ),
  cells = list(
    values = rbind(top_paises$country, top_paises$n),
    fill   = list(color = "white"),
    font   = list(color = "black", size = 12),
    align  = "center"
  )
) %>%
  layout(title = "Top 10 Países — Títulos com 1 país de origem")
tabela %>%
  config(displayModeBar = FALSE)

Questão 9 - Por ano

# Leitura do dataset
netflix <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE)

# Criação da coluna 'decade'
netflix <- netflix %>%
  mutate(decade = floor(release_year / 10) * 10)  # Ex: 2003 -> 2000

# Contagem de conteúdos por década e tipo
conteudo_decada <- netflix %>%
  filter(!is.na(release_year)) %>%
  group_by(decade, type) %>%
  summarise(qtd = n(), .groups = 'drop')

# Gráfico de linha com Plotly
fig <- plot_ly(conteudo_decada, x = ~decade, y = ~qtd, color = ~type,
               colors = c("orange", "blue"), type = 'scatter', mode = 'lines+markers') %>%
  layout(
    title = "Quantidade de Conteúdos na Netflix por Década",
    xaxis = list(title = "Década"),
    yaxis = list(title = "Qtd. Conteúdo"),
    legend = list(title = list(text = "Tipo de Conteúdo"))
  )

fig %>%
  config(displayModeBar = FALSE)

Questão 10 - 2000 a 2010

# --- 1. Filtra apenas FILMES ---
filmes <- netflix %>%
  filter(type == "Movie", !is.na(release_year), release_year >= 2000, release_year <= 2010)

# --- 2. Considera apenas o PRIMEIRO gênero (antes da vírgula) ---
filmes <- filmes %>%
  mutate(listed_in = trimws(sapply(strsplit(listed_in, ","), `[`, 1)))

# --- 3. Mantém apenas os 3 gêneros desejados ---
filmes <- filmes %>%
  filter(listed_in %in% c("Dramas", "Action & Adventure", "Comedies"))

# --- 4. Conta quantos filmes foram lançados por ano e gênero ---
contagem <- filmes %>%
  group_by(release_year, listed_in) %>%
  summarise(qtd = n(), .groups = 'drop')

# --- 5. Gráfico de barras lado a lado ---
fig <- plot_ly(
  data = contagem,
  x = ~release_year,
  y = ~qtd,
  color = ~listed_in,
  colors = c("blue", "orange", "green"),
  type = "bar"
) %>%
  layout(
    barmode = "group",
    title = "Quantidade de Filmes por Gênero (2000–2010)",
    xaxis = list(title = "Ano de Lançamento"),
    yaxis = list(title = "Qnt. de Lançamentos"),
    legend = list(title = list(text = "Gênero"))
  )

fig %>%
  config(displayModeBar = FALSE)