Introdução

Essa é a resolução do Exercício 12, que tem como tema a Visualização de Dados.

Irei fazer a divisão das questões por abas, assim facilitando a visualização das questões.

Nós teremos 10 questões ao todo, sendo das questões 1 a 6 para respondermos utilizando o R tradicional, enquanto para as questões 7 a 10 usando o Ploty.

Questão 01

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

#Definição 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)

# Configuração do layout: 1 linha para o gráfico de linha, 1 linha para o gráfico de barras
layout(matrix(c(1, 1, 1, 
                2, 2, 2), nr = 2, byrow = TRUE))

# Gráfico de linhas
plot(clock, MRT_1F, type="o", col="red", pch=16, ylim=c(0, max(MRT_1F)), xlab="Clock", ylab="Valores", main="Gráfico de Linhas")
lines(clock, MRT_3F, type="o", col="blue", pch=16)
lines(clock, MRT_5F, type="o", col="green", pch=16)
lines(clock, MRT_10F, type="o", col="purple", pch=16)
lines(clock, MRT_15F, type="o", col="orange", pch=16)
lines(clock, MRT_sem_F, type="o", col="black", pch=16)
legend("topright", legend=c("MRT_1F", "MRT_3F", "MRT_5F", "MRT_10F", "MRT_15F", "MRT_sem_F"),
       col=c("red", "blue", "green", "purple", "orange", "black"), pch=16, bty="n")

# Gráfico de barras com escala logarítmica
barplot(height = c(mean(MRT_1F), mean(MRT_3F), mean(MRT_5F), mean(MRT_10F), mean(MRT_15F), mean(MRT_sem_F)),
        names.arg = c("MRT_1F", "MRT_3F", "MRT_5F", "MRT_10F", "MRT_15F", "MRT_sem_F"),
        log = "y", col = c("#E6E6E6", "#666666"), main = "Gráfico de Barras (Escala Log)", ylab = "Valores Médios")

Questão 02

Descrição da questão: 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.

#Criar o data frame com os dados fornecidos
dados <- data.frame(
  Meal_Price = c("$10-19", "$20-29", "$30-39", "$40-49"),
  Good = c(53.8, 33.9, 2.6, 0.0),
  Very_Good = c(43.6, 54.2, 60.5, 21.4),
  Excellent = c(2.6, 11.9, 36.8, 78.6)
)

# Transformar os dados para o formato longo (necessário para ggplot)
dados_long <- tidyr::pivot_longer(dados, cols = c(Good, Very_Good, Excellent),
                                  names_to = "Quality_Rating", values_to = "Percentage")

# Criar o gráfico de barras empilhadas
ggplot(dados_long, aes(x = Meal_Price, y = Percentage, fill = Quality_Rating)) +
  geom_bar(stat = "identity") + 
  labs(title = "Qualidade da Refeição por Faixa de Preço",
       x = "Faixa de Preço da Refeição",
       y = "Percentual",
       fill = "Classificação de Qualidade") +
  theme_minimal()

Questão 03

Descrição da questão: 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.

# Carregar dataset padrão do R
data("airquality")

# Filtrar apenas os dados do mês de maio
dados_maio <- subset(airquality, Month == 5)

# Converter temperaturas de Fahrenheit para Celsius
dados_maio$Temp_C <- (dados_maio$Temp - 32) / 1.8

ggplot(dados_maio, aes(x = Temp_C)) +
  geom_histogram(aes(y = after_stat(density)), bins = 10, fill = "skyblue", color = "black", alpha = 0.7) +
  geom_density(color = "red", linewidth = 1) +
  labs(title = "Distribuição das Temperaturas em Maio",
       x = "Temperatura (°C)",
       y = "Densidade") +
  theme_minimal()

Questão 04

Descrição da questão: 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.

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

# Calculando as porcentagens
sales$Percent <- round((sales$SALES / sum(sales$SALES)) * 100, 1)

# Criando rótulos com país e porcentagem
labels <- paste(sales$COUNTRY, "\n", sales$Percent, "%")

# Definindo cores para as fatias
colors <- c("red", "blue", "green", "orange", "purple", "yellow")

# Criando o gráfico de pizza
pie(sales$SALES, labels = labels, col = colors, main = "Percentual de Vendas por País")

# Adicionando a legenda
legend("topright", legend = sales$COUNTRY, fill = colors)

Questão 05

Descrição da questão: 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 o dataset InsectSprays
data(InsectSprays)

# Criar o boxplot sem outliers
boxplot(count ~ spray, data = InsectSprays, 
        main = "Contagem de Insetos por Tipo de Inseticida",
        xlab = "Tipo de Inseticida", 
        ylab = "Contagem de Insetos", 
        col = "yellow", 
        outline = FALSE)  # Remove os outliers

