[Visualização de Dados]
library(dplyr)
library(plotly)
library(stringr)
# Carrega o dataset (se não estiver carregado)
netflix_data <- read.csv("netflix_titles.csv")
Questão 1
# 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)
# Layout: 1 gráfico de linhas + comparações
layout(matrix(c(1,1,2,3,4,5,6,0), ncol = 2, byrow = TRUE))
par(mar = c(4, 4, 3, 1))
# Plot principal
plot(clock, MRT_1F, type = "b", pch = 4, lty = 1, col = "black",
xlab = "Time between Things requests (seconds)",
ylab = "Response Time (sec.)",
xlim = c(0, 3), ylim = c(0, 550),
yaxt = "n", main = "Average Response Time - All Configurations")
axis(side = 2, at = seq(0, 500, by = 100), las = 1)
lines(clock, MRT_3F, type = "b", pch = 8, col = "orange", lty = 1)
lines(clock, MRT_5F, type = "b", pch = 1, col = "red", lty = 1)
lines(clock, MRT_10F, type = "b", pch = 2, col = "blue", lty = 1)
lines(clock, MRT_15F, type = "b", pch = 5, col = "purple", lty = 1)
lines(clock, MRT_sem_F, type = "b", pch = 3, col = "green", lty = 1)
legend("topright",
legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
col = c("black","orange","red","blue","purple","green"),
pch = c(4,8,1,2,5,3),
lty = 1,
cex = 0.8,
bg = "white")
# Função auxiliar para gráficos de comparação (barras)
plot_comparacao <- function(MRT_fog, titulo){
barplot(
rbind(MRT_sem_F, MRT_fog),
beside = TRUE,
names.arg = clock,
col = c("white", "gray40"),
border = "black",
log = "y",
ylim = c(0.1, 600),
ylab = "Response time (s)",
xlab = "Time between Things requests"
)
legend("topright",
legend = c("w/o Fog", titulo),
fill = c("white", "gray40"),
bty = "n")
}
# Gráficos de barra (comparações)
plot_comparacao(MRT_1F, "1 Fog")
plot_comparacao(MRT_3F, "3 Fogs")
plot_comparacao(MRT_5F, "5 Fogs")
plot_comparacao(MRT_10F, "10 Fogs")
plot_comparacao(MRT_15F, "15 Fogs")

Questão 2
## Barras empilhadas — dados
dados_originais <- data.frame(
`10-19` = c(53.8, 43.6, 2.6),
`20-29` = c(33.9, 54.2, 11.9),
`30-39` = c(2.6, 60.5, 36.8),
`40-49` = c(0.0, 21.4, 78.6),
row.names = c("Good", "Very Good", "Excellent")
)
# Processamento: reordena e converte para matriz
dados_reordenados <- dados_originais[c("Good", "Very Good", "Excellent"), ]
matriz_final <- as.matrix(dados_reordenados)
# --- Configurações Gráficas ---
rotulos_x <- colnames(matriz_final) # As 4 faixas de preço para o Eixo X
# Cores na ordem de empilhamento (Good, Very Good, Excellent)
cores_base_r <- c("#8da0cb", "#fc8d62", "#66c2a5")
par(mar = c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)
# Criar o gráfico de barras empilhadas
barplot(
matriz_final,
beside = FALSE, # Barras empilhadas
col = cores_base_r, # Aplica as cores aos 3 segmentos de Qualidade
ylim = c(0, 100), # Limite 100%
names.arg = rotulos_x, # Rótulos do Eixo X: As 4 faixas de preço
main = "Distribuição de Qualidade por Faixa de Preço da Refeição",
xlab = "Faixa de Preço da Refeição (US$)",
ylab = "Percentual (%)",
# Adiciona Legenda fora do plot
legend.text = rownames(matriz_final), # Legenda: As 3 Qualidades
args.legend = list(
x = "topright",
inset = c(-0.25, 0),
bty = "n",
title = "Qualidade",
fill = cores_base_r
)
)
# --- Linhas de referência no eixo Y ---
abline(h = seq(20, 80, by = 20), col = "gray80", lty = "dotted")

