Relatório de Exercícios

Questão 1

# 1) Dados fornecidos
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.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)

# Configurar layout para organizar gráficos
matriz_layout <- matrix(c(1, 1, 
                          2, 3, 
                          4, 5, 
                          6, 0), nrow = 4, byrow = TRUE)
layout(matriz_layout, heights = c(2, 1.2, 1.2, 1.2))

# Ajustar as margens
par(mar = c(4.5, 4.5, 2, 1))

# --- Gráfico de Linhas (Superior) ---
plot(clock, MRT_1F, type = "b", pch = 4, col = "black", ylim = c(0, 520),
     xlab = "Time between Things requests (seconds)", ylab = "Response Time (sec.)")
lines(clock, MRT_3F, type = "b", pch = 5, col = "orange")
lines(clock, MRT_5F, type = "b", pch = 6, col = "magenta")
lines(clock, MRT_10F, type = "b", pch = 2, col = "blue")
lines(clock, MRT_15F, type = "b", pch = 0, col = "purple")
lines(clock, MRT_sem_F, type = "b", pch = 1, col = "green")

legend("topright", legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
       col = c("black", "orange", "magenta", "blue", "purple", "green"), pch = c(4, 5, 6, 2, 0, 1), cex = 0.8)

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

gerar_barplot <- function(mrt_data, label_legenda) {
  dados_barra <- rbind(MRT_sem_F, mrt_data)
  barplot(dados_barra, beside = TRUE, log = "y", names.arg = clock, col = cores_barra,
          xlab = "Time between Things", ylab = "Response time (s)", cex.axis = 0.8, cex.names = 0.8)
  legend("topright", legend = c("w/o Fog", label_legenda), fill = cores_barra, bty = "o", cex = 0.7)
}

gerar_barplot(MRT_1F, "1 Fog")
gerar_barplot(MRT_3F, "3 Fogs")
gerar_barplot(MRT_5F, "5 Fogs")
gerar_barplot(MRT_10F, "10 Fogs")
gerar_barplot(MRT_15F, "15 Fogs")

Questão 2

# 1) Criar a matriz com os dados EXATOS da imagem fornecida
# Cada coluna representa uma categoria de preço (da esquerda para a direita)
# As linhas representam: Good, Very Good, Excellent
dados_restaurante <- 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 os nomes das linhas (qualidade) e colunas (preço)
colnames(dados_restaurante) <- c("$10-19", "$20-29", "$30-39", "$40-49")
rownames(dados_restaurante) <- c("Good", "Very Good", "Excellent")

# Ajustar as margens para que a legenda caiba perfeitamente do lado de fora
par(mar = c(5, 5, 4, 7))

# 2) Gerar o gráfico de barras empilhadas utilizando o R tradicional (barplot)
barplot(dados_restaurante, 
        beside = FALSE, # FALSE garante que as barras fiquem empilhadas
        col = c("#D98880", "#F7DC6F", "#7DCEA0"), # Cores bonitas e visíveis
        xlab = "Meal Price", 
        ylab = "Percentage (%)", 
        main = "Meal Quality Rating by Price Category",
        font.main = 2)

# 3) Adicionar a legenda posicionada à direita, fora da área de plotagem
legend("topright", 
       legend = rownames(dados_restaurante), 
       fill = c("#D98880", "#F7DC6F", "#7DCEA0"), 
       title = "Quality Rating",
       xpd = TRUE, 
       inset = c(-0.22, 0)) # Empurra a legenda um pouco mais para a direita para não cobrir o gráfico

Questão 3

# 1) Filtrar os dados nativos 'airquality' apenas para o mês de maio (Month == 5)
dados_maio <- subset(airquality, Month == 5)

# 2) Converter a temperatura da coluna 'Temp' de Fahrenheit para Celsius
# Fórmula: °C = (°F − 32) / 1.8
dados_maio$Temp_C <- (dados_maio$Temp - 32) / 1.8

# 3) Plotar o Histograma usando o R tradicional
# IMPORTANTE: O parâmetro freq = FALSE é obrigatório para que a escala do eixo Y 
# mude de "Frequência" para "Densidade", permitindo desenhar a curva por cima!
hist(dados_maio$Temp_C, 
     freq = FALSE, 
     col = "skyblue", 
     border = "white",
     xlab = "Temperatura (°C)", 
     ylab = "Densidade", 
     main = "Distribuição de Temperatura em Maio (Airquality)",
     font.main = 2)

