Questões

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(). Ver exemplos do uso da função layout() em: https://stackoverflow.com/questions/38810854/how-to-use-layout-function-in-r e https://bookdown.org/ndphillips/YaRrr/arranging-plots-with-parmfrow-and-layout.html.

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)

plot(
  x = clock,
  y= MRT_1F,
  type="o",
  pch=4,
  col="black",
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (sec.)"
)
lines(
  x = clock,
  y = MRT_3F,
  type="o",
  pch=0,
  col="yellow"
)
lines(
  x = clock,
  y = MRT_5F,
  type="o",
  pch=1,
  col="red"
)
lines(
  x = clock,
  y = MRT_10F,
  type="o",
  pch=2,
  col="blue"
)
lines(
  x = clock,
  y = MRT_15F,
  type="o",
  pch=5,
  col="purple"
)
lines(
  x = clock,
  y = MRT_sem_F,
  type="o",
  pch=4,
  col="green"
)
legend(
  "topright",
  pch = c(4, 0, 1, 2, 5,4),
  col = c("black", "yellow", "red", "blue", "purple", "green"), 
  legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog")
)

layout(matrix(c(1, 2,
                3, 4,
                5, 0), nrow = 3, byrow= TRUE)
       )

#Second chart
par(mar = rep(2, 4))

values_1F <- t(cbind(MRT_sem_F, MRT_1F))

barplot(
  values_1F,
  names.arg = clock,
  col = c("gray", "black"),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (sec.)",
  log = "y",
  beside = TRUE
)
legend(
  "topright",
   pch = c(15, 15),
   col = c("gray", "black"),
  legend = c("w/o Fog", "1 Fog")
 )

# Third chart

values_3F <- t(cbind(MRT_sem_F, MRT_3F))

barplot(
  values_3F,
  names.arg = clock,
  col = c("gray", "black"),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (sec.)",
  log = "y",
  beside = TRUE,
)
legend(
  "topright",
   pch = c(15, 15),
   col = c("gray", "black"),
  legend = c("w/o Fog", "3 Fogs")
 )

# 4th chart

values_5F <- t(cbind(MRT_sem_F, MRT_5F))

barplot(
  values_5F,
  names.arg = clock,
  col = c("gray", "black"),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (sec.)",
  log = "y",
  beside = TRUE,
)
legend(
  "topright",
   pch = c(15, 15),
   col = c("gray", "black"),
  legend = c("w/o Fog", "5 Fogs")
 )

# 5th chart

values_10F <- t(cbind(MRT_sem_F, MRT_10F))

barplot(
  values_10F,
  names.arg = clock,
  col = c("gray", "black"),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (sec.)",
  log = "y",
  beside = TRUE,
)
legend(
  "topright",
   pch = c(15, 15),
   col = c("gray", "black"),
  legend = c("w/o Fog", "10 Fogs")
 )

# 6th chart

values_15F <- t(cbind(MRT_sem_F, MRT_15F))

