A evolução e globalização do catálogo da Netflix

Introdução

O boom dos Streamings

Nos últimos anos, as plataformas de streaming se consolidaram como um dos principais meios de acesso a filmes e séries em todo o mundo. Entre elas, a Netflix desempenha um papel central, tanto por sua ampla base de assinantes quanto por sua estratégia agressiva de produção e aquisição de conteúdo. Com um catálogo que se expande continuamente e que inclui produções de dezenas de países, a Netflix se tornou uma peça importante para compreender tendências culturais, econômicas e globais do entretenimento contemporâneo.

Por que estudar o catálogo da Netflix?

Diante desse cenário, investigar como o catálogo da Netflix se transformou ao longo do tempo não é apenas uma curiosidade, é uma forma de entender como a plataforma responde às demandas do mercado, como se posiciona estrategicamente em diferentes regiões e como contribui para a circulação de conteúdos globais. Essa análise interessa a pesquisadores, estudantes, profissionais criativos e até mesmo consumidores, pois revela mudanças nos tipos de produções oferecidas, no equilíbrio entre filmes e séries, e na ampliação da diversidade geográfica.

Sobre os dados e metodologias

Para realizar essa investigação, utilizo um conjunto de dados do Kaggle contendo informações detalhadas sobre títulos disponíveis na plataforma, incluindo:

  • Ano de lançamento
  • País(es) de produção
  • Tipo de obra (filme ou série)
  • Classificação indicativa
  • Data em que o título entrou no catálogo

A partir desses dados, aplico procedimentos de limpeza, padronização e organização, de modo a torná-los adequados para análise exploratória. Em seguida, realizo investigações que permitem observar padrões temporais e geográficos, com foco especial na evolução e globalização do catálogo.

Sobre a abordagem

A abordagem adotada combina análise descritiva, visualização de dados e interpretação narrativa, permitindo não apenas quantificar mudanças ao longo dos anos, mas também compreender o que essas mudanças significam. Dessa forma, a análise busca responder perguntas como: Como o catálogo cresceu ao longo do tempo? Em que momento séries se tornaram tão importantes quanto filmes? De que forma a Netflix expandiu seu alcance para além dos Estados Unidos?

Por fim, espera-se que os resultados auxiliem potenciais interessados a enxergar tendências estratégicas da Netflix, identificar padrões de produção global e compreender como a plataforma tem influenciado a circulação de conteúdos culturais no mundo contemporâneo.


Pacotes requeridos

Para garantir a execução completa das análises e visualizações apresentadas neste relatório, é necessário carregar previamente os seguintes pacotes, responsáveis pela importação, organização, manipulação e plotagem dos dados:

library(readr)
library(DT)
library(dplyr)
library(lubridate)
library(tidyr)
library(ggplot2)
library(knitr)
# Criar dataframe com bibliotecas e descrições
tabela <- data.frame(
  Nome_do_Pacote = c(
    "library(readr)",
    "library(DT)",
    "library(dplyr)",
    "library(lubridate)",
    "library(tidyr)",
    "library(ggplot2)",
    "library(knitr)",
    "library(rmdformats)"
  ),
  Finalidade = c(
    "Importar dados delimitados (como CSV) de forma simples e rápida",
    "Criar tabelas interativas em HTML",
    "Manipular, transformar e filtrar dados",
    "Trabalhar com datas de maneira prática",
    "Organizar, separar, unir e reestruturar conjuntos de dados",
    "Criar gráficos personalizáveis",
    "Gerar relatórios dinâmicos (HTML, PDF, etc.)",
    "Customização do template gerado pelo rmarkdown"
  )
)

kable(tabela,
  align = c("l", "l"),
  col.names = c("Nome do pacote", "Finalidade")
)
Nome do pacote Finalidade
library(readr) Importar dados delimitados (como CSV) de forma simples e rápida
library(DT) Criar tabelas interativas em HTML
library(dplyr) Manipular, transformar e filtrar dados
library(lubridate) Trabalhar com datas de maneira prática
library(tidyr) Organizar, separar, unir e reestruturar conjuntos de dados
library(ggplot2) Criar gráficos personalizáveis
library(knitr) Gerar relatórios dinâmicos (HTML, PDF, etc.)
library(rmdformats) Customização do template gerado pelo rmarkdown

Preparação dos dados

Carregamento dos dados

Como descrito na Introdução, o conjunto de dados utilizado neste trabalho é o “Netflix Movies and TV Shows”, disponibilizado no Kaggle e originalmente compilado a partir do mecanismo de busca Flixable, que registra títulos presentes no catálogo da Netflix.

Esse dataset reúne informações sobre filmes e séries adicionados na plataforma desde dezembro de 2007 até setembro de 2021, mas antes de iniciar a análise é necessário importar o arquivo CSV, compreender sua estrutura e identificar quais colunas são relevantes para responder às perguntas propostas pelo projeto.

raw_data <- read.csv("netflix_titles.csv.csv")

Visualização da tabela inicial

O dataset utilizado no projeto possui 12 colunas e 8.807 linhas. As colunas são nomeadas da seguinte forma: show_id, type, title, director, cast, country, date_added, release_year, rating, duration, listed_in e description. A seguir, temos uma tabela iterativa dos nossos dados iniciais que ainda precisam ser pré-processados.

datatable(raw_data,
  rownames = FALSE,
  options = list(
    pageLength = 5,
    autoWidth = TRUE,
    language = list(search = "Buscar:", lengthMenu = "Mostrar _MENU_ entradas")
  )
)

Análise inicial

Levando em consideração o objetivo do projeto, nós podemos começar excluindo algumas colunas que não serão necessárias para a análise, ficando apenas com 7 variáveis:

  • type
  • title
  • country
  • date_added
  • release_year
  • rating
  • listed_in
data <- raw_data[, c(
  "type",
  "title",
  "country",
  "date_added",
  "release_year",
  "rating",
  "listed_in"
)]

