Atividade 12

Questão 1

Use os dados abaixo para gerar os gráficos. Para o segundo gráfico (barras), use a escala logarítmica (log = “y”) e as seguintes cores: “#E6E6E6”, “#666666”. Além disso, os gráficos podem ser organizados com a função layout(). Ver exemplos do uso da função layout() em:

https://stackoverflow.com/questions/38810854/how-to-use-layout-function-in-r e https://bookdown.org/ndphillips/YaRrr/arranging-plots-with-parmfrow-and-layout.html.

Carregar 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)

x_axis_requests <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)
# Definir limites do eixo Y com base no valor máximo
ylim_max <- max(MRT_1F) # 517.14
ylim_min <- 0

Plot do gráfico 1

# Plotar a primeira linha (1 Fog)
plot(x_axis_requests, MRT_1F,
     type = "o",             # 'o' para pontos e linhas (overplotted)
     col = "gray40",         # Cor da linha
     pch = 4,                # Símbolo 'x' (conforme legenda da imagem)
     ylim = c(ylim_min, ylim_max + 50), # Limites do eixo Y (0 a ~570)
     xlab = "Time between Things requests (seconds)",
     ylab = "Response Time (sec.)",
     main = "Response Time vs. Request Frequency")

# Adicionar as outras linhas ao gráfico
lines(x_axis_requests, MRT_3F, type="o", col="red", pch=25)
lines(x_axis_requests, MRT_5F, type="o", col="darkgoldenrod", pch=23) # (Usando 'darkgoldenrod' pois 'yellow' é muito claro)
lines(x_axis_requests, MRT_10F, type="o", col="blue", pch=24)
lines(x_axis_requests, MRT_15F, type="o", col="purple", pch=8)
lines(x_axis_requests, MRT_sem_F, type="o", col="darkgreen", pch=1)

legend("topright",
       legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
       col = c("gray40", "red", "darkgoldenrod", "blue", "purple", "darkgreen"),
       pch = c(4, 25, 23, 24, 8, 1), # Símbolos correspondentes
       lty = 1,                    # Tipo de linha (sólida)
       bty = "n")                  # 'n' para sem caixa (no box)

Plot do gráfico 2

# Cores solicitadas: [w/o Fog], [Fog]
colors_bar <- c("#E6E6E6", "#666666")

# Definir o layout para 3 linhas e 2 colunas.
# O gráfico 5 (último) ocupará as duas colunas da linha inferior.
layout(matrix(c(1, 2, 3, 4, 5, 5), nrow = 3, ncol = 2, byrow = TRUE))

# Ajustar margens para dar espaço aos rótulos (bottom, left, top, right)
par(mar = c(4.5, 5.0, 3.0, 1.5))

# --- Plot 1: 1 Fog ---
data_1F <- rbind(MRT_sem_F, MRT_1F)
# Definir limite Y dinamicamente baseado nos dados deste gráfico
ylim_1F <- c(0.1, max(data_1F, na.rm = TRUE) * 1.2)
barplot(data_1F,
        beside = TRUE,
        log = "y",              # Escala logarítmica (requisito)
        col = colors_bar,       # Cores (requisito)
        names.arg = x_axis_requests,
        ylim = ylim_1F,
        xlab = "Time between Things requests",
        ylab = "Response time (s) [log scale]",
        main = "Comparison: w/o Fog vs 1 Fog")
legend("topright", legend = c("w/o Fog", "1 Fog"), fill = colors_bar, bty = "n")

# --- Plot 2: 3 Fogs ---
data_3F <- rbind(MRT_sem_F, MRT_3F)
ylim_3F <- c(0.1, max(data_3F, na.rm = TRUE) * 1.2)
barplot(data_3F,
        beside = TRUE,
        log = "y",
        col = colors_bar,
        names.arg = x_axis_requests,
        ylim = ylim_3F,
        xlab = "Time between Things requests",
        ylab = "Response time (s) [log scale]",
        main = "Comparison: w/o Fog vs 3 Fogs")
