Exercícios

Questão 1

(20 pontos) Use os dados abaixo para gerar os gráficos. Para o segundo gráfico (barras), use a escala logarítmica (log = “y”) e as seguintes cores: “#E6E6E6”, “#666666”. Além disso, os gráficos podem ser organizados com a função layout().

# --- 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) 
# --- Fim dos Dados ---

# Layout segundo a imagem nas instruções
par(mar = c(4, 4, 3, 1))
layout_matrix <- matrix(c(
  1, 1,
  2, 3,
  4, 5,
  6, 0
), nrow = 4, byrow = TRUE)
layout(layout_matrix)


# Gráfico 1: Linhas para cada MRT vs clock

# Criar o gráfico
plot(clock, MRT_1F,
     type = "o",
     pch = 4,
     lty = 1,
     col = "black",
     ylim = c(0, max(MRT_1F)), 
     xlab = "Time between Things requests (seconds)",
     ylab = "Response Time (sec.)")

# Adicionar as outras linhas
lines(clock, MRT_3F, type="o", pch=1, lty=1, col="yellow")
lines(clock, MRT_5F, type="o", pch=0, lty=1, col="red")
lines(clock, MRT_10F, type="o", pch=2, lty=1, col="blue")
lines(clock, MRT_15F, type="o", pch=5, lty=1, col="purple")
lines(clock, MRT_sem_F, type="o", pch=3, lty=1, col="green")

# Adicionar a 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, 1, 0, 2, 5, 3), 
       lty = 1)

# Gráfico 2: Barras (com log="y")
# Cores
cores_g2 <- c("#E6E6E6", "#666666")

# Limite superior do Y
ylim_g2 <- c(0.1, max(MRT_1F))

# Função helper para criar os barplots
criar_barplot <- function(data_fog, fog_name) {
  dados_combinados <- rbind(MRT_sem_F, data_fog)

  barplot(dados_combinados,
          beside = TRUE,
          col = cores_g2,
          names.arg = clock,
          xlab = "Time between Things requests",
          ylab = "Response time (s)",
          log = "y", # Escala logarítmica [cite: 5]
          ylim = ylim_g2
         )
  legend("topright",
         legend = c("w/o Fog", fog_name),
         fill = cores_g2)
}

# Gerar os 5 gráficos
criar_barplot(MRT_1F, "1 Fog")
criar_barplot(MRT_3F, "3 Fogs")
criar_barplot(MRT_5F, "5 Fogs")
criar_barplot(MRT_10F, "10 Fogs")
criar_barplot(MRT_15F, "15 Fogs")

Questão 2

(5 pontos) Para a tabela abaixo que classifica a qualidade de refeição de acordo com categorias de preços crie um gráfico de barras empilhadas. Também adicione título, nomes de eixos e legenda.

# --- Dados ---
dados_q2 <- matrix(c(53.8, 43.6, 2.6,
                   33.9, 54.2, 11.9,
                   2.6, 60.5, 36.8,
                   0.0, 21.4, 78.6),
                 nrow = 3, ncol = 4)

colnames(dados_q2) <- c("$10-19", "$20-29", "$30-39", "$40-49")
rownames(dados_q2) <- c("Good", "Very Good", "Excellent")
# --- Fim dos Dados ---

# Cores
cores_q2 <- c("green", "orange", "brown")

# Criar o gráfico de barras empilhadas
barplot(dados_q2,
        main = "Quality Rating by Meal Price",
        xlab = "Meal Price", 
        ylab = "Percentage",
        col = cores_q2,
        ylim = c(0, 150), # Aumentei pois a legenda estava em cima do gráfico...
        legend.text = rownames(dados_q2),
        args.legend = list(x = "topright")
       )

Questão 3

(5 pontos) Faça o histograma das temperaturas do mês de maio do dataset airquality. No entanto, primeiro converta as temperaturas para graus Celsius através da expressão °C = (°F − 32) / 1.8. Após isso, gere o histograma. Também adicione título, nomes de eixos, cor e curva de densidade.