Coluna date_added

A coluna date_added é responsável por registrar quando cada título foi incluído no catálogo da Netflix, porém seus valores estão armazenados no formato texto (chr), utilizando datas escritas em inglês, como “September 9, 2020”.

class(data$date_added)
## [1] "character"

Para que seja possível realizar análises temporais, é necessário converter essa coluna para o tipo data. Após essa conversão, extraímos o ano de cada registro e criamos uma nova variável chamada added_year, que servirá como base para explorar tendências temporais de expansão da Netflix, permitindo identificar períodos de maior inclusão de títulos e mudanças na composição do catálogo.

# Converter e extrair ano
data$date_added <- mdy(data$date_added)
data$added_year <- year(data$date_added)

Após a conversão, o dataframe data agora possui a nova variável added_year. Vejamos como ficaram os dados:

# Visualizar estrutura do dataframe após conversão temporal
data %>%
  select(type, title, date_added, added_year, release_year) %>%
  head(8) %>%
  kable(
    col.names = c("Tipo", "Título", "Data Adição", "Ano Adição", "Ano Lançamento"),
    align = c("c", "l", "c", "c", "c"),
    caption = "Amostra do dataframe 'data' após conversão temporal"
  )
Amostra do dataframe ‘data’ após conversão temporal
Tipo Título Data Adição Ano Adição Ano Lançamento
Movie Dick Johnson Is Dead 2021-09-25 2021 2020
TV Show Blood & Water 2021-09-24 2021 2021
TV Show Ganglands 2021-09-24 2021 2021
TV Show Jailbirds New Orleans 2021-09-24 2021 2021
TV Show Kota Factory 2021-09-24 2021 2021
TV Show Midnight Mass 2021-09-24 2021 2021
Movie My Little Pony: A New Generation 2021-09-24 2021 2021
Movie Sankofa 2021-09-24 2021 1993

A criação da variável added_year é essencial porque permite agregações temporais e análises de tendências ao longo dos anos, transformando datas específicas em períodos analiticamente úteis.

Coluna country

A análise geográfica requer tratamento especial da coluna country, pois muitos títulos apresentam múltiplos países de produção separados por vírgula (exemplo: “United States, Canada, United Kingdom”). Esta característica dos dados apresenta uma decisão metodológica importante: como tratar títulos com múltiplos países?

Opção 1 - Considerar apenas o primeiro país: Seria possível extrair apenas o primeiro país listado, assumindo que representa o país principal de produção. Esta abordagem simplificaria a análise, mas perderia informação valiosa sobre coproduções internacionais.

Opção 2 - Considerar todos os países (escolha adotada): A abordagem escolhida expande cada título com múltiplos países em registros separados, onde cada combinação título-país ocupa uma linha distinta. Esta decisão preserva a completude dos dados e reflete a realidade da produção audiovisual.

Limpeza e expansão da coluna country

O processo de tratamento se inicia com etapas para garantir qualidade dos dados, como a remoção de NA’s, remoção de espaços extras, filtro de registros vazios, etc.:

# OBJETIVO: Preparar dados geográficos para análise temporal
# Tratar registros com múltiplos países separados por vírgula
data_country <- data %>%
  filter(!is.na(country), !is.na(added_year)) %>% # Remover registros sem informação
  mutate(country = trimws(country)) %>% # Remover espaços extras
  filter(country != "") %>% # Filtrar registros vazios
  separate_rows(country, sep = ",") %>% # Separar países múltiplos em linhas
  mutate(country = trimws(country)) %>% # Limpar espaços após separação
  filter(country != "") # Filtrar novamente registros vazios

O novo dataframe data_country é criado porque precisamos de uma estrutura onde cada linha representa uma combinação título-país, permitindo análise geográfica adequada. Títulos que originalmente tinham múltiplos países agora aparecem em linhas separadas para cada país, preservando toda a informação geográfica:

# Visualizar como ficou a estrutura expandida por país
data_country %>%
  select(type, title, country, added_year) %>%
  head(10) %>%
  kable(
    col.names = c("Tipo", "Título", "País", "Ano Adição"),
    align = c("c", "l", "l", "c"),
    caption = "Amostra do dataframe 'data_country' - expansão geográfica"
  )
Amostra do dataframe ‘data_country’ - expansão geográfica
Tipo Título País Ano Adição
Movie Dick Johnson Is Dead United States 2021
TV Show Blood & Water South Africa 2021
TV Show Kota Factory India 2021
Movie Sankofa United States 2021
Movie Sankofa Ghana 2021
Movie Sankofa Burkina Faso 2021
Movie Sankofa United Kingdom 2021
Movie Sankofa Germany 2021
Movie Sankofa Ethiopia 2021
TV Show The Great British Baking Show United Kingdom 2021

Identificação dos principais países produtores

Para manter o foco analítico nos mercados mais relevantes, identificamos os países com maior volume de títulos:

# Calcular total por país ao longo de todo o período
country_total <- data_country %>%
  group_by(country) %>%
  summarise(total_titles = n(), .groups = "drop") %>%
  arrange(desc(total_titles))

# Selecionar os 10 países com maior número de títulos
top_countries <- country_total %>%
  slice_max(order_by = total_titles, n = 10) %>%
  pull(country)

# Manter apenas os países do TOP 10
data_country_top <- data_country %>%
  filter(country %in% top_countries)

O dataframe data_country_top é criado para focar a análise nos mercados mais relevantes. Vamos visualizar a estrutura resultante:

# Visualizar estrutura do dataframe filtrado
data_country_top %>%
  select(type, title, country, added_year) %>%
  head(8) %>%
  kable(
    col.names = c("Tipo", "Título", "País (TOP 10)", "Ano Adição"),
    align = c("c", "l", "l", "c"),
    caption = "Amostra do dataframe 'data_country_top' - foco nos principais mercados"
  )
