Questões da Atividade

Questão 1

# Dados usados
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)

# Vetor de nomes para as legendas
legendas <- c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog")
# Vetor de cores e tipos de linha/ponto para o gráfico de linha
cores_linha <- c("black", "red", "blue", "purple", "green", "orange")
tipos_linha <- c(1, 2, 3, 4, 5, 6)
tipos_ponto <- c(1, 2, 3, 4, 5, 6)

# Layout dos gráficos
# 1 gráfico na linha de cima 
# 5 gráficos na linha de baixo
layout(matrix(c(1, 1, 1, 1, 1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE))
par(mar = c(4, 4, 2, 1)) # Ajustar margens

# Gráfico de Linhas
# Definir o range do eixo Y
ylim_max <- max(MRT_1F)
tam_simbolo <- 1.8 # Tamanho dos símbolos nos gráficos de linha
plot(clock, MRT_1F,
  type = "o", pch = tipos_ponto[1], lty = tipos_linha[1], col = cores_linha[1],
  ylim = c(0, ylim_max),
  xlab = "Time between Things requests (seconds)",
  ylab = "Response Time (sec.)",
  cex = tam_simbolo
)
# Adicionar as outras linhas
lines(clock, MRT_3F, type = "o", pch = tipos_ponto[2], lty = tipos_linha[2], col = cores_linha[2], cex = tam_simbolo)
lines(clock, MRT_5F, type = "o", pch = tipos_ponto[3], lty = tipos_linha[3], col = cores_linha[3], cex = tam_simbolo)
lines(clock, MRT_10F, type = "o", pch = tipos_ponto[4], lty = tipos_linha[4], col = cores_linha[4], cex = tam_simbolo) 
lines(clock, MRT_15F, type = "o", pch = tipos_ponto[5], lty = tipos_linha[5], col = cores_linha[5], cex = tam_simbolo) 
lines(clock, MRT_sem_F, type = "o", pch = tipos_ponto[6], lty = tipos_linha[6], col = cores_linha[6], cex = tam_simbolo) 
# Adicionar legenda 
legend("topright",
  legend = legendas,
  col = cores_linha,
  lty = tipos_linha,
  pch = tipos_ponto,
  pt.cex = tam_simbolo
)

# Gráficos de Barra 
cores_barra <- c("#E6E6E6", "#666666") 

# Função auxiliar para criar cada gráfico de barra
criar_barra <- function(dados_f, legenda_f) {
  # Combinar 'sem Fog' e os 'dados_f'
  dados_combinados <- rbind(MRT_sem_F, dados_f)
  
  barplot(dados_combinados,
    beside = TRUE,
    col = cores_barra,
    log = "y", 
    xlab = "Time between Things requests",
    ylab = "Response time (s)",
    names.arg = clock
  )
  legend("topright",
    legend = c("w/o Fog", legenda_f),
    fill = cores_barra,
    bty = "n"
  )
}

# Criar os gráficos de barra
par(mar = c(4, 4, 2, 1)) # Resetar margens para os gráficos menores
criar_barra(MRT_1F, "1 Fog")
criar_barra(MRT_3F, "3 Fogs")
criar_barra(MRT_5F, "5 Fogs")
criar_barra(MRT_10F, "10 Fogs")
criar_barra(MRT_15F, "15 Fogs")

# Resetar o layout para o padrão
par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)

Questão 2

# Criar a matriz de dados
dados_q2 <- matrix(
  c(
    53.8, 43.6, 2.6,  # Coluna $10-19 
    33.9, 54.2, 11.9, # Coluna $20-29 
    2.6, 60.5, 36.8,  # Coluna $30-39 
    0.0, 21.4, 78.6   # Coluna $40-49 
  ),
  nrow = 3,
  byrow = FALSE
)

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

# Cores para as pilhas
cores_q2 <- c("blue", "green", "yellow")

# Ajustar margens para caber a legenda na lateral
par(mar = c(5.1, 4.1, 4.1, 8.1))

