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