# --- Dados ---
data(airquality)
# --- Fim dos Dados ---

# Filtrar pelo mês de Maio
temps_f_maio <- airquality$Temp[airquality$Month == 5]

# Converter para Celsius
temps_c <- (temps_f_maio - 32) / 1.8

# Gerar o histograma
hist(temps_c,
     main = "Histograma da Temperatura (Maio - Celsius)",
     xlab = "Temperatura (°C)",
     ylab = "Frequência",
     col = "blue",
     freq = FALSE,
    )

# 4. Adicionar curva de densidade
lines(density(temps_c), col = "red", lwd = 2)

Questão 4

(10 pontos) Use os dados dos 4 arquivos ‘monitoringCloudData…’ para criar um gráfico de linha da segunda coluna (totalCpuUsage…) em função da primeira coluna (currentTime) de cada um dos arquivos, todos no mesmo gráfico. Use cores diferentes e adicione uma legenda.

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

# Calcular porcentagens
total_sales <- sum(sales$SALES)
porcentagens <- (sales$SALES / total_sales) * 100

# Criar porcentagem
pct <- paste(sales$COUNTRY, " - ", round(porcentagens, 1), "%", sep="")

# Cores
cores_q4 <- rainbow(length(sales$COUNTRY))

# Gráfico de Pizza
pie(sales$SALES,
    labels = pct,
    col = cores_q4,
    main = "Total de Vendas por País"
   )

# Adicionar legenda separada
legend("topright",
       legend = sales$COUNTRY, 
       fill = cores_q4)

Questão 5

(5 pontos) Utilize os dados de contagens de insetos em unidades experimentais agrícolas tratados com inseticidas diferentes disponíveis no R em InsectSprays e construa um boxplot sem a presença dos outliers para os 6 tipos de inseticidas. Coloque título e nomes de eixos adequados. Além disso, as caixas devem ser preenchidas com a cor “yellow”.

# --- Dados ---
data(InsectSprays) 
# --- Fim dos Dados ---

# Criar o boxplot
boxplot(count ~ spray,
        data = InsectSprays,
        main = "Contagem de Insetos por Tipo de Inseticida",
        xlab = "Tipo de Inseticida", 
        ylab = "Número de Insetos", 
        col = "yellow",
        outline = FALSE
       )

Questão 6

(20 pontos) Gere os gráficos abaixo a partir dos seguintes dados: monitoringCloudData_0.1.csv, monitoringCloudData_0.5.csv, monitoringCloudData_1.csv e monitoringCloudData_NONE.csv. Esses dados consistem de informações de monitoramento dos recursos de uma máquina virtual. Basicamente, é necessário gerar gráficos de linha do tempo de coleta dos recursos (currentTime) em relação a memória usada (usedMemory). Porém, é necessário ajustar a coluna “currentTime” para que o tempo fique contínuo e a coluna “usedMemory” para que todas as informações fiquem megabytes. Por fim, use a função layout() para organizar os gráficos. Dica 1: use a função difftime() para calcular a diferença do tempo em horas. Dica 2:use os conceitos vistos na aula de string/regex para converter os dados na coluna “usedMemory” para apenas megabytes. Além disso, considere que um terabyte equivale a 1000000 megabytes e 1 gigabyte equivale a 1024 megabytes.

# --- Dados ---

# --- FUNÇÕES DE PROCESSAMENTO ---
# Converter para MB
convert_to_mb <- function(mem_vector) {
  # Extrai a parte numérica
  values <- as.numeric(sub("([0-9.]+).*", "\\1", mem_vector))
  # Extrai a unidade (MB, GB, TB)
  units <- sub("[0-9.]+", "", mem_vector)
  
  # Converte
  mb_values <- ifelse(units == "GB", values * 1024,
                ifelse(units == "TB", values * 1000000, 
                ifelse(units == "MB", values, NA)))
  
  return(mb_values)
}


