Ex 12

Questão 1

clock <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)
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.196174208289447737)
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)

leg_text <- c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog")
leg_col <- c("black", "yellow", "red", "darkblue", "purple", "green")
leg_pch <- c(4, 11, 1, 2, 0, 4)
leg_lty <- c(1, 1, 1, 1, 1, 1) 
plot_type <- "o" 


par(mar = c(5, 4, 2, 2))
plot(clock, MRT_1F,
     type = "n", 
     main = "",
     xlab = "Time between Things requests (seconds)",
     ylab = "Response Time (sec.)",
     xlim = c(0, 3),
     ylim = c(0, 520),
     axes = FALSE
)
axis(2, at = seq(0, 500, by = 100)) 
axis(1, at = seq(0, 3, by = 0.5))
box()


lines(clock, MRT_1F, type = plot_type, pch = leg_pch[1], lty = leg_lty[1], col = leg_col[1]) 
lines(clock, MRT_3F, type = plot_type, pch = leg_pch[2], lty = leg_lty[2], col = leg_col[2]) 
lines(clock, MRT_5F, type = plot_type, pch = leg_pch[3], lty = leg_lty[3], col = leg_col[3]) 
lines(clock, MRT_10F, type = plot_type, pch = leg_pch[4], lty = leg_lty[4], col = leg_col[4])
lines(clock, MRT_15F, type = plot_type, pch = leg_pch[5], lty = leg_lty[5], col = leg_col[5])
lines(clock, MRT_sem_F, type = plot_type, pch = leg_pch[6], lty = leg_lty[6], col = leg_col[6])


legend("topright",
       legend = leg_text,
       pch = leg_pch, 
       lty = leg_lty, 
       col = leg_col, 
       cex = 0.8
)

par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)
cores_barras <- c("#E6E6E6", "#666666")
layout_matrix_barras <- matrix(c(1, 2, 3, 4, 5, 0), nrow = 3, ncol = 2, byrow = TRUE)
layout(layout_matrix_barras)
par(mar = c(4, 4, 1.5, 1)) 


data_1F <- rbind(MRT_sem_F, MRT_1F)
barplot(data_1F,
        beside = TRUE, col = cores_barras, names.arg = clock,
        xlab = "Time between Things requests", ylab = "Response time (s)",
        log = "y", ylim = c(0.1, 600) 
)
legend("topright", legend = c("w/o Fog", "1 Fog"), fill = cores_barras, cex = 0.8)

#  w/o Fog vs 3 Fogs 
data_3F <- rbind(MRT_sem_F, MRT_3F)
barplot(data_3F,
        beside = TRUE, col = cores_barras, names.arg = clock,
        xlab = "Time between Things requests", ylab = "Response time (s)",
        log = "y", ylim = c(0.1, 600) # O ylim correto
)
legend("topright", legend = c("w/o Fog", "3 Fogs"), fill = cores_barras, cex = 0.8)

#  w/o Fog vs 5 Fogs 
data_5F <- rbind(MRT_sem_F, MRT_5F)
barplot(data_5F,
        beside = TRUE, col = cores_barras, names.arg = clock,
        xlab = "Time between Things requests", ylab = "Response time (s)",
        log = "y", ylim = c(0.1, 100) # MUDANÇA: Ylim corrigido (max 83.9, teto 100)
)
legend("topright", legend = c("w/o Fog", "5 Fogs"), fill = cores_barras, cex = 0.8)

# w/o Fog vs 10 Fogs 
data_10F <- rbind(MRT_sem_F, MRT_10F)
barplot(data_10F,
        beside = TRUE, col = cores_barras, names.arg = clock,
        xlab = "Time between Things requests", ylab = "Response time (s)",
        log = "y", ylim = c(0.1, 50) # MUDANÇA: Ylim corrigido (max 29.5, teto 50)
)
legend("topright", legend = c("w/o Fog", "10 Fogs"), fill = cores_barras, cex = 0.8)

#  w/o Fog vs 15 Fogs 
data_15F <- rbind(MRT_sem_F, MRT_15F)
barplot(data_15F,
        beside = TRUE, col = cores_barras, names.arg = clock,
        xlab = "Time between Things requests", ylab = "Response time (s)",
        log = "y", ylim = c(0.1, 50) # MUDANÇA: Ylim corrigido (max 11.3, teto 50)
)
legend("topright", legend = c("w/o Fog", "15 Fogs"), fill = cores_barras, cex = 0.8)

par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)

Questão 2

#  Preparar os dados 
dados_refeicao <- matrix(c(53.8, 33.9, 2.6, 0.0,   # Good
                             43.6, 54.2, 60.5, 21.4, # Very Good
                             2.6, 11.9, 36.8, 78.6),  # Excellent
                           nrow = 3, byrow = TRUE)

