Camila Exercício 12 [Visualização de Dados]

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

Adicionar 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)

definindo o layout:

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

# Gráfico de linhas
plot(clock, MRT_1F, type = "b", col = "black", lwd = 1, pch = 4,
     ylim = c(0, max(MRT_1F)),
     xlab = "Time between requests (seconds)", ylab = "Response Time (sec)")

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

legend("topright",
       legend = c("1 Fog", "3 Fogs", "5 Fogs", "10Fogs", "15Fogs", "W/o Fog"),
       col = c("black", "yellow", "red", "blue", "purple", "green"),
       lwd = 1, lty = c(1,1,1,1,1,1), pch= c(4,0,1,2,5,4))


# plotar gráfico de barras comparativo 

# Sem Fog vs 1 Fogs
dados <- cbind(MRT_sem_F, MRT_1F)
colnames(dados) <- c("W/o Fog", "1 Fog")
rownames(dados) <- clock

# Gráfico de barras lado a lado
barplot(t(dados), beside = TRUE,
        col = c("#E6E6E6", "#666666"),
        names.arg = clock,
        ylim = c(0.5, max(dados)),
        xlab = "Time between requests (seconds)",
        ylab = "Response Time (s)",
        log = "y")   

legend("topright",
       legend = c("W/o Fog", "1 Fog"),  
       fill = c("#E6E6E6", "#666666"),
       bty = "n")

# Sem Fog vs 3 Fogs
dados <- cbind(MRT_sem_F, MRT_3F)
colnames(dados) <- c("W/o Fog", "3 Fogs")
rownames(dados) <- clock

barplot(t(dados), beside = TRUE,
        col = c("#E6E6E6", "#666666"),
        names.arg = clock,
        ylim = c(0.1, max(dados)),
        xlab = "Time between requests (seconds)",
        ylab = "Response Time (s)",
        log = "y")

legend("topright",
       legend = c("W/o Fog", "3 Fogs"),
       fill = c("#E6E6E6", "#666666"),
       bty = "n")


# Sem Fog vs 5 Fogs
dados <- cbind(MRT_sem_F, MRT_5F)
colnames(dados) <- c("W/o Fog", "5 Fogs")
rownames(dados) <- clock

barplot(t(dados), beside = TRUE,
        col = c("#E6E6E6", "#666666"),
        names.arg = clock,
        ylim = c(0.1, max(dados)),
        xlab = "Time between requests (seconds)",
        ylab = "Response Time (s)",
        log = "y")

legend("topright",
       legend = c("W/o Fog", "5 Fogs"),
       fill = c("#E6E6E6", "#666666"),
       bty = "n")


#Sem Fog vs 10 Fogs
dados <- cbind(MRT_sem_F, MRT_10F)
colnames(dados) <- c("W/o Fog", "10 Fogs")
rownames(dados) <- clock

barplot(t(dados), beside = TRUE,
        col = c("#E6E6E6", "#666666"),
        names.arg = clock,
        ylim = c(0.1, max(dados)),
        xlab = "Time between requests (seconds)",
        ylab = "Response Time (s)",
        log = "y")

legend("topright",
       legend = c("W/o Fog", "10 Fogs"),
       fill = c("#E6E6E6", "#666666"),
       bty = "n")


#Sem Fog vs 15 Fogs
dados <- cbind(MRT_sem_F, MRT_15F)
colnames(dados) <- c("W/o Fog", "15 Fogs")
rownames(dados) <- clock

barplot(t(dados), beside = TRUE,
        col = c("#E6E6E6", "#666666"),
        names.arg = clock,
        ylim = c(0.1, max(dados)),
        xlab = "Time between requests (seconds)",
        ylab = "Response Time (s)",
        log = "y")

legend("topright",
       legend = c("W/o Fog", "15 Fogs"),
       fill = c("#E6E6E6", "#666666"),
       bty = "n")

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.

# Dados da tabela
dados <- matrix(
  c(53.8, 33.9, 2.6, 0.0,     # Good
    43.6, 54.2, 60.5, 21.4,   # Very Good
    2.6, 11.9, 36.8, 78.6),   # Excellent
  nrow = 3,
  byrow = TRUE
)