# Função para processar um arquivo
process_data <- function(file_path) {

  data <- read.csv(file_path)
  
  #Ajustar o tempo
  data$currentTime <- as.POSIXct(data$currentTime, format="%Y-%m-%d %H:%M:%OS")
  data$hours <- as.numeric(difftime(data$currentTime, data$currentTime[1], units="hours"))
  
  #Ajustar a memória
  data$usedMemory_MB <- convert_to_mb(data$usedMemory)
  
  return(na.omit(data))
}

# --- CARREGAMENTO E PROCESSAMENTO DOS DADOS ---

data_01 <- process_data("monitoringCloudData_0.1.csv")
data_05 <- process_data("monitoringCloudData_0.5.csv")
data_1 <- process_data("monitoringCloudData_1.csv")
data_none <- process_data("monitoringCloudData_NONE.csv")

# --- Fim dos Dados ---


# --- GERAÇÃO DOS GRÁFICOS ---

# Ajustar as margens
par(mar = c(4, 4, 2.5, 1.5))

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

# Plot 1: None
plot(data_none$hours, data_none$usedMemory_MB, type="l", 
     xlab="Time (hour)", ylab="Used Memory (MB)", 
     main="Memory Analysis (None Workload)")

# Plot 2: 0.1
plot(data_01$hours, data_01$usedMemory_MB, type="l", 
     xlab="Time (hour)", ylab="Used Memory (MB)", 
     main="Memory Analysis (Workload of 0.1)")

# Plot 3: 0.5
plot(data_05$hours, data_05$usedMemory_MB, type="l", 
     xlab="Time (hour)", ylab="Used Memory (MB)", 
     main="Memory Analysis (Workload of 0.5)")

# Plot 4: 1.0
plot(data_1$hours, data_1$usedMemory_MB, type="l", 
     xlab="Time (hour)", ylab="Used Memory (MB)",
     main="Memory Analysis (Workload of 1.0)")

Questão 7

(10 pontos) Filtrando os conteúdos com apenas UM país de origem (coluna “country”), utilize o Plotly para obter um gráfico de pizza dos 10 países com mais conteúdo na plataforma.

# --- Dados ---
netflix_data <- read.csv("netflix_titles.csv")
# --- Fim dos Dados ---

# Filtrar por país único
data_q7 <- netflix_data %>%
  filter(country != "" & !is.na(country)) %>%
  filter(!str_detect(country, ",")) %>%
  group_by(country) %>%
  summarise(total = n()) %>%
  arrange(desc(total)) %>%
  slice_max(order_by = total, n = 10) # Pegar o Top 10

# Criar gráfico de pizza com Plotly
fig_q7 <- plot_ly(data_q7,
                  labels = ~country,
                  values = ~total,
                  type = 'pie',
                  textinfo = 'label+percent',
                  insidetextorientation = 'radial') %>%
  layout(title = "Top 10 Países (Com apenas UM país de origem) na Netflix",
         showlegend = TRUE) # Manti para ficar explicito as fatias que não mostram o nome(apesar de dar para ver se passar a seta em cima...)

# Exibir o gráfico
fig_q7

Questão 8

(10 pontos) Considerando os 10 países descritos na questão anterior, utilize o Plotly para obter uma tabela com as colunas “País” e “Total de conteúdos”. Para tal tabela, é necessário que o cabeçalho esteja com o fundo da célula cinza e a letra em branco, e que todos os textos das células estejam @centralizados.

# --- Dados ---
data_q8 <- data_q7 %>%
  rename(País = country, "Total de conteúdos" = total)
# --- Fim dos Dados ---

# Criar a tabela com Plotly
fig_q8<- plot_ly(
  type = 'table',
  # Configuração do cabeçalho
  header = list(
    values = names(data_q8),
    fill = list(color = "grey"),
    font = list(color = "white", size = 14), # Letra branca
    align = "center" # Centralizar cabeçalho
  ),
  # Configuração das células
  cells = list(
    values = t(as.matrix(unname(data_q8))),
    fill = list(color = "white"),
    font = list(color = "black", size = 12),
    align = "center" 
  )
) %>%
layout(title = "Top 10 Países ")

