NETFLIX em Números

Crescimento, geografia e padrões do catálogo, antes e durante a pandemia de COVID-19.

Lucas Matias Da Silva  ·  31/05/2026

Introdução

8.807 títulos analisados
2008 – 2021 período coberto
+ 100 países representados
1.1 — Declaração do problema e relevância

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 geral

Será 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 detalhada

A análise segue quatro eixos, cada um respondendo a uma pergunta específica:

  • Crescimento temporal: Quantos títulos foram adicionados a cada ano? O ritmo foi constante? A pandemia de 2020 alterou esse ritmo?
  • Distribuição geográfica: Quais países concentram a produção? Como o peso relativo de cada país mudou entre 2015 e 2021?
  • Composição do catálogo: O catálogo é dominado por filmes ou séries? Quais gêneros prevalecem? Para qual público a plataforma produz mais?
  • Recorte brasileiro: Qual é o volume e o crescimento do conteúdo brasileiro? Em quais gêneros o Brasil está presente?

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.

1.4 — Utilidade para os clientes da análise

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.


Requisitos

2.1 — Pacotes carregados antecipadamente

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
PacoteCategoriaFinalidade neste projeto
tidyversemeta-pacoteCarrega em conjunto dplyr (manipulação), tidyr (reestruturação), ggplot2 (visualização estática) e readr (importação). Base de toda a análise.
lubridatedatasConverte 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.
plotlyvisualização interativaGera gráficos HTML interativos com zoom, tooltip ao passar o mouse e filtros por clique na legenda — sem necessidade de Shiny.
DTtabelas interativasRenderiza data frames como tabelas HTML com busca por texto, ordenação por coluna, paginação e filtros por coluna.
stringrtextoManipula strings: remove espaços extras com str_trim() e permite separar valores múltiplos em colunas como country e listed_in.
scalesformataçãoFormata rótulos de eixos em gráficos, como separadores de milhar e porcentagens legíveis.
knitrrelatórioIntegra 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()

Importação e Preparação

3.1 — Fonte citada com hiperlink

Os dados foram obtidos do Kaggle: Netflix Movies and TV Shows, compilado por Shivam Bansal.

3.2 — Dados da fonte explicados minuciosamente

O 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:

  • Passo 1 — Conversão de 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.
  • Passo 2 — Criação de 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.
  • Passo 3 — Extração numérica de 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.
  • Passo 4 — Remoção de espaços extras: 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.
  • Passo 5 — Criação de 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.
3.3 — Importação dos dados
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ávelTipo originalDescrição
show_idcharacterIdentificador único de cada título no dataset
typecharacter"Movie" (filme) ou "TV Show" (série)
titlecharacterNome do título
directorcharacterDiretor — ausente em ~30% dos registros
castcharacterElenco separado por vírgula — ausente em ~10%
countrycharacterPaís(es) de produção separados por vírgula — ausente em ~10%
date_addedcharacterData de adição ao catálogo em texto americano — ausente em ~1%
release_yearintegerAno de lançamento original do título
ratingcharacterClassificação indicativa no padrão americano
durationcharacterDuração em minutos (filmes) ou número de temporadas (séries) — unidades misturadas
listed_incharacterGêneros separados por vírgula — múltiplos valores por célula
descriptioncharacterSinopse curta do título
3.4 — Amostra dos dados brutos (máx. 200 linhas)
# 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")
  )

Limpeza

Requisito 3.3 — Etapas de limpeza explicadas no texto com justificativa

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"
    )
  )
3.4 e 3.5 — Dados limpos exibidos de forma condensada com resumo consolidado
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.


Subconjuntos

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:

Crescimento por ano

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 15 países

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

Top 15 gêneros

top_generos %>%
  rename(Gênero = listed_in, Títulos = n) %>%
  kable(align = c("l", "r"))
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

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

Visualizações

4.1 a 4.5 — Descobertas não auto-evidentes, gráficos e tabelas interativas, insights explicados

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.

Crescimento

Títulos adicionados por ano :
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")
  )
Descoberta: O pico de adições ao catálogo ocorreu em 2019, não em 2020, ano da pandemia. Em 2020 o volume caiu em relação ao ano anterior, contradizendo a expectativa de que o isolamento aceleraria a expansão. A queda é consistente em filmes e séries. A hipótese mais plausível é que as paralisações de filmagens durante o isolamento reduziram a oferta de conteúdo novo, criando um gargalo de produção que só foi parcialmente resolvido em 2021.
Sazonalidade mensal :
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")
  )
Descoberta: Julho e dezembro concentram os maiores volumes de adição em todos os anos combinados. Isso não é coincidência: julho coincide com as férias de verão no hemisfério norte (principal mercado da plataforma), enquanto dezembro é fortemente impulsionado pelas festas de fim de ano e recessos de inverno, momentos em que as pessoas passam mais tempo em casa. Essa sazonalidade mostra que as decisões de curadoria do catálogo seguem de perto o calendário de descanso e consumo do público.

