Crescimento, geografia e padrões do catálogo, antes e durante a pandemia de COVID-19.
A Netflix é uma das maiores plataformas de streaming do mundo, com mais de 200 milhões de assinantes e presença em mais de 190 países. Seu catálogo cresce continuamente e reflete decisões estratégicas de mercado, preferências de consumo e o impacto de eventos globais. Entender como esse catálogo foi construído ao longo do tempo não é trivial: o volume de conteúdo, a origem geográfica e a composição por gênero revelam prioridades da empresa que raramente estão explícitas em seus comunicados oficiais.
Este projeto analisa a evolução do catálogo da Netflix entre 2008 e 2021. A questão central é direta: a pandemia de COVID-19 de fato acelerou a expansão do catálogo, como seria natural esperar dado o aumento do consumo doméstico de streaming? Além disso, buscamos entender como a distribuição geográfica do conteúdo mudou, quais gêneros dominam e qual é o espaço do Brasil dentro dessa plataforma global.
Esse tema interessa tanto a pesquisadores de comunicação e mídia quanto a profissionais da indústria audiovisual. Para quem produz conteúdo, entender o catálogo da maior plataforma de streaming do mundo é entender onde há espaço para crescer.
1.2 — Dados utilizados e abordagem geralSerá utilizado o conjunto de dados Netflix Movies and TV
Shows, disponível publicamente no Kaggle
(link
do dataset), com base no arquivo netflix_titles.csv. A
base contém 8.807 registros e 12 variáveis, cobrindo títulos adicionados
à plataforma de 2008 a 2021.
A abordagem é quantitativa e exploratória: os dados serão importados, limpos e transformados antes de qualquer análise. Variáveis de texto com múltiplos valores serão separadas para permitir contagens por país e gênero. Novas variáveis serão criadas para enriquecer a análise. Por fim, visualizações interativas serão usadas para tornar os padrões visíveis.
1.3 — Técnica e metodologia detalhadaA análise segue quatro eixos, cada um respondendo a uma pergunta específica:
As técnicas empregadas incluem: separação de variáveis multivaloradas
com separate_rows(), criação de variáveis derivadas com
mutate() e case_when(), agregações com
count() e group_by(), e visualização
interativa com plotly.
Esta análise tem utilidade prática para três perfis de leitores. Produtores e realizadores audiovisuais podem identificar quais gêneros e formatos têm mais espaço na plataforma, orientando decisões de desenvolvimento de projetos. Pesquisadores de mídia e comunicação encontram aqui evidências sobre como plataformas globais estruturam seus catálogos e como eventos externos como uma pandemia afetam essa estrutura. Estudantes e profissionais de dados podem usar este trabalho como referência de análise exploratória com dados reais, sujos e não normalizados, exatamente o tipo de dado encontrado no mercado.
Os pacotes abaixo são carregados no início do relatório para que qualquer leitor saiba exatamente o que instalar antes de tentar reproduzir a análise.
2.2 — Finalidade de cada pacote explicada| Pacote | Categoria | Finalidade neste projeto |
|---|---|---|
| tidyverse | meta-pacote | Carrega em conjunto dplyr (manipulação), tidyr (reestruturação), ggplot2 (visualização estática) e readr (importação). Base de toda a análise. |
| lubridate | datas | Converte a coluna date_added, que está em texto no formato americano ("September 25, 2021"), para o tipo Date do R. Extrai ano e mês como variáveis separadas. |
| plotly | visualização interativa | Gera gráficos HTML interativos com zoom, tooltip ao passar o mouse e filtros por clique na legenda — sem necessidade de Shiny. |
| DT | tabelas interativas | Renderiza data frames como tabelas HTML com busca por texto, ordenação por coluna, paginação e filtros por coluna. |
| stringr | texto | Manipula strings: remove espaços extras com str_trim() e permite separar valores múltiplos em colunas como country e listed_in. |
| scales | formatação | Formata rótulos de eixos em gráficos, como separadores de milhar e porcentagens legíveis. |
| knitr | relatório | Integra código R ao documento e gera tabelas estáticas formatadas com kable(). |
library(tidyverse) # dplyr, tidyr, readr, ggplot2 e outros
library(lubridate) # conversão e extração de componentes de datas
library(plotly) # gráficos interativos em HTML
library(DT) # tabelas HTML interativas
library(stringr) # manipulação e limpeza de strings
library(scales) # formatação de eixos e rótulos
library(knitr) # geração do relatório e kable()Os dados foram obtidos do Kaggle: Netflix Movies and TV Shows, compilado por Shivam Bansal.
3.2 — Dados da fonte explicados minuciosamenteO dataset tem como propósito original catalogar os títulos disponíveis na plataforma Netflix para análise pública. Foi coletado via web scraping da interface da Netflix e atualizado pela última vez em 2021. Em sua forma original, contém 8.807 linhas e 12 colunas, cada linha representando um título único.
Peculiaridades importantes dos dados brutos:
date_added para
Date: a coluna chegou como texto; sem converter para Date o R
não consegue extrair ano nem mês, tornando qualquer análise temporal
impossível.
year_added e
month_added: extraímos ano e mês como variáveis
separadas para evitar repetir o parse em cada análise temporal e
facilitar agrupamentos.
duration: a
coluna mistura “90 min” e “2 Seasons” — parse_number()
extrai apenas o número, permitindo comparações dentro de cada tipo de
conteúdo.
country e listed_in têm espaços antes e depois
das vírgulas (ex: “United States”), o que causaria duplicatas nas
contagens após separação.
audience: o rating
americano (TV-MA, PG-13, R…) é pouco intuitivo para o público
brasileiro. Agrupamos em quatro categorias de público reconhecíveis,
criando uma nova variável a partir de uma existente e aplicando
engenharia de variáveis.
netflix <- read_csv("./data/netflix_titles.csv")
# Verificar estrutura antes de qualquer transformação
glimpse(netflix)## Rows: 8,807
## Columns: 12
## $ show_id <chr> "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s1…
## $ type <chr> "Movie", "TV Show", "TV Show", "TV Show", "TV Show", "TV …
## $ title <chr> "Dick Johnson Is Dead", "Blood & Water", "Ganglands", "Ja…
## $ director <chr> "Kirsten Johnson", NA, "Julien Leclercq", NA, NA, "Mike F…
## $ cast <chr> NA, "Ama Qamata, Khosi Ngema, Gail Mabalane, Thabang Mola…
## $ country <chr> "United States", "South Africa", NA, NA, "India", NA, NA,…
## $ date_added <chr> "September 25, 2021", "September 24, 2021", "September 24…
## $ release_year <dbl> 2020, 2021, 2021, 2021, 2021, 2021, 2021, 1993, 2021, 202…
## $ rating <chr> "PG-13", "TV-MA", "TV-MA", "TV-MA", "TV-MA", "TV-MA", "PG…
## $ duration <chr> "90 min", "2 Seasons", "1 Season", "1 Season", "2 Seasons…
## $ listed_in <chr> "Documentaries", "International TV Shows, TV Dramas, TV M…
## $ description <chr> "As her father nears the end of his life, filmmaker Kirst…
3.2 — Dicionário de dados original
| Variável | Tipo original | Descrição |
|---|---|---|
| show_id | character | Identificador único de cada título no dataset |
| type | character | "Movie" (filme) ou "TV Show" (série) |
| title | character | Nome do título |
| director | character | Diretor — ausente em ~30% dos registros |
| cast | character | Elenco separado por vírgula — ausente em ~10% |
| country | character | País(es) de produção separados por vírgula — ausente em ~10% |
| date_added | character | Data de adição ao catálogo em texto americano — ausente em ~1% |
| release_year | integer | Ano de lançamento original do título |
| rating | character | Classificação indicativa no padrão americano |
| duration | character | Duração em minutos (filmes) ou número de temporadas (séries) — unidades misturadas |
| listed_in | character | Gêneros separados por vírgula — múltiplos valores por célula |
| description | character | Sinopse curta do título |
# Limitado a 200 linhas conforme requisito 3.4
netflix %>%
select(type, title, country, date_added, rating, listed_in) %>%
head(200) %>%
datatable(
options = list(
pageLength = 10, scrollX = TRUE,
language = list(
search = "Buscar:",
info = "Mostrando _START_ a _END_ de _TOTAL_ registros",
paginate = list(`next` = "Próx.", previous = "Ant.")
)
),
rownames = FALSE,
colnames = c("Tipo", "Título", "País", "Adicionado em", "Rating", "Gêneros")
)As transformações seguem uma ordem lógica: primeiro corrigimos tipos de dados incorretos, depois padronizamos o texto, e por último criamos variáveis derivadas que enriquecerão a análise.
netflix <- netflix %>%
mutate(
# Passo 1: converte texto "September 25, 2021" para Date
date_added = mdy(date_added),
# Passo 2: extrai ano e mês como variáveis separadas
year_added = year(date_added),
month_added = month(date_added, label = TRUE, abbr = TRUE),
# Passo 3: extrai apenas o número de "90 min" ou "2 Seasons"
duration_value = parse_number(duration),
# Passo 4: remove espaços extras para evitar duplicatas na separação
listed_in = str_trim(listed_in),
country = str_trim(country),
# Passo 5: agrupa ratings americanos em categorias de público em pt-br
audience = case_when(
rating %in% c("TV-Y", "TV-Y7", "G") ~ "Infantil",
rating %in% c("PG", "TV-PG") ~ "Família",
rating %in% c("PG-13", "TV-14") ~ "Adolescente",
rating %in% c("TV-MA", "R", "NC-17") ~ "Adulto",
TRUE ~ "Não classificado"
)
)tibble(
Variável = c("type", "title", "country", "date_added",
"release_year", "rating", "duration",
"listed_in", "year_added", "audience"),
Tipo = c("character", "character", "character", "Date",
"integer", "character", "character",
"character", "integer (derivada)", "character (derivada)"),
`Valores distintos` = c(
n_distinct(netflix$type),
n_distinct(netflix$title),
n_distinct(netflix$country, na.rm = TRUE),
n_distinct(netflix$date_added, na.rm = TRUE),
n_distinct(netflix$release_year),
n_distinct(netflix$rating, na.rm = TRUE),
n_distinct(netflix$duration),
n_distinct(netflix$listed_in),
n_distinct(netflix$year_added, na.rm = TRUE),
n_distinct(netflix$audience)
),
`Ausentes` = c(
sum(is.na(netflix$type)),
sum(is.na(netflix$title)),
sum(is.na(netflix$country)),
sum(is.na(netflix$date_added)),
sum(is.na(netflix$release_year)),
sum(is.na(netflix$rating)),
sum(is.na(netflix$duration)),
sum(is.na(netflix$listed_in)),
sum(is.na(netflix$year_added)),
sum(is.na(netflix$audience))
)
) %>%
kable(align = c("l", "l", "r", "r"))| Variável | Tipo | Valores distintos | Ausentes |
|---|---|---|---|
| type | character | 2 | 0 |
| title | character | 8807 | 0 |
| country | character | 748 | 831 |
| date_added | Date | 1714 | 10 |
| release_year | integer | 74 | 0 |
| rating | character | 17 | 4 |
| duration | character | 221 | 3 |
| listed_in | character | 514 | 0 |
| year_added | integer (derivada) | 14 | 10 |
| audience | character (derivada) | 5 | 0 |
O conjunto limpo mantém 8807 títulos. Foram criadas duas variáveis
derivadas: year_added e audience. A variável
date_added foi convertida de texto para Date.
country e listed_in permanecem como texto
multivalorado, a separação ocorre por demanda em cada análise para não
duplicar linhas desnecessariamente no dataset principal.
Para facilitar as análises e evitar repetição de código, criamos
subconjuntos a partir dos dados limpos. Variáveis com múltiplos valores
por célula (country, listed_in) são separadas
aqui com separate_rows(), gerando um registro por valor,
técnica que permite contagens corretas por país e por gênero.
# 1. Títulos por ano e tipo — base para análise de crescimento temporal
por_ano <- netflix %>%
filter(!is.na(year_added), year_added >= 2010) %>%
count(year_added, type) %>%
mutate(type_label = ifelse(type == "Movie", "Filme", "Série"))
# 2. Títulos por mês — base para análise de sazonalidade
por_mes <- netflix %>%
filter(!is.na(month_added)) %>%
count(month_added) %>%
arrange(month_added)
# 3. Títulos por público-alvo — usa a variável derivada audience
por_audience <- netflix %>%
count(audience) %>%
arrange(desc(n))
# 4. Proporção entre filmes e séries
por_tipo <- netflix %>%
count(type) %>%
mutate(label = ifelse(type == "Movie", "Filme", "Série"))
# 5. Top 15 países: separate_rows() expande países múltiplos em linhas individuais
# Vetor nomeado para tradução dos países mais frequentes
paises_labels <- c(
"United States" = "Estados Unidos", "India" = "Índia",
"United Kingdom" = "Reino Unido", "Canada" = "Canadá",
"France" = "França", "Japan" = "Japão",
"South Korea" = "Coreia do Sul", "Spain" = "Espanha",
"Mexico" = "México", "Australia" = "Austrália",
"Germany" = "Alemanha", "Turkey" = "Turquia",
"Egypt" = "Egito", "Nigeria" = "Nigéria",
"Brazil" = "Brasil"
)
top_paises <- netflix %>%
separate_rows(country, sep = ",") %>%
mutate(country = str_trim(country)) %>%
filter(!is.na(country), country != "") %>%
count(country, sort = TRUE) %>%
slice_head(n = 15) %>%
mutate(country_pt = ifelse(
country %in% names(paises_labels), paises_labels[country], country
))
# 6. Crescimento de seis países ao longo do tempo (2015–2021)
paises_sel <- c("United States", "India", "United Kingdom",
"Japan", "South Korea", "Brazil")
paises_tempo <- netflix %>%
separate_rows(country, sep = ",") %>%
mutate(country = str_trim(country)) %>%
filter(country %in% paises_sel, !is.na(year_added), year_added >= 2015) %>%
count(year_added, country) %>%
mutate(country_pt = paises_labels[country])
# 7. Top 15 gêneros: separate_rows() expande gêneros múltiplos em linhas individuais
top_generos <- netflix %>%
separate_rows(listed_in, sep = ",") %>%
mutate(listed_in = str_trim(listed_in)) %>%
count(listed_in, sort = TRUE) %>%
slice_head(n = 15)
# 8. Top 8 gêneros por tipo (filmes x séries) — para comparação direta
generos_tipo <- netflix %>%
separate_rows(listed_in, sep = ",") %>%
mutate(listed_in = str_trim(listed_in)) %>%
count(type, listed_in, sort = TRUE) %>%
group_by(type) %>%
slice_head(n = 8) %>%
ungroup()
# 9. Subconjunto filtrado: apenas títulos com Brasil como país de produção
brasil <- netflix %>%
separate_rows(country, sep = ",") %>%
mutate(country = str_trim(country)) %>%
filter(country == "Brazil") %>%
select(type, title, year_added, audience, listed_in, rating) %>%
arrange(desc(year_added))
# 10. Crescimento brasileiro por ano e tipo
brasil_ano <- brasil %>%
filter(!is.na(year_added)) %>%
count(year_added, type) %>%
mutate(type_label = ifelse(type == "Movie", "Filme", "Série"))
# 11. Gêneros do conteúdo brasileiro
brasil_generos <- brasil %>%
separate_rows(listed_in, sep = ",") %>%
mutate(listed_in = str_trim(listed_in)) %>%
count(listed_in, sort = TRUE) %>%
slice_head(n = 10)A seguir, uma visão tabular dos principais subconjuntos:
por_ano %>%
pivot_wider(names_from = type_label, values_from = n, values_fill = 0) %>%
rename(Ano = year_added) %>%
kable(align = "r")| Ano | type | Filme | Série |
|---|---|---|---|
| 2010 | Movie | 1 | 0 |
| 2011 | Movie | 13 | 0 |
| 2012 | Movie | 3 | 0 |
| 2013 | Movie | 6 | 0 |
| 2013 | TV Show | 0 | 5 |
| 2014 | Movie | 19 | 0 |
| 2014 | TV Show | 0 | 5 |
| 2015 | Movie | 56 | 0 |
| 2015 | TV Show | 0 | 26 |
| 2016 | Movie | 253 | 0 |
| 2016 | TV Show | 0 | 176 |
| 2017 | Movie | 839 | 0 |
| 2017 | TV Show | 0 | 349 |
| 2018 | Movie | 1237 | 0 |
| 2018 | TV Show | 0 | 412 |
| 2019 | Movie | 1424 | 0 |
| 2019 | TV Show | 0 | 592 |
| 2020 | Movie | 1284 | 0 |
| 2020 | TV Show | 0 | 595 |
| 2021 | Movie | 993 | 0 |
| 2021 | TV Show | 0 | 505 |
top_paises %>%
select(country_pt, n) %>%
rename(País = country_pt, Títulos = n) %>%
kable(align = c("l", "r"))| País | Títulos |
|---|---|
| Estados Unidos | 3690 |
| Índia | 1046 |
| Reino Unido | 806 |
| Canadá | 445 |
| França | 393 |
| Japão | 318 |
| Espanha | 232 |
| Coreia do Sul | 231 |
| Alemanha | 226 |
| México | 169 |
| China | 162 |
| Austrália | 160 |
| Egito | 117 |
| Turquia | 113 |
| Hong Kong | 105 |
| Gênero | Títulos |
|---|---|
| International Movies | 2752 |
| Dramas | 2427 |
| Comedies | 1674 |
| International TV Shows | 1351 |
| Documentaries | 869 |
| Action & Adventure | 859 |
| TV Dramas | 763 |
| Independent Movies | 756 |
| Children & Family Movies | 641 |
| Romantic Movies | 616 |
| TV Comedies | 581 |
| Thrillers | 577 |
| Crime TV Shows | 470 |
| Kids’ TV | 451 |
| Docuseries | 395 |
brasil %>%
rename(Tipo = type, Título = title, Ano = year_added,
Público = audience, Gêneros = listed_in, Rating = rating) %>%
mutate(Tipo = ifelse(Tipo == "Movie", "Filme", "Série")) %>%
datatable(
options = list(
pageLength = 10, scrollX = TRUE, searchHighlight = TRUE,
language = list(
search = "Buscar:",
info = "Mostrando _START_ a _END_ de _TOTAL_ títulos",
paginate = list(`next` = "Próx.", previous = "Ant.")
)
),
rownames = FALSE,
filter = "top"
)Os gráficos estão organizados em quatro grupos, cada um respondendo a uma dimensão de análise. Após cada gráfico há uma caixa de insight explicando o que o dado revela e por que não é auto-evidente.
plot_ly(
por_ano,
x = ~year_added,
y = ~n,
color = ~type_label,
type = "bar",
colors = c("Filme" = "#E50914", "Série" = "#5a0a0a"),
hovertemplate = "<b>%{x}</b>: %{y} títulos<extra>%{fullData.name}</extra>"
) %>%
layout(
barmode = "group",
shapes = list(list(
type = "line", x0 = 2019.5, x1 = 2019.5, y0 = 0, y1 = 1,
yref = "paper", line = list(color = "#666", width = 1.5, dash = "dot")
)),
annotations = list(list(
x = 2020, y = 0.97, yref = "paper",
text = "Pandemia (2020)", showarrow = FALSE,
font = list(color = "#888", size = 12),
xanchor = "left", yanchor = "top"
)),
title = list(text = "",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Ano", color = "#999",
tickmode = "linear", dtick = 1, gridcolor = "#1a1a1a"),
yaxis = list(title = "Quantidade adicionada", color = "#999",
gridcolor = "#1e1e1e"),
legend = list(orientation = "h", x = 0, y = 1.12,
font = list(color = "#ccc")),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
por_mes,
x = ~month_added,
y = ~n,
type = "scatter",
mode = "lines+markers",
line = list(color = "#E50914", width = 2.5),
marker = list(color = "#E50914", size = 9,
line = list(color = "#fff", width = 1.5)),
hovertemplate = "<b>%{x}</b>: %{y} títulos<extra></extra>"
) %>%
layout(
title = list(text = "Distribuição mensal de adições ao catálogo (todos os anos)",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Mês", color = "#999", gridcolor = "#1a1a1a"),
yaxis = list(title = "Títulos adicionados", color = "#999",
gridcolor = "#1e1e1e"),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
por_tipo,
labels = ~label,
values = ~n,
type = "pie",
marker = list(
colors = c("#E50914", "#5a0a0a"),
line = list(color = "#0f0f0f", width = 2)
),
textinfo = "label+percent",
hovertemplate = "%{label}: %{value} títulos (%{percent})<extra></extra>"
) %>%
layout(
title = list(text = "Proporção de filmes e séries no catálogo",
font = list(color = "#ffffff", size = 15)),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#0f0f0f",
font = list(color = "#cccccc"),
legend = list(font = list(color = "#cccccc"))
)plot_ly(
por_audience,
x = ~reorder(audience, n),
y = ~n,
type = "bar",
marker = list(
color = colorRampPalette(c("#2a0505", "#E50914"))(nrow(por_audience)),
line = list(color = "#0f0f0f", width = 1)
),
text = ~n,
textposition = "outside",
hovertemplate = "<b>%{x}</b>: %{y} títulos<extra></extra>"
) %>%
layout(
title = list(text = "Número de títulos por público-alvo",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Público-alvo", color = "#999",
categoryorder = "total ascending"),
yaxis = list(title = "Número de títulos", color = "#999",
gridcolor = "#1e1e1e"),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
top_paises,
x = ~n,
y = ~reorder(country_pt, n),
type = "bar",
orientation = "h",
marker = list(
color = colorRampPalette(c("#3a0707", "#E50914"))(15),
line = list(color = "#0f0f0f", width = 0.5)
),
text = ~n,
textposition = "outside",
hovertemplate = "<b>%{y}</b>: %{x} títulos<extra></extra>"
) %>%
layout(
title = list(text = "Os 15 países com mais títulos no catálogo",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Número de títulos", color = "#999",
gridcolor = "#1e1e1e"),
yaxis = list(title = "", color = "#ccc", automargin = TRUE),
margin = list(l = 130),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
paises_tempo,
x = ~year_added,
y = ~n,
color = ~country_pt,
type = "scatter",
mode = "lines+markers",
line = list(width = 2),
marker = list(size = 7),
hovertemplate = "<b>%{x}</b>: %{y} títulos<extra>%{fullData.name}</extra>"
) %>%
layout(
title = list(text = "Crescimento por país selecionado (2015–2021)",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Ano", color = "#999",
tickmode = "linear", dtick = 1, gridcolor = "#1a1a1a"),
yaxis = list(title = "Títulos adicionados no ano", color = "#999",
gridcolor = "#1e1e1e"),
legend = list(title = list(text = ""), font = list(color = "#ccc")),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
top_generos,
x = ~n,
y = ~reorder(listed_in, n),
type = "bar",
orientation = "h",
marker = list(
color = colorRampPalette(c("#3a0707", "#E50914"))(15),
line = list(color = "#0f0f0f", width = 0.5)
),
text = ~n,
textposition = "outside",
hovertemplate = "<b>%{y}</b>: %{x} títulos<extra></extra>"
) %>%
layout(
title = list(text = "Os 15 gêneros mais frequentes no catálogo",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Número de títulos", color = "#999",
gridcolor = "#1e1e1e"),
yaxis = list(title = "", color = "#ccc", automargin = TRUE),
margin = list(l = 200),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly() %>%
add_trace(
data = generos_tipo %>% filter(type == "Movie"),
x = ~n,
y = ~reorder(listed_in, n),
type = "bar",
orientation = "h",
name = "Filme",
marker = list(color = "#E50914"),
hovertemplate = "<b>%{y}</b>: %{x}<extra>Filme</extra>"
) %>%
add_trace(
data = generos_tipo %>% filter(type == "TV Show"),
x = ~n,
y = ~reorder(listed_in, n),
type = "bar",
orientation = "h",
name = "Série",
marker = list(color = "#5a0a0a"),
hovertemplate = "<b>%{y}</b>: %{x}<extra>Série</extra>"
) %>%
layout(
barmode = "group",
title = list(text = "Top 8 gêneros: filmes vs. séries",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Número de títulos", color = "#999",
gridcolor = "#1e1e1e"),
yaxis = list(title = "", color = "#ccc", automargin = TRUE),
margin = list(l = 200),
legend = list(font = list(color = "#ccc")),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
brasil_ano,
x = ~year_added,
y = ~n,
color = ~type_label,
type = "bar",
colors = c("Filme" = "#E50914", "Série" = "#5a0a0a"),
hovertemplate = "<b>%{x}</b>: %{y} títulos<extra>%{fullData.name}</extra>"
) %>%
layout(
barmode = "group",
title = list(text = "Títulos brasileiros adicionados por ano",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Ano", color = "#999",
tickmode = "linear", dtick = 1, gridcolor = "#1a1a1a"),
yaxis = list(title = "Quantidade", color = "#999",
gridcolor = "#1e1e1e"),
legend = list(orientation = "h", x = 0, y = 1.12,
font = list(color = "#ccc")),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)plot_ly(
brasil_generos,
x = ~n,
y = ~reorder(listed_in, n),
type = "bar",
orientation = "h",
marker = list(
color = colorRampPalette(c("#3a0707", "#E50914"))(10),
line = list(color = "#0f0f0f", width = 0.5)
),
text = ~n,
textposition = "outside",
hovertemplate = "<b>%{y}</b>: %{x} títulos<extra></extra>"
) %>%
layout(
title = list(text = "Gêneros mais frequentes no conteúdo brasileiro",
font = list(color = "#ffffff", size = 15)),
xaxis = list(title = "Número de títulos", color = "#999",
gridcolor = "#1e1e1e"),
yaxis = list(title = "", color = "#ccc", automargin = TRUE),
margin = list(l = 180),
paper_bgcolor = "#0f0f0f", plot_bgcolor = "#141414",
font = list(color = "#cccccc")
)brasil %>%
rename(Tipo = type, Título = title, Ano = year_added,
Público = audience, Gêneros = listed_in, Rating = rating) %>%
mutate(Tipo = ifelse(Tipo == "Movie", "Filme", "Série")) %>%
datatable(
options = list(
pageLength = 10, scrollX = TRUE, searchHighlight = TRUE,
language = list(
search = "Buscar:",
info = "Mostrando _START_ a _END_ de _TOTAL_ títulos",
paginate = list(`next` = "Próx.", previous = "Ant.")
)
),
rownames = FALSE,
filter = "top"
)Este trabalho analisou a evolução do catálogo da Netflix entre 2008 e 2021, buscando responder à pergunta central: a pandemia de COVID-19 acelerou a expansão do catálogo? A resposta, apoiada nos dados, é não, pelo menos não no curto prazo. O catálogo encolheu em 2020 em relação a 2019, contrariando a expectativa intuitiva.
5.2 — Como o problema foi abordadoOs dados foram obtidos do Kaggle, importados com
read_csv(), limpos e transformados com
tidyverse e lubridate. Variáveis
multivaloradas foram separadas com separate_rows() para
permitir contagens corretas. A variável audience foi criada
a partir do rating americano. Onze subconjuntos foram
gerados para evitar repetição de processamento. Todas as visualizações
são interativas (plotly) e todas as tabelas permitem busca e ordenação
(DT).
Para produtores e realizadores audiovisuais brasileiros: drama e conteúdo adulto têm mais espaço. O mercado internacional é uma rota viável, a Netflix posiciona produções brasileiras como conteúdo global, não regional. Para pesquisadores de mídia: os dados contradizem o mito do boom de catálogo durante a pandemia. O crescimento existiu em audiência, não em volume de novos títulos, uma distinção importante para entender os limites da expansão das plataformas de streaming.
5.5 — Limitações e melhorias possíveisOs dados cobrem apenas títulos disponíveis no catálogo em 2021 e não registram remoções, títulos retirados da plataforma ao longo do tempo são invisíveis nesta análise, o que subestima o volume real de conteúdo que passou pela Netflix. Não há dados de audiência, impedindo qualquer análise sobre o sucesso relativo dos títulos.
Melhorias futuras poderiam incluir: cruzamento com dados de audiência
quando disponíveis publicamente; incorporação de dados históricos de
remoções para calcular a vida útil média de um título; análise de
intervalos entre lançamento original e chegada à plataforma usando
release_year versus year_added; e análise de
sentimento das sinopses para identificar padrões temáticos além das
categorias de gênero.