# 4) Adicionar a curva com a estimativa da densidade por cima do histograma
# O parâmetro na.rm = TRUE remove valores nulos caso existam para não quebrar a curva
lines(density(dados_maio$Temp_C, na.rm = TRUE), 
      col = "darkblue", 
      lwd = 2)

Questão 4

# 1) Importação corrigida dos dados (especificando que o separador é espaço/tabulação)
sales <- read.table("https://training-course-material.com/images/8/8f/Sales.txt", header = TRUE, sep = "\t")

# Forçar os nomes das colunas para garantir que o R encontre 'Sales' e 'Country' exatamente assim
colnames(sales) <- c("Country", "Sales")

# 2) Somar o total de vendas (Sales) agrupado por país (Country)
vendas_por_pais <- aggregate(Sales ~ Country, data = sales, FUN = sum)

# 3) Calcular as porcentagens de cada país para exibir nas fatias
porcentagens <- round(100 * vendas_por_pais$Sales / sum(vendas_por_pais$Sales), 1)
labels_pizza <- paste(porcentagens, "%", sep = "")

# 4) Definir uma paleta de cores para as fatias
cores_pizza <- c("#5DADE2", "#F4D03F", "#48C9B0", "#EB984E", "#AF7AC5")

# Ajustar margens para a legenda lateral caber sem problemas
par(mar = c(4, 4, 4, 8))

# 5) Gerar o Gráfico de Pizza (R tradicional)
# Passamos as porcentagens como labels das fatias
pie(vendas_por_pais$Sales, 
    labels = labels_pizza, 
    col = cores_pizza,
    main = "Porcentagem do Total de Vendas por País",
    init.angle = 90) # Rotaciona para iniciar o desenho no topo

# 6) Adicionar a Legenda contendo os nomes dos países (requisito obrigatório)
legend("topright", 
       legend = vendas_por_pais$Country, 
       fill = cores_pizza, 
       title = "Países",
       xpd = TRUE,
       inset = c(-0.25, 0)) # Coloca a legenda para fora do círculo da pizza

Questão 5

# 1) Gerar o Boxplot utilizando o dataset nativo 'InsectSprays'
boxplot(count ~ spray, 
        data = InsectSprays, 
        outline = FALSE,          # Remove a exibição dos outliers
        col = "yellow",           # Preenche as caixas com a cor amarela pedida
        xlab = "Tipo de Inseticida (Spray)", 
        ylab = "Contagem de Insetos",
        main = "Contagem de Insetos por Tipo de Inseticida",
        font.main = 2)

Questão 6

# 1) Função interna para automatizar a leitura e tratamento rigoroso de cada CSV
tratar_monitoramento <- function(caminho_arquivo) {
  # Ler o arquivo CSV real
  df <- read.csv(caminho_arquivo, header = TRUE, stringsAsFactors = FALSE)
  
  # --- TRATAMENTO DE TEMPO (Dica 1) ---
  # Converter a coluna currentTime de texto para formato de data/hora real do R
  df$currentTime <- as.POSIXct(df$currentTime, format="%Y-%m-%d %H:%M:%S")
  
  # Calcular a diferença de tempo em horas a partir do primeiríssimo registro do arquivo
  tempo_inicial <- df$currentTime[1]
  df$tempo_horas <- as.numeric(difftime(df$currentTime, tempo_inicial, units = "hours"))
  
  # --- TRATAMENTO DE MEMÓRIA VIA REGEX (Dica 2) ---
  # Extrair apenas a parte numérica (remove qualquer letra ou espaço)
  numero_memoria <- as.numeric(gsub("[^0-9.]", "", df$usedMemory))
  
  # Pegar apenas o sufixo de texto em minúsculo para identificar a unidade (mb, gb, tb)
  unidade_memoria <- tolower(gsub("[0-9. ]", "", df$usedMemory))
  
  # Aplicar as regras de conversão matemática para unificar tudo na escala de Megabytes (MB)
  df$usedMemory_MB <- ifelse(grepl("gb", unidade_memoria), numero_memoria * 1024,
                      ifelse(grepl("tb", unidade_memoria), numero_memoria * 1000000, 
                             numero_memoria))
  
  return(df)
}

# 2) Carregar e processar os 4 conjuntos de dados reais apontando para a sua pasta de Downloads
dados_none <- tratar_monitoramento("C:/Users/ccunh/Downloads/monitoringCloudData/monitoringCloudData_NONE.csv")
dados_01   <- tratar_monitoramento("C:/Users/ccunh/Downloads/monitoringCloudData/monitoringCloudData_0.1.csv")
dados_05   <- tratar_monitoramento("C:/Users/ccunh/Downloads/monitoringCloudData/monitoringCloudData_0.5.csv")
dados_1    <- tratar_monitoramento("C:/Users/ccunh/Downloads/monitoringCloudData/monitoringCloudData_1.csv")