Amostra do dataframe ‘data_country_top’ - foco nos principais mercados
Tipo Título País (TOP 10) Ano Adição
Movie Dick Johnson Is Dead United States 2021
TV Show Kota Factory India 2021
Movie Sankofa United States 2021
Movie Sankofa United Kingdom 2021
Movie Sankofa Germany 2021
TV Show The Great British Baking Show United Kingdom 2021
Movie The Starling United States 2021
Movie Je Suis Karl Germany 2021

A criação de data_country_top é estratégica porque concentra a análise nos países mais significativos, evitando ruído analítico de mercados com poucos títulos.

Esta filtragem pelos 10 principais países é necessária para:

  • Concentrar a análise nos mercados mais estratégicos para a Netflix
  • Evitar sobrecarga visual em gráficos com dezenas de países
  • Excluir países com poucos títulos, o que pode gerar ruído analítico

Cálculo da diversidade geográfica temporal

Complementarmente, calculamos um indicador de diversidade geográfica para mensurar a amplitude da globalização:

# Número de países distintos com títulos adicionados por ano
country_diversity_year <- data_country %>%
  filter(!is.na(added_year)) %>%
  group_by(added_year) %>%
  summarise(n_countries = n_distinct(country), .groups = "drop")

O dataframe country_diversity_year é criado especificamente para análise temporal da diversidade geográfica, agregando dados por ano:

# Visualizar evolução da diversidade geográfica
country_diversity_year %>%
  head(10) %>%
  kable(
    col.names = c("Ano de Adição", "Número de Países"),
    align = c("c", "c"),
    caption = "Amostra do dataframe 'country_diversity_year' - diversidade temporal"
  )
Amostra do dataframe ‘country_diversity_year’ - diversidade temporal
Ano de Adição Número de Países
2008 1
2009 2
2010 1
2011 5
2012 2
2013 4
2014 9
2015 16
2016 52
2017 77

Este dataframe é essencial porque transforma dados individuais de títulos em uma métrica agregada que mede a globalização do catálogo ao longo do tempo.

Este indicador é fundamental porque revela se o crescimento quantitativo do catálogo foi acompanhado por real diversificação geográfica, permitindo distinguir entre crescimento concentrado (poucos países) versus crescimento globalizado (muitos países).

Coluna listed_in

Para explorar os gêneros presentes no catálogo, também é necessário tratar a coluna listed_in, que pode conter múltiplos gêneros separados por vírgula.

# OBJETIVO: Preparar dados de gêneros para análise temática
# Expandir registros com múltiplos gêneros em linhas separadas
data_genre <- data %>%
  filter(!is.na(listed_in)) %>% # Manter apenas registros com gênero
  mutate(listed_in = trimws(listed_in)) %>% # Limpar espaços extras
  separate_rows(listed_in, sep = ",") %>% # Separar gêneros múltiplos
  mutate(listed_in = trimws(listed_in)) # Limpar espaços pós-separação

# Criar agregação: gêneros por tipo de conteúdo (filme/série)
genre_type <- data_genre %>%
  group_by(type, listed_in) %>% # Agrupar por tipo e gênero
  summarise(n = n(), .groups = "drop") # Contar ocorrências

# Identificar os gêneros mais frequentes para foco da análise
top_genres <- genre_type %>%
  group_by(listed_in) %>% # Agrupar por gênero
  summarise(total = sum(n), .groups = "drop") %>% # Somar todas as ocorrências
  slice_max(order_by = total, n = 12) %>% # Selecionar top 12
  pull(listed_in) # Extrair nomes dos gêneros

# Filtrar dados para manter apenas os gêneros principais
genre_type_top <- genre_type %>%
  filter(listed_in %in% top_genres) # Manter apenas top gêneros

Aqui criamos vários dataframes especializados para análise temática:

1. data_genre - Expansão por gêneros (similar ao processo de países):

data_genre %>%
  select(type, title, listed_in, added_year) %>%
  head(8) %>%
  kable(
    col.names = c("Tipo", "Título", "Gênero", "Ano Adição"),
    align = c("c", "l", "l", "c"),
    caption = "Amostra do dataframe 'data_genre' - expansão por gêneros"
  )
Amostra do dataframe ‘data_genre’ - expansão por gêneros
Tipo Título Gênero Ano Adição
Movie Dick Johnson Is Dead Documentaries 2021
TV Show Blood & Water International TV Shows 2021
TV Show Blood & Water TV Dramas 2021
TV Show Blood & Water TV Mysteries 2021
TV Show Ganglands Crime TV Shows 2021
TV Show Ganglands International TV Shows 2021
TV Show Ganglands TV Action & Adventure 2021
TV Show Jailbirds New Orleans Docuseries 2021

2. genre_type_top - Agregação dos principais gêneros por tipo de conteúdo:

genre_type_top %>%
  arrange(desc(n)) %>%
  head(10) %>%
  kable(
    col.names = c("Tipo", "Gênero", "Número de Títulos"),
    align = c("c", "l", "c"),
    caption = "Amostra do dataframe 'genre_type_top' - principais gêneros agregados"
  )
Amostra do dataframe ‘genre_type_top’ - principais gêneros agregados
Tipo Gênero Número de Títulos
Movie International Movies 2752
Movie Dramas 2427
Movie Comedies 1674
TV Show International TV Shows 1351
Movie Documentaries 869
Movie Action & Adventure 859
TV Show TV Dramas 763
Movie Independent Movies 756
Movie Children & Family Movies 641
Movie Romantic Movies 616

A criação destes dataframes é necessária porque:

  • data_genre: Permite análise individual de cada gênero por título
  • genre_type_top: Possibilita comparação entre filmes e séries por categoria temática
# Contar títulos por ano e gênero
genre_year <- data_genre %>%
  filter(!is.na(added_year)) %>%
  group_by(added_year, listed_in) %>%
  summarise(n = n(), .groups = "drop")