legend("topright", legend = c("w/o Fog", "3 Fogs"), fill = colors_bar, bty = "n")

# --- Plot 3: 5 Fogs ---
data_5F <- rbind(MRT_sem_F, MRT_5F)
ylim_5F <- c(0.1, max(data_5F, na.rm = TRUE) * 1.2)
barplot(data_5F,
        beside = TRUE,
        log = "y",
        col = colors_bar,
        names.arg = x_axis_requests,
        ylim = ylim_5F,
        xlab = "Time between Things requests",
        ylab = "Response time (s) [log scale]",
        main = "Comparison: w/o Fog vs 5 Fogs")
legend("topright", legend = c("w/o Fog", "5 Fogs"), fill = colors_bar, bty = "n")

# --- Plot 4: 10 Fogs ---
data_10F <- rbind(MRT_sem_F, MRT_10F)
ylim_10F <- c(0.1, max(data_10F, na.rm = TRUE) * 1.2)
barplot(data_10F,
        beside = TRUE,
        log = "y",
        col = colors_bar,
        names.arg = x_axis_requests,
        ylim = ylim_10F,
        xlab = "Time between Things requests",
        ylab = "Response time (s) [log scale]",
        main = "Comparison: w/o Fog vs 10 Fogs")
legend("topright", legend = c("w/o Fog", "10 Fogs"), fill = colors_bar, bty = "n")

# --- Plot 5: 15 Fogs ---
data_15F <- rbind(MRT_sem_F, MRT_15F)
ylim_15F <- c(0.1, max(data_15F, na.rm = TRUE) * 1.2)
barplot(data_15F,
        beside = TRUE,
        log = "y",
        col = colors_bar,
        names.arg = x_axis_requests,
        ylim = ylim_15F,
        xlab = "Time between Things requests",
        ylab = "Response time (s) [log scale]",
        main = "Comparison: w/o Fog vs 15 Fogs")
legend("topright", legend = c("w/o Fog", "15 Fogs"), fill = colors_bar, bty = "n")

Questão 2

Para a tabela abaixo que classifica a qualidade de refeição de acordo com categorias de preços crie um gráfico de barras empilhadas. Também adicione título, nomes de eixos e legenda.

Preparação dos dados

# Carregar os pacotes necessários
library(ggplot2)
library(scales) # Para formatar o eixo Y como porcentagem

# --- 1. Preparação dos Dados ---
# Precisamos recriar a tabela no formato "longo" (tidy)

meal_data <- data.frame(
  # Coluna de Preço: repetimos cada faixa de preço 3x (uma para cada classificação)
  MealPrice = c(
    rep("$10–19", 3), rep("$20–29", 3), rep("$30–39", 3), rep("$40–49", 3)
  ),
  # Coluna de Classificação: repetimos a sequência para cada faixa de preço
  QualityRating = c(
    "Good", "Very Good", "Excellent",
    "Good", "Very Good", "Excellent",
    "Good", "Very Good", "Excellent",
    "Good", "Very Good", "Excellent"
  ),
  # Coluna de Porcentagem: inserimos os valores da tabela
  Percentage = c(
    53.8, 43.6, 2.6,  # Valores para $10-19
    33.9, 54.2, 11.9, # Valores para $20-29
    2.6, 60.5, 36.8,  # Valores para $30-39
    0.0, 21.4, 78.6   # Valores para $40-49
  )
)

# --- 2. Ordenação dos Fatores ---
# Garantir que o R plote as categorias na ordem correta, e não em ordem alfabética

# Definir a ordem correta para o eixo X
price_levels <- c("$10–19", "$20–29", "$30–39", "$40–49")

# Definir a ordem correta para o empilhamento (Good na base, Excellent no topo)
quality_levels <- c("Good", "Very Good", "Excellent")

# Aplicar os níveis aos fatores
meal_data$MealPrice <- factor(meal_data$MealPrice, levels = price_levels)
meal_data$QualityRating <- factor(meal_data$QualityRating, levels = quality_levels)

