Exercício 12

Questão 1

Carregamento dos 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

# Cria o gráfico inicial com a primeira linha
plot(clock, MRT_1F, type = "b", pch = 4, col = "black", lwd = 1, ylim = range(c(MRT_1F, MRT_5F, MRT_3F, MRT_10F, MRT_15F, MRT_sem_F)),
     xlab = "Time between Things requests (seconds)", ylab = "Response Time (sec.)")

# Adiciona as outras linhas
# 3F – triângulo duplo (pra cima e pra baixo)
lines(clock, MRT_3F, col = "yellow", lwd = 1)
points(clock, MRT_3F, pch = 2, col = "yellow")
points(clock, MRT_3F, pch = 6, col = "yellow", bg = "yellow")

# 5F
lines(clock, MRT_5F, col = "red", lwd = 1)
points(clock, MRT_5F, pch = 1, col = "red")

# 10F
lines(clock, MRT_10F, col = "blue", lwd = 1)
points(clock, MRT_10F, pch = 2, col = "blue")

# 15F
lines(clock, MRT_15F, col = "purple", lwd = 1)
points(clock, MRT_15F, pch = 5, col = "purple")

# sem F
lines(clock, MRT_sem_F, col = "green", lwd = 1)
points(clock, MRT_sem_F, pch = 4, col = "green")

# Adiciona legenda
legend("topright",
       legend = c("1 Fog", "3 Fog", "5 Fog", "10 Fog", "15 Fog", "sem  Fog"),
       col = c("black", "yellow", "red", "blue", "purple", "green"),
       pch = c(4, 17, 1, 2, 5, 4),
       lty = 1)

Gráficos de Barras Agrupadas

layout(matrix(1:6, nrow = 3, ncol = 2, byrow = TRUE))

comparacoes <- list(
  "1 Fog" = MRT_1F,
  "3 Fog" = MRT_3F,
  "5 Fog" = MRT_5F,
  "10 Fog" = MRT_10F,
  "15 Fog" = MRT_15F
)

for (nome in names(comparacoes)) {
  y <- comparacoes[[nome]]
  
  max_y <- ceiling(max(c(MRT_sem_F, y))) 
  
  barplot(
    rbind(MRT_sem_F, y),
    beside = TRUE,
    names.arg = clock,
    col = c("#E6E6E6", "#666666"),
    ylim = c(0.1, max_y),
    log = "y",
    xlab = "Time between Things requests (seconds)",
    ylab = "Response Time (sec.)",
    main = paste("Sem Fog vs", nome),
    cex.main = 1
  )
  
  legend("topright",
         legend = c("Sem Fog", nome),
         fill = c("#E6E6E6", "#666666"),
         bty = "n",
         cex = 0.8)
}

Questão 2

Criação da Tabela

tabela <- data.frame(
  Quality_Rating = c("Good", "Very Good", "Excellent", "Total"),
  `$10_19` = c(53.8, 43.6, 2.6, 100.0),
  `$20_29` = c(33.9, 54.2, 11.9, 100.0),
  `$30_39` = c(2.6, 60.5, 36.8, 100.0),
  `$40_49` = c(0.0, 21.4, 78.6, 100.0)
)

Gráfico de Barras Agrupadas Preços

tabela_grafico <- tabela[1:3, ]
rownames(tabela_grafico) <- tabela_grafico$Quality_Rating
tabela_grafico <- tabela_grafico[, -1]

colnames(tabela_grafico) <- c("$10-19", "$20-29", "$30-39", "$40-49")

max_valor <- max(as.matrix(tabela_grafico), na.rm = TRUE)
ylim_max <- max_valor * 1.1

legenda_args <- list(
  title = "Quality Rating",
  x = "top",
  cex = 0.5,
  title.cex = 0.6
)

barplot(
  as.matrix(tabela_grafico),
  beside = TRUE,
  col = rainbow(3),
  legend.text = TRUE,
  args.legend = legenda_args,
  xlab = "Meal Price",
  ylab = "Percentage (%)",
  main = "Quality Rating by Meal Price",
  ylim = c(0, ylim_max)
)

Questão 3

Histograma

data("airquality")

maio <- subset(airquality, Month == 5)

temp_c <- (maio$Temp - 32) / 1.8

hist(temp_c,
     breaks = "FD",
     main = "Histograma das Temperaturas de Maio (°C)", 
     xlab = "Temperatura (°C)",                         
     ylab = "Frequência",                                
     col = "lightblue",                                     
     border = "white",                                 
     prob = T)                                   

lines(density(temp_c), 
      col = "red", 
      lwd = 2)

media_celsius <- mean(temp_c, na.rm = TRUE)
abline(v = media_celsius, col = "darkgreen", lwd = 2, lty = 2)

legend("topright",
       legend = c("Curva de Densidade (KDE)", paste("Média:", round(media_celsius, 2), "°C")),
       col = c("red", "darkgreen"), # Cores dos elementos
       lwd = c(2, 2), # Espessura da linha
       lty = c(1, 2), # Tipo de linha (sólida para densidade, tracejada para média)
       bty = "n", # Remove a caixa de borda
       cex = 0.9) # Tamanho da fonte