# Selecionar os gêneros mais frequentes no período
top_genres_year <- genre_year %>%
  group_by(listed_in) %>%
  summarise(total = sum(n), .groups = "drop") %>%
  slice_max(order_by = total, n = 10) %>%
  pull(listed_in)

genre_year_top <- genre_year %>%
  filter(listed_in %in% top_genres_year)

3. genre_year_top - Evolução temporal dos gêneros principais:

genre_year_top %>%
  filter(added_year >= 2018) %>% # Filtrar anos recentes para visualização
  head(10) %>%
  kable(
    col.names = c("Ano Adição", "Gênero", "Número de Títulos"),
    align = c("c", "l", "c"),
    caption = "Amostra do dataframe 'genre_year_top' - evolução temporal dos gêneros"
  )
Amostra do dataframe ‘genre_year_top’ - evolução temporal dos gêneros
Ano Adição Gênero Número de Títulos
2018 Action & Adventure 173
2018 Children & Family Movies 85
2018 Comedies 297
2018 Documentaries 167
2018 Dramas 531
2018 Independent Movies 163
2018 International Movies 668
2018 International TV Shows 214
2018 Romantic Movies 108
2018 TV Dramas 109

O genre_year_top é essencial para análise temporal dos gêneros, permitindo identificar quais categorias temáticas ganharam ou perderam relevância ao longo dos anos.

Coluna rating

Por fim, é interessante preparar os dados de classificação indicativa (rating) para analisar como a composição etária do catálogo evolui ao longo do tempo.

Limpeza e validação dos dados de rating

Antes de proceder com a análise, é fundamental examinar a qualidade dos dados na coluna rating. Uma exploração inicial revela que existem valores inconsistentes que não correspondem a classificações indicativas válidas:

# Examinar todos os valores únicos na coluna rating
rating_values <- data %>%
  filter(!is.na(rating), rating != "") %>%
  count(rating, sort = TRUE) %>%
  mutate(prop = round((n / sum(n)) * 100, 1))

# Mostrar todos os valores encontrados
kable(rating_values,
  col.names = c("Valor de Rating", "Quantidade", "Percentual (%)"),
  align = c("l", "c", "c"),
  caption = "Todos os valores encontrados na coluna 'rating'"
)
Todos os valores encontrados na coluna ‘rating’
Valor de Rating Quantidade Percentual (%)
TV-MA 3207 36.4
TV-14 2160 24.5
TV-PG 863 9.8
R 799 9.1
PG-13 490 5.6
TV-Y7 334 3.8
TV-Y 307 3.5
PG 287 3.3
TV-G 220 2.5
NR 80 0.9
G 41 0.5
TV-Y7-FV 6 0.1
NC-17 3 0.0
UR 3 0.0
66 min 1 0.0
74 min 1 0.0
84 min 1 0.0

Como observado na tabela, existem valores claramente incorretos como durações de filmes (“66 min”, “84 min”, “74 min”) que foram erroneamente classificados como ratings. Esses valores precisam ser removidos para garantir a qualidade da análise.

Definição de ratings válidos e agrupamento

Para resolver essa inconsistência, definimos explicitamente quais são as classificações indicativas válidas reconhecidas pelo sistema americano e internacional e fazemos o agrupamento em categorias etárias (Infantil, Família, Adolescente, Adulto e Sem classificação):

# Definir grupos de classificação indicativa
rating_groups <- c(
  "TV-Y" = "Infantil",
  "TV-Y7" = "Infantil",
  "TV-Y7-FV" = "Infantil",
  "G" = "Infantil",
  "TV-G" = "Família",
  "TV-PG" = "Família",
  "PG" = "Família",
  "PG-13" = "Adolescente",
  "TV-14" = "Adolescente",
  "R" = "Adulto",
  "NC-17" = "Adulto",
  "TV-MA" = "Adulto",
  "UR" = "Adulto",
  "NR" = "Sem classificação"
)

# Filtrar apenas ratings válidos e criar grupos
data_rating <- data %>%
  filter(!is.na(rating), rating != "", !is.na(added_year)) %>%
  filter(rating %in% names(rating_groups)) %>% # Manter apenas ratings válidos
  mutate(rating_group = rating_groups[rating]) # Criar grupos de rating

Distribuição dos grupos de classificação

Após a limpeza e agrupamento, podemos observar a distribuição final dos grupos etários no catálogo:

# Resumo dos grupos de classificação
rating_summary <- data_rating %>%
  group_by(rating_group) %>%
  summarise(n = n(), .groups = "drop") %>%
  mutate(prop = round((n / sum(n)) * 100, 1)) %>%
  arrange(desc(n))

kable(rating_summary,
  col.names = c("Grupo de Classificação", "Total de Títulos", "Percentual (%)"),
  align = c("l", "c", "c"),
  caption = "Distribuição dos grupos de classificação indicativa no catálogo"
)
Distribuição dos grupos de classificação indicativa no catálogo
Grupo de Classificação Total de Títulos Percentual (%)
Adulto 4010 45.6
Adolescente 2647 30.1
Família 1368 15.6
Infantil 686 7.8
Sem classificação 79 0.9

Processamento temporal dos ratings

Com os dados limpos e agrupados, criamos a estrutura temporal necessária para análise da evolução da composição etária, realizando um cálculo de proporções para garantir que cada ano some 100% entre todos os grupos:

# Criar tabela pivô: ano x categoria
rating_pivot <- data_rating %>%
  count(added_year, rating_group) %>%
  pivot_wider(
    names_from = rating_group,
    values_from = n,
    values_fill = 0
  )

# Calcular proporções por ano
rating_props <- rating_pivot %>%
  mutate(
    total = rowSums(select(., -added_year)),
    across(-c(added_year, total), ~ .x / total)
  ) %>%
  select(-total)

# Converter de volta para formato longo para ggplot
rating_year <- rating_props %>%
  pivot_longer(
    cols = -added_year,
    names_to = "rating_group",
    values_to = "prop"
  )