# Restaura as margens padrão
par(mar = c(5.1, 4.1, 4.1, 2.1), xpd=FALSE)
Questão 3
# Restaura configurações gráficas e prepara dados
par(mfrow = c(1, 1), mar = c(5.1, 4.1, 4.1, 2.1))
data(airquality)
airquality$Temp_C <- (airquality$Temp - 32) / 1.8
dados_maio_celsius <- airquality$Temp_C[airquality$Month == 5]
# Histograma e curva de densidade
cor_histograma <- "skyblue"
cor_densidade <- "darkblue"
hist_info <- hist(dados_maio_celsius,
main = "Distribuição de Temperaturas em Maio",
xlab = "Temperatura (°C)", ylab = "Frequência",
col = cor_histograma, border = "white",
xlim = c(5, 25), yaxt = "n", freq = FALSE)
# 2. Adicionar o Eixo Y de Frequência (opcional, para clareza)
axis(side = 2, at = seq(0, max(hist_info$density) * 1.1, length.out = 5), las = 1)
mtext("Densidade", side = 2, line = 3) # Rótulo do eixo Y
# 3. Adicionar a curva de densidade
lines(density(dados_maio_celsius),
col = cor_densidade,
lwd = 2)
# 4. Adicionar um título mais descritivo
title(main = "Histograma das Temperaturas Médias do Mês de Maio (Nova York)", line = 2.5)
# 5. Adicionar a média como referência (opcional)
abline(v = mean(dados_maio_celsius), col = "red", lty = 2, lwd = 1)
legend("topright",
legend = c("Curva de Densidade", "Média"),
col = c(cor_densidade, "red"),
lwd = c(2, 1),
lty = c(1, 2),
bty = "n")

# NOTA: O par() é restaurado automaticamente após o chunk, mas é crucial no início.
Questão 4
### Questão 4
# Ler e preparar dados de vendas
sales <- read.table("https://training-course-material.com/images/8/8f/Sales.txt")
names(sales) <- c("Country", "Sales")
sales <- sales[-1, ]
sales$Sales <- as.numeric(sales$Sales)
total_sales_by_country <- tapply(sales$Sales, sales$Country, sum)
ordered_sales <- total_sales_by_country
percentages <- round(ordered_sales / sum(ordered_sales) * 100, 1)
# Definir rótulos e cores
country_names_ordered <- names(ordered_sales)
legend_labels <- paste0(country_names_ordered, " (", percentages, "%)")
slice_percentage_labels <- paste0(percentages, "%")
# Cores na ordem alfabética: China, France, Japan, Poland, UK, US
pie_colors_ordered <- c("#FFA07A", "#FFD700", "#FFC0CB", "#90EE90", "#A9A9A9", "#ADD8E6")
# Criar gráfico de pizza com legenda visível
par(mar = c(1, 1, 3, 8), xpd = TRUE)
# Criar o gráfico de pizza
pie(ordered_sales,
labels = slice_percentage_labels,
main = "Distribuição Percentual de Vendas por País",
col = pie_colors_ordered,
border = "white",
cex = 1.2)
# Adicionar a legenda
legend("topright",
legend = legend_labels,
fill = pie_colors_ordered,
bty = "n",
title = "País",
# inset ajusta a posição da legenda na margem extra
inset = c(-0.20, 0))

# Restaurar as configurações de margem padrão
par(mar = c(5.1, 4.1, 4.1, 2.1), xpd = FALSE)
Questão 5
data(InsectSprays)
titulo_grafico <- "Contagem de Insetos por Tipo de Inseticida (Outliers Suprimidos)"
eixo_x <- "Tipo de Inseticida"
eixo_y <- "Contagem de Insetos"
cor_caixa <- "yellow"
boxplot(
count ~ spray,
data = InsectSprays,
main = titulo_grafico,
xlab = eixo_x,
ylab = eixo_y,
col = cor_caixa,
outline = FALSE,
border = "black",
notch = FALSE
)