barplot(
  values_15F,
  names.arg = clock,
  col = c("gray", "black"),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response time (sec.)",
  log = "y",
  beside = TRUE,
)
legend(
  "topright",
   pch = c(15, 15),
   col = c("gray", "black"),
  legend = c("w/o Fog", "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.

data <- matrix(c(53.9, 33.9, 2.6, 0,
                   43.6, 54.2, 60.5, 21.4,
                   2.6, 11.9, 36.8, 78.6), nrow = 3, byrow = TRUE)
barplot(
  data,
  names.arg = c("$10-19", "$20-29", "$30-39", "$40-49"),
  col = rainbow(3),
  xlab = "Meal Price",
  ylab = "Quality Rating %",
)
legend(
  "topright",
   pch = c(15, 15),
   col = rainbow(3),
  legend = c("Good", "Very Good", "Excellent")
 )

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.

airquality_may <- airquality %>% filter(Month == 5)
airquality_may_temperatures <- as.numeric(airquality$Temp)
airquality_may_temperatures
##   [1] 67 72 74 62 56 66 65 59 61 69 74 69 66 68 58 64 66 57 68 62 59 73 61 61 57
##  [26] 58 57 67 81 79 76 78 74 67 84 85 79 82 87 90 87 93 92 82 80 79 77 72 65 73
##  [51] 76 77 76 76 76 75 78 73 80 77 83 84 85 81 84 83 83 88 92 92 89 82 73 81 91
##  [76] 80 81 82 84 87 85 74 81 82 86 85 82 86 88 86 83 81 81 81 82 86 85 87 89 90
## [101] 90 92 86 86 82 80 79 77 79 76 78 78 77 72 75 79 81 86 88 97 94 96 94 91 92
## [126] 93 93 87 84 80 78 75 73 81 76 77 71 71 78 67 76 68 82 64 71 81 69 63 70 77
## [151] 75 76 68
to_celsius <- function (x) {return ((x-32)/1.8)}

airquality_may_temperatures_celsius <- sapply(airquality_may_temperatures, FUN = to_celsius)
density_temp <- density(airquality_may_temperatures_celsius)

hist(
  airquality_may_temperatures_celsius,
  col = rainbow(15),
  main = "Histograma da temperatura do mês de Maio",
  ylab = "Ocorrências",
  xlab = "Temperatura °C",
  probability = TRUE
  )
lines(density_temp)

Questão 4

(5 pontos) 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)

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

sales_number <- sales$SALES
countries <- sales$COUNTRY

# Valores em porcentagem
sales_percentage <- round(sales_number/sum(sales_number)*100)
# Transformar em string no formato "x%"
sales_percentage_str <- paste(sales_percentage, "%", sep = "")
# Concatenar país e sua porcentagem de vendas
labels <- paste(countries, sales_percentage_str)

pie(
  sales_number,
  labels = labels,
  main = "Vendas por País",
  col = rainbow(nrow(sales))  
  )
legend(
  "topright",
  legend = countries,
  fill = rainbow(nrow(sales))
)

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

boxplot(
  count ~ spray,  
  data = InsectSprays,
  main = "Variacao de Insetos encontrados em tratamento com Inseticida",
  col = "yellow",
  xlab = "Spray",
  ylab = "Insetos",
  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
  • 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.

#Load data  
monitoring_none <- read.csv("monitoringCloudData_NONE.csv")
monitoring_01 <- read.csv("monitoringCloudData_0.1.csv")
monitoring_05 <- read.csv("monitoringCloudData_0.5.csv")
monitoring_1 <- read.csv("monitoringCloudData_1.csv")

# Helper function to convert to MB
to_mb <- function(value) {
  digits <- str_extract(value, "[[:digit:]]+") 
  numeric_digits <- sapply(digits, as.numeric)
  unit <- str_extract(value, "[[:alpha:]]+") 
  if(unit == "MB")
    return (numeric_digits)
  if(unit == "GB")
    return (numeric_digits * 1024)
  if(unit == "TB")
    return (numeric_digits * 1000000)
}

# Prepare data for monitoringCloudData_NONE.csv
time_serie_none <- sapply(monitoring_none$currentTime, function (x) {return (difftime(x, monitoring_none$currentTime[1], units = "hour"))})

used_memory_none <- as.vector(monitoring_none$usedMemory)
used_memory_value_none <- sapply(used_memory_none, to_mb)

# Prepare data for monitoringCloudData_0.1.csv
time_serie_01 <- sapply(monitoring_01$currentTime, function (x) {return (difftime(x, monitoring_01$currentTime[1], units = "hour"))})

used_memory_01 <- as.vector(monitoring_01$usedMemory)
used_memory_value_01 <- sapply(used_memory_01, to_mb)

# Prepare data for monitoringCloudData_0.5.csv
time_serie_05 <- sapply(monitoring_05$currentTime, function (x) {return (difftime(x, monitoring_05$currentTime[1], units = "hour"))})

used_memory_05 <- as.vector(monitoring_05$usedMemory)
used_memory_value_05 <- sapply(used_memory_05, to_mb)

# Prepare data for monitoringCloudData_1.csv
time_serie_1 <- sapply(monitoring_1$currentTime, function (x) {return (difftime(x, monitoring_1$currentTime[1], units = "hour"))})

used_memory_1 <- as.vector(monitoring_1$usedMemory)
used_memory_value_1 <- sapply(used_memory_1, to_mb)

layout(
  matrix(c(1, 2,
         3, 4), nr = 2, byrow = TRUE)
)

par(mar = rep(2,4))

plot(
  used_memory_value_none,
  x= time_serie_none,
  main= "Memory Analysis (None Workload)",
  ylab= "Used Memory (MB)",
  xlab= "Time (hour)",
  type = "l"
)

plot(
  used_memory_value_01,
  x= time_serie_01,
  main= "Memory Analysis (Workload of 0.1)",
  ylab= "Used Memory (MB)",
  xlab= "Time (hour)",
  type = "l"
)

plot(
  used_memory_value_05,
  x= time_serie_05,
  main= "Memory Analysis (Workload of 0.5)",
  ylab= "Used Memory (MB)",
  xlab= "Time (hour)",
  type = "l"
)

plot(
  used_memory_value_1,
  x= time_serie_1,
  main= "Memory Analysis (Workload of 1.0)",
  ylab= "Used Memory (MB)",
  xlab= "Time (hour)",
  type = "l"
)

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.

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

top_10_countries <- netflix %>% 
                    filter(!grepl(",", country) & country != "") %>%
                    summarise(n = n(), .by = country) %>%
                    arrange(desc(n)) %>%
                    slice(1:10)

plot_ly(
  data = top_10_countries,
  labels=~country,
  values=~n,
  type = "pie"
)

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

plot_ly(
  type="table",
  header = list(
    values = c("País", "Total de conteúdos"),
    align = c("center", "center"),
    fill = list(color="gray"),
    font = list(color="white")
  ),
  cells = list(
    values = rbind(top_10_countries$country, top_10_countries$n)
  )
)

Questão 9

(10 pontos) Utilizando o Plotly, obtenha um gráfico de linha com pontos (como na imagem abaixo) contendo a 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)

# Cria uma coluna chamada release_decade para armazenar a decada do filme 
netflix$release_decade <- netflix$release_year - (netflix$release_year %% 10)
# Agrupa os filmes por década
movies_by_decade <- netflix %>% filter(type == "Movie") %>% group_by(release_decade) %>% summarise(count = n())
tv_shows_by_decade <- netflix %>% filter(type == "TV Show") %>% group_by(release_decade) %>% summarise(count = n())

movies_shows_by_decade <- merge(movies_by_decade, tv_shows_by_decade, by = "release_decade")

colnames(movies_shows_by_decade)[2] <- "movies"
colnames(movies_shows_by_decade)[3] <- "tv_shows"

chart <- plot_ly(
  data=movies_shows_by_decade,
  x=~release_decade,
  y=~movies,
  name = "Qtd. Conteúdo",
  type = "scatter",
  line = list(color="yellow"),
  marker = list(color = "yellow"),
  mode="lines+markers"
)
chart <- chart %>% add_trace(
  movies_shows_by_decade,
  y = ~tv_shows, 
  name = "TV Shows",
  mode = "lines+markers",
  line = list(color = "blue"),
  marker = list(color = "blue")
) 
chart <- chart %>%
  layout(
    xaxis = list(title = "Décadas"),
    yaxis = list(title = "Qtd. Conteúdo")
  )
chart

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

selected_genres = c("Dramas", "Action & Adventure", "Comedies")

netflix$main_genre <- sapply(netflix$listed_in, FUN = function(x) { return (strsplit(x, ",")[[1]][1]) } )

genre_by_year <- netflix %>%
  filter(type == "Movie") %>%
  filter(release_year >= 2000 & release_year <= 2010) %>%
  filter(main_genre %in% selected_genres) %>%
  group_by(release_year, main_genre) %>%
  summarise(count = n()) %>%
  arrange(release_year)
## `summarise()` has grouped output by 'release_year'. You can override using the
## `.groups` argument.
count_by_genre <- genre_by_year %>% spread(main_genre, count)
count_by_genre <- count_by_genre %>% mutate_all(~replace_na(., 0))
## `mutate_all()` ignored the following grouping variables:
## • Column `release_year`
## ℹ Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
fig <- plot_ly(count_by_genre, x = ~release_year, y = ~Dramas, type = "bar", name = "Drama")
fig <- fig %>% add_trace(y = ~`Action & Adventure`, name = 'Ação e Aventura')
fig <- fig %>% add_trace(y = ~Comedies, name = 'Comédia')
fig <- fig %>% layout(
  xaxis = list(title = "Ano de Lançamento", range = c(1999.5, 2010.5)),
  yaxis = list(title = 'Qtd. de Lançamentos'),
  barmode = 'group'
)
fig