# 3) Configurar o Layout de exibição: Matriz 2x2 para acomodar os 4 gráficos lado a lado
matriz_layout_q6 <- matrix(c(1, 2, 
                             3, 4), nrow = 2, byrow = TRUE)
layout(matriz_layout_q6)

# Ajustar margens dos subgráficos para não encavalar os eixos
par(mar = c(4.5, 4.5, 3, 1))

# 4) Plotagem dos 4 gráficos de linha do tempo
# Gráfico 1: Workload None
plot(dados_none$tempo_horas, dados_none$usedMemory_MB, type = "l", col = "blue",
     xlab = "Time (hour)", ylab = "Used Memory (MB)", 
     main = "Memory Analysis (None Workload)", font.main = 2)

# Gráfico 2: Workload 0.1
plot(dados_01$tempo_horas, dados_01$usedMemory_MB, type = "l", col = "red",
     xlab = "Time (hour)", ylab = "Used Memory (MB)", 
     main = "Memory Analysis (Workload of 0.1)", font.main = 2)

# Gráfico 3: Workload 0.5
plot(dados_05$tempo_horas, dados_05$usedMemory_MB, type = "l", col = "green",
     xlab = "Time (hour)", ylab = "Used Memory (MB)", 
     main = "Memory Analysis (Workload of 0.5)", font.main = 2)

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

Questão 7

# 1) LER O DATASET DA NETFLIX
# Ajuste o caminho caso o arquivo esteja em outra pasta
netflix_df <- read.csv("C:/Users/ccunh/Downloads/netflix_titles.csv", stringsAsFactors = FALSE)

# 2) FILTRAR CONTEÚDOS COM APENAS UM PAÍS DE ORIGEM
# Remove registros onde a coluna country está vazia e onde há vírgulas (múltiplos países)
netflix_filtrado <- subset(netflix_df, country != "" & !grepl(",", country))

# 3) OBTER OS TOP 10 PAÍSES COM MAIS CONTEÚDO
tabela_paises <- as.data.frame(table(netflix_filtrado$country))
colnames(tabela_paises) <- c("Pais", "Total")

# Ordenar de forma decrescente e pegar as 10 primeiras linhas
top10_paises <- tabela_paises[order(-tabela_paises$Total), ][1:10, ]

# 4) GERAR O GRÁFICO DE PIZZA INTERATIVO COM PLOTLY
plot_ly(top10_paises, 
        labels = ~Pais, 
        values = ~Total, 
        type = 'pie',
        textinfo = 'label+percent',
        insidetextorientation = 'radial') %>%
  layout(title = "Top 10 Países com Mais Conteúdo Único na Netflix",
         showlegend = TRUE)

Questão 8

# 1) GARANTIR OS DADOS DO TOP 10 (Recalculado para o bloco ser independente)
# Se o arquivo não estiver na pasta atual, mantenha o caminho completo usado antes
netflix_df <- read.csv("C:/Users/ccunh/Downloads/netflix_titles.csv", stringsAsFactors = FALSE)
netflix_filtrado <- subset(netflix_df, country != "" & !grepl(",", country))
tabela_paises <- as.data.frame(table(netflix_filtrado$country))
colnames(tabela_paises) <- c("Pais", "Total")
top10_paises <- tabela_paises[order(-tabela_paises$Total), ][1:10, ]

# 2) GERAR A TABELA INTERATIVA COM PLOTLY
plot_ly(
  type = 'table',
  # Configuração do Cabeçalho da Tabela
  header = list(
    values = c("<b>País</b>", "<b>Total de conteúdos</b>"),
    align = "center",                                 # Centraliza o texto do cabeçalho
    line = list(width = 1, color = '#506784'),
    fill = list(color = 'grey'),                      # Fundo cinza pedido pelo professor
    font = list(family = "Arial", size = 14, color = "white") # Letra branca pedida pelo professor
  ),
  # Configuração das Células de Conteúdo
  cells = list(
    values = rbind(top10_paises$Pais, top10_paises$Total),
    align = "center",                                 # Centraliza o texto de todas as células
    line = list(color = '#506784', width = 1),
    font = list(family = "Arial", size = 12, color = "black"),
    fill = list(color = c('#F9F9F9', '#FFFFFF'))      # Efeito zebrado leve para estética
  )
)

Questão 9

