[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