Bibliotecas

Instalação e carregamento de bibliotecas.

install.packages("plotly")
## Instalando pacote em '/home/renan-beserra/R/x86_64-pc-linux-gnu-library/4.5'
## (como 'lib' não foi especificado)
install.packages("dplyr")
## Instalando pacote em '/home/renan-beserra/R/x86_64-pc-linux-gnu-library/4.5'
## (como 'lib' não foi especificado)
install.packages("stringr")
## Instalando pacote em '/home/renan-beserra/R/x86_64-pc-linux-gnu-library/4.5'
## (como 'lib' não foi especificado)
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
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(stringr)

Questão 1

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().

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 1
plot(clock, MRT_1F, type = "o", col = "black", pch = 4, ylim = c(0, max(MRT_1F)),
     xlab = "Time between Things requests (seconds)",
     ylab = "Response Time (sec.)",
     main = "Tempo de Resposta vs Intervalo de Requisições")

lines(clock, MRT_3F, type = "o", col = "yellow", pch = 11)
lines(clock, MRT_5F, type = "o", col = "red", pch = 1)
lines(clock, MRT_10F, type = "o", col = "blue", pch = 2)
lines(clock, MRT_15F, type = "o", col = "purple", pch = 5)
lines(clock, MRT_sem_F, type = "o", col = "green", pch = 4)

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, 11, 1, 2, 5, 4),
       lwd = 1)

# Gráfico 2
dados_1F <- matrix(c(MRT_sem_F, MRT_1F), nrow = 2, ncol = 7, byrow = TRUE)
dados_3F <- matrix(c(MRT_sem_F, MRT_3F), nrow = 2, ncol = 7, byrow = TRUE)
dados_5F <- matrix(c(MRT_sem_F, MRT_5F), nrow = 2, ncol = 7, byrow = TRUE)
dados_10F <- matrix(c(MRT_sem_F, MRT_10F), nrow = 2, ncol = 7, byrow = TRUE)
dados_15F <- matrix(c(MRT_sem_F, MRT_15F), nrow = 2, ncol = 7, byrow = TRUE)

par(mfrow = c(3, 2)) 

criar_barplot <- function(dados, titulo) {
  barplot(dados, beside = TRUE, col = c("#E6E6E6", "#666666"),
          names.arg = clock, log = "y",
          xlab = "Time between Things requests (seconds)",
          ylab = "Response time (s)")
  legend("topright", legend = c("w/o Fog", titulo), 
         fill = c("#E6E6E6", "#666666"))
}

criar_barplot(dados_1F, "1 Fog")
criar_barplot(dados_3F, "3 Fogs")
criar_barplot(dados_5F, "5 Fogs")
criar_barplot(dados_10F, "10 Fogs")
criar_barplot(dados_15F, "15 Fogs")

par(mfrow = c(1, 1))

Questão 2

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.

cores <- rainbow(3)
preco_refeicao <- c("$10-19", "$20-29", "$30-39", "$40-49")
percentual <- matrix(c(53.8, 33.9, 2.6, 0, 43.6, 54.2, 60.5, 21.4, 2.6, 11.9, 36.8, 78.6),
                     nrow = 3, ncol = 4, byrow = T)
qualidade <- c("Good", "Very Good", "Excellent")

barplot(percentual, names.arg = preco_refeicao, col = cores, main = "Qualidade de refeição de acordo com categorias de preços", 
        xlab = "Preço da Refeição", ylab = "Percentual (%)", ylim = c(0, 150))
legend("topleft", pch = 15, col = cores, legend = qualidade, title = "Qualidade da Refeição")

Questão 3

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.

data(airquality)

may_data <- airquality[airquality$Month == 5, ]

may_data$Temp_C <- (may_data$Temp - 32) / 1.8

hist(may_data$Temp_C, 
     col = "lightblue",
     main = "Histograma das Temperaturas em Maio (°C)",
     xlab = "Temperatura (°C)",
     ylab = "Frequência",
     probability = TRUE)

densidade <- density(may_data$Temp_C, na.rm = TRUE)
lines(densidade, col = "red", lwd = 2)

legend("topright", 
       legend = "Curva de Densidade", 
       col = "red", 
       lwd = 2, 
       bty = "n")

Questão 4