O dataframe rating_year é criado para a evolução da composição etária do catálogo independentemente do crescimento total, revelando mudanças estratégicas na segmentação de público ao longo dos anos. Vamos visualizar uma amostra dessa estrutura:

rating_year %>%
  filter(added_year >= 2018) %>% # Anos recentes para melhor visualização
  arrange(desc(prop)) %>%
  head(10) %>%
  kable(
    col.names = c("Ano Adição", "Grupo de Classificação", "Proporção"),
    align = c("c", "c", "c"),
    caption = "Amostra do dataframe 'rating_year' - evolução dos grupos etários"
  )
Amostra do dataframe ‘rating_year’ - evolução dos grupos etários
Ano Adição Grupo de Classificação Proporção
2018 Adulto 0.4726942
2019 Adulto 0.4697421
2020 Adulto 0.4571581
2021 Adulto 0.4532710
2021 Adolescente 0.3150868
2019 Adolescente 0.3120040
2018 Adolescente 0.3058252
2020 Adolescente 0.2985631
2019 Família 0.1582341
2020 Família 0.1559340

Resumo da base pós-processamento

Após as etapas de pré-processamento, a base passa a contar com novas variáveis derivadas ( added_year, estrutura expandida de country e listed_in, além dos objetos agregados como data_country_top, genre_type_top, genre_year_top, rating_year e country_diversity_year).

O data frame data continua sendo a tabela central da análise, representando os títulos já filtrados para as colunas de interesse. A partir dele, foram construídos data frames derivados específicos para responder a perguntas sobre:

  • Crescimento temporal: uso de added_year para contar títulos adicionados por ano.
  • Composição etária: objeto rating_year, com contagens e proporções por classificação indicativa.
  • Expansão geográfica: objetos data_country, data_country_top e country_diversity_year, que permitem analisar tanto o volume por país quanto a diversidade de países ao longo do tempo.
  • Diversificação temática: objetos data_genre, genre_type_top e genre_year_top, que descrevem a distribuição de gêneros entre filmes e séries e sua evolução ao longo dos anos.

Em conjunto, essas estruturas pós-processamento fornecem uma visão consolidada da evolução do catálogo da Netflix, permitindo que a análise exploratória se concentre em padrões de crescimento, globalização e diversificação de conteúdo.

# Visualizar amostra da base pós-processamento
data %>%
  select(type, title, country, date_added, added_year, release_year, rating, listed_in) %>%
  head(10) %>%
  kable(
    align = c("c", "l", "l", "c", "c", "c", "c", "l"),
    col.names = c(
      "Tipo",
      "Título",
      "País(es)",
      "Data de adição",
      "Ano de adição",
      "Ano de lançamento",
      "Classificação",
      "Gênero(s)"
    )
  )
Tipo Título País(es) Data de adição Ano de adição Ano de lançamento Classificação Gênero(s)
Movie Dick Johnson Is Dead United States 2021-09-25 2021 2020 PG-13 Documentaries
TV Show Blood & Water South Africa 2021-09-24 2021 2021 TV-MA International TV Shows, TV Dramas, TV Mysteries
TV Show Ganglands 2021-09-24 2021 2021 TV-MA Crime TV Shows, International TV Shows, TV Action & Adventure
TV Show Jailbirds New Orleans 2021-09-24 2021 2021 TV-MA Docuseries, Reality TV
TV Show Kota Factory India 2021-09-24 2021 2021 TV-MA International TV Shows, Romantic TV Shows, TV Comedies
TV Show Midnight Mass 2021-09-24 2021 2021 TV-MA TV Dramas, TV Horror, TV Mysteries
Movie My Little Pony: A New Generation 2021-09-24 2021 2021 PG Children & Family Movies
Movie Sankofa United States, Ghana, Burkina Faso, United Kingdom, Germany, Ethiopia 2021-09-24 2021 1993 TV-MA Dramas, Independent Movies, International Movies
TV Show The Great British Baking Show United Kingdom 2021-09-24 2021 2021 TV-14 British TV Shows, Reality TV
Movie The Starling United States 2021-09-24 2021 2021 PG-13 Comedies, Dramas

Características do dataset final

Após o pré-processamento, o dataset apresenta as seguintes características:

# Informações resumidas sobre as variáveis finais
caracteristicas <- data.frame(
  Variavel = c("type", "added_year", "release_year", "rating", "country", "listed_in"),
  Tipo = c("Categórica", "Numérica", "Numérica", "Categórica", "Texto", "Texto"),
  Descricao = c(
    "Tipo de conteúdo: Movie ou TV Show",
    "Ano em que o título foi adicionado ao catálogo (2007-2021)",
    "Ano de lançamento original do título",
    "Classificação indicativa (TV-MA, TV-14, PG-13, etc.)",
    "País(es) de produção (múltiplos valores separados por vírgula)",
    "Gêneros/categorias (múltiplos valores separados por vírgula)"
  ),
  Observacoes = c(
    paste0("Filmes: ", nrow(data[data$type == "Movie", ]), " | Séries: ", nrow(data[data$type == "TV Show", ])),
    paste0("Range: ", min(data$added_year, na.rm = TRUE), "-", max(data$added_year, na.rm = TRUE)),
    paste0("Range: ", min(data$release_year, na.rm = TRUE), "-", max(data$release_year, na.rm = TRUE)),
    paste0("Grupos etários válidos: ", length(unique(data_rating$rating_group))),
    paste0("Países únicos: ", length(unique(trimws(unlist(strsplit(data$country[!is.na(data$country)], ",")))))),
    paste0("Gêneros únicos: ", length(unique(trimws(unlist(strsplit(data$listed_in[!is.na(data$listed_in)], ","))))))
  )
)