# 1) LER O DATASET E CALCULAR AS DÉCADAS
# Ajuste o caminho completo do arquivo netflix_titles.csv se necessário
netflix_df <- read.csv("C:/Users/ccunh/Downloads/netflix_titles.csv", stringsAsFactors = FALSE)

# Calcular a década correspondente para cada ano usando divisão inteira (%/%)
netflix_df$decade <- (netflix_df$release_year %/% 10) * 10

# 2) AGRUPAR E CONTAR POR DÉCADA E POR TIPO (Movie / TV Show)
tabela_decadas <- as.data.frame(table(netflix_df$decade, netflix_df$type))
colnames(tabela_decadas) <- c("Decade", "Type", "Count")

# Converter a coluna Decade para numérico para a linha do gráfico ficar contínua e correta
tabela_decadas$Decade <- as.numeric(as.character(tabela_decadas$Decade))

# Separar os dados em dois subsets para plotar cada linha de forma independente
dados_filmes <- subset(tabela_decadas, Type == "Movie")
dados_series <- subset(tabela_decadas, Type == "TV Show")

# 3) GERAR O GRÁFICO DE LINHAS INTERATIVO COM PLOTLY
plot_ly() %>%
  # Adicionar a linha para Séries (TV Shows) - Cor Azul
  add_trace(data = dados_series, 
            x = ~Decade, 
            y = ~Count, 
            type = 'scatter', 
            mode = 'lines+markers',
            name = 'TV Series', 
            line = list(color = 'blue'),
            marker = list(color = 'blue')) %>%
  # Adicionar a linha para Filmes (Movies) - Cor Amarela
  add_trace(data = dados_filmes, 
            x = ~Decade, 
            y = ~Count, 
            type = 'scatter', 
            mode = 'lines+markers',
            name = 'Movies', 
            line = list(color = 'orange'), # 'orange' ou 'yellow' dão excelente visibilidade no fundo branco
            marker = list(color = 'orange')) %>%
  # Configurar títulos, eixos e legendas do layout
  layout(title = "Quantidade de Conteúdo por Década na Netflix",
         xaxis = list(title = "Década", dtick = 10), # dtick = 10 força o eixo a pular de 10 em 10 anos
         yaxis = list(title = "Qnd. Conteúdo"),
         legend = list(title = list(text = 'Tipo de Conteúdo')))

Questão 10

# 1) LER E FILTRAR O DATASET ORIGINAL DA NETFLIX
# Ajuste o caminho completo do arquivo netflix_titles.csv se necessário
netflix_df <- read.csv("C:/Users/ccunh/Downloads/netflix_titles.csv", stringsAsFactors = FALSE)

# Filtrar apenas por filmes lançados entre os anos de 2000 e 2010
filmes_filtrados <- subset(netflix_df, type == "Movie" & release_year >= 2000 & release_year <= 2010)

# 2) TRATAR OS GÊNEROS (Extrair apenas o primeiro antes da vírgula via Regex)
# O padrão ",.*" encontra a primeira vírgula e tudo o que vem depois dela, substituindo por nada ""
filmes_filtrados$primeiro_genero <- sub(",.*", "", filmes_filtrados$listed_in)

# 3) FILTRAR APENAS OS TRÊS GÊNEROS SOLICITADOS
generos_alvo <- c("Dramas", "Action & Adventure", "Comedies")
filmes_finais <- subset(filmes_filtrados, primeiro_genero %in% generos_alvo)

# 4) MONTAR A TABELA DE CONTAGEEM POR ANO E GÊNERO
tabela_barras <- as.data.frame(table(filmes_finais$release_year, filmes_finais$primeiro_genero))
colnames(tabela_barras) <- c("Ano", "Genero", "Quantidade")

# 5) GERAR O GRÁFICO DE BARRAS LADO A LADO COM PLOTLY
plot_ly(data = tabela_barras, 
        x = ~Ano, 
        y = ~Quantidade, 
        color = ~Genero, 
        type = 'bar',
        colors = c("Dramas" = "#3366CC", "Action & Adventure" = "#FF9900", "Comedies" = "#109618")) %>%
  layout(title = "Filmes Lançados por Gênero (2000 - 2010)",
         xaxis = list(title = "Ano de Lançamento", type = 'category'), # 'category' garante que mostre ano a ano de forma discreta
         yaxis = list(title = "Quantidade de Filmes"),
         barmode = 'group', # ESTE COMANDO IMPÕE AS BARRAS LADO A LADO (Requisito obrigatório)
         legend = list(title = list(text = 'Gênero Principal')))