# Criar o gráfico de barras empilhadas
barplot(dados_q2,
  main = "Qualidade da Refeição por Preço", # Título do gráfico
  xlab = "Preço da Refeição (Meal Price)", # Rótulo do eixo X
  ylab = "Porcentagem Total", # Rótulo do eixo Y
  col = cores_q2, # Cores das pilhas
  ylim = c(0, 100) # Ajustar limite para a legenda caber
)

legend("topright",
  legend = rownames(dados_q2),
  fill = cores_q2,
  inset = c(-0.25, 0), # Coloca a legenda fora da área do gráfico
  xpd = TRUE, # Permite desenhar a legenda fora      
  bty = "n" # Remove a caixa ao redor da legenda
)

# Resetar as margens para o padrão
par(mar = c(5.1, 4.1, 4.1, 2.1))

Questão 3

  1. Carregar o dataset airquality e converter a coluna Temp de Fahrenheit para Celsius.
  2. Depois, criar o histograma com hist(), definindo freq = FALSE para permitir a sobreposição da curva de densidade.
# Carregar o dataset
data("airquality")

# Converter Temperatura de F para C 
# Fórmula: °C = (°F - 32) / 1.8
temp_celsius <- (airquality$Temp - 32) / 1.8

# Gerar o histograma 
hist(temp_celsius,
  freq = FALSE, # Permite plotar a densidade
  main = "Histograma da Temperatura em Maio (Celsius)",
  xlab = "Temperatura (°C)",
  ylab = "Densidade",
  col = "lightblue", # Cor do histograma
  border = "black"
)

# Adicionar curva de densidade 
lines(density(temp_celsius, na.rm = TRUE), col = "red", lwd = 2)

Questão 4

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

# Agregar vendas por país
sales_por_pais <- aggregate(SALES ~ COUNTRY, data = sales, FUN = sum)

# Calcular porcentagens
total_sales <- sum(sales_por_pais$SALES) 
porcentagens <- round((sales_por_pais$SALES / total_sales) * 100, 1) 
labels_pie <- paste(sales_por_pais$COUNTRY, " (", porcentagens, "%)", sep = "") 

# Definir cores
cores_pie <- rainbow(length(sales_por_pais$COUNTRY)) 

# Criar o gráfico de pizza 
pie(sales_por_pais$SALES, 
  labels = labels_pie,
  col = cores_pie,
  main = "Porcentagem de Vendas por País"
)

# Adicionar legenda 
legend("topright",
  legend = sales_por_pais$COUNTRY, 
  fill = cores_pie,
  cex = 0.8
)

Questão 5

# Carregar o dataset
data("InsectSprays") 

# Criar o boxplot
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 6

# Carregar biblioteca para manipulação de strings
library(stringr)

# Função de pré-processamento
# Esta função lê e limpa cada arquivo
processar_dados <- function(caminho_arquivo) {
  # Ler os dados
  dados <- read.csv(caminho_arquivo)
  
  # Limpeza da Memória
  dados$usedMemory_MB <- NA 
  
  # Identificar unidades
  idx_mb <- grepl("MB", dados$usedMemory, ignore.case = TRUE)
  idx_gb <- grepl("GB", dados$usedMemory, ignore.case = TRUE)
  idx_tb <- grepl("TB", dados$usedMemory, ignore.case = TRUE)
  
  # Converter tudo para numérico (removendo "MB", "GB", "TB" e outros caracteres)
  valores_num <- as.numeric(gsub("[^0-9.]", "", dados$usedMemory))
  
  # Converter para MB
  dados$usedMemory_MB[idx_mb] <- valores_num[idx_mb]
  dados$usedMemory_MB[idx_gb] <- valores_num[idx_gb] * 1024 # 1 GB = 1024 MB
  dados$usedMemory_MB[idx_tb] <- valores_num[idx_tb] * 1000000 # 1 TB = 1000000 MB
  
  
  # Limpeza do Tempo
  # Os arquivos usam string de data/hora
  # A função as.POSIXct consegue ler esse formato diretamente.
  dados$Timestamp <- as.POSIXct(dados$currentTime)
  
  # Calcular tempo decorrido em horas
  tempo_inicial <- min(dados$Timestamp, na.rm = TRUE)
  dados$Time_Hour <- as.numeric(difftime(dados$Timestamp, tempo_inicial, units = "hours"))
  
  return(dados)
}