nomes_colunas <- c("$10-19", "$20-29", "$30-39", "$40-49")
nomes_linhas <- c("Good", "Very Good", "Excellent")
cores <- c("lightblue", "blue", "darkblue")

# Ajustar margens e permitir desenho externo 
par(mar = c(5, 4, 4, 6) + 0.1)

# --- PASSO 3: Plotar o gráfico (sem legenda) ---
barplot(dados_refeicao,
        main = "Qualidade da Refeição por Preço",
        xlab = "Preço da Refeição (Meal Price)",
        ylab = "Porcentagem (%)",
        names.arg = nomes_colunas,
        col = cores,
        ylim = c(0, 100) # De volta ao ylim normal
)

# Adicionar legenda fora do gráfico
# Permitir que o R desenhe fora da área do gráfico
par(xpd = TRUE) 

# Adicionar a legenda usando coordenadas
legend(x = 4.9, y = 100, 
       legend = nomes_linhas,
       fill = cores,
       cex = 0.8
)

par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1, xpd = FALSE)

Questão 3

# Preparar os dados ---

# Carregar o dataset
data("airquality")

# Filtrar o dataset para pegar apenas o mês de Maio (Month == 5)
# e remover quaisquer NAs (valores faltantes)
temp_f_maio <- airquality[airquality$Month == 5, "Temp"]
temp_f_maio <- na.omit(temp_f_maio)

# Converter de Fahrenheit para Celsius
# C = (F - 32) / 1.8
temp_c_maio <- (temp_f_maio - 32) / 1.8

# --- PASSO 2: Plotar o Histograma (R Tradicional) ---

# Criar o histograma
hist(temp_c_maio,
     main = "Histograma da Temperatura em Maio (Celsius)", # Título
     xlab = "Temperatura (°C)",                           # Eixo X
     ylab = "Densidade",                                 # Eixo Y
     col = "lightblue",                                  # Cor
     probability = TRUE                                  # Requisito para densidade
)



# Calcular a densidade
densidade_temp <- density(temp_c_maio)

# Adicionar a linha (curva) ao gráfico
lines(densidade_temp, col = "darkblue") 

par(mfrow = c(1, 1))

Questão 4

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

# ler "COUNTRY" e suas "SALES" 
sales_by_country <- aggregate(SALES ~ COUNTRY, data = sales, FUN = sum)

#  Preparar Labels e Cores 
pct <- round(sales_by_country$SALES / sum(sales_by_country$SALES) * 100)
labels_pct <- paste(pct, "%", sep = "")
cores <- rainbow(length(sales_by_country$COUNTRY))

#  Ajustar Margens 
par(mar = c(5, 4, 4, 7) + 0.1)

# Plotar o Gráfico de Pizza
pie(sales_by_country$SALES,
    labels = labels_pct,
    col = cores,
    main = "Total de Vendas por País"
)

# Adicionar a Legenda Externa 
par(xpd = TRUE)
legend(x = 1.3, y = 1.0,
       legend = sales_by_country$COUNTRY,
       fill = cores,
       cex = 0.8
)

par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1, xpd = FALSE)

Questão 5

#  Carregar os dados 
# O dataset InsectSprays já vem incluído no R
data("InsectSprays")

#  Plotar o Boxplot (R Tradicional)

boxplot(count ~ spray, # Fórmula: 'count' por 'spray'
        data = InsectSprays,
        main = "Contagem de Insetos por Tipo de Inseticida", # Título
        xlab = "Tipo de Inseticida (Spray)",                 # Eixo X
        ylab = "Contagem de Insetos",                         # Eixo Y
        col = "yellow",    # Cor amarela
        outline = FALSE    # Remove os outliers
)

par(mfrow = c(1, 1))

Questão 6

# Criar as Funções de Limpeza 

# Função para converter memória 
converter_para_mb <- function(memoria_str) {
  sapply(memoria_str, function(x) {
    if (grepl("TB", x)) {
      num <- as.numeric(gsub("TB", "", x))
      return(num * 1000000) # 1 TB = 1,000,000 MB
    } else if (grepl("GB", x)) {
      num <- as.numeric(gsub("GB", "", x))
      return(num * 1024)    # 1 GB = 1024 MB
    } else if (grepl("MB", x)) {
      return(as.numeric(gsub("MB", "", x)))
    } else if (grepl("KB", x)) {
      num <- as.numeric(gsub("KB", "", x))
      return(num / 1024)
    } else {
      return(as.numeric(x))
    }
  })
}