Questão 06

Descrição da questão: 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.

# Carregar pacotes necessários
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(ggplot2)
library(stringr)

# Lista de arquivos
arquivos <- c("C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_0.1.csv", "C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_0.5.csv", "C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_1.csv", "C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_NONE.csv")

titulos <- c("C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_0.1.csv" = "Memory Analysis (Wordload of 0.1)", "C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_0.5.csv" = "Memory Analysis (Wordload of 0.5)", "C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_1.csv" = "Memory Analysis (Wordload of 1.0)", "C:\\Users\\Alexandre\\Meu RCurso\\monitoringCloudData\\monitoringCloudData_NONE.csv" = "Memory Analysis (None Workload)")

# Função para processar cada dataset
processar_dados <- function(arquivo) {
  # Ler os dados corretamente
  df <- read.csv(arquivo)  # Removendo stringAsFactors = FALSE
  
  # Verificar se a coluna currentTime existe
  if (!"currentTime" %in% colnames(df) | !"usedMemory" %in% colnames(df)) {
    warning(paste("Erro: Dataset", arquivo, "não contém as colunas necessárias."))
    return(NULL)
  }

  # Converter currentTime para formato POSIXct
  df <- df %>%
    mutate(currentTime = as.POSIXct(currentTime, format="%Y-%m-%d %H:%M:%OS", tz="UTC"))
  
  # Remover valores NA que possam ter surgido na conversão
  df <- df %>% filter(!is.na(currentTime))

  # Calcular a diferença de tempo em relação ao primeiro registro
  df <- df %>%
    mutate(currentTime = as.numeric(difftime(currentTime, min(currentTime), units = "hours")))

  # Converter a coluna usedMemory para MB
  df <- df %>%
    mutate(
      usedMemory = case_when(
        str_detect(usedMemory, "TB") ~ as.numeric(str_remove(usedMemory, "TB")) * 1000000,
        str_detect(usedMemory, "GB") ~ as.numeric(str_remove(usedMemory, "GB")) * 1024,
        str_detect(usedMemory, "MB") ~ as.numeric(str_remove(usedMemory, "MB")),
        TRUE ~ NA_real_  # Se houver valores inesperados
      )
    )

  # Remover valores NA na coluna usedMemory
  df <- df %>% filter(!is.na(usedMemory))

  return(df)
}

# Processar todos os datasets
datasets <- lapply(arquivos, processar_dados)
## Warning: There were 3 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `usedMemory = case_when(...)`.
## Caused by warning:
## ! NAs introduzidos por coerção
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 2 remaining warnings.
## There were 3 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `usedMemory = case_when(...)`.
## Caused by warning:
## ! NAs introduzidos por coerção
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 2 remaining warnings.
## Warning: There were 2 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `usedMemory = case_when(...)`.
## Caused by warning:
## ! NAs introduzidos por coerção
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
## There were 2 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `usedMemory = case_when(...)`.
## Caused by warning:
## ! NAs introduzidos por coerção
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
# Remover datasets nulos ou vazios
datasets <- datasets[!sapply(datasets, is.null)]
datasets <- datasets[lengths(datasets) > 0]

# Criar layout de 2 linhas e 2 colunas
par(mfrow = c(2, 2))

# Cores para os gráficos
cores <- c("blue", "red", "green", "purple")

# Gerar os gráficos
for (i in 1:length(datasets)) {
  df <- datasets[[i]]
  arquivo_nome <- arquivos[i]  # Nome do arquivo
  titulo_grafico <- titulos[arquivo_nome]  # Pegando o título correspondente
  
  if (nrow(df) > 1) {
    plot(df$currentTime, df$usedMemory, type = "l", col = cores[i],
         xlab = "Tempo Decorrido (Horas)", ylab = "Memória Usada (MB)")
    
    points(df$currentTime, df$usedMemory, col = cores[i], pch = 19)

    # Adicionar título extra acima do gráfico
    mtext(titulo_grafico, side = 3, line = 2, font = 2, cex = 1.2)
  } else {
    message(paste("Aviso: Dataset", arquivo_nome, "tem poucos dados para plotar."))
  }
}

Questão 07

Descrição da questão: 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.

# Carregar as bibliotecas necessárias
library(dplyr)
library(plotly)
## 
## 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(readr)

# Ler o dataset
netflix_data <- read.csv(file = "C:\\Users\\Alexandre\\Meu RCurso\\netflix_titles.csv")