# Processar os arquivos
# Os arquivos estão no diretório atual
caminho_base <- "./" 
dados_none <- processar_dados(paste0(caminho_base, "monitoringCloudData_NONE.csv"))
dados_0.1 <- processar_dados(paste0(caminho_base, "monitoringCloudData_0.1.csv"))
dados_0.5 <- processar_dados(paste0(caminho_base, "monitoringCloudData_0.5.csv"))
dados_1.0 <- processar_dados(paste0(caminho_base, "monitoringCloudData_1.csv"))


# Configurar o layout e plotar
layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
par(mar = c(4, 4, 3, 2)) # Ajustar margens

# Gráfico 1: None Workload
plot(dados_none$Time_Hour, dados_none$usedMemory_MB,
  type = "l",
  xlab = "Time (hour)",
  ylab = "Used Memory (MB)",
  main = "Memory Analysis (None Workload)"
)

# Gráfico 2: Workload 0.1
plot(dados_0.1$Time_Hour, dados_0.1$usedMemory_MB,
  type = "l",
  xlab = "Time (hour)",
  ylab = "Used Memory (MB)",
  main = "Memory Analysis (Workload of 0.1)"
)

# Gráfico 3: Workload 0.5
plot(dados_0.5$Time_Hour, dados_0.5$usedMemory_MB,
  type = "l",
  xlab = "Time (hour)",
  ylab = "Used Memory (MB)",
  main = "Memory Analysis (Workload of 0.5)"
)

# Gráfico 4: Workload 1.0
plot(dados_1.0$Time_Hour, dados_1.0$usedMemory_MB,
  type = "l",
  xlab = "Time (hour)",
  ylab = "Used Memory (MB)",
  main = "Memory Analysis (Workload of 1.0)"
)

# Resetar o layout
par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)

Questão 7

library(plotly)
library(dplyr)

# Carregar os dados 
if (!exists("netflix_data")) {
  netflix_data <- read.csv("netflix_titles.csv")
}

# Preparar os dados
top_10_paises <- netflix_data %>%
  # Filtrar linhas sem país definido
  filter(country != "") %>%
  # Filtrar por conteúdo com apenas UM país
  filter(!grepl(",", country)) %>%
  # Contar por país
  group_by(country) %>%
  summarise(Total_Conteudos = n()) %>%
  # Ordenar e pegar o Top 10
  arrange(desc(Total_Conteudos)) %>%
  top_n(10)

# Criar o gráfico de pizza com Plotly
fig <- plot_ly(top_10_paises,
  labels = ~country,
  values = ~Total_Conteudos,
  type = "pie",
  textinfo = "label+percent",
  insidetextorientation = "radial"
) %>%
  layout(
    title = "Top 10 Países com Mais Conteúdo na Netflix (Origem Única)",
    margin = list(t = 80, b = 50) # Ajustar margens para o título
  )
fig

Questão 8

library(plotly)
library(dplyr)

# Garantir que os dados da Q7 existam
# (Se este chunk for executado separadamente, ele recalcula 'top_10_paises')
if (!exists("top_10_paises")) {
  if (!exists("netflix_data")) {
    netflix_data <- read.csv("netflix_titles.csv")
  }
  top_10_paises <- netflix_data %>%
    filter(country != "") %>%
    filter(!grepl(",", country)) %>%
    group_by(country) %>%
    summarise(Total_Conteudos = n()) %>%
    arrange(desc(Total_Conteudos)) %>%
    top_n(10)
}

# Renomear colunas para a tabela
tabela_dados <- top_10_paises
colnames(tabela_dados) <- c("País", "Total de conteúdos")