Questão 6
MB_IN_GB <- 1024
MB_IN_TB <- 1000000
convert_to_mb <- function(memory_vector) {
converted_values <- numeric(length(memory_vector))
for (i in seq_along(memory_vector)) {
mem_str <- memory_vector[i]
value_part <- as.numeric(gsub("[^0-9.]", "", mem_str))
unit_part <- toupper(gsub("[0-9.]", "", mem_str))
if (grepl("TB", unit_part)) {
converted_values[i] <- value_part * MB_IN_TB
} else if (grepl("GB", unit_part)) {
converted_values[i] <- value_part * MB_IN_GB
} else if (grepl("MB", unit_part)) {
converted_values[i] <- value_part
} else if (grepl("B", unit_part)) {
converted_values[i] <- value_part / (1024 * 1024)
} else {
converted_values[i] <- value_part
}
}
return(converted_values)
}
process_data <- function(filename) {
df <- read.csv(filename)
df$Time_POSIX <- as.POSIXct(df$currentTime, format = "%Y-%m-%d %H:%M:%OS")
df$ContinuousTime_h <- as.numeric(difftime(df$Time_POSIX, df$Time_POSIX[1], units = "hours"))
df$UsedMemory_MB <- convert_to_mb(df$usedMemory)
return(df)
}
files <- c("monitoringCloudData_0.1.csv", "monitoringCloudData_0.5.csv", "monitoringCloudData_1.csv", "monitoringCloudData_NONE.csv")
titles <- c("Memory Analysis (Workload of 0.1)", "Memory Analysis (Workload of 0.5)", "Memory Analysis (Workload of 1.0)", "Memory Analysis (None Workload)")
data_list <- lapply(files, process_data)
par(mfrow = c(2, 2), mar = c(4, 4, 3, 1) + 0.1)
for (i in seq_along(data_list)) {
df <- data_list[[i]]
plot(df$ContinuousTime_h, df$UsedMemory_MB,
type = "l", col = "blue", lwd = 1,
main = titles[i], xlab = "Time (hour)", ylab = "Used Memory (MB)")
points(df$ContinuousTime_h[1], df$UsedMemory_MB[1], pch = 19, col = "red")
}