Questão 4

Gráfico de Pizza de Vendas

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

porcentagens <- round(sales$SALES / sum(sales$SALES) * 100, 1)

nomes_fatias <- paste(sales$COUNTRY, " (", porcentagens, "%)", sep = "")

rotulos <- paste(porcentagens, "%")

cores <- rainbow(length(sales$COUNTRY))

par(mar = c(1, 1, 3, 1)) 

pie(
  sales$SALES,
  labels = rotulos,
  col = cores,
  main = "Distribuição Total de Vendas por País",
  cex.main = 1.2,
  cex = 0.8
)

legend(
  "topright", 
  legend = nomes_fatias, 
  fill = cores,
  title = "País (Vendas)",
  bty = "n", 
  cex = 0.8
)

Questão 5

Boxplot Insetos

data(InsectSprays)

boxplot(
  count ~ spray,
  data = InsectSprays, 
  outline = FALSE,
  col = "yellow",
  main = "Contagem de Insetos por Tipo de Inseticida (Outliers Excluídos)",
  xlab = "Tipo de Inseticida",
  ylab = "Contagem de Insetos",
  border = "black"
)

Questão 6

Download zip

temp_zip <- tempfile(fileext = ".zip")

download.file(
  "https://www.dropbox.com/scl/fi/gyajp6p4bacdasymcguz6/monitoringCloudData.zip?rlkey=4i3zj343im9s8hpldpjmtfldi&e=3&st=94ygvcub&dl=1",
  temp_zip,
  mode = "wb"
)

files_in_zip <- unzip(temp_zip, list = TRUE)

arquivos <- c(
  "monitoringCloudData_NONE.csv",
  "monitoringCloudData_0.1.csv",
  "monitoringCloudData_0.5.csv",
  "monitoringCloudData_1.csv"
)

unzip(temp_zip, files = arquivos, exdir = tempdir())

csv_paths <- file.path(tempdir(), arquivos)

dados <- lapply(csv_paths, read.csv)

names(dados) <- c("data_NONE","data_0.1", "data_0.5", "data_1")

Pré-processamento

dados_processados <- list()

for (nome in names(dados)) {
  df <- dados[[nome]][, c("currentTime", "usedMemory")]
  
  df$currentTime <- as.POSIXct(df$currentTime)

  tempo_inicial <- df$currentTime[1]
  df$tempo_horas <- as.numeric(difftime(df$currentTime, tempo_inicial, units = "hours"))
  
  df$valor <- as.numeric(gsub("([0-9.]+).*", "\\1", df$usedMemory))
  df$unidade <- gsub(".*(MB|GB|TB).*", "\\1", df$usedMemory)
  
  df$usedMemory_MB <- 0
  
  idx_gb <- which(df$unidade == "GB")
  df$usedMemory_MB[idx_gb] <- df$valor[idx_gb] * 1024
  
  idx_tb <- which(df$unidade == "TB")
  df$usedMemory_MB[idx_tb] <- df$valor[idx_tb] * 1000000
  
  idx_mb <- which(df$unidade == "MB")
  df$usedMemory_MB[idx_mb] <- df$valor[idx_mb]
  
  dados_processados[[nome]] <- df
}

Gráfico de Linhas de Tempo

layout(matrix(1:4, nrow = 2, ncol = 2, byrow = TRUE))

par(mar = c(4, 4, 2, 1) + 0.1, cex.main = 0.9)

max_tempo_horas <- max(sapply(dados_processados, \(x) max(x$tempo_horas, na.rm = TRUE)))

for (nome in names(dados_processados)) {
  df <- dados_processados[[nome]]
  
  df <- df[complete.cases(df$tempo_horas, df$usedMemory_MB), ]
  
  min_memoria <- min(df$usedMemory_MB, na.rm = TRUE)
  max_memoria <- max(df$usedMemory_MB, na.rm = TRUE)
  
  plot(
    df$tempo_horas,
    df$usedMemory_MB,
    type = "l",
    col = "darkblue",
    lwd = 2,
    
    main = paste("Uso de Memória - Intervalo:", gsub("data_", "", nome)),
    xlab = "Tempo Contínuo (horas)",
    ylab = "Memória Usada (MB)",
    
    xlim = c(0, max_tempo_horas),
    ylim = c(min_memoria * 0.98, max_memoria * 1.02)
  )
  
  # Adiciona uma grade discreta
  grid(col = "gray", lty = "dotted")
}

# 2.4. Restaurar as configurações gráficas padrão
layout(1)
par(mar = c(5, 4, 4, 2) + 0.1, cex.main = 1)

Preparação para as próximas questões

Download csv

url <- "https://www.dropbox.com/scl/fi/vjlgt50835d6snk03add2/netflix_titles.csv?rlkey=rzrveurxlom9cjp51nbv4w1gw&e=1&st=4du21n9d&dl=1"