# Criar a tabela com Plotly
fig_tabela <- plot_ly(
  type = "table",
  # Estilização do cabeçalho
  header = list(
    values = colnames(tabela_dados),
    fill = list(color = "grey"), # Fundo cinza
    font = list(color = "white", size = 14), # Letra branca
    align = "center" # Centralizado
  ),
  # Estilização das células
  cells = list(
    values = list(tabela_dados$País, tabela_dados$`Total de conteúdos`),
    fill = list(color = "white"),
    align = "center", # Centralizado
    font = list(size = 12)
  )
) %>%
  layout(title = "Total de Conteúdos por País (Top 10)")

fig_tabela

Questão 9

Este código cria o gráfico de linhas da quantidade de conteúdo por década. Ele primeiro cria a coluna Decada (arredondando o release_year para baixo), depois agrupa por década e tipo (Filme/Série). Por último, plota as linhas com plotly, usando as cores azul para séries e “laranja” para filmes.

# Garantir que os dados da Netflix existam
if (!exists("netflix_data")) {
  netflix_data <- read.csv("netflix_titles.csv")
}

# Preparar os dados
conteudo_por_decada <- netflix_data %>%
  # Criar coluna de década
  mutate(Decada = floor(release_year / 10) * 10) %>%
  # Contar por Década e Tipo
  group_by(Decada, type) %>%
  summarise(Qnd_Conteudo = n()) %>%
  # Filtrar dados muito antigos
  filter(Decada >= 1940) %>%
  ungroup()

# Renomear "Movie" e "TV Show" para bater com a legenda da imagem
conteudo_por_decada$type <- recode(conteudo_por_decada$type,
  "Movie" = "Movies",
  "TV Show" = "TV Series"
)

# Criar gráfico de linha com Plotly
fig_decada <- plot_ly(conteudo_por_decada,
  x = ~Decada,
  y = ~Qnd_Conteudo,
  color = ~type,
  type = "scatter",
  mode = "lines+markers",
  # Definir cores manualmente
  colors = c("Movies" = "orange", "TV Series" = "blue")
) %>%
  layout(
    title = "Quantidade de Conteúdo por Década",
    xaxis = list(title = "Década"),
    yaxis = list(title = "Qnd. Conteúdo"),
    legend = list(title = list(text = ""))
  )

fig_decada

Questão 10

Este código cria um gráfico de barras agrupado. Ele filtra por: - Tipo: “Movie” - Anos: 2000 a 2010 - Gêneros: “Dramas”, “Action & Adventure”, “Comedies”

Ele também extrai apenas o primeiro gênero listado antes de agrupar.

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

# Garantir que os dados da Netflix existam
if (!exists("netflix_data")) {
  netflix_data <- read.csv("netflix_titles.csv")
}

# Gêneros e anos de interesse
generos_alvo <- c("Dramas", "Action & Adventure", "Comedies")
anos_alvo <- 2000:2010

# Preparar os dados
dados_generos_ano <- netflix_data %>%
  # Filtrar por tipo e ano
  filter(type == "Movie" & release_year %in% anos_alvo) %>%
  # Extrair o primeiro gênero
  mutate(Primeiro_Genero = str_split(listed_in, ", ", simplify = TRUE)[, 1]) %>%
  # Filtrar apenas os gêneros de interesse
  filter(Primeiro_Genero %in% generos_alvo) %>%
  # Contar por ano e gênero
  group_by(release_year, Primeiro_Genero) %>%
  summarise(Qnd_Lancamentos = n()) %>%
  ungroup()

# Renomear para português
dados_generos_ano$Primeiro_Genero <- recode(dados_generos_ano$Primeiro_Genero,
  "Dramas" = "Drama",
  "Action & Adventure" = "Ação e Aventura",
  "Comedies" = "Comédia"
)

# Criar o gráfico de barras agrupado
fig_generos <- plot_ly(dados_generos_ano,
  x = ~release_year,
  y = ~Qnd_Lancamentos,
  color = ~Primeiro_Genero,
  type = "bar" # barmode = "group" é o padrão
) %>%
  layout(
    title = "Lançamentos de Filmes por Gênero (2000-2010)",
    xaxis = list(title = "Ano de Lançamento"),
    yaxis = list(title = "Qnt. de Lançamentos"),
    legend = list(title = list(text = "Gênero"))
  )

fig_generos