kable(caracteristicas,
  col.names = c("Variável", "Tipo", "Descrição", "Características"),
  align = c("l", "c", "l", "l")
)
Variável Tipo Descrição Características
type Categórica Tipo de conteúdo: Movie ou TV Show Filmes: 6131 | Séries: 2676
added_year Numérica Ano em que o título foi adicionado ao catálogo (2007-2021) Range: 2008-2021
release_year Numérica Ano de lançamento original do título Range: 1925-2021
rating Categórica Classificação indicativa (TV-MA, TV-14, PG-13, etc.) Grupos etários válidos: 5
country Texto País(es) de produção (múltiplos valores separados por vírgula) Países únicos: 123
listed_in Texto Gêneros/categorias (múltiplos valores separados por vírgula) Gêneros únicos: 42

Análise exploratória dos dados

Crescimento temporal do catálogo: filmes vs. séries

Até 2014, a Netflix adicionava poucos títulos ao catálogo. Esse crescimento tímido reflete o período em que a plataforma ainda não era global e possuía um acervo limitado, concentrado principalmente nos Estados Unidos.

A partir de 2016, ocorre uma expansão acelerada, com forte aumento na entrada de filmes e séries. Os filmes atingem seu pico em 2019, ultrapassando 1.400 adições, enquanto as séries crescem de forma constante no mesmo intervalo. Esse movimento acompanha a internacionalização da Netflix, o início dos conteúdos originais e novas parcerias com estúdios.

O ano de 2019 representa o pico das adições, mostrando um momento de fortalecimento do catálogo antes da chegada de concorrentes importantes no mercado de streaming.

Após 2020, há uma redução no ritmo, os filmes caem de maneira mais expressiva, e séries mostram uma queda mais moderada. Esse declínio pode estar relacionado ao impacto da pandemia e a uma estratégia mais seletiva da Netflix, já com o catálogo estabilizado.

No geral, essas tendências mostram como o crescimento rápido e a posterior desaceleração acompanham a trajetória de globalização e maturidade da plataforma.

# OBJETIVO: Analisar crescimento temporal comparando filmes vs séries
# Criar estrutura de dados agregada por ano e tipo de conteúdo
type_year <- data %>%
  group_by(added_year, type) %>% # Agrupar por ano de adição e tipo
  summarise(n = n(), .groups = "drop") %>% # Contar títulos por grupo
  pivot_wider(
    names_from = type, # Transformar tipo em colunas
    values_from = n,
    values_fill = 0
  ) # Preencher valores ausentes com 0

# Criar visualização de linhas temporais para comparação direta
ggplot(type_year, aes(x = added_year)) +
  geom_line(aes(y = Movie, color = "Filmes"), size = 1.2) + # Linha para filmes
  geom_line(aes(y = `TV Show`, color = "Séries"), size = 1.2) + # Linha para séries
  labs(
    x = "Ano de adição",
    y = "Quantidade de títulos",
    title = "Filmes vs Séries adicionados à Netflix ao longo do tempo",
    color = ""
  ) +
  theme_minimal() +
  theme(legend.position = "bottom") # Posicionar legenda na base


Expansão geográfica: principais países produtores

A coluna country indica o(s) país(es) de produção de cada título. Muitos registros possuem múltiplos países associados, o que reflete coproduções internacionais. Para tornar essa informação analisável ao longo do tempo, a coluna foi desmembrada, de forma que cada combinação título–país passa a ocupar uma linha. Além disso, para manter o foco nos principais polos de produção, a análise a seguir considera apenas os 10 países com maior número de títulos no catálogo.

# OBJETIVO: Visualizar evolução temporal dos principais países produtores
# Preparar dados agregados por país e ano
country_year <- data_country_top %>%
  group_by(added_year, country) %>% # Agrupar por ano e país
  summarise(n = n(), .groups = "drop") %>% # Contar títulos
  filter(!is.na(added_year)) # Remover registros com ano ausente

# Gráfico de evolução temporal por país
ggplot(country_year, aes(x = added_year, y = n, color = country)) +
  geom_line(size = 1) +
  labs(
    x = "Ano de adição",
    y = "Quantidade de títulos adicionados",
    color = "País",
    title = "Evolução do número de títulos adicionados por país (TOP 10)"
  ) +
  theme_minimal() +
  theme(legend.position = "right")

Observando o gráfico, é possível perceber que:

  • Estados Unidos concentram o maior volume de títulos ao longo de todo o período, mas sua participação relativa diminui à medida que outros países crescem.
  • A partir de 2016, países como Índia, Reino Unido e outros mercados emergentes passam a registrar aumentos expressivos no número de títulos adicionados.
  • O pico geral em 2019 também aparece em vários países, indicando um movimento coordenado de expansão global do catálogo antes da chamada guerra dos streamings. A entrada de novos concorrentes pressionou a Netflix a ampliar rapidamente parcerias e produções internacionais para reforçar sua vantagem competitiva.
  • Após 2020, há uma redução no número de novos títulos, mas alguns países mantêm uma produção relativamente estável, sugerindo foco em mercados estratégicos específicos.

TOP 10 países por volume de títulos

Para uma visão mais clara do ranking de países, o gráfico de barras abaixo apresenta os 10 principais mercados por volume total de títulos no catálogo:

# OBJETIVO: Visualizar ranking dos principais países em formato de barras
# Usar dados já calculados do country_total
country_total %>%
  head(10) %>%
  ggplot(aes(x = reorder(country, total_titles), y = total_titles)) +
  geom_col(fill = "#9F2042", alpha = 0.8) +
  coord_flip() +
  labs(
    x = "País",
    y = "Total de títulos no catálogo",
    title = "TOP 10 países por número de títulos no catálogo da Netflix"
  ) +
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 10),
    plot.title = element_text(hjust = 0.5)
  ) +
  geom_text(aes(label = total_titles),
    hjust = -0.05,
    size = 3,
    color = "black"
  )

Este gráfico complementa a análise temporal ao mostrar claramente a dominância dos Estados Unidos como principal produtor de conteúdo, seguido por mercados emergentes como Índia e Reino Unido que ganharam relevância estratégica na expansão global da Netflix.