Composição

Filmes vs. séries :
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"))
  )
Descoberta: O catálogo é majoritariamente composto por filmes (~70%), mas a proporção de séries cresceu ao longo dos anos. Séries geram mais horas de consumo por título e criam hábito de retorno à plataforma, o que explica por que a Netflix tem investido cada vez mais em produções seriais originais, mesmo que o volume absoluto ainda seja menor.
Público-alvo :
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")
  )
Descoberta: Mais de 60% dos títulos são classificados como adultos (TV-MA ou R). Conteúdo infantil e familiar representa uma fatia pequena. Isso contradiz a imagem que parte do público tem da Netflix como uma plataforma "para toda a família", na prática, a plataforma prioriza o assinante adulto pagante, que tem maior poder de decisão sobre a assinatura.

Países

Os 15 países com mais títulos :
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")
  )
Descoberta: Os Estados Unidos dominam com mais de 2.800 títulos, quase o triplo do segundo colocado. A Índia em segundo lugar reflete uma estratégia deliberada da Netflix de conquistar o mercado sul-asiático, um dos maiores do mundo em número de potenciais assinantes. O Brasil aparece consistentemente entre os quinze primeiros, superando países europeus maiores como Alemanha e Espanha em volume de conteúdo produzido.
Crescimento por país (2015–2021) :
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")
  )
Descoberta: A Índia teve crescimento explosivo entre 2018 e 2020, passando de menos de 100 títulos adicionados por ano para mais de 300. A Coreia do Sul apresentou crescimento contínuo, o sucesso global de Squid Game (2021) é o ponto mais visível de uma estratégia construída ao longo de vários anos. Os EUA, apesar de dominarem o total acumulado, tiveram crescimento mais estável, sugerindo um catálogo já maduro em relação ao conteúdo americano.

Gêneros

Os 15 gêneros mais frequentes :
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")
  )
Descoberta: "International Movies" e "International TV Shows" aparecem entre os gêneros mais frequentes, o que é notável pois essa categoria simplesmente marca produções fora dos EUA. Seu alto volume revela que a Netflix não apenas distribui conteúdo local para audiências locais, mas usa produções internacionais como diferencial competitivo global. Documentários e Thrillers independentes também têm presença relevante, sugerindo que a plataforma não se limita ao entretenimento de massa.
Filmes vs. séries por gênero :
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")
  )
Descoberta: Reality TV e Crime TV são gêneros quase exclusivos de séries, o formato seriado é essencial para esses gêneros, pois constroem tensão e fidelização ao longo de episódios. Documentários, por outro lado, aparecem fortemente em filmes. Drama é o único gênero verdadeiramente universal: presente com alto volume tanto em filmes quanto em séries.

Brasil

Crescimento do conteúdo brasileiro :
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")
  )
Descoberta: O conteúdo brasileiro cresceu de forma consistente a partir de 2017, com aceleração visível em 2018 e 2019. Esse período coincide com os primeiros investimentos públicos da Netflix em produções originais brasileiras, a série 3%, lançada em 2016, foi a primeira produção original brasileira da plataforma e abriu caminho para um pipeline crescente. O crescimento de séries brasileiras é proporcionalmente maior que o de filmes a partir de 2018.
Gêneros mais frequentes no conteúdo brasileiro :
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")
  )
Descoberta: O conteúdo brasileiro na plataforma concentra-se em dramas internacionais e comédias. A presença de "International Movies" como categoria dominante revela como a Netflix enxerga o Brasil: não como mercado isolado, mas como exportador de conteúdo para o catálogo global, os filmes e séries brasileiros são marcados como "internacionais" e distribuídos para o mundo todo, não apenas para o Brasil.
Catálogo brasileiro completo :
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"
  )

Conclusões

5.1 — Conclusão sobre a declaração do problema

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 abordado

Os 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).

5.3 — Insights da análise
  • A pandemia reduziu o catálogo no curto prazo: 2020 teve menos títulos novos do que 2019, com recuperação parcial apenas em 2021.
  • Sazonalidade clara e consistente: janeiro e julho concentram as maiores adições, calendário que segue o consumo do hemisfério norte.
  • O catálogo é majoritariamente adulto: mais de 60% dos títulos são TV-MA ou R.
  • A internacionalização é real e crescente: Índia, Coreia do Sul e Brasil crescem consistentemente, com o conteúdo desses países sendo distribuído globalmente.
  • Drama é o gênero universal: domina tanto em filmes quanto em séries. Reality TV e Crime são predominantemente seriados.
  • O Brasil cresceu a partir de 2017: com aceleração em séries a partir de 2018, reflexo de investimentos em produções originais locais.
5.4 — Implicações práticas

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íveis

Os 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.