Gráfico

# --- 3. Criação do Gráfico ---
# O 'echo=FALSE' neste chunk esconde o código de plotagem, mostrando apenas o gráfico.

ggplot(meal_data, aes(x = MealPrice, y = Percentage, fill = QualityRating)) +
  # geom_col() é usado para barras onde a altura já é um valor (nossa coluna Percentage)
  geom_col(position = "stack") + 
  
  # --- 4. Títulos, Eixos e Legenda ---
  labs(
    title = "Relação entre Preço da Refeição e Classificação de Qualidade",
    subtitle = "Distribuição % da classificação por faixa de preço",
    x = "Faixa de Preço da Refeição (USD)",
    y = "Porcentagem Total (%)",
    fill = "Classificação:" # Este é o título da legenda
  ) +
  
  # Formata o eixo Y para mostrar "50%" em vez de "50"
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +
  
  # Aplica um tema visual limpo
  theme_minimal() +
  
  # Melhora a posição da legenda
  theme(legend.position = "bottom")

Questão 3

Faça o histograma das temperaturas do mês de maio do dataset airquality. No entanto, primeiro converta as temperaturas para graus Celsius através da expressão °C = (°F − 32) / 1.8. Após isso, gere o histograma. Também adicione título, nomes de eixos, cor e curva de densidade.

# 1. Filtrar os dados para o mês de Maio (Month == 5)
# O dataset 'airquality' já vem carregado no R
dados_maio <- subset(airquality, Month == 5)

# 2. Extrair a coluna de Temperatura (em Fahrenheit) de Maio
# (Neste dataset específico, não há NAs na temperatura em Maio)
temp_f <- dados_maio$Temp

# 3. Converter as temperaturas de Fahrenheit para Celsius
# Fórmula: °C = (°F - 32) / 1.8
temp_c <- (temp_f - 32) / 1.8

# 4. Gerar o histograma
# Usamos 'freq = FALSE' (ou 'prob = TRUE') para que o eixo Y
# represente a densidade, permitindo sobrepor a curva de densidade.

hist(temp_c,
     freq = FALSE,
     main = "Histograma da Temperatura em Maio (Celsius)", # Título
     xlab = "Temperatura (°C)",                          # Rótulo Eixo X
     ylab = "Densidade",                                 # Rótulo Eixo Y
     col = "lightblue",                                  # Cor das barras
     border = "gray")                                    # Cor da borda das barras

# 5. Adicionar a curva de densidade
# 'lwd = 2' torna a linha um pouco mais espessa
lines(density(temp_c), col = "red", lwd = 2)

Questão 4

Crie um gráfico de pizza com a porcentagem da tabela total de vendas por país. Use o dataset abaixo. Inclua a porcentagem de cada fatia, as cores das fatias e o nome do gráfico. Adicionalmente, use o comando legend() para incluir a legenda do gráfico.

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

Questão 5

Utilize os dados de contagens de insetos em unidades experimentais agrícolas tratados com inseticidas diferentes disponíveis no R em InsectSprays e construa um boxplot sem a presença dos outliers para os 6 tipos de inseticidas. Coloque título e nomes de eixos adequados. Além disso, as caixas devem ser preenchidas com a cor “yellow”.

# Gerar o boxplot
boxplot(count ~ spray, 
        data = InsectSprays,
        main = "Eficácia de Inseticidas: Contagem de Insetos",
        xlab = "Tipo de Inseticida (Spray)",
        ylab = "Número de Insetos Contados",
        col = "yellow",
        outline = FALSE) # Este argumento remove a exibição dos outliers

Questão 6

Processamento dos dados