# Converter 'currentTime'  para horas contínuas
converter_para_horas <- function(time_col) {
  
  # Converter o texto da data para um objeto de Data/Hora do R
  time_obj <- as.POSIXct(time_col, format = "%Y-%m-%d %H:%M:%S")
  
  #  Encontrar o primeiro tempo (o início do experimento)
  start_time <- min(time_obj, na.rm = TRUE)
  
  # Calcular a diferença em horas 
  elapsed_time <- difftime(time_obj, start_time, units = "hours")
  
  # Converter para um número simples
  return(as.numeric(elapsed_time))
}
# Verificar e Carregar os 4 CSVs 
file_none <- "monitoringCloudData_NONE.csv"
file_0_1 <- "monitoringCloudData_0.1.csv"
file_0_5 <- "monitoringCloudData_0.5.csv"
file_1_0 <- "monitoringCloudData_1.csv"

if (!file.exists(file_none) || !file.exists(file_0_1) || !file.exists(file_0_5) || !file.exists(file_1_0)) {
  stop("ERRO: Um ou mais arquivos CSV da Questão 6 não foram encontrados. 
       Verifique se os 4 arquivos .csv estão no mesmo diretório do seu .Rmd")
}

data_none <- read.csv(file_none)
data_0_1 <- read.csv(file_0_1)
data_0_5 <- read.csv(file_0_5)
data_1_0 <- read.csv(file_1_0)
print("Todos os 4 arquivos CSV foram carregados com sucesso.")
## [1] "Todos os 4 arquivos CSV foram carregados com sucesso."
# Definir o Layout 
layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
par(mar = c(5, 4, 3, 2) + 0.1)

# Limpar e Plotar Gráfico 1 (None Workload) 

df_none <- data.frame(Time = converter_para_horas(data_none$currentTime),
                      Memory = converter_para_mb(data_none$usedMemory))
df_none_sorted <- na.omit(df_none[order(df_none$Time), ])

plot(df_none_sorted$Time, df_none_sorted$Memory,
     type = "l", 
     main = "Memory Analysis (None Workload)",
     xlab = "Time (hour)",
     ylab = "Used Memory (MB)",
     ylim = c(96, 107) 
)

# Limpar e Plotar Gráfico 2 (Workload of 0.1)

df_0_1 <- data.frame(Time = converter_para_horas(data_0_1$currentTime),
                     Memory = converter_para_mb(data_0_1$usedMemory))
df_0_1_sorted <- na.omit(df_0_1[order(df_0_1$Time), ])

plot(df_0_1_sorted$Time, df_0_1_sorted$Memory,
     type = "l",
     main = "Memory Analysis (Workload of 0.1)",
     xlab = "Time (hour)",
     ylab = "Used Memory (MB)",
     ylim = c(0, 3500) 
)

# Limpar e Plotar Gráfico 3 (Workload of 0.5)
df_0_5 <- data.frame(Time = converter_para_horas(data_0_5$currentTime),
                     Memory = converter_para_mb(data_0_5$usedMemory))
df_0_5_sorted <- na.omit(df_0_5[order(df_0_5$Time), ])

plot(df_0_5_sorted$Time, df_0_5_sorted$Memory,
     type = "l",
     main = "Memory Analysis (Workload of 0.5)",
     xlab = "Time (hour)",
     ylab = "Used Memory (MB)",
     
)

# Limpar e Plotar Gráfico 4 (Workload of 1.0) 
df_1_0 <- data.frame(Time = converter_para_horas(data_1_0$currentTime),
                     Memory = converter_para_mb(data_1_0$usedMemory))
df_1_0_sorted <- na.omit(df_1_0[order(df_1_0$Time), ])

plot(df_1_0_sorted$Time, df_1_0_sorted$Memory,
     type = "l",
     main = "Memory Analysis (Workload of 1.0)",
     xlab = "Time (hour)",
     ylab = "Used Memory (MB)",
     ylim = c(240, 255) 
)

par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)

Questão 7

# Carregar as bibliotecas ---
library(plotly)
## Warning: pacote 'plotly' foi compilado no R versão 4.5.2
## Carregando pacotes exigidos: ggplot2
## Warning: pacote 'ggplot2' foi compilado no R versão 4.5.2
## 
## 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(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
# Carregar o novo dataset ---
tryCatch({
  netflix_data <- read.csv("netflix_titles.csv")
}, error = function(e) {
  stop("ERRO: Arquivo 'netflix_titles.csv' não encontrado.")
})

# Preparar os dados 
top_10_countries <- netflix_data %>%
  
  # Remover linhas onde o país está vazio
  filter(!is.na(country) & country != "") %>%
  
  # Filtrar APENAS UM país 
  filter(!grepl(",", country)) %>%
  
  # Agrupar por país e contar
  group_by(country) %>%
  summarize(Total = n()) %>%
  
  # 'with_ties = FALSE' garante EXATAMENTE 10 países
  slice_max(order_by = Total, n = 10, with_ties = FALSE) %>%
  
  # 5. Ordenar
  arrange(desc(Total))