Crie um gráfico de pizza com a porcentagem da tabela total de vendas por país. Use o dataset abaixo. Inclua a porcentagem de cada fatia, as cores das fatias e o nome do gráfico. Adicionalmente, use o comando legend() para incluir a legenda do gráfico.

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

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

labels <- paste(sales$COUNTRY, "\n", porcentagens, "%", sep = "")

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

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

legend("topright", 
       legend = sales$COUNTRY,
       fill = cores,
       cex = 0.7,
       title = "Países")

Questão 5

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”.

data(InsectSprays)

boxplot(count ~ spray, data = InsectSprays, 
        ylab = "Quantidade", 
        xlab = "Categoria", 
        main = "Contagens de Insetos por Tipo de Inseticida", 
        col = "yellow", 
        outline = FALSE)

Questão 6

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.

convert_memory_to_mb <- function(memory_string) {
  s <- as.character(memory_string) 
  
  value_str <- sub("([0-9.]+)([A-Z]+)", "\\1", s, ignore.case = TRUE)
  unit_str  <- sub("([0-9.]+)([A-Z]+)", "\\2", s, ignore.case = TRUE)
  
  value <- as.numeric(value_str)

  if (is.na(value) || unit_str == "" || value_str == s) {
    warning(paste("Não foi possível analisar a string de memória:", memory_string))
    return(NA)
  }
  
  unit <- toupper(unit_str) 
  
  if (unit == "MB") {
    return(value)
  } else if (unit == "GB") {
    return(value * 1024) 
  } else if (unit == "TB") {
    return(value * 1000000) 
  } else if (unit == "KB") {
    return(value / 1024) 
  } else {
    warning(paste("Unidade de memória desconhecida:", unit, "na string:", memory_string))
    return(NA)
  }
}

file_info <- list(
  list(path = "monitoringCloudData_NONE.csv", title = "Memory Analysis (None Workload)"),
  list(path = "monitoringCloudData_0.1.csv", title = "Memory Analysis (Workload of 0.1)"),
  list(path = "monitoringCloudData_0.5.csv", title = "Memory Analysis (Workload of 0.5)"),
  list(path = "monitoringCloudData_1.csv", title = "Memory Analysis (Workload of 1.0)")
)

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

for (info in file_info) {
  data_orig <- tryCatch({
    read.csv(info$path, stringsAsFactors = FALSE) 
  }, error = function(e) {
    warning(paste("Erro ao ler o arquivo:", info$path, "-", e$message))
    return(NULL)
  })

  data <- data_orig

  data$currentTime <- suppressWarnings(as.POSIXct(data$currentTime))

  data <- data[!is.na(data$currentTime), ]
  
  if (nrow(data) == 0) {
    plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1),
         xlab = "Tempo (horas)", ylab = "Memória Usada (MB)",
         main = paste(info$title, "\n(Sem dados de tempo válidos)"))
    next
  }

  data <- data[order(data$currentTime), ]

  data$time_continuous_hours <- as.numeric(difftime(data$currentTime, data$currentTime[1], units = "hours"))

  data$usedMemory_MB <- sapply(data$usedMemory, convert_memory_to_mb)

  valid_plot_data <- nrow(data) > 0 &&
    !all(is.na(data$time_continuous_hours)) &&
    any(!is.na(data$usedMemory_MB)) 
  
  if (valid_plot_data) {
    x_range <- range(data$time_continuous_hours, na.rm = TRUE)
    y_range <- range(data$usedMemory_MB, na.rm = TRUE)
    
    if (!all(is.finite(x_range))) x_range <- c(0, 1)
    if (!all(is.finite(y_range))) y_range <- c(0, 1)
    
    if (y_range[1] == y_range[2]) {
      y_range <- y_range + c(-max(1, abs(y_range[1]*0.1)), max(1, abs(y_range[1]*0.1)))
    }
    
    plot(data$time_continuous_hours, data$usedMemory_MB,
         type = "l", 
         xlab = "Time (hour)",
         ylab = "Used Memory (MB)",
         main = info$title,
         col = "black", 
         lwd = 1, 
         xlim = x_range,
         ylim = y_range)
    grid() 
  } else {
    plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1),
         xlab = "Time (hour)", ylab = "Used Memory (MB)",
         main = paste(info$title, "\n(Sem dados para plotar)"))
  }
}

par(mfrow = c(1, 1))

