1 Respostas das Questões

1.1 Questão 1

1.1.1 MRT (linhas e barras em escala logarítmica)

MRT_1F <- c(517.1468515630205,  85.13094142168089, 30.333207896694553,
            12.694776264558937,  3.3041601673945418)
MRT_2F <- c(526.9692994038237, 280.4079496307135, 121.28292671587394,
            76.65751249749171,  7.846599292193567)

labels <- c("1", "2", "3", "4", "5")

data_q1 <- data.frame(
  Feature = labels,
  MRT_1F  = MRT_1F,
  MRT_2F  = MRT_2F
)

par(mfrow = c(1, 2), mar = c(5, 4, 4, 2) + 0.1)

# --- Gráfico 1: Linhas ---
plot(data_q1$MRT_1F, type = "l", col = "blue",
     xlab = "Feature", ylab = "MRT (ms)", main = "MRT - Linhas",
     ylim = range(c(data_q1$MRT_1F, data_q1$MRT_2F)),
     xaxt = "n", lwd = 2)
lines(data_q1$MRT_2F, type = "l", col = "red", lwd = 2)
axis(side = 1, at = 1:length(labels), labels = labels)
legend("topright",
       legend = c("1 Feature", "2 Features"),
       col    = c("blue", "red"),
       lty    = 1,
       cex    = 0.8)

# --- Gráfico 2: Barras (Escala Log) ---
# Transpõe para ficar 2 x 5 (2 séries, 5 features)
bar_data <- t(as.matrix(data_q1[, 2:3]))
colnames(bar_data) <- labels   # nomes dos grupos no eixo X

barplot(bar_data,
        col       = c("#E6E6E6", "#666666"),
        xlab      = "Feature",
        ylab      = "log(MRT)",
        main      = "MRT - Barras (Escala Logarítmica)",
        log       = "y",
        beside    = TRUE)

legend("topright",
       legend = c("1 Feature", "2 Features"),
       fill   = c("#E6E6E6", "#666666"),
       cex    = 0.8)

par(mfrow = c(1, 1))

1.2 Questão 2

1.2.1 Barras empilhadas (qualidade x preço)

tab_q2 <- matrix(
  c(20, 10,  5,   # Preço Baixo: Ruim, Média, Alta
    15, 25, 15,   # Preço Médio
    5,  15, 30),  # Preço Alto
  nrow = 3, byrow = TRUE
)

colnames(tab_q2) <- c("Baixo", "Médio", "Alto")
rownames(tab_q2) <- c("Ruim", "Média", "Alta")

# Gráfico de barras empilhadas
barplot(
  tab_q2,
  col = c("#FF5733", "#FFC300", "#33FF57"),
  main = "Qualidade da refeição por faixa de preço",
  xlab = "Faixa de preço",
  ylab = "Quantidade",
  legend.text = rownames(tab_q2),
  args.legend = list(x = "topright", bty = "n")
)

1.3 Questão 3

1.3.1 Histograma das temperaturas (airquality, maio)

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

# Converter de °F para °C
temp_C <- (aq_maio$Temp - 32) / 1.8

# Histograma com curva de densidade
hist(
  temp_C,
  breaks = 8,
  col = "lightblue",
  border = "white",
  main = "Temperaturas em maio (Nova York) em °C",
  xlab = "Temperatura (°C)",
  ylab = "Frequência",
  prob = TRUE
)

# Curva de densidade
dens <- density(temp_C, na.rm = TRUE)
lines(dens, col = "red", lwd = 2)

1.4 Questão 4

1.4.1 Pizza de vendas por país (Sales.txt)

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

# assumindo que a 1ª coluna é País e a 2ª é Vendas
nomes_paises <- sales[[1]]
valores <- sales[[2]]

# porcentagens
pct <- round(valores / sum(valores) * 100, 1)
labels <- paste0(nomes_paises, " (", pct, "%)")

pie(
  valores,
  labels = labels,
  col = hcl.colors(length(valores), "Set 2"),
  main = "Participação nas vendas por país"
)

legend(
  "topright",
  legend = nomes_paises,
  fill = hcl.colors(length(valores), "Set 2"),
  bty = "n"
)

1.5 Questão 5

1.5.1 Boxplot (InsectSprays, sem outliers, caixas amarelas)

boxplot(
  count ~ spray,
  data = InsectSprays,
  main = "Contagem de insetos por tipo de inseticida",
  xlab = "Spray",
  ylab = "Contagem de insetos",
  col  = "yellow",
  outline = FALSE   # remove outliers
)

1.6 Questão 6

1.6.1 MonitoringCloudData (4 arquivos CSV)

# Conversor de textos de memória ("0.5 GB", "512 MB") para MB
conv_mb <- function(x) {
  if (all(is.na(x))) return(rep(NA_real_, length(x)))
  # separa número e unidade
  num  <- suppressWarnings(as.numeric(sub(" .*", "", x)))
  unit <- toupper(sub(".* ", "", x))
  mult <- ifelse(unit == "TB", 1e6,
                 ifelse(unit == "GB", 1024,
                        ifelse(unit == "MB", 1, 1)))
  num * mult
}