# Criar o Gráfico de Pizza (Plotly) 
fig <- plot_ly(top_10_countries, 
               labels = ~country, 
               values = ~Total,   
               type = 'pie',      
               textinfo = 'percent+label',
               insidetextfont = list(color = '#FFFFFF')
)

fig <- fig %>% layout(title = "Top 10 Países (Origem Única) na Netflix")

# Exibir a figura
fig

Questão 8

# Renomear as colunas para a exibição
data_para_tabela <- top_10_countries %>%
  rename("País" = country,
         "Total de conteúdos" = Total)

# Criar a Tabela (Plotly) 


fig_tabela <- plot_ly(
  type = 'table',
  
  # Define o cabeçalho 
  header = list(
    values = names(data_para_tabela),
    
    align = "center",                     # Centralizar cabeçalho
    fill = list(color = "grey"),          # Fundo cinza
    font = list(color = "white", size = 12) # Letra em branco
  ),
  
  # Define as células 
  cells = list(
    values = rbind(data_para_tabela$País, data_para_tabela$`Total de conteúdos`),
    align = "center",                     
    font = list(size = 12)
  )
)

fig_tabela <- fig_tabela %>% layout(title = "Top 10 Países (Origem Única) na Netflix")


fig_tabela

Questão 9

# Carregar as bibliotecas ---

library(plotly)
library(dplyr)

# Preparar os Dados ---

data_por_decada <- netflix_data %>%
  
  #Remover linhas onde o ano de lançamento é NA
  filter(!is.na(release_year)) %>%
  
  #Criar a coluna "Decade"
  mutate(Decade = floor(release_year / 10) * 10) %>%
  
  # Agrupar por Década e por Tipo (Filme/Série)
  group_by(Decade, type) %>%
  
  # Contar o total em cada grupo
  summarize(Count = n()) %>%
  
  ungroup() %>%
  
  # começar de 1940 (como na imagem de exemplo)
  filter(Decade >= 1940)
## `summarise()` has grouped output by 'Decade'. You can override using the
## `.groups` argument.
# Definir as cores 

cores_linhas <- c("orange", "blue") 

# Criar o Gráfico de Linha (Plotly) ---

fig_decada <- plot_ly(data_por_decada,
                      x = ~Decade,         # Eixo X
                      y = ~Count,          # Eixo Y
                      color = ~type,       # Cria as duas linhas (Movie, TV Series)
                      colors = cores_linhas, # Aplica nossas cores
                      type = 'scatter',    # Tipo de gráfico
                      mode = 'lines+markers' # Linhas com pontos
)

# Adicionar títulos aos eixos e ao gráfico
fig_decada <- fig_decada %>% layout(
  title = "Quantidade de Conteúdo por Década",
  xaxis = list(title = "Década"),
  yaxis = list(title = "Qnd. Conteúdo")
)

# Exibir o gráfico
fig_decada

Questão 10

#  Carregar as bibliotecas ---
library(plotly)
library(dplyr)
library(tidyr)

#  Preparar os Dados ---

# Gêneros que queremos filtrar
generos_desejados <- c("Dramas", "Action & Adventure", "Comedies")

data_generos_ano <- netflix_data %>%
  
  # apenas Filmes
  filter(type == "Movie") %>%
  
  # entre os anos 2000 e 2010
  filter(release_year >= 2000 & release_year <= 2010) %>%
  
  # apenas o PRIMEIRO gênero, 'separate' para dividir na primeira vírgula
  separate(listed_in, into = c("Genero_1"), sep = ",", extra = "drop") %>%
  
  # apenas os 3 gêneros que queremos
  filter(Genero_1 %in% generos_desejados) %>%
  
  # Agrupar por ano e pelo primeiro gênero
  group_by(release_year, Genero_1) %>%
  
  # Contar o total em cada grupo
  summarize(Count = n()) %>%
  
  ungroup()
## `summarise()` has grouped output by 'release_year'. You can override using the
## `.groups` argument.
# --- Gráfico de Barras Agrupado (Plotly) ---

fig_barras <- plot_ly(data_generos_ano,
                      x = ~release_year, # Eixo X (Ano)
                      y = ~Count,        # Eixo Y (Contagem)
                      color = ~Genero_1, # Agrupa por Gênero
                      type = 'bar'       # Tipo de gráfico
)

# Adicionar títulos e 'barmode = "group"' para ficar lado-a-lado
fig_barras <- fig_barras %>% layout(
  title = "Filmes Lançados por Gênero (2000-2010)",
  xaxis = list(title = "Ano de Lançamento"),
  yaxis = list(title = "Qnt. de Lançamentos"),
  barmode = 'group' 
)

# Exibir o gráfico
fig_barras