Tabela comparativa: crescimento por país

Para complementar a visualização, a tabela a seguir apresenta dados quantitativos sobre o crescimento:

# OBJETIVO: Criar tabela resumo do crescimento por país
# Calcular métricas de crescimento por país
crescimento_paises <- data_country_top %>%
  filter(!is.na(added_year)) %>%
  group_by(country) %>%
  summarise(
    total_titulos = n(), # Total de títulos
    primeiro_ano = min(added_year), # Primeiro ano de adição
    ultimo_ano = max(added_year), # Último ano de adição
    pico_ano = added_year[which.max(table(added_year))], # Ano com mais adições
    .groups = "drop"
  ) %>%
  arrange(desc(total_titulos)) %>% # Ordenar por total decrescente
  slice_head(n = 8) # Top 8 para tabela mais limpa

# Formatar tabela
kable(crescimento_paises,
  col.names = c("País", "Total de Títulos", "Primeiro Ano", "Último Ano", "Ano de Pico"),
  align = c("l", "c", "c", "c", "c"),
  caption = "Resumo do crescimento temporal por país"
)
Resumo do crescimento temporal por país
País Total de Títulos Primeiro Ano Último Ano Ano de Pico
United States 3684 2008 2021 2021
India 1046 2016 2021 2021
United Kingdom 805 2011 2021 2021
Canada 445 2013 2021 2021
France 393 2011 2021 2021
Japan 317 2015 2021 2021
Spain 232 2011 2021 2021
South Korea 231 2016 2021 2021

Essa evolução geográfica reforça a ideia de que a Netflix deixou de ser uma plataforma centrada nos Estados Unidos para se tornar um ecossistema global de produção, com catálogos robustos em múltiplas regiões.


Diversidade geográfica ao longo do tempo

Complementando a análise dos principais países produtores, também é relevante observar quantos países diferentes têm obras adicionadas em cada ano. Esse indicador mostra se a expansão da Netflix foi acompanhada por um aumento efetivo na diversidade geográfica do catálogo.

ggplot(country_diversity_year, aes(x = added_year, y = n_countries)) +
  geom_line(color = "#9F2042", size = 1) +
  geom_point(color = "#9F2042", size = 2) +
  labs(
    x = "Ano de adição",
    y = "Número de países com títulos adicionados",
    title = "Evolução da diversidade geográfica do catálogo da Netflix"
  ) +
  theme_minimal()

Podemos perceber que entre 2007 e 2014, a variedade é baixa, reforçando o caráter inicial do catálogo, composto principalmente por produções norte-americanas e poucas coproduções.

A curva passa a crescer de maneira consistente a partir de 2016, acompanhando o início da disponibilidade da Netflix em quase todo o mundo. Esse crescimento não se limita a volume, mas revela um aumento real no número de países representados, indicando que a globalização da plataforma não foi apenas quantitativa, mas estrutural.

O auge entre 2018 e 2020 coincide com a explosão de produções estrangeiras que se tornaram fenômenos culturais globais, como La Casa de Papel (Espanha), Dark (Alemanha), The Rain (Dinamarca) e Kingdom (Coreia do Sul). Esses sucessos impulsionaram a estratégia da Netflix de financiar e distribuir conteúdo local com potencial internacional, ampliando ainda mais o número de países participantes.

A evolução desta métrica confirma se a expansão da Netflix foi acompanhada por um real aumento na diversidade geográfica, aprofundando o processo de globalização do catálogo.


Diversificação temática: gêneros por tipo de conteúdo

Completando as dimensões temporal e geográfica com a análise temática, é importante observar quais tipos de histórias a Netflix privilegia em seu catálogo. A coluna listed_in reúne os gêneros e categorias atribuídos a cada título, muitas vezes com múltiplas atribuições por obra (por exemplo, “Dramas Internacionais, Filmes Românticos”).