par(mfrow = c(1, 1), mar = c(5.1, 4.1, 4.1, 2.1))
Questão 7
### Questão 7 (Gráfico de Pizza)
library(dplyr)
library(plotly)
netflix_data <- read.csv("netflix_titles.csv")
# Prepara top 10 de países (apenas entradas com um país)
data_filtered <- netflix_data %>%
filter(country != "" & !is.na(country)) %>%
filter(!grepl(",", country))
top_10_countries <- data_filtered %>%
group_by(country) %>%
summarise(Total_Conteudo = n()) %>%
arrange(desc(Total_Conteudo)) %>%
head(10)
pie_chart <- plot_ly(
top_10_countries, labels = ~country, values = ~Total_Conteudo, type = 'pie',
textinfo = 'label+percent', insidetextorientation = 'radial',
marker = list(line = list(color = '#FFFFFF', width = 1)),
hoverinfo = 'text', text = ~paste(country, '<br>', Total_Conteudo, 'conteúdos')
) %>%
layout(title = 'Top 10 Países (País Único) por Conteúdo na Netflix',
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
pie_chart
Questão 8
### Questão 8 (Tabela Formatada)
library(dplyr)
library(plotly)
table_data_ready <- top_10_countries %>%
rename(País = country, `Total de conteúdos` = Total_Conteudo) %>%
mutate(`Total de conteúdos` = as.character(`Total de conteúdos`))
header_names <- names(table_data_ready)
cell_values <- t(as.matrix(table_data_ready))
table_plot <- plot_ly(
type = 'table',
header = list(values = header_names, align = c("center", "center"), line = list(width = 1, color = 'black'), fill = list(color = 'red'), font = list(color = 'white', size = 12)),
cells = list(values = cell_values, align = c("center", "center"), line = list(color = "black", width = 1), fill = list(color = 'gray'), font = list(size = 11, color ="white"))
) %>% layout(title = 'Top 10 Países e Total de Conteúdos')
table_plot
Questão 9
# Instalar pacotes se necessário
# install.packages("dplyr")
# install.packages("plotly")
# Carrega os pacotes
library(dplyr)
library(plotly)
# Carrega o dataset (se não estiver carregado)
netflix_data <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE)
# 1. Calcular a Década: Arredondar o 'release_year' para baixo para o início da década (ex: 2018 -> 2010).
# A fórmula (x - x %% 10) faz isso.
data_decades <- netflix_data %>%
mutate(decade = floor(release_year / 10) * 10) %>%
# Limpa NAs na coluna 'type' se houver (embora seja improvável)
filter(!is.na(type))
# 2. Agregação: Contar o número de conteúdos por 'type' e 'decade'.
decade_counts <- data_decades %>%
group_by(decade, type) %>%
summarise(Qtd_Conteudo = n(), .groups = 'drop')
## 📈 Gráfico de Linha por Década (Plotly)
line_chart <- plot_ly(
decade_counts,
x = ~decade,
y = ~Qtd_Conteudo,
color = ~type, # Define a cor baseada na coluna 'type'
type = 'scatter',
mode = 'lines+markers', # Garante linhas E pontos
# Mapeamento manual de cores para replicar o anexo
colors = c("TV Show" = "blue", "Movie" = "orange")
) %>%
layout(
title = "Quantidade de Conteúdo por Década",
xaxis = list(
title = "Década",
# Força os pontos a serem o início da década e garante a exibição
tickmode = "linear",
dtick = 20 # Exibe um rótulo a cada 20 anos para se parecer com o anexo (1940, 1960...)
),
yaxis = list(
title = "Qnd. Conteúdo",
range = c(0, 4100) # Ajusta o limite Y para replicar o layout do anexo
),
# Configuração da legenda para replicar o estilo do anexo
legend = list(
title = list(text = ""),
orientation = "v",
x = 1,
y = 1
)
)
# Exibir o gráfico
line_chart
Questão 10
# Carrega os pacotes
library(dplyr)
library(plotly)
library(stringr)
# Carrega o dataset (se não estiver carregado)
netflix_data <- read.csv("netflix_titles.csv", stringsAsFactors = FALSE)
# Dicionário de tradução dos rótulos de gênero
genero_map <- c(
"Dramas" = "Drama",
"Action & Adventure" = "Ação e Aventura",
"Comedies" = "Comédia"
)
# Ordem desejada para as barras (CRUCIAL para a visualização)
ordem_barras <- c("Drama", "Ação e Aventura", "Comédia")
# 1. Pré-processamento e Filtragem
data_processed <- netflix_data %>%
# Filtrar apenas por Filmes
filter(type == "Movie") %>%
# Extrair o PRIMEIRO GÊNERO
mutate(primeiro_genero = str_trim(str_extract(listed_in, "^[^,]*"))) %>%
# Filtrar o intervalo de anos (2002 a 2008, conforme o anexo)
filter(release_year >= 2002 & release_year <= 2008) %>%
# Filtrar apenas os 3 gêneros de interesse
filter(primeiro_genero %in% names(genero_map)) %>%
# Mapear o nome do gênero para o rótulo da legenda solicitada
mutate(genero_legenda = recode(primeiro_genero, !!!genero_map)) %>%
# Converter a coluna da legenda em um fator com a ordem desejada
mutate(genero_legenda = factor(genero_legenda, levels = ordem_barras))
# 2. Agregação: Contar a quantidade de filmes por ano e pelo novo rótulo de gênero
genre_year_counts <- data_processed %>%
group_by(release_year, genero_legenda) %>%
summarise(Qtd_Lancamentos = n(), .groups = 'drop') %>%
arrange(release_year)
## 📈 Gráfico de Barras Lado-a-Lado (Plotly)
# Definição das cores na ordem solicitada (Blue, Orange, Green)
cores_custom <- c("Drama" = "blue", "Ação e Aventura" = "orange", "Comédia" = "#006400")
bar_chart <- plot_ly(
genre_year_counts,
x = ~release_year,
y = ~Qtd_Lancamentos,
color = ~genero_legenda, # O plotly respeitará a ordem do fator
colors = cores_custom, # Força as cores solicitadas
type = 'bar'
) %>%
layout(
title = "",
xaxis = list(
title = "Ano de Lançamento",
type = 'category',
dtick = 1 # Para exibir todos os anos
),
yaxis = list(
title = "Qnt. de Lançamentos"
),
barmode = 'group',
legend = list(
title = list(text = ""),
traceorder = 'normal', # Mantém a ordem da legenda igual à ordem do fator
y = 1, x = 1
)
)
# Exibir o gráfico
bar_chart