# 1. Definir a função de pré-processamento de dados
process_monitoring_data <- function(df) {
  
  # --- Processamento de Tempo (currentTime) ---
  
  # Converter a coluna de string para o formato POSIXct (data/hora)
  df$currentTime <- as.POSIXct(df$currentTime)
  
  # Calcular o tempo decorrido em horas
  # Encontrar o tempo inicial (primeiro registro)
  start_time <- min(df$currentTime, na.rm = TRUE)
  
  # Calcular a diferença em horas e converter para numérico
  df$timeElapsed_hours <- as.numeric(
    difftime(df$currentTime, start_time, units = "hours")
  )
  
  # --- Processamento de Memória (usedMemory) ---
  
  # Extrair o valor numérico usando regex
  # sub("([0-9.]+).*", "\\1", "247.09MB") -> "247.09"
  values <- as.numeric(sub("([0-9.]+).*", "\\1", df$usedMemory))
  
  # Extrair a unidade usando regex
  # sub("[0-9.]+(.*)", "\\1", "247.09MB") -> "MB"
  units <- sub("[0-9.]+(.*)", "\\1", df$usedMemory)
  
  # Converter tudo para Megabytes (MB) com base nas regras fornecidas
  # 1 TB = 1.000.000 MB
  # 1 GB = 1024 MB
  # 1 KB = 1/1024 MB
  # 1 B  = 1/(1024*1024) MB
  
  df$usedMemory_MB <- ifelse(units == "GB", values * 1024,
                        ifelse(units == "TB", values * 1000000,
                           ifelse(units == "KB", values / 1024,
                              ifelse(units == "B", values / (1024 * 1024),
                                 values # O padrão já é MB
                              )
                           )
                        )
                      )
  
  return(df)
}

Carregando os dados

# 2. Carregar e processar os quatro arquivos CSV
df_0.1 <- process_monitoring_data(read.csv("monitoringCloudData_0.1.csv"))
df_0.5 <- process_monitoring_data(read.csv("monitoringCloudData_0.5.csv"))
df_1 <- process_monitoring_data(read.csv("monitoringCloudData_1.csv"))
df_NONE <- process_monitoring_data(read.csv("monitoringCloudData_NONE.csv"))

Configurando o layout

# layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
# | 1 | 2 |
# | 3 | 4 |
layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
par(mar = c(4.1, 4.1, 3.1, 1.1)) # Ajustar margens (bottom, left, top, right)

Gerar gráficos

common_xlab <- "Tempo Decorrido (horas)"
common_ylab <- "Memória Usada (MB)"

# Gráfico 1: 0.1
plot(df_0.1$timeElapsed_hours, df_0.1$usedMemory_MB, 
     type = 'l', # 'l' para gráfico de linha
     col = "blue",
     main = "Monitoramento 0.1",
     xlab = common_xlab,
     ylab = common_ylab)

# Gráfico 2: 0.5
plot(df_0.5$timeElapsed_hours, df_0.5$usedMemory_MB, 
     type = 'l', 
     col = "red",
     main = "Monitoramento 0.5",
     xlab = common_xlab,
     ylab = common_ylab)

# Gráfico 3: 1
plot(df_1$timeElapsed_hours, df_1$usedMemory_MB, 
     type = 'l', 
     col = "darkgreen",
     main = "Monitoramento 1",
     xlab = common_xlab,
     ylab = common_ylab)

# Gráfico 4: NONE
plot(df_NONE$timeElapsed_hours, df_NONE$usedMemory_MB, 
     type = 'l', 
     col = "purple",
     main = "Monitoramento NONE",
     xlab = common_xlab,
     ylab = common_ylab)

Questão 7

Para os exercícios a seguir utilizaremos o dataset Netflix Movies and TV Shows. Essa base de dados reúne os filmes e séries disponíveis na Netflix em 2019, e se divide em algumas colunas que descrevem o tipo do conteúdo (série ou filme), o país de origem, o ano de lançamento, o gênero, entre outros.

Filtrando os conteúdos com apenas UM país de origem (coluna “country”), utilize o Plotly para obter um gráfico de pizza dos 10 países com mais conteúdo na plataforma.

library(readr)
## 
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
## 
##     col_factor
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

Processamento de Dados

netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl  (1): release_year
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Filtrar, Contar e Selecionar os Top 10
top_10_countries <- netflix_data %>%
  # Remover linhas onde o país é nulo (NA)
  filter(!is.na(country)) %>%
  # Filtrar para incluir apenas linhas SEM vírgula na coluna 'country'
  # Isso garante que apenas conteúdos com um único país de origem sejam contados
  filter(!grepl(",", country)) %>%
  # Contar as ocorrências de cada país e ordenar em ordem decrescente
  count(country, sort = TRUE, name = "count") %>%
  # Pegar apenas as 10 primeiras linhas (os 10 principais)
  slice_head(n = 10)

# Exibir os dados processados (opcional)
print(top_10_countries)
## # A tibble: 10 × 2
##    country        count
##    <chr>          <int>
##  1 United States   2555
##  2 India            923
##  3 United Kingdom   397
##  4 Japan            226
##  5 South Korea      183
##  6 Canada           177
##  7 Spain            134
##  8 France           115
##  9 Egypt            101
## 10 Mexico           100

Gerar Gráfico

fig <- plot_ly(
    data = top_10_countries,
    labels = ~country,     # Coluna para os rótulos das fatias
    values = ~count,       # Coluna para os valores (tamanho) das fatias
    type = 'pie',          # Tipo de gráfico
    textposition = 'inside', # Posição do texto (inside, outside)
    textinfo = 'percent+label', # Mostrar porcentagem e o rótulo
    hoverinfo = 'text',    # Informação ao passar o mouse
    text = ~paste(count, "títulos"), # Texto customizado para o hover
    marker = list(line = list(color = '#FFFFFF', width = 1)) # Linha branca entre as fatias
)
  
# 4. Adicionar layout e título
fig <- fig %>% layout(
  title = "Top 10 Países com Mais Conteúdo na Netflix (Origem Única)",
  # Esconder eixos que não são necessários para gráficos de pizza
  xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
  yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE)
)

# 5. Exibir o gráfico
fig

Questão 8

Processamento de dados

netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl  (1): release_year
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Filtrar, Contar e Selecionar os Top 10
top_10_countries <- netflix_data %>%
  filter(!is.na(country)) %>%
  filter(!grepl(",", country)) %>%
  count(country, sort = TRUE, name = "count") %>%
  slice_head(n = 10)

Gerar gráfico

# --- Visualização: Tabela com Plotly ---

fig <- plot_ly(
  type = 'table', # Define o tipo de gráfico como 'tabela'
  
# --- Estilização do Cabeçalho ---
header = list(
  # Define os nomes das colunas
  values = c("<b>País</b>", "<b>Total de conteúdos</b>"),
  # Alinhamento do texto
  align = "center",
  # Cor de preenchimento (fundo)
  fill = list(color = "grey"),
  # Estilo da fonte
  font = list(color = "white", size = 12)
),
  
  # --- Estilização das Células (Corpo da Tabela) ---
  cells = list(
    # Passa os dados das colunas
    # É importante que a ordem corresponda ao cabeçalho
    values = list(top_10_countries$country, top_10_countries$count),
    # Alinhamento do texto
    align = "center",
    # Cor de preenchimento (vamos usar um cinza claro para linhas alternadas)
    fill = list(color = c("#F5F5F5", "white")),
    font = list(size = 12)
  )
)

# Adiciona um título ao layout
fig <- fig %>% layout(
  title = "Top 10 Países com Mais Conteúdo na Netflix (Origem Única)"
)

# Exibe a tabela
fig

Questão 9

Processamento de dados

# 1. Carregar o conjunto de dados
netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl  (1): release_year
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Processar os dados
content_by_decade <- netflix_data %>%
  # Remove linhas onde o ano de lançamento é nulo
  filter(!is.na(release_year)) %>%
  # 3. Criar a coluna da década
  # Esta fórmula agrupa os anos (ex: 1995 -> 1990, 2003 -> 2000)
  mutate(decade_start = floor(release_year / 10) * 10) %>%
  
  # 4. Contar o conteúdo por década e tipo
  count(decade_start, type, name = "count") %>%
  
  # Criar um rótulo amigável para a década (ex: "1990s")
  mutate(decade_label = paste0(decade_start, "s")) %>%

  mutate(tipo_traduzido = ifelse(type == "Movie", "Filmes", "Séries"))