temp_file <- tempfile(fileext = ".csv")

download.file(url, temp_file, mode = "wb")

netflix_data <- read.csv(temp_file, header = TRUE, stringsAsFactors = FALSE)

Libraries

library(readr)
library(dplyr)
## 
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
## 
##     filter, lag
## Os seguintes objetos são mascarados por 'package:base':
## 
##     intersect, setdiff, setequal, union
library(plotly)
## Carregando pacotes exigidos: ggplot2
## 
## Anexando pacote: 'plotly'
## O seguinte objeto é mascarado por 'package:ggplot2':
## 
##     last_plot
## O seguinte objeto é mascarado por 'package:stats':
## 
##     filter
## O seguinte objeto é mascarado por 'package:graphics':
## 
##     layout

Top 10 países

dados_filtrados <- netflix_data %>%
  filter(
    country != "",
    !is.na(country),
    !grepl(",", country)
  )

top_paises <- dados_filtrados %>%
  group_by(country) %>%
  summarise(total = n()) %>%
  arrange(desc(total)) %>%
  head(10)

Questão 7

Gráfico de Pizza Netflix

fig <- plot_ly(top_paises, 
               labels = ~country, 
               values = ~total, 
               type = 'pie',
               textinfo = 'label+percent',
               insidetextorientation = 'radial') %>%
  layout(title = "Top 10 países com mais conteúdos",
         legend = list(title = list(text = 'País')),
  margin = list(
           l = 50,
           r = 100,
           b = 150,
           t = 50
         ))

fig

Questão 8

Tabela Quantidade de Conteúdos

tabela_dados <- top_paises %>%
  rename(
    País = country,
    `Total de conteúdos` = total
  )

fig_tabela <- plot_ly(
  type = 'table',
  
  header = list(
    values = c("País", "Total de conteúdos"), 
    align = c("center"), 
    font = list(color = 'white', size = 12),
    fill = list(color = 'gray')
  ),
  
  cells = list(
    values = t(as.matrix(tabela_dados)),
    align = c("center"),
    line = list(color = "black", width = 1),
    fill = list(color = c("white", "lightgray"))
  )
) %>% 
  layout(
    title = "Total de Conteúdos da Netflix nos Top 10 Países"
  )

fig_tabela

Questão 9

Quantidade de Conteúdo por Década

netflix_data$decade <- floor(netflix_data$release_year / 10) * 10

conteudo_por_decada <- netflix_data %>%
  filter(type %in% c("Movie", "TV Show")) %>%
  group_by(decade, type) %>%
  summarise(total_conteudo = n(), .groups = 'drop') %>%
  
  # Preencher décadas sem dados com zero para garantir linhas contínuas no gráfico
  tidyr::complete(decade, type, fill = list(total_conteudo = 0)) %>%
  
  arrange(decade)

fig <- plotly::plot_ly(
  conteudo_por_decada,
  x = ~decade,
  y = ~total_conteudo,
  color = ~type,
  type = 'scatter',
  mode = 'lines+markers',
  colors = c("Movie" = "yellow", "TV Show" = "blue")
) %>%
  plotly::layout(
    title = "Quantidade de Conteúdo Netflix por Década (Filmes vs. Séries)",
    xaxis = list(
      title = "Década",
      tickvals = ~unique(conteudo_por_decada$decade),
      ticktext = ~paste0(unique(conteudo_por_decada$decade), "s"),
      dtick = 10
    ),
    yaxis = list(title = "Total de Conteúdo"),
    legend = list(title = list(text = 'Tipo de Conteúdo'))
  )

fig

Questão 10

Gráfico Barras Agrupadas Gêneros

netflix_data$primary_genre <- trimws(sub(",.*", "", netflix_data$listed_in))

generos_alvo <- c("Dramas", "Action & Adventure", "Comedies")
ano_min <- 2000
ano_max <- 2010

dados_filtrados <- subset(netflix_data, 
                          type == "Movie" &
                          release_year > ano_min &
                          release_year < ano_max &
                          primary_genre %in% generos_alvo)

dados_grafico <- aggregate(show_id ~ release_year + primary_genre, 
                           data = dados_filtrados, 
                           FUN = length)
names(dados_grafico)[3] <- "count"

dados_grafico <- dados_grafico[order(dados_grafico$release_year), ]

fig <- plot_ly(
  dados_grafico,
  x = ~release_year,
  y = ~count,
  color = ~primary_genre,
  type = 'bar'
) %>%
  layout(
    title = paste("Filmes Lançados por Gênero Principal (", ano_min, " - ", ano_max, ")", sep=""),
    xaxis = list(
      title = "Ano de Lançamento",
      type = "category",
      tickangle = -45
    ),
    yaxis = list(title = "Quantidade de Filmes"),
    barmode = 'group',
    legend = list(title = list(text = 'Gênero Primário'))
  )

fig