# Filtrar conteúdos com apenas UM país de origem
netflix_filtered <- netflix_data %>%
  filter(!is.na(country) & !grepl(",", country)) %>%  # Remove múltiplos países e NA
  count(country, name = "count") %>%  # Conta quantas vezes cada país aparece
  arrange(desc(count)) %>%  # Ordena do maior para o menor
  head(10)  # Seleciona os 10 países com mais conteúdos

# Criar o gráfico de pizza
fig <- plot_ly(
  data = netflix_filtered, 
  labels = ~country, 
  values = ~count, 
  type = 'pie',
  textinfo = 'label+percent',
  hoverinfo = 'label+value+percent',
  marker = list(colors = RColorBrewer::brewer.pal(10, "Set3")) # Cores variadas
)

# Personalizar o layout
fig <- fig %>%
  layout(
    title = "Top 10 Países com Mais Conteúdo na Netflix (Apenas um País de Origem)",
    showlegend = TRUE
  )

# Exibir o gráfico
fig

Questão 08

Descrição da questão: 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.

# Carregar as bibliotecas necessárias
library(dplyr)
library(plotly)

# Carregar dataset
netflix_data2 <- read.csv(file = "C:\\Users\\Alexandre\\Meu RCurso\\netflix_titles.csv")

# Filtrar apenas conteúdos que pertencem a um único país
single_country_content <- netflix_data2 %>%
  filter(!is.na(country) & !grepl(",", country)) %>%
  group_by(country) %>%
  summarise(`Total de conteúdos` = n()) %>%
  arrange(desc(`Total de conteúdos`)) %>%
  head(10) # Pegar os 10 países com mais conteúdos

# Criar a tabela formatada no Plotly
fig <- plot_ly(
  type = 'table',
  header = list(
    values = c("País", "Total de conteúdos"),
    fill = list(color = "gray"),  # Fundo cinza
    font = list(color = "white"), # Texto branco
    align = "center"              # Alinhar ao centro
  ),
  cells = list(
    values = list(single_country_content$country, single_country_content$`Total de conteúdos`),
    align = "center"  # Centralizar textos
  )
)

# Mostrar tabela
fig

Questão 09

Descrição da questão: Utilizando o Plotly, obtenha um gráfico de linha com pontos, 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).

# Carregar pacotes necessários
library(dplyr)
library(plotly)

# Carregar dataset
netflix_data <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE)

# Criar a coluna 'decade' para agrupar os conteúdos por década
netflix_data <- netflix_data %>%
  mutate(decade = (release_year %/% 10) * 10) %>% # Converte ano para década
  filter(!is.na(decade)) # Remove valores vazios

# Contar quantos conteúdos existem por década, separando TV Shows e Movies
content_by_decade <- netflix_data %>%
  group_by(decade, type) %>%
  summarise(Quantidade = n(), .groups = 'drop')

# Criar o gráfico de linha com pontos
fig <- plot_ly(content_by_decade, 
               x = ~decade, 
               y = ~Quantidade, 
               color = ~type, 
               colors = c("Movie" = "yellow", "TV Show" = "blue"), 
               type = 'scatter', 
               mode = 'lines+markers') %>%
  layout(title = "Quantidade de Conteúdos por Década no Netflix",
         xaxis = list(title = "Década"),
         yaxis = list(title = "Quantidade de Conteúdos"),
         legend = list(title = list(text = "Tipo de Conteúdo")))

# Mostrar o gráfico
fig

Questão 10

Descrição da questão: 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”).

library(dplyr)
library(plotly)
library(stringr)

# Carregar os dados
netflix <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE)

# Filtrar apenas filmes lançados entre 2000 e 2010 e selecionar colunas necessárias
filtered_movies <- netflix %>%
  filter(type == "Movie", release_year >= 2000, release_year <= 2010) %>%
  select(release_year, listed_in)

# Extrair apenas o primeiro gênero listado
filtered_movies <- filtered_movies %>%
  mutate(genre = sapply(strsplit(listed_in, ","), `[`, 1))

# Filtrar apenas os gêneros desejados
genres_of_interest <- c("Dramas", "Action & Adventure", "Comedies")
filtered_movies <- filtered_movies %>%
  filter(genre %in% genres_of_interest)

# Contar a quantidade de filmes por gênero e ano
genre_counts <- filtered_movies %>%
  group_by(release_year, genre) %>%
  summarise(count = n(), .groups = 'drop')

# Criar o gráfico de barras lado-a-lado
plot <- plot_ly(genre_counts, x = ~release_year, y = ~count, color = ~genre, 
                type = 'bar', colors = c("red", "blue", "green")) %>%
  layout(title = "Quantidade de Filmes por Gênero (2000-2010)",
         xaxis = list(title = "Ano"),
         yaxis = list(title = "Quantidade de Filmes"),
         barmode = "group")

# Exibir o gráfico
plot