# OBJETIVO: Comparar distribuição de gêneros entre filmes e séries
# Criar visualização de barras agrupadas
ggplot(genre_type_top, aes(x = reorder(listed_in, n), y = n, fill = type)) +
  geom_col(position = "dodge") + # Barras lado a lado
  coord_flip() + # Rotacionar para facilitar leitura
  labs(
    x = "Gênero / Categoria",
    y = "Quantidade de títulos",
    fill = "Tipo",
    title = "Distribuição dos principais gêneros entre Filmes e Séries"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")

O gráfico mostra que o gênero International é o mais representado no catálogo da Netflix quando consideramos filmes e séries juntos. A predominância desse gênero em filmes indica que a plataforma utilizou o licenciamento internacional como estratégia para ampliar rapidamente a diversidade do catálogo, especialmente durante seu período inicial de expansão global.

Gêneros fortemente associados ao formato seriado, como TV Dramas e TV Comedies refletem um movimento estratégico da Netflix a partir de 2017: consolidar sua identidade por meio de séries originais que estimulam maratonas e engajamento contínuo.

Tabela: proporção de gêneros por tipo

Para análise quantitativa detalhada, a tabela mostra as proporções exatas:

# OBJETIVO: Calcular proporções de gêneros por tipo para análise numérica
# Calcular proporções e formatar tabela
genero_proporcao <- genre_type_top %>%
  group_by(listed_in) %>%
  mutate(
    total_genero = sum(n), # Total do gênero
    prop = round((n / total_genero) * 100, 1) # Proporção percentual
  ) %>%
  select(listed_in, type, n, prop) %>% # Selecionar colunas relevantes
  pivot_wider(
    names_from = type,
    values_from = c(n, prop),
    values_fill = list(n = 0, prop = 0)
  ) %>%
  arrange(desc(n_Movie + `n_TV Show`)) %>% # Ordenar por total decrescente
  slice_head(n = 8) # Top 8 gêneros

# Formatar tabela final
kable(genero_proporcao,
  col.names = c("Gênero", "Filmes (n)", "Séries (n)", "Filmes (%)", "Séries (%)"),
  align = c("l", "c", "c", "c", "c"),
  caption = "Distribuição quantitativa e percentual dos principais gêneros"
)
Distribuição quantitativa e percentual dos principais gêneros
Gênero Filmes (n) Séries (n) Filmes (%) Séries (%)
Action & Adventure 859 0 100 0
Children & Family Movies 641 0 100 0
Comedies 1674 0 100 0
Documentaries 869 0 100 0
Dramas 2427 0 100 0
Independent Movies 756 0 100 0
International Movies 2752 0 100 0
International TV Shows 0 1351 0 100
Romantic Movies 616 0 100 0
TV Comedies 0 581 0 100
TV Dramas 0 763 0 100
Thrillers 577 0 100 0

A partir das análises acima, podemos identificar quais gêneros aparecem equilibrados entre filmes e séries e quais são dominados por um formato específico, revelando como a Netflix estrutura seu catálogo tematicamente.


Evolução temporal dos gêneros

Para completar a análise temática com a perspectiva temporal, também é relevante observar como esses gêneros se comportam ao longo dos anos. Isso permite identificar momentos de expansão ou retração de determinadas categorias dentro do catálogo.

ggplot(genre_year_top, aes(x = added_year, y = listed_in, fill = n)) +
  geom_tile() +
  scale_fill_viridis_c(option = "plasma") +
  labs(
    x = "Ano de adição",
    y = "Gênero / Categoria",
    fill = "Nº de títulos",
    title = "Evolução dos principais gêneros no catálogo da Netflix"
  ) +
  theme_minimal()

Esse gráfico em formato de heatmap evidencia os períodos em que determinados gêneros ganham intensidade no catálogo da plataforma. Alguns gêneros apresentam crescimento mais concentrado nos anos de expansão global (especialmente após 2016), enquanto outros mantêm presença mais estável ao longo do tempo.

Gêneros como Drama, Documentário, Internacional e Ação/Aventura apresentam forte expansão entre 2017 e 2019, coincidindo com o auge da produção global da plataforma.

A presença crescente da categoria Filmes e Séries Internacionais reforça o papel da Netflix como catalisadora de produções estrangeiras, um movimento que levou obras como La Casa de Papel, Lupin, The Witcher e Round 6 a se tornarem fenômenos globais.

Esta análise temática, combinada com as dimensões temporal e geográfica exploradas anteriormente, revela como a Netflix implementou uma estratégia integrada de diversificação, expandindo simultaneamente em volume (mais títulos por ano), alcance geográfico (maior diversidade de países) e variedade temática (ampliação de gêneros), consolidando-se como uma plataforma verdadeiramente global e diversificada.


Conclusão

Este estudo investigou de forma integrada como o catálogo da Netflix evoluiu entre 2007 e 2021, analisando suas dimensões temporal, geográfica e temática. Mais do que observar números, buscou-se interpretar o que essas transformações dizem sobre a estratégia global da plataforma e como elas refletem mudanças profundas no mercado do entretenimento digital.

Metodologia aplicada

A análise utilizou o dataset do Kaggle com 8.807 títulos, passando por um processo estruturado de limpeza, padronização e expansão das variáveis. Posteriormente, aplicaram-se métodos de análise exploratória combinando gráficos, tabelas comparativas e interpretação narrativa. O objetivo foi construir uma leitura coerente sobre o crescimento da Netflix enquanto catálogo e enquanto plataforma global.

Principais descobertas

1. Crescimento exponencial coordenado (2016-2019)

O catálogo apresentou expansão acelerada a partir de 2016, atingindo pico em 2019. Esse período coincide com a internacionalização da Netflix, com investimentos em produções originais e parcerias globais. O período pós-2020 mostrou estabilização e maior seletividade, refletindo um mercado mais competitivo e o impacto da pandemia na produção audiovisual.

2. Globalização efetiva do conteúdo

A Netflix deixou de ser uma plataforma predominantemente norte-americana para se tornar um ecossistema global. Houve:

  • Diversificação crescente de países produtores;
  • Aumento da diversidade geográfica anual;
  • Consolidação de mercados-chave como Índia, Reino Unido e Coreia do Sul, refletindo um modelo de produção descentralizada.

3. Estratégia de diversificação integrada

A ampliação de gêneros demonstra uma plataforma que equilibra:

  • Filmes para volume e variedade, com forte presença do gênero Internacional;
  • Séries para retenção e identidade, especialmente dramas e comédias seriadas.

Essa diversificação revela um catálogo pensado para públicos globais, com estratégias distintas para filmes e séries, com expansão simultânea em volume, alcance e variedade temática.

Implicações para stakeholders

De maneira geral, os resultados deste estudo oferecem insights relevantes para diferentes públicos: criadores e produtoras podem identificar oportunidades em mercados emergentes e gêneros em expansão, pesquisadores e analistas podem utilizar estes padrões como referência para estudos sobre globalização cultural, consumidores e investidores compreendem melhor os movimentos estratégicos por trás da plataforma, e profissionais de mercado visualizam tendências que moldam o ecossistema do streaming.

Limitações e oportunidades futuras

Limitações identificadas

  • Temporal: Os dados abrangem até setembro de 2021, não capturando desenvolvimentos recentes no mercado de streaming
  • Contextual: Ausência de fatores externos (concorrência, políticas de licenciamento)
  • Qualitativa: Priorização de métricas quantitativas sobre qualidade e engajamento

Implicações para interpretação

Essas limitações não invalidam os insights obtidos, mas contextualizam os resultados dentro do escopo de uma análise exploratória inicial. Estudos futuros poderiam incorporar dados mais recentes, análises regionais específicas e métricas de engajamento para uma compreensão mais completa da estratégia da Netflix.

Este estudo estabelece uma base sólida para compreender como plataformas digitais implementam estratégias de globalização cultural, oferecendo insights valiosos sobre a evolução do entretenimento digital contemporâneo e suas implicações para diversos stakeholders.