# Função genérica para preparar dados de um arquivo de monitoramento
prep_mc <- function(file) {
  df <- tryCatch(
    read.csv(file, stringsAsFactors = FALSE),
    error = function(e) NULL
  )
  if (is.null(df) || ncol(df) < 2) return(NULL)

  # 1ª coluna = tempo, 2ª coluna = uso de memória (texto)
  time_txt <- df[[1]]
  mem_txt  <- df[[2]]

  # converte para POSIXct e horas relativas
  time_posix <- as.POSIXct(time_txt, format = "%Y-%m-%d %H:%M:%OS", tz = "UTC")
  horas      <- as.numeric(difftime(time_posix, min(time_posix, na.rm = TRUE),
                                    units = "hours"))

  usedMB <- conv_mb(mem_txt)

  out <- data.frame(horas = horas, usedMB = usedMB)
  out <- out[is.finite(out$usedMB) & is.finite(out$horas), ]
  if (nrow(out) == 0) return(NULL)
  out
}

# Arquivos e rótulos
arqs <- c("monitoringCloudData_NONE.csv",
          "monitoringCloudData_0.1.csv",
          "monitoringCloudData_0.5.csv",
          "monitoringCloudData_1.csv")

titulos <- c("Sem carga", "Carga 0.1", "Carga 0.5", "Carga 1.0")

dfs <- lapply(arqs, prep_mc)

# 4 gráficos em uma tela 2x2
op <- par(mfrow = c(2, 2))

for (i in seq_along(dfs)) {
  df <- dfs[[i]]
  if (!is.null(df) && nrow(df) > 0) {
    with(df, {
      plot(horas, usedMB, type = "l", col = "blue",
           main = titulos[i],
           xlab = "Tempo (horas)",
           ylab = "Memória usada (MB)")
    })
  } else {
    # painel vazio com aviso
    plot(0, 0, type = "n", axes = FALSE,
         xlab = "", ylab = "",
         main = titulos[i])
    text(0, 0, "dados ausentes")
  }
}

par(op)  # restaura layout

1.7 Questão 7

1.7.1 Netflix: Pizza dos 10 países com mais conteúdos

library(plotly)
library(dplyr)
library(stringr)

# considerar apenas uma país (sem vírgula)
netflix_one_country <- netflix_data %>%
  filter(!is.na(country)) %>%
  filter(!str_detect(country, ","))

top_10 <- netflix_one_country %>%
  group_by(country) %>%
  summarise(total = n(), .groups = "drop") %>%
  arrange(desc(total)) %>%
  slice(1:10)

p7 <- plot_ly(
  top_10,
  labels = ~country,
  values = ~total,
  type = "pie",
  textinfo = "percent",
  hoverinfo = "label+percent+value",
  marker = list(line = list(color = "#FFFFFF", width = 1))
) %>%
  layout(
    title = "Top 10 países com mais conteúdo (country único)"
  )

p7

1.8 Questão 8

1.8.1 Netflix: Tabela Plotly (País x Total de conteúdos)

top_10_tbl <- top_10 %>%
  rename("País" = country,
         "Total de conteúdos" = total)

p8 <- plot_ly(
  type = "table",
  header = list(
    values = colnames(top_10_tbl),
    fill = list(color = "#666666"),
    font = list(color = "white", size = 12),
    align = "center"
  ),
  cells = list(
    values = list(top_10_tbl$`País`, top_10_tbl$`Total de conteúdos`),
    align = "center"
  )
)

p8

1.9 Questão 9

1.9.1 Netflix: Linha por década (Filmes x Séries)

netflix_decade <- netflix_data %>%
  filter(!is.na(type), !is.na(release_year)) %>%
  mutate(decade = floor(release_year / 10) * 10) %>%
  group_by(decade, type) %>%
  summarise(qtd = n(), .groups = "drop") %>%
  filter(decade >= 1940)

p9 <- plot_ly(
  netflix_decade,
  x = ~decade,
  y = ~qtd,
  color = ~type,
  colors = c("TV Show" = "blue", "Movie" = "yellow"),
  type = "scatter",
  mode = "lines"
) %>%
  layout(
    title = "Quantidade de conteúdo por década (Netflix)",
    xaxis = list(
      title = "Década",
      tickvals = sort(unique(netflix_decade$decade)),
      ticktext = paste0(sort(unique(netflix_decade$decade)), "'s")
    ),
    yaxis = list(title = "Quantidade"),
    legend = list(title = list(text = "Tipo"))
  )

p9

1.10 Questão 10

1.10.1 Netflix: Barras lado a lado (gêneros 2000–2010)

generos_alvo <- c("Dramas", "Action & Adventure", "Comedies")

netflix_gen <- netflix_data %>%
  filter(type == "Movie",
         release_year >= 2000,
         release_year <= 2010,
         !is.na(listed_in)) %>%
  mutate(
    main_genre = sub(",.*", "", listed_in),
    main_genre = str_trim(main_genre)
  ) %>%
  filter(main_genre %in% generos_alvo) %>%
  group_by(release_year, main_genre) %>%
  summarise(qtd = n(), .groups = "drop")

# garantir todos anos e gêneros no grid (preenche com 0)
netflix_gen_full <- tidyr::complete(
  netflix_gen,
  release_year = 2000:2010,
  main_genre   = generos_alvo,
  fill         = list(qtd = 0)
)

p10 <- plot_ly(
  netflix_gen_full,
  x = ~release_year,
  y = ~qtd,
  color = ~main_genre,
  type = "bar",
  text = ~paste(
    "Ano:", release_year,
    "<br>Gênero:", main_genre,
    "<br>Filmes:", qtd
  ),
  hoverinfo = "text"
) %>%
  layout(
    title = "Filmes por gênero (2000–2010)",
    xaxis = list(
      title   = "Ano",
      tickmode = "array",
      tickvals = 2000:2010
    ),
    yaxis = list(title = "Quantidade de filmes"),
    barmode = "group",
    legend = list(title = list(text = "Gênero"))
  )

p10