# Nome das linhas e colunas
rownames(dados) <- c("Good", "Very Good", "Excellent")
colnames(dados) <- c("$10-19", "$20-29", "$30-39", "$40-49")

# Cores para cada categoria
cores <- c("lightblue", "lightgreen", "orange")

# Criar gráfico de barras empilhadas
barplot(
  dados,
  beside = FALSE, 
  col = cores,
  ylim = c(0, 120),
  main = "Qualidade da Refeição por Faixa de Preço",
  xlab = "Faixa de Preço ($)",
  ylab = "Percentual (%)",
  legend.text = rownames(dados),
  args.legend = list(x = "topright", bty = "n")
)

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.

# Dataset airquality 
data("airquality")

# Convertendo temperatura de Fahrenheit para Celsius
temp_c <- (airquality$Temp - 32) / 1.8

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

lines(density(temp_c, na.rm = TRUE), col = "red", lwd = 2)

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)

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

sales
##   COUNTRY SALES
## 1      US   340
## 2      UK   290
## 3  France   510
## 4  Poland   820
## 5   Japan   120
## 6   China   780
# Total de vendas por país
total_por_pais <- tapply(sales$SALES, sales$COUNTRY, sum)

# Porcentagens
porcentagem <- round(100 * total_por_pais / sum(total_por_pais), 1)

# Criar rótulos com país e porcentagem
rotulos <- paste(names(total_por_pais), "-", porcentagem, "%")

# Cores das fatias
cores <- rainbow(length(total_por_pais))

# Gráfico de pizza
pie(
  total_por_pais,
  labels = rotulos,
  col = cores,
  main = "Distribuição das Vendas por País"
)

# Legenda
legend(
  "topright",
  legend = names(total_por_pais),
  fill = cores,
  title = "Países",
  bty = "n"
)

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

# Carregar dados
data("InsectSprays")

# 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          # Sem os outliers
)

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

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

# Função auxiliar para converter memória em MB
convert_to_mb <- function(x) {
  x <- str_trim(x)
  x <- toupper(x)
  x <- str_replace_all(x, ",", ".")  # garante ponto decimal
  numeric_value <- as.numeric(str_extract(x, "[0-9.]+"))
  unit <- str_extract(x, "[A-Z]+")
  
  case_when(
    unit == "TB" ~ numeric_value * 1e6,
    unit == "GB" ~ numeric_value * 1024,
    unit == "MB" ~ numeric_value,
    TRUE ~ NA_real_
  )
}

# Função auxiliar para preparar cada dataset
prepare_data <- function(df) {
  df <- df %>%
    mutate(
      # Converter tempo para diferença em horas
      currentTime = as.POSIXct(currentTime),
      time_hr = as.numeric(difftime(currentTime, min(currentTime), units = "hours")),
      # Converter memória para MB
      usedMemory_MB = convert_to_mb(usedMemory)
    )
  return(df)
}

# Importar datasets
mcd_0_1   <- prepare_data(read_csv("monitoringCloudData/monitoringCloudData_0.1.csv", show_col_types = FALSE))
mcd_0_5   <- prepare_data(read_csv("monitoringCloudData/monitoringCloudData_0.5.csv", show_col_types = FALSE))
mcd_1     <- prepare_data(read_csv("monitoringCloudData/monitoringCloudData_1.csv", show_col_types = FALSE))
mcd_none  <- prepare_data(read_csv("monitoringCloudData/monitoringCloudData_NONE.csv", show_col_types = FALSE))

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

# Gráficos
plot(mcd_none$time_hr, mcd_none$usedMemory_MB, type = "l", col = "purple",xlab = "Time (hour", ylab = "Used Memory (MB)",
     main = "monitoringCloudData_NONE")

plot(mcd_0_1$time_hr, mcd_0_1$usedMemory_MB, type = "l", col = "blue",xlab = "Time (hour", ylab = "Used Memory (MB)",
     main = "monitoringCloudData_0.1")

plot(mcd_0_5$time_hr, mcd_0_5$usedMemory_MB, type = "l", col = "red",xlab = "Time (hour", ylab = "Used Memory (MB)",
     main = "monitoringCloudData_0.5")

plot(mcd_1$time_hr, mcd_1$usedMemory_MB, type = "l", col = "green",
     xlab = "Time (hour", ylab = "Used Memory (MB)",
     main = "monitoringCloudData_1")