Questão 7

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.

netflix <- read.csv("netflix_titles.csv") 

netflix_single_country <- netflix %>%
  filter(!is.na(country)) %>%
  mutate(country = strsplit(as.character(country), ", ")) %>%
  filter(lengths(country) == 1) %>%
  mutate(country = unlist(country))

top_countries <- netflix_single_country %>%
  count(country, sort = TRUE) %>%
  head(10)

fig <- plot_ly(top_countries,
               labels = ~country,
               values = ~n,
               type = 'pie',
               textinfo = 'label+percent',
               insidetextorientation = 'radial',
               marker = list(colors = rainbow(10)),
               hoverinfo = 'label+value+percent')
fig

Questão 8

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.

netflix <- read.csv("netflix_titles.csv") 

netflix_single_country <- netflix %>%
  filter(!is.na(country)) %>%
  mutate(country = strsplit(as.character(country), ", ")) %>%
  filter(lengths(country) == 1) %>%
  mutate(country = unlist(country))

top_countries <- netflix_single_country %>%
  count(country, name = "Total de conteúdos", sort = TRUE) %>%
  head(10) %>%
  rename(País = country)

fig <- plot_ly(
  type = 'table',
  header = list(
    values = c("<b>País</b>", "<b>Total de conteúdos</b>"),
    align = c('center', 'center'),
    fill = list(color = 'gray'),
    font = list(color = 'white', size = 14)
  ),
  cells = list(
    values = rbind(top_countries$País, top_countries$`Total de conteúdos`),
    align = c('center', 'center'),
    font = list(size = 12)
  )
)

fig

Questão 9

Utilizando o Plotly, obtenha um gráfico de linha com quantidade de conteúdo por década do 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).

netflix <- read.csv("netflix_titles.csv") 

netflix <- netflix %>%
  mutate(decade = floor(release_year/10)*10) %>%
  filter(!is.na(decade))

conteudo_decada <- netflix %>%
  group_by(decade, type) %>%
  summarise(qtd = n(), .groups = 'drop')

filmes <- conteudo_decada %>% filter(type == "Movie")
series <- conteudo_decada %>% filter(type == "TV Show")

fig <- plot_ly() %>%
  # Adicionar linha para séries (azul)
  add_trace(data = series,
            x = ~decade, 
            y = ~qtd,
            type = 'scatter',
            mode = 'lines+markers',
            name = 'TV Series',
            line = list(color = 'blue', width = 3),
            marker = list(color = 'blue', size = 8)) %>%

  add_trace(data = filmes,
            x = ~decade, 
            y = ~qtd,
            type = 'scatter',
            mode = 'lines+markers',
            name = 'Movies',
            line = list(color = 'orange', width = 3),
            marker = list(color = 'orange', size = 8)) %>%

  layout(xaxis = list(title = "Década",
         tickvals = seq(1940, 2020, by = 20)),
         yaxis = list(title = "Qnd. Conteúdo"),
         legend = list(
           x = 1,         
           y = 1,          
           xanchor = "right",  
           yanchor = "top"  
         )
  )
fig

Questão 10

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, 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”).

netflix <- read.csv("netflix_titles.csv") 

dados_filtrados <- netflix %>%
  filter(type == "Movie") %>% 
  filter(release_year >= 2000 & release_year <= 2010) %>% 
  mutate(genero_principal = str_split(listed_in, ", ", simplify = TRUE)[,1]) %>% 
  filter(genero_principal %in% c("Dramas", "Action & Adventure", "Comedies")) %>% 
  group_by(release_year, genero_principal) %>%
  summarise(quantidade = n(), .groups = 'drop')

fig <- plot_ly(dados_filtrados,
               x = ~release_year,
               y = ~quantidade,
               color = ~genero_principal,
               type = 'bar',
               colors = c("Dramas" = "#1f77b4", 
                         "Action & Adventure" = "#ff7f0e", 
                         "Comedies" = "#2ca02c")) %>%
  
  layout(title = "Filmes na Netflix por Gênero (2000-2010)",
         xaxis = list(title = "Ano de Lançamento",
                      dtick = 1), 
         yaxis = list(title = "Quantidade de Filmes"),
         barmode = 'group',
         legend = list(title = list(text = '<b>Gênero</b>'),
                      x = 1, y = 1))

fig