# Exibir a tabela
fig_q8

Questão 9

(10 pontos) Utilizando o Plotly, obtenha um gráfico de linha com uantidade de conteúdo por década dpontos (como na imagem abaixo) contendo a qo Netflix, onde o eixo X representa as décadas e o eixo Y a quantidade de conteúdo disponível na plataforma (coluna “release_year”). Use uma linha azul para representar as séries e uma linha amarela representando os filmes. (Obs: considerar como década o período que compreende os anos de XXX0 à XXX9, por exemplo, 2000 à 2009)

# --- Dados ---
# Limpar dados
data_q9 <- netflix_data %>%
  filter(!is.na(release_year))
# --- Fim dos Dados ---

# Criar a coluna "década" (XXX0 a XXX9)
data_q9$decade <- floor(data_q9$release_year / 10) * 10

# Agregar por década e tipo
ddata_q9_agg <- data_q9 %>% 
  group_by(decade, type) %>% 
  summarise(total = n(), .groups = 'drop') %>% 
  tidyr::pivot_wider(names_from = type, values_from = total, values_fill = 0) %>% 
  filter(decade >= 1940 & decade <= 2020) 

# Criar gráfico de linha com Plotly
fig_q9 <- plot_ly(ddata_q9_agg, x = ~decade) %>%
  
  # Linha de Séries (TV Show) - Azul
  add_trace(y = ~`TV Show`,
            name = 'TV Series',
            type = 'scatter',
            mode = 'lines+markers',
            line = list(color = 'blue'),
            marker = list(color = 'blue')) %>%

  # Linha de Filmes (Movies) - Amarela/Laranja
  add_trace(y = ~Movie,
            name = 'Movies',
            type = 'scatter',
            mode = 'lines+markers',
            line = list(color = 'orange'), 
            marker = list(color = 'orange')) %>%

  layout(title = "Quantidade de Conteúdo por Década",
         xaxis = list(title = "Década", dtick = 20),
         yaxis = list(title = "Qnd. Conteúdo"))

# Exibir gráfico
fig_q9

Questão 10

(10 pontos) Utilizando o Plotly, obtenha um gráfico que representa a quantidade de filmes lançados de um determinado gênero entre os anos de 2000 e 2010. Este gráfico deve ser de barras lado-a-lado (como na imagem abaixo), com cada barra representando a quantidade de filmes dos gêneros “Dramas”, “Action & Adventure” e “Comedies” lançados naquele determinado ano. (Obs: Para filmes com múltiplos gêneros, considerar apenas o primeiro descrito na coluna “listed_in”).

# --- Dados ---
# Filtrar dados: Apenas Filmes, entre 2000 e 2010
data_q10 <- netflix_data %>%
  filter(type == "Movie") %>%
  filter(release_year >= 2000 & release_year <= 2010) %>%
  filter(!is.na(listed_in) & listed_in != "")
# --- Fim dos Dados ---

# Extrair o gênero
data_q10$first_genre <- str_trim(str_split_fixed(data_q10$listed_in, ",", n = 2)[, 1])

# Filtrar pelos 3 gêneros solicitados 
target_genres <- c("Dramas", "Action & Adventure", "Comedies")

data_q10_filtered <- data_q10 %>%
  filter(first_genre %in% target_genres)

# Agregar dados
data_q10_agg <- data_q10_filtered %>%
  group_by(release_year, first_genre) %>%
  summarise(total = n())

# Criar gráfico de barras agrupado
fig_q10 <- plot_ly(data_q10_agg,
                   x = ~release_year,
                   y = ~total,
                   color = ~first_genre,
                   colors = c("orange", "blue", "green"), 
                   type = 'bar',
                   barmode = 'group') %>%
  layout(title = "Filmes Lançados (2000-2010) por Gênero",
         xaxis = list(title = "Ano de Lançamento", 
                      tickmode = 'linear',
                      dtick = 2),
         yaxis = list(title = "Qnt. de Lançamentos"),
         legend = list(title = list(text = "Gênero")))

# Exibir gráfico
fig_q10