Gerar gráfico

fig <- plot_ly(
    data = content_by_decade,
    x = ~decade_label,            # Eixo X: Rótulo da década
    y = ~count,                   # Eixo Y: Quantidade
    color = ~tipo_traduzido,      # Agrupar linhas por tipo (Filmes, Séries)
    
    # Define as cores específicas para cada grupo
    colors = c("Filmes" = "gold", "Séries" = "blue"), 
    
    type = 'scatter',             # Tipo de gráfico
    mode = 'lines+markers',       # Modo: linhas E pontos (marcadores)
    
    # Configurar os marcadores (pontos)
    marker = list(size = 8, opacity = 0.8),
    
    # Configurar o texto do hover
    hoverinfo = 'text',
    text = ~paste0(
      "<b>", tipo_traduzido, "</b><br>",
      "Década: ", decade_label, "<br>",
      "Total: ", count
    )
  )

# 7. Adicionar layout e títulos
fig <- fig %>% layout(
  title = "Quantidade de Conteúdo Netflix por Década de Lançamento",
  xaxis = list(
    title = "Década de Lançamento",
    # Ordena o eixo X categoricamente pela ordem dos dados (já ordenados)
    # Isso evita que "2000s" venha antes de "1990s" se houver falhas
    categoryorder = "array",
    categoryarray = ~decade_label
  ),
  yaxis = list(title = "Quantidade de Conteúdos"),
  hovermode = "x unified" # Melhora a experiência do hover
)

# 8. Exibir o gráfico
fig

Questão 10

Processamento dos dados

# 1. Carregar o conjunto de dados
netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl  (1): release_year
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Preparar os dados para o gráfico
genre_data_by_year <- netflix_data %>%
  # Filtrar por tipo (apenas filmes) e pelo intervalo de anos
  filter(type == "Movie") %>%
  filter(release_year >= 2000 & release_year <= 2010) %>%
  
  # Remover linhas onde o gênero (listed_in) é nulo
  filter(!is.na(listed_in)) %>%
  
  # 3. Extrair APENAS o primeiro gênero
  # A função sub() substitui a primeira vírgula e tudo depois dela por nada
  mutate(primary_genre = sub(",.*", "", listed_in)) %>%
  
  # 4. Filtrar APENAS para os três gêneros de interesse
  filter(primary_genre %in% c("Dramas", "Action & Adventure", "Comedies")) %>%
  
  # 5. Agrupar e contar por ano e gênero
  count(release_year, primary_genre, name = "count") %>%
  
  # Converter o ano em fator para que o Plotly o trate como categoria
  # Isso garante que todos os anos sejam mostrados corretamente no eixo X
  mutate(year_factor = as.factor(release_year))

Gerar Gráfico

fig <- plot_ly(
    data = genre_data_by_year,
    x = ~year_factor,         # Eixo X: O ano (como categoria)
    y = ~count,               # Eixo Y: A contagem
    color = ~primary_genre,   # Agrupar/colorir por gênero
    type = 'bar',             # Tipo de gráfico
    
    # Configurar o texto do hover
    hoverinfo = 'text',
    text = ~paste0(
      "<b>", primary_genre, "</b><br>",
      "Ano: ", release_year, "<br>",
      "Total: ", count
    )
  )
  
# 7. Adicionar layout e títulos
fig <- fig %>% layout(
  title = "Filmes Lançados por Gênero e Ano (2000-2010)",
  xaxis = list(title = "Ano de Lançamento"),
  yaxis = list(title = "Quantidade de Filmes"),
  
  # Esta é a configuração chave para barras "lado-a-lado"
  barmode = 'group',
  
  # Adiciona um título à legenda
  legend = list(title = list(text = "<b>Gênero</b>"))
)

# 8. Exibir o gráfico
fig