Questão 7

OBS:Para os exercícios a seguir utilizaremos o dataset Netflix Movies and TV Shows. Essa base de dados reúne os filmes e séries disponíveis na Netflix em 2019, e se divide em algumas colunas que descrevem o tipo do conteúdo (série ou filme), o país de origem, o ano de lançamento, o gênero, entre outros.

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.

# Pacotes 
library(readr)
library(dplyr)
library(plotly)
## Warning: pacote 'plotly' foi compilado no R versão 4.5.2
## 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
# Importar dataset
nt <- read_csv("netflix_titles.csv", show_col_types = FALSE)

# Filtrar apenas conteúdos com um único país
nt_single_country <- nt %>%
  filter(!is.na(country)) %>%
  filter(!grepl(",", country))

# Contar o número de títulos por país e pegar os 10 maiores
top_countries <- nt_single_country %>%
  count(country, sort = TRUE) %>%
  slice_max(n, n = 10)

# Criar o gráfico de pizza
fig <- plot_ly(
  data = top_countries,
  labels = ~country,
  values = ~n,
  type = 'pie',
  textinfo = 'label+percent',
  insidetextorientation = 'radial'
)

# Adicionar título e legenda (fora do pipe)
fig <- fig %>%
  plotly::layout(
    title = list(
      text = "Top 10 países com mais conteúdos (apenas 1 país de origem)",
      x = 0.5,
      xanchor = 'center'
    ),
    showlegend = TRUE
  )

# Mostrar gráfico
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.

# Criar tabela Plotly
fig_table <- plot_ly(
  type = 'table',
  header = list(
    values = c("País", "Total de conteúdos"),
    fill = list(color = "#808080"),      
    font = list(color = "white", size = 14), 
    align = "center"                     
  ),
  cells = list(
    values = list(top_countries$country, top_countries$n),
    align = "center"                     
  )
)

# Mostrar tabela
fig_table

Questão 9

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)

# Criar coluna com década
nt <- nt %>%
  mutate(decade = floor(release_year / 10) * 10)

# Contar a quantidade de conteúdos por década e tipo
conteudo_decada <- nt %>%
  filter(!is.na(decade)) %>%
  group_by(decade, type) %>%
  summarise(total = n(), .groups = "drop")

# Gráfico de linha com Plotly
fig <- plot_ly(conteudo_decada,
               x = ~decade,
               y = ~total,
               color = ~type,
               colors = c("yellow", "blue"), # azul e amarelo
               type = 'scatter',
               mode = 'lines+markers') %>%
  layout(
    title = "Quantidade de conteúdos por década na Netflix",
    xaxis = list(title = "Década"),
    yaxis = list(title = "Quantidade de conteúdos"),
    legend = list(title = list(text = "Tipo de conteúdo")),
    hovermode = "x unified"
  )

# Mostrar gráfico
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 (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”).

# Filtrar filmes entre 2000 e 2010
filmes <- nt %>%
  filter(type == "Movie",
         release_year >= 2000,
         release_year <= 2010)

# Extrair o primeiro gênero 
filmes <- filmes %>%
  mutate(genero_principal = trimws(sub(",.*", "", listed_in))) # remove espaços extras

# Filtrar os três gêneros desejados
filmes_generos <- filmes %>%
  filter(genero_principal %in% c("Dramas", "Action & Adventure", "Comedies"))

# Contar a quantidade de filmes por ano e gênero
filmes_ano_genero <- filmes_generos %>%
  group_by(release_year, genero_principal) %>%
  summarise(total = n(), .groups = "drop")

# Gráfico de barras lado a lado com Plotly
fig <- plot_ly(
  data = filmes_ano_genero,
  x = ~release_year,
  y = ~total,
  color = ~genero_principal,
  colors = c("orange", "green", "blue"),
  type = "bar"   # 👈 ESSENCIAL
) %>%
  layout(
    title = "Quantidade de filmes por gênero (2000–2010)",
    xaxis = list(title = "Ano de lançamento"),
    yaxis = list(title = "Quantidade de filmes"),
    barmode = "group",  # barras lado a lado
    legend = list(title = list(text = "Gênero"))
  )

# Mostrar o gráfico
fig