Introdução

Cinema no Brasil

História, Resiliência e Regulação

A indústria cinematográfica brasileira é caracterizada por uma história de extremos, alternando entre períodos de grande popularidade e crises estruturais. Desde o auge nos anos 1970 — impulsionado por políticas de fomento e o sucesso de filmes populares — até o declínio acentuado nas décadas subsequentes, o mercado sempre demonstrou forte correlação com a estabilidade econômica e o ambiente regulatório do país (AIC - Academia Internacional de Cinema 2019).

Após ser duramente atingido pela pandemia de Covid-19 e pela ascensão do streaming, o circuito exibidor brasileiro mostra sinais de recuperação. Em 2023, o país registrou 114,1 milhões de pagantes e cerca de 3.480 salas, embora ainda aquém dos patamares pré-pandemia (Salgado 2024). Essa recuperação é sustentada por marcos regulatórios recentes, como o restabelecimento da Cota de Tela (“Lei Nº 14.814, de 15 de Janeiro de 2024,” n.d.), que obriga exibidoras a dedicarem um número mínimo de sessões à produção nacional até 2033. Essa medida é vista como crucial para proteger o cinema nacional e garantir sua participação efetiva nos horários de maior procura.

O Desafio da Acessibilidade e a Concentração de Salas

Embora a recuperação do público seja um indicador positivo, a infraestrutura de exibição no Brasil apresenta um desafio estrutural: a baixa cobertura e a alta concentração. A migração histórica dos cinemas de rua para o modelo de multiplex em shopping centers resultou em um mercado onde 88,4% das salas estão em shoppings, e apenas 8% dos municípios brasileiros (451 de 5.565) possuem acesso a um cinema (Salgado 2024).

Essa concentração levanta a questão central desta análise: se o acesso à experiência cinematográfica está geograficamente restrito e se essa limitação influencia diretamente os hábitos de consumo e a rentabilidade do setor.

Objetivo e Escopo da Análise

Este relatório apresenta uma análise da forma de consumo e disponibilidade de cinemas e filmes no Brasil em 2024, confrontando a infraestrutura de salas (acessibilidade) com o comportamento de bilheteria (demanda).

O estudo utilizará exclusivamente dados consolidados de bilheteria e cadastro de salas da Agência Nacional do Cinema (ANCINE) referentes ao ano de 2024, visando mapear:

  • Padrões de Consumo: A distribuição temporal (mês, dia, horário) do público e da receita.

  • Alcance Geográfico: A relação entre o número de salas/complexos por UF e município e o desempenho de público.

  • Influência da Infraestrutura: Como a disponibilidade e o tipo de sala (e sua localização) se correlacionam com a capacidade de atração de público no cenário pós-pandemia, sob a vigência de novas políticas como a Cota de Tela.


Origem dos Dados

Nesta seção são apresentadas as fontes de dados utilizadas no estudo, ambas disponibilizadas pela Agência Nacional do Cinema (ANCINE) por meio do Portal Brasileiro de Dados Abertos. As duas bases possuem ampla cobertura nacional e seguem padrões de padronização definidos por instruções normativas específicas.

Relatório de Bilheteria Diária de Obras Informadas pelas Exibidoras

Definição

O conjunto de dados de “Relatório de Bilheteria Diária de Obras Informadas Pelas Distribuidoras” (2024) reúne informações declaradas pelas exibidoras sobre todas as sessões de cinema realizadas no país. Cada registro corresponde a uma sessão individual e inclui data, horário, obra exibida, características da sala e do exibidor, além de indicadores de público e receita.

Os dados são originalmente organizados por no e mês, mas cada mês é subdividido em arquivos referentes às semanas consolidadas, no formato:

YYYY-MM-s01  
YYYY-MM-s02  
YYYY-MM-s03  
YYYY-MM-s04  
YYYY-MM-s05

Por exemplo:

  • 2014-01-s01
  • 2014-01-s02
  • 2023-11-s01
  • 2023-11-s02

Essa estrutura permite que a base seja atualizada continuamente, com novas semanas publicadas conforme o envio obrigatório das informações pelas exibidoras. Assim, o conjunto disponibilizado é sempre o mais atualizado possível, porém meses muito recentes podem aparecer ainda incompletos.

Para garantir consistência temporal e evitar problemas decorrentes de semanas não consolidadas, esta análise utiliza exclusivamente os dados referentes a 2024, que apresentam maior estabilidade e cobertura completa.

O envio das informações é regulamentado pela Instrução Normativa nº 123/2015, que define as diretrizes do Sistema de Controle de Bilheteria (SCB).

Mais informações: Instrução Normativa n.º 123, de 22 de dezembro de 2015 (ANCINE 2015)


Principais campos

A base contém informações como:

  • DATA_EXIBICAO — Data da sessão (dd/MM/yyyy)
  • SESSAO — Data e horário completo da sessão
  • TITULO_ORIGINAL / TITULO_BRASIL — Identificação da obra
  • CPB_ROE — Registro nacional/estrangeiro
  • AUDIO / LEGENDADA — Idioma e acessibilidade
  • REGISTRO_SALA / NOME_SALA — Identificação da sala
  • MUNICIPIO_SALA_COMPLEXO / UF_SALA_COMPLEXO — Localização
  • RAZAO_SOCIAL_EXIBIDORA / CNPJ_EXIBIDORA — Dados da exibidora
  • PUBLICO — Indicadorw de audiência

Esses campos tornam possível realizar análises temporais, geográficas, econômicas e estruturais do mercado exibidor brasileiro.


Salas de Exibição e Complexos Registrados na ANCINE

Definição

A base de “Salas de Exibição e Complexos Registrados Na ANCINE” (2024) reúne informações do cadastro oficial de salas, complexos e exibidores registrados na ANCINE. Inclui dados estruturais (capacidade, acessibilidade, operação), localização, situação de funcionamento e informações cadastrais.

Esse cadastro segue normas estabelecidas pelas instruções normativas:

  • IN nº 91/2010 — sobre cadastro de exibidores
  • IN nº 123/2015 — sobre definição e regulamentação de salas, complexos e funcionamento do SCB

Mais informações:


Principais campos

A base inclui:

  • NOME_SALA / REGISTRO_SALA / CNPJ_SALA — Identificação da sala
  • SITUACAO_SALA — Estado de funcionamento
  • ASSENTOS_SALA — Capacidade total
  • Campos de acessibilidade — Rampas, banheiros acessíveis, etc.
  • NOME_COMPLEXO / REGISTRO_COMPLEXO — Identificação do complexo
  • LOCALIZAÇÃO — Endereço, município, UF
  • OPERACAO_USUAL — Comercial ou não comercial
  • NOME_EXIBIDOR / CNPJ_EXIBIDOR — Dados do exibidor
  • SITUACAO_EXIBIDOR — Regularidade cadastral
  • GRUPO_EXIBIDOR — Quando aplicável

Essa base é fundamental para contextualizar as análises de bilheteria com a infraestrutura de exibição existente no país.


Pacotes Necessários

Esses são os pacotes necessários para executar a análise descrita nesse documento:

Pacote Justificativa
tidyverse Conjunto de pacotes para manipulação, transformação e visualização de dados (inclui dplyr, ggplot2, tidyr, readr, etc.).
hms Manipulação e formatação de horários no padrão HH:MM:SS.
DT Criação e exibição de tabelas interativas.
scales Formatação de números, percentuais e escalas usada em gráficos.
plotly Gráficos interativos integrados com ggplot ou criados do zero.
geobr Download de shapefiles do Brasil para mapas e análises geográficas.
library(tidyverse)
library(hms)
library(DT)
library(scales)
library(plotly)
library(geobr)

Carregamento dos Dados

Dados de Bilheterias

Os dados de bilheteria diária e das salas de cinema utilizados neste estudo são disponibilizados pela ANCINE por meio do Portal Brasileiro de Dados Abertos, como explicado da seção de Introdução. Cada mês é dividido em arquivos semanais (por exemplo: 2024-01-s01, 2024-01-s02, …), contendo todas as sessões de cinema realizadas naquela semana.

Embora a base complete constantemente novas semanas ao longo do ano — sendo, portanto, a mais atualizada possível — para esta análise foram utilizados exclusivamente os dados referentes ao ano de 2024, que é o último ano completo no momento dessa análise.

Isso significa que, entre todos os arquivos disponibilizados (2014–2025), foram carregados apenas aqueles que seguem o padrão:

bilheteria-diaria-obras-por-exibidoras-2024-XX-sYY.csv

onde:

  • XX representa o mês (01 a 12)
  • YY representa a semana do mês (s01 a s05, dependendo do calendário)

A opção por limitar a análise ao ano de 2024 se justifica pela necessidade de trabalhar com:

  • um período completo e homogêneo,
  • dados suficientemente recentes,
  • um recorte consistente para comparação temporal,
  • redução de volume, uma vez que a base completa ultrapassa dezenas de milhões de registros.

Além disso, para garantir consistência na correspondência com a base de Salas de Exibição e Complexos, também foi carregada a versão mais recente disponível do cadastro oficial de salas no ano de referência.

Seleção dos arquivos de bilheteria de 2024

Nesta subseção, identificamos na pasta de trabalho apenas os arquivos semanais do ano de 2024. Os nomes seguem o padrão YYYY-MM-sXX, o que permite filtrar os arquivos desejados com expressões regulares. Em seguida, uma função auxiliar extrai o mês de referência de cada arquivo para que possam ser agrupados.

pasta <- "Bilheteria-Salas-Cinema"

# *Assumindo que os arquivos CSV estão na pasta especificada*
arquivos_bilheteria <- list.files(
  pasta,
  pattern = "^bilheteria-diaria-obras-por-exibidoras-2024-\\d{2}-s\\d{2}\\.csv$",
  full.names = TRUE
)

extrair_mes <- function(caminho) {
  nome <- basename(caminho)
  sub(".*(2024-\\d{2}).*", "\\1", nome)
}

meses <- sapply(arquivos_bilheteria, extrair_mes)

Combinação das semanas de cada mês

Cada mês do ano é distribuído em múltiplos arquivos semanais. Nesta etapa, os arquivos são agrupados por mês e combinados em um único data frame mensal. A função map_dfr() é utilizada para ler e empilhar todas as semanas daquele mês, removendo colunas irrelevantes para a análise.

# Usando split() e lapply() para agrupar e carregar
lista_meses_combinados <- lapply(
  split(arquivos_bilheteria, meses),
  function(arquivos_mes) {
    map_dfr(
      arquivos_mes,
      ~read_csv2(
        file = .x,
        locale = locale(encoding = "UTF-8"),
        col_select = -c(REGISTRO_GRUPO_EXIBIDOR, REGISTRO_EXIBIDOR, REGISTRO_COMPLEXO, NOME_SALA, MUNICIPIO_SALA_COMPLEXO,
                        AUDIO, LEGENDADA, CNPJ_EXIBIDORA, RAZAO_SOCIAL_EXIBIDORA)
      )
    )
  }
)

Motivos para o descarte das colunas:

  • Pouco úteis à análise: códigos internos e informações que não influenciam significativamente.
  • Baixa qualidade: colunas com muitos valores ausentes, reduzindo confiabilidade e podendo causar perda de dados.

Dados das Salas

Além da base de bilheteria, também é carregado o cadastro oficial de salas e complexos exibidores da ANCINE. Esses metadados são importantes para complementar e validar as informações de exibição presentes nos relatórios de bilheteria. Algumas colunas menos relevantes são descartadas para otimizar o processamento.

df_salas <- read_csv2(
  file = file.path(pasta, "salas-de-exibicao-e-complexos.csv"),
  locale = locale(encoding = "UTF-8"),
  col_select = -c(
    PAGINA_ELETRONICA_COMPLEXO, ENDERECO_COMPLEXO, NUMERO_ENDERECO_COMPLEXO,
    COMPLEMENTO_COMPLEXO, BAIRRO_COMPLEXO, DATA_INICIO_FUNCIONAMENTO_SALA, DATA_SITUACAO_SALA, SITUACAO_SALA, DATA_SITUACAO_COMPLEXO, SITUACAO_COMPLEXO, SITUACAO_EXIBIDOR, MUNICIPIO_COMPLEXO, COMPLEXO_ITINERANTE, CNPJ_EXIBIDOR, REGISTRO_EXIBIDOR, NOME_GRUPO_EXIBIDOR, NOME_EXIBIDOR, CEP_COMPLEXO, CNPJ_SALA
  )
)

Motivos para o descarte das colunas:

  • Pouco úteis à análise: códigos internos e informações que não influenciam significativamente.
  • Granularidade excessiva: detalhes de endereço desnecessários para uma análise em nível de município e UF.
  • Baixa qualidade: colunas com muitos valores ausentes, reduzindo confiabilidade e podendo causar perda de dados.

Visualização Inicial

Após o carregamento das bases, realizamos uma inspeção preliminar para verificar a estrutura dos dados, identificar possíveis problemas e garantir que o conteúdo está coerente com o esperado. A seguir, são exibidos exemplos das primeiras linhas de cada uma das fontes utilizadas.

Essa prévia permite inspecionar nomes de colunas, formatos de data, valores ausentes e outras possíveis inconsistências antes de etapas posteriores de limpeza e integração.


Base de Bilheterias

A base de bilheteria foi organizada em uma lista (lista_meses_combinados), na qual cada elemento corresponde a um mês completo de 2024 já resultante da combinação de suas semanas.

A visualização abaixo mostra as primeiras linhas do primeiro mês disponível na lista:

datatable(
      head(lista_meses_combinados[[1]], 10),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

Base de Salas

A visualização abaixo mostra as primeiras linhas da base de dados que descreve as salas de cinema registradas pela ANCINE:

datatable(
      head(df_salas),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

Tratamento dos Dados

Tratamento dos Dados de Bilheteria

Tratamento de NA’s

Aqui vamos ver como está a situação dos dados quanto a presença de NA’s.

# 1. Calcular percentual de NA por coluna em cada mês
na_pct_por_mes <- lista_meses_combinados %>%
  map_dfr(
    ~ colMeans(is.na(.x)) * 100,  # colMeans = média lógica, vira % de NA
    .id = "Mes"
  )

# 2. Transformar para formato longo (tidy)
na_pct_long <- na_pct_por_mes %>%
  pivot_longer(-Mes, names_to = "Coluna", values_to = "Pct_NA")

# 3. Criar o heatmap
ggplot(na_pct_long, aes(x = Mes, y = Coluna, fill = Pct_NA)) +
  geom_tile(color = "white") +
  scale_fill_gradient(
    low = "#FFFFFF",
    high = "#0D47A1",    # sua cor primária
    name = "% NA"
  ) +
  labs(
    title = "Percentual de valores NA por coluna e mês",
    x = "Mês",
    y = "Coluna"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Observa-se uma maior concentração de valores ausentes nas colunas PAIS_OBRA e TITULO_BRASIL. No caso de PAIS_OBRA, a ausência é esperada, pois esse campo não é preenchido quando o item exibido pertence às categorias “Mostra e Festivais”, “Shows e Musicais” ou “Eventos Esportivos”. Nessas situações, o país de produção não se aplica.

datatable(
      lista_meses_combinados[["2024-01"]] %>% 
        filter(is.na(PAIS_OBRA)) %>% 
        slice(526:530) %>%
        select(DATA_EXIBICAO, TITULO_ORIGINAL, TITULO_BRASIL, PAIS_OBRA),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

Para evitar que esses casos apareçam como valores faltantes nas análises — o que poderia sugerir erro de preenchimento — optou-se por recodificar esses NA específicos como “Não se aplica”, preservando a interpretação correta do dado.

lista_meses_combinados_tratados <- lista_meses_combinados %>%
   map(~.x %>%
        mutate(
          PAIS_OBRA = ifelse(
            TITULO_ORIGINAL %in% c("Mostras e Festivais", "Shows e Musicais", "Eventos Esportivos"),
            "Não se aplica",
            PAIS_OBRA
          )
        )
    )

datatable(
      lista_meses_combinados_tratados[["2024-01"]] %>% 
        filter(TITULO_ORIGINAL %in% c("Mostras e Festivais", "Shows e Musicais", "Eventos Esportivos")) %>% 
        slice(526:530) %>%
        select(DATA_EXIBICAO, TITULO_ORIGINAL, TITULO_BRASIL, PAIS_OBRA),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

No caso de TITULO_BRASIL, os valores ausentes ocorrem principalmente porque, para filmes nacionais, apenas a coluna TITULO_ORIGINAL é utilizada, deixando TITULO_BRASIL em branco. Além disso, esse campo também não é preenchido quando o conteúdo exibido pertence às categorias “Mostra e Festivais”, “Shows e Musicais” ou “Eventos Esportivos”.

datatable(
      lista_meses_combinados[["2024-01"]] %>% 
        filter(is.na(TITULO_BRASIL)) %>% 
        slice(1:10) %>%
        select(DATA_EXIBICAO, TITULO_ORIGINAL, TITULO_BRASIL, PAIS_OBRA),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

Para esse caso, vamos simplesmente repetir o Título Original do filme para a coluna TITULO_BRASIL, já que utilizaremos ela para as análises.

lista_meses_combinados_tratados <- lista_meses_combinados_tratados %>%
  map(~.x %>%
        mutate(
          # Preenche TITULO_BRASIL com TITULO_ORIGINAL se for NA
          TITULO_BRASIL = if_else(is.na(TITULO_BRASIL), TITULO_ORIGINAL, TITULO_BRASIL)
        )
    )

datatable(
      lista_meses_combinados_tratados[["2024-01"]] %>% 
        filter(PAIS_OBRA == "BRASIL") %>% 
        slice(2:6) %>%
        select(DATA_EXIBICAO, TITULO_ORIGINAL, TITULO_BRASIL, PAIS_OBRA),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

Tratamento de Datas e Horários

Como mencionado anteriormente, a coluna SESSAO armazena tanto a data quanto o horário da sessão em formato de texto. Nesta etapa, extraímos apenas o horário para manter na coluna SESSAO, enquanto a data é preservada na coluna DATA_EXIBICAO. Em seguida, ambas são convertidas para formatos apropriados: DATA_EXIBICAO para o tipo Date e SESSAO para o tipo hms.

lista_meses_combinados_tratados <- lista_meses_combinados_tratados %>%
  map(~.x %>%
        mutate(
          # Trata SESSAO para extrair apenas o horário (HH:mm:ss)
          SESSAO = str_extract(SESSAO, "\\d{2}:\\d{2}:\\d{2}$"),
          DATA_EXIBICAO = as.Date(DATA_EXIBICAO, format = "%d/%m/%Y"),
          SESSAO = as_hms(SESSAO)
        )
  )

Tratamento de Categorias

Nesta etapa, convertemos essas colunas para factor, já que representam variáveis categóricas e devem ser tratadas como tal nas análises subsequentes.

lista_meses_combinados_tratados <- lista_meses_combinados_tratados %>%
  map(~.x %>%
        mutate(
          across(
            c(
              TITULO_ORIGINAL, TITULO_BRASIL, PAIS_OBRA, UF_SALA_COMPLEXO
            ),
            factor
          )
        )
  )

Visualização Pós-Tratamento

Após os tratamentos realizados, temos:

Dicionário de Variáveis do Conjunto de Dados
Variável Tipo Descrição
DATA_EXIBICAO Date Data em que a sessão de cinema ocorreu.
SESSAO hms Horário da sessão (formato horas:minutos:segundos).
TITULO_ORIGINAL Factor Título original do filme informado pelo exibidor.
TITULO_BRASIL Factor Título comercial utilizado no Brasil.
CPB_ROE chr Código identificador da obra audiovisual no sistema da Ancine.
PAIS_OBRA Factor País de origem da obra audiovisual.
REGISTRO_SALA num Código identificador único da sala de exibição.
PUBLICO num Número de espectadores presentes na sessão.
UF_SALA_COMPLEXO Factor Unidade Federativa (estado) do complexo exibidor.
datatable(
      lista_meses_combinados_tratados[["2024-01"]] %>%
        slice(1:10),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )
Nº de NA’s por Coluna
colSums(is.na(lista_meses_combinados_tratados[["2024-01"]]))
##    DATA_EXIBICAO           SESSAO  TITULO_ORIGINAL    TITULO_BRASIL 
##                0                0                0                0 
##          CPB_ROE        PAIS_OBRA    REGISTRO_SALA          PUBLICO 
##                0                0                0                0 
## UF_SALA_COMPLEXO 
##                0

Tratamento dos Dados de Salas

Tratamento de NA’s

Aqui apresentamos as colunas que apresentam NA’s e suas quantidades.

df_salas_na <- df_salas %>%
  summarise(across(everything(), ~ sum(is.na(.)))) %>%
  pivot_longer(everything(),
               names_to = "variavel",
               values_to = "n_na") %>%
  filter(n_na > 0)   # << filtra só colunas com NA

ggplot(df_salas_na, aes(x = reorder(variavel, n_na), y = n_na)) +
  geom_col(fill = "#1E88E5") +
  coord_flip() +
  labs(
    title = "Quantidade de valores ausentes por variável — df_salas",
    x = "Variável",
    y = "Nº de valores ausentes"
  ) +
  theme_minimal(base_size = 12)

As colunas ASSENTOS_MOBILIDADE_REDUZIDA, ASSENTOS_OBESIDADE e ASSENTOS_CADEIRANTES apresentam valores ausentes representando ausência de assentos, sendo preenchidas com NA em vez de 0. Portanto, substituímos os NA por 0 nessas variáveis.

df_salas_filtrado <- df_salas %>%
  mutate(
    across(
      c(ASSENTOS_CADEIRANTES, ASSENTOS_MOBILIDADE_REDUZIDA, ASSENTOS_OBESIDADE),
      ~replace_na(.x, 0)
    )
  )

Para os demais casos de valores ausentes, não identificamos uma relação direta — tratam-se simplesmente de informações que não foram fornecidas. Além disso, as linhas que apresentam esses NAs são, em grande parte, as mesmas, o que impede a obtenção de informações relevantes a partir delas.

datatable(
      df_salas_filtrado %>% 
        filter(is.na(REGISTRO_SALA)) %>% 
        slice(6:10),
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )

Por esse motivo, optamos por excluir essas observações do conjunto de dados.

df_salas_filtrado <- df_salas_filtrado %>%
  filter(!is.na(REGISTRO_SALA))

Conversão de variáveis categóricas e lógicas

O código abaixo realiza dois tipos distintos de conversão:

  1. Variáveis categóricas → Factor As colunas UF_COMPLEXO e OPERACAO_USUAL . Convertê-las para factor garante consistência no tratamento dessas informações e facilita análises, sumarizações e visualizações baseadas em categorias.

  2. Variáveis SIM/NÃO → lógicas (TRUE/FALSE) Já as variáveis de acessibilidade não são categorias, mas indicadores binários. Assim, elas são convertidas para valores lógicos:

    • "SIM"TRUE
    • qualquer outro valor → FALSE

    Isso torna cálculos como proporções, somas e filtros muito mais diretos e confiáveis.

df_salas_filtrado <- df_salas_filtrado %>%
  mutate(
    across(
      c(UF_COMPLEXO, OPERACAO_USUAL),
      factor
    ),
    ACESSO_ASSENTOS_COM_RAMPA = ACESSO_ASSENTOS_COM_RAMPA == "SIM",
    ACESSO_SALA_COM_RAMPA = ACESSO_SALA_COM_RAMPA == "SIM",
    BANHEIROS_ACESSIVEIS = BANHEIROS_ACESSIVEIS == "SIM"
  )

Visualização Pós-Tratamento

Após os tratamentos realizados:

Dicionário de Variáveis do Conjunto de Dados
Variável Tipo Descrição
NOME_SALA chr Nome da sala individual dentro do complexo.
REGISTRO_SALA num Código numérico da sala registrado na ANCINE.
ASSENTOS_SALA num Quantidade total de assentos disponíveis na sala.
ASSENTOS_CADEIRANTES num Número de assentos reservados para pessoas cadeirantes.
ASSENTOS_MOBILIDADE_REDUZIDA num Número de assentos destinados a pessoas com mobilidade reduzida.
ASSENTOS_OBESIDADE num Número de assentos adaptados para pessoas com obesidade.
ACESSO_ASSENTOS_COM_RAMPA logi Indica se há rampa para acesso aos assentos (TRUE = sim).
ACESSO_SALA_COM_RAMPA logi Indica se a sala possui acesso por rampa (TRUE = sim).
BANHEIROS_ACESSIVEIS logi Indica se o complexo possui banheiros acessíveis (TRUE = sim).
NOME_COMPLEXO chr Nome do complexo de cinemas (shopping, centro cultural etc.).
UF_COMPLEXO factor Sigla da Unidade Federativa onde o complexo está localizado.
OPERACAO_USUAL factor Tipo de operação do complexo: comercial, não comercial etc.
datatable(
      df_salas_filtrado,
      extensions = "Scroller",
      options = list(
        deferRender = TRUE,
        scrollX = TRUE,
        scrollY = 300,
        scroller = TRUE
      ),
      rownames = FALSE
    )
Nº de NA’s por Coluna
colSums(is.na(df_salas_filtrado))
##                    NOME_SALA                REGISTRO_SALA 
##                            0                            0 
##                ASSENTOS_SALA         ASSENTOS_CADEIRANTES 
##                            0                            0 
## ASSENTOS_MOBILIDADE_REDUZIDA           ASSENTOS_OBESIDADE 
##                            0                            0 
##    ACESSO_ASSENTOS_COM_RAMPA        ACESSO_SALA_COM_RAMPA 
##                            0                            0 
##         BANHEIROS_ACESSIVEIS                NOME_COMPLEXO 
##                            0                            0 
##            REGISTRO_COMPLEXO                  UF_COMPLEXO 
##                            0                            0 
##               OPERACAO_USUAL 
##                            0

Análise Exploratória dos Dados

Distribuição de Salas e Público

Um aspecto importante do cinema brasileiro é a distribuição de salas e de público. Segundo estimativas de população (IBGE 2024), em 2024 o Sudeste representava aproximadamente 41.7% da população do país, sendo que São Paulo concentrava cerca de 51.9% da população da região. Naturalmente, isso nos leva a supor que o público cinematográfico paulista seja maior simplesmente devido à sua densidade populacional, o que pode ser visualizado no mapa abaixo:

# Público por estado em cada mês
publico_mensal_por_estado <- lista_meses_combinados_tratados %>%
  imap_dfr(~ .x %>% 
             group_by(UF_SALA_COMPLEXO) %>% 
             summarise(publico_estado = sum(PUBLICO, na.rm = TRUE),
                       .groups = "drop") %>% 
             mutate(Mes = .y))

# Público total do mês
publico_total_mes <- publico_mensal_por_estado %>%
  group_by(Mes) %>%
  summarise(publico_total = sum(publico_estado), .groups = "drop")

# Juntar e calcular percentual
percentual_estado_mes <- publico_mensal_por_estado %>%
  left_join(publico_total_mes, by = "Mes") %>%
  mutate(percentual = publico_estado / publico_total)

# Média percentual anual por estado
media_percentual_por_estado <- percentual_estado_mes %>%
  group_by(UF_SALA_COMPLEXO) %>%
  summarise(media_percentual = mean(percentual), .groups = "drop")


# 1. Obter o mapa do Brasil com os estados
brasil <- read_state(year = 2020)

# 2. Juntar com os dados de participação média
mapa_publico <- brasil %>%
  left_join(media_percentual_por_estado, by = c("abbrev_state" = "UF_SALA_COMPLEXO"))

# 3. Plotar mapa
ggplot(mapa_publico) +
  geom_sf(aes(fill = media_percentual), color = "white") +
  scale_fill_gradient(low = "lightblue", high = "darkblue", labels = percent_format(accuracy = 0.1)) +
  labs(
    title = "Participação Média Anual do Público por Estado",
    fill = "Participação (%)"
  ) +
  theme_minimal()

Ao analisar os dados, observa-se que o público de cinema concentra-se majoritariamente e de maneira demasiada no estado de São Paulo. Esse fenômeno é influenciado pela elevada densidade populacional da metrópole, mas também se reflete na concentração de salas de cinema na região Sudeste, conforme ilustrado na tabela abaixo.

# Contar salas por UF
salas_por_uf <- df_salas_filtrado %>%
  count(UF_COMPLEXO)

# Obter UFs com a região já incluída
ufs <- brasil %>%
  select(abbrev_state, name_region) %>%
  distinct()

# Renomear colunas para bater com seu df
ufs <- ufs %>%
  rename(UF_COMPLEXO = abbrev_state, REGIAO = name_region)

# Juntar com seu df
df_salas_regiao <- df_salas_filtrado %>%
  left_join(ufs, by = "UF_COMPLEXO")

# Contar salas por região
salas_por_regiao <- df_salas_regiao %>%
  count(REGIAO) %>%
  arrange(desc(n))

salas_por_regiao_perc <- salas_por_regiao %>%
  mutate(pct = n / sum(n) * 100)

salas_outras <- salas_por_regiao %>% filter(REGIAO != "Sudeste") %>% summarise(total_salas = sum(n)) %>% pull(total_salas)

datatable(
  salas_por_regiao,
  rownames = FALSE,
  options = list(pageLength = 5),
  colnames = c("Região", "Número de Salas")
)

Observa-se que a região Sudeste concentra 51% das salas de cinema do país. Somando-se todas as salas das demais regiões, o total é 3080, valor que ainda é inferior à quantidade de salas existentes apenas no Sudeste (3187).

total_sudeste <- df_salas_filtrado %>%
  left_join(ufs, by = "UF_COMPLEXO") %>%
  filter(REGIAO == "Sudeste") %>%
  nrow()  # número de salas no Sudeste

salas_sp <- df_salas_filtrado %>%
  filter(UF_COMPLEXO == "SP") %>%
  nrow()  # número de salas em SP

salas_mg <- df_salas_filtrado %>%
  filter(UF_COMPLEXO == "MG") %>%
  nrow()  # número de salas em ES

pct_sp_sudeste <- round(salas_sp / total_sudeste * 100)

pct_mg_sudeste <- round(salas_mg/ total_sudeste * 100)

Além disso, o estado de São Paulo possui 1885 salas, representando 59% das salas da região Sudeste. Isso é aproximadamente 7 pontos percentuais acima de sua participação na população da região. Em contraste, Minas Gerais possui 17% das salas, enquanto corresponde a 24% da população, resultando em uma diferença de -7 pontos percentuais.

Para comparação fora da região Sudeste, observa-se que, por exemplo, o estado do Pará, com 8.664306^{6} habitantes, possui apenas 126 salas de cinema. Em contraste, o Espírito Santo, com aproximadamente metade da população do Pará (4.102129^{6}), abriga praticamente o mesmo número de salas (125).

Ainda que consideremos a soma das salas de cinema de Bahia, Pernambuco, Ceará, Maranhão e Paraíba (760), mesmo com uma população próxima à de São Paulo, o total de salas ainda representa apenas cerca de metade das existentes em São Paulo.

# Plotly horizontal bar
plot_ly(
  salas_por_uf,
  x = ~n,
  y = ~reorder(UF_COMPLEXO, n),
  type = "bar",
  orientation = "h",
  marker = list(color = "#4C72B0")
) %>%
  layout(
    title = "Quantidade de Salas por Estado",
    xaxis = list(title = "Salas"),
    yaxis = list(title = "Estado")
  )

Disponibilidade de Títulos entre Regiões

Além da distribuição de salas, nota-se que a região Sudeste também concentra mais títulos lançados nos cinemas. A tabela abaixo apresenta a média de títulos por estado em cada região, evidenciando que os estados do Sudeste têm, em média, mais lançamentos que estados de outras regiões.

# Juntando todos os meses da lista em um único df
titulos_por_estado <- lista_meses_combinados_tratados %>%
  bind_rows() %>%
  group_by(UF_SALA_COMPLEXO) %>%
  summarise(num_titulos = n_distinct(TITULO_BRASIL)) %>%
  arrange(desc(num_titulos)) %>%
  select(UF_SALA_COMPLEXO, num_titulos)  # mantém só as colunas importantes

# Calcular média de títulos por região com base nos estados
media_titulos_por_regiao <- titulos_por_estado %>%
  left_join(ufs, by = c("UF_SALA_COMPLEXO" = "UF_COMPLEXO")) %>%  # adiciona REGIAO
  group_by(REGIAO) %>%
  summarise(media_titulos = round(mean(num_titulos))) %>%
  arrange(desc(media_titulos))

datatable(
  media_titulos_por_regiao,
  rownames = FALSE,
  colnames = c("Região", "Média de Títulos por Estado"),
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: center; font-weight: bold; font-size: 16px;',
    "Média da Quantidade de Títulos Disponíveis por Região"
  ),
  options = list(pageLength = 5, autoWidth = TRUE)
) %>%
  formatStyle(
    columns = names(media_titulos_por_regiao),
    'text-align' = 'center'
  )

Isso reforça o padrão observado anteriormente: não apenas o público e as salas estão concentrados, mas a própria oferta de filmes tende a privilegiar essa região, deixando Norte e Nordeste com menos diversidade de títulos exibidos. Essa disparidade entre oferta de títulos e distribuição populacional sugere que o cinema brasileiro ainda tem forte concentração geográfica e não reflete de forma equilibrada o panorama nacional.


Nacionalidade dos Títulos

O cinema brasileiro apresenta um panorama interessante: apesar de haver uma grande quantidade de títulos nacionais disponíveis nas salas, o público tende a consumir mais produções estrangeiras.

# 1. Juntar todos os meses
todos_filmes <- lista_meses_combinados_tratados %>%
  bind_rows() %>%
  select(TITULO_BRASIL, PAIS_OBRA, ) %>%
  distinct()  # garante que cada filme conte apenas uma vez

# 2. Contar filmes por país (Top 5)
filmes_por_pais_top5 <- todos_filmes %>%
  group_by(PAIS_OBRA) %>%
  summarise(num_filmes = n(), .groups = "drop") %>%
  arrange(desc(num_filmes)) %>%
  slice_head(n = 5)  # pega apenas o top 5

O gráfico abaixo mostra os 5 países com maior número de títulos em cartaz. Observa-se que o Brasil lidera em quantidade de títulos (358), seguido por outros países, como os Estados Unidos.

# 3. Gráfico de barras mostrando a quantidade absoluta de filmes por país
p <- ggplot(filmes_por_pais_top5, 
            aes(x = fct_reorder(PAIS_OBRA, num_filmes), y = num_filmes, fill = PAIS_OBRA,
                text = paste("País:", PAIS_OBRA,
                             "<br>Número de Filmes:", num_filmes))) +
  geom_col() +
  geom_text(aes(label = num_filmes), hjust = -0.2, size = 4) +
  coord_flip() +
  labs(
    title = "Top 5 Países por Quantidade de Filmes",
    x = "País",
    y = "Número de Filmes",
    fill = "País"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 14))

# Transformar em plotly
ggplotly(p, tooltip = "text") %>%
  layout(
    autosize = TRUE,
    margin = list(l = 150, r = 50, t = 80, b = 50), # aumenta margens para labels e título
    yaxis = list(tickformat = ","),
    xaxis = list(tickangle = 0)
  )

No entanto, a predominância de títulos nacionais disponíveis não se traduz automaticamente em maior público, indicando que fatores como marketing, distribuição e preferência do público influenciam significativamente a audiência.


Repercussão de Títulos Nacionais

A seguir, analisamos os 100 filmes mais assistidos do ano:

  • Ao contabilizar o público total, percebe-se que a maior parcela de espectadores concentra-se nos filmes dos Estados Unidos, mesmo que o Brasil tenha mais títulos disponíveis.
  • Isso indica que títulos estrangeiros, sobretudo de Hollywood, conseguem atrair mais público por sala ou por lançamento específico, como blockbusters.

O gráfico a seguir mostra a distribuição de nacionalidades entre os 100 filmes mais assistidos, reforçando o predomínio do cinema americano.

top_100_mais_assistidos <- lista_meses_combinados_tratados %>%
  bind_rows() %>%
  group_by(TITULO_BRASIL, PAIS_OBRA) %>%
  summarise(publico_total = sum(PUBLICO, na.rm = TRUE), .groups = "drop") %>%
  filter(publico_total > 0) %>%
  arrange(desc(publico_total))%>%
  slice_head(n = 100)

contagem_paises <- top_100_mais_assistidos %>%
  count(PAIS_OBRA) %>%
  mutate(percentual = n / sum(n) * 100) %>%
  filter(!(PAIS_OBRA %in% c("Não se aplica", "null")))

plot_ly(
  contagem_paises,
  labels = ~PAIS_OBRA,
  values = ~percentual,
  type = "pie",
  textinfo = "label+percent",
  insidetextorientation = "radial"
) %>%
  layout(
    title = "Distribuição dos Países entre os 100 Filmes Mais Assistidos",
    showlegend = TRUE
  )

Em contraste, ao observar os 100 filmes menos assistidos percebemos que o Brasil ainda lidera em número de títulos, representando uma parcela significativa dos filmes menos assistidos. Isso sugere que muitos filmes nacionais não conseguem grande repercussão de público, possivelmente devido à distribuição limitada, marketing ou apelo comercial menor.

O gráfico abaixo apresenta a distribuição de nacionalidades entre os 100 filmes menos assistidos, destacando novamente a predominância de produções nacionais nessa faixa.

top_100_menos_assistidos <- lista_meses_combinados_tratados %>%
  bind_rows() %>%
  group_by(TITULO_BRASIL, PAIS_OBRA) %>%
  summarise(publico_total = sum(PUBLICO, na.rm = TRUE), .groups = "drop") %>%
  filter(publico_total > 0) %>%
  arrange(publico_total)%>%
  slice_head(n = 100)

contagem_paises <- top_100_menos_assistidos %>%
  count(PAIS_OBRA) %>%
  mutate(percentual = n / sum(n) * 100)

plot_ly(
  contagem_paises,
  labels = ~PAIS_OBRA,
  values = ~percentual,
  type = "pie",
  textinfo = "label+percent",
  insidetextorientation = "radial"
) %>%
  layout(
    title = "Distribuição dos Países entre os 100 Filmes Menos Assistidos",
    showlegend = TRUE
  )

Além disso, ao analisar o padrão de consumo ao longo do ano em todos os estados, percebemos que os filmes mais assistidos tendem a ser estrangeiros. O heatmap abaixo ilustra essa tendência, mostrando a origem dos filmes mais populares em cada estado mês a mês.

Mesmo com a presença significativa de títulos nacionais, o público costuma se concentrar nas produções internacionais, evidenciando que a quantidade de títulos disponíveis não garante necessariamente maior audiência para filmes brasileiros.

# 1. Iterar sobre cada mês e juntar os dados
filmes_mais_assistidos <- lista_meses_combinados_tratados %>%
  imap_dfr(~ .x %>%
             group_by(UF_SALA_COMPLEXO, TITULO_BRASIL, PAIS_OBRA) %>%
             summarise(publico_total = sum(PUBLICO, na.rm = TRUE), .groups = "drop") %>%
             group_by(UF_SALA_COMPLEXO) %>%
             slice_max(order_by = publico_total, n = 1) %>%  # pega o filme mais assistido por estado
             ungroup() %>%
             mutate(Mes = .y))

# Pivot para heatmap
origem_filmes_estado <- filmes_mais_assistidos %>%
  select(Mes, UF_SALA_COMPLEXO, PAIS_OBRA)

ggplot(origem_filmes_estado, aes(x = Mes, y = UF_SALA_COMPLEXO, fill = PAIS_OBRA)) +
  geom_tile(color = "white") +
  labs(
    title = "Origem dos Filmes Mais Assistidos por Estado e Mes",
    x = "Mes",
    y = "Estado",
    fill = "Pais do Filme"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Os únicos meses em que essa tendência é quebrada são novembro e dezembro, o que coincide, respectivamente, com o lançamento dos filmes Ainda Estou Aqui e Moana no Brasil, que se destacaram como os mais assistidos de seus respectivos meses, como mostra a tabela abaixo:

# Iterar sobre cada mês e pegar o filme mais assistido no país
filmes_mais_assistidos_mes <- lista_meses_combinados_tratados %>%
  imap_dfr(~ .x %>%
             group_by(UF_SALA_COMPLEXO, TITULO_BRASIL, PAIS_OBRA) %>%
             summarise(publico_total = sum(PUBLICO, na.rm = TRUE), .groups = "drop") %>%
             slice_max(order_by = publico_total, n = 1) %>%  # pega o filme mais assistido do mês
             ungroup() %>%
             mutate(Mes = .y)) %>%
  select(Mes, TITULO_BRASIL, PAIS_OBRA, publico_total, UF_SALA_COMPLEXO)  # mantém só as colunas relevantes

# Visualizar em tabela
datatable(
  filmes_mais_assistidos_mes,
  rownames = FALSE,
  colnames = c("Mês", "Título", "Origem", "Público Total"),
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: center; font-weight: bold; font-size: 16px;',
    "Filmes mais Assistidos por Mês"
  ),
  options = list(pageLength = 6, autoWidth = TRUE)
) %>%
  formatStyle(
    columns = names(filmes_mais_assistidos_mes),
    'text-align' = 'center'
  )

Na tabela acima, podemos também ver que os títulos estadunidenses tendem a atrair consistentemente mais público do que os filmes de outros países ao longo do ano.

O gráfico de evolução do público por estado reforça essas tendências já discutidas, mostrando que São Paulo concentra naturalmente a maior parte da audiência. Além disso, nota-se um pico de público nos meses de junho, julho e dezembro, coincidindo com o lançamento de grandes produções estrangeiras, como Divertidamente 2 e Moana, evidenciando que filmes dos Estados Unidos não só são mais numerosos entre os mais assistidos, mas também geram maior engajamento do público.

# Certificando que Mes é fator para manter a ordem correta
publico_mensal_por_estado <- publico_mensal_por_estado %>%
  mutate(Mes = factor(Mes, levels = unique(Mes)))

# Gráfico ggplot
p <- ggplot(publico_mensal_por_estado,
            aes(x = Mes, 
                y = publico_estado, 
                color = UF_SALA_COMPLEXO, 
                group = UF_SALA_COMPLEXO,
                text = paste("Estado:", UF_SALA_COMPLEXO,
                             "<br>Mês:", Mes,
                             "<br>Público:", format(publico_estado, big.mark = ",")))) +
  geom_line(size = 1.2) +
  geom_point(size = 2) +
  scale_y_continuous(labels = scales::label_number(scale = 1e-6, suffix = "M")) +
  labs(
    title = "Evolução do Público por Estado",
    x = "Mês",
    y = "Público (em milhões)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Transformando em plotly
ggplotly(p, tooltip = "text") %>%
  layout(
    autosize = TRUE,          # faz o gráfico tentar ocupar todo o espaço disponível
    margin = list(l = 150),   # aumenta margem esquerda para labels longos
    yaxis = list(tickformat = ",")  # formata eixo Y com milhares
  )

Adicionalmente, o gráfico abaixo evidencia a disparidade de público entre os filmes mais assistidos de diferentes países. Nele, apresentamos os títulos de maior bilheteria de cada origem, ordenados pelo público total.

filmes_mais_assistidos_por_pais <- lista_meses_combinados_tratados %>%
  bind_rows() %>%
  select(TITULO_BRASIL, PAIS_OBRA, PUBLICO) %>%
  group_by(PAIS_OBRA, TITULO_BRASIL) %>%
  summarise(publico_total = sum(PUBLICO, na.rm = TRUE), .groups = "drop") %>%
  group_by(PAIS_OBRA) %>%
  slice_max(order_by = publico_total, n = 1) %>%
  ungroup() %>%
  filter(PAIS_OBRA != "Não se aplica") %>%
  arrange(desc(publico_total)) %>%
  slice_head(n = 5)

# Extrair público
publico_brasil <- filmes_mais_assistidos_por_pais %>% filter(PAIS_OBRA == "BRASIL") %>% pull(publico_total)
publico_eua <- filmes_mais_assistidos_por_pais %>% filter(PAIS_OBRA == "ESTADOS UNIDOS") %>% pull(publico_total)

# Diferença absoluta e percentual
diferenca_absoluta <- publico_eua - publico_brasil
diferenca_percentual <- (publico_eua - publico_brasil) / publico_brasil * 100

plot_ly(
  filmes_mais_assistidos_por_pais,
  x = ~reorder(TITULO_BRASIL, publico_total),  # ordena barras
  y = ~publico_total,
  type = 'bar',
  color = ~PAIS_OBRA,
  text = ~paste("País:", PAIS_OBRA,
                "<br>Público total:"),
  hoverinfo = 'text'
) %>%
  layout(
    title = "Top 5 Títulos Mais Populares por Nacionalidade no Brasil",
    xaxis = list(title = "Filme"),
    yaxis = list(title = "Público Total", tickformat = ","),
    margin = list(l = 80, r = 50, t = 80, b = 150)
  )

Dessa forma, observa-se que, mesmo entre os cinco filmes de maior sucesso por nacionalidade, os títulos estadunidenses atraíram cerca de 647 mais público do que os nacionais, sendo também consideravelmente superiores aos títulos de outros países. Essa diferença reforça a tendência já observada nas seções anteriores: embora haja muitos filmes brasileiros em cartaz, o público tende a se concentrar nas produções internacionais, evidenciando o maior prestígio e apelo das obras estrangeiras no mercado cinematográfico brasileiro.


Distruibuição de Sessões

As observações das sessões anteriores podem nos levar a refletir sobre por que, mesmo estando em maioria absoluta em quantidade de títulos — e apesar de iniciativas de incentivo, como a Cota de Telas — o público de filmes nacionais permanece tão reduzido.

Uma primeira hipótese poderia ser a de que os filmes brasileiros recebem horários desfavoráveis, algo frequentemente apontado como reclamação. No entanto, o gráfico abaixo mostra que isso não é necessariamente verdade: a grande maioria dos filmes, incluindo os nacionais, é exibida no período da tarde, justamente o horário de maior movimento nos cinemas.

df <- lista_meses_combinados_tratados %>%
  bind_rows() %>%
  select(SESSAO, PUBLICO, TITULO_BRASIL, PAIS_OBRA, REGISTRO_SALA, DATA_EXIBICAO) %>%
  mutate(
    Hora = hour(SESSAO),
    Faixa = case_when(
      Hora >= 6 & Hora < 12 ~ "Manhã",
      Hora >= 12 & Hora < 18 ~ "Tarde",
      Hora >= 18 & Hora < 24 ~ "Noite",
      TRUE ~ "Madrugada"
    ),
    Pais = ifelse(PAIS_OBRA == "BRASIL", "Brasil",
                  ifelse(PAIS_OBRA == "ESTADOS UNIDOS", "EUA", NA))
  ) %>%
  filter(!is.na(Pais))

# Resumir dados por país e faixa
df_resumo <- df %>%
  group_by(Pais, Faixa) %>%
  summarise(
    qtd_sessoes = n(),
    publico_total = sum(PUBLICO, na.rm = TRUE),
    .groups = "drop"
  )

# Extrair público
publico_brasil <- filmes_mais_assistidos_por_pais %>%
  filter(PAIS_OBRA %in% c("BRASIL", "ESTADOS UNIDOS")) %>% filter(PAIS_OBRA == "BRASIL") %>% pull(publico_total)
publico_eua <- filmes_mais_assistidos_por_pais %>%
  filter(PAIS_OBRA %in% c("BRASIL", "ESTADOS UNIDOS")) %>% filter(PAIS_OBRA == "ESTADOS UNIDOS") %>% pull(publico_total)

# Diferença absoluta e percentual
diferenca_absoluta <- publico_eua - publico_brasil
diferenca_percentual <- (publico_eua - publico_brasil) / publico_brasil * 100

# Gráfico interativo com plotly (Número de sessões)
plot_sessoes <- plot_ly(df_resumo, 
                        x = ~Faixa, 
                        y = ~qtd_sessoes, 
                        color = ~Pais, 
                        type = 'bar',
                        text = ~paste("País:", Pais,
                                      "<br>Faixa:", Faixa,
                                      "<br>Sessões:", scales::comma(qtd_sessoes))) %>%
  layout(title = "Número de Sessões por Faixa Horária: Brasil vs EUA",
         yaxis = list(title = "Número de Sessões", tickformat = ","),
         barmode = 'group')

# Exibir
plot_sessoes

Ainda assim, o que observamos é uma quantidade muito maior de sessões dedicadas a filmes estadunidenses em todas as faixas horárias, chegando a uma diferença percentual de 646.7% em relação aos filmes brasileiros.

Ou seja, podemos então supor que a menor audiência dos filmes nacionais não é consequência direta de falta de interesse imediato do público, mas sim de uma distribuição desequilibrada de sessões. Com uma quantidade significativamente inferior de exibições, é natural que o público acumulado seja também menor — como apresentado na seção anterior.


Tempo em Cartaz

# Calcular duração em cartaz por título
duracao_por_filme <- df %>%
  group_by(Pais, TITULO_BRASIL) %>%
  summarise(
    primeira_data = min(DATA_EXIBICAO, na.rm = TRUE),
    ultima_data = max(DATA_EXIBICAO, na.rm = TRUE),
    duracao_dias = as.numeric(ultima_data - primeira_data + 1), # +1 para contar inclusive o primeiro dia
    .groups = "drop"
  )

# Calcular duração média e mediana por país (se ainda não tiver rodado)
duracao_media_pais <- duracao_por_filme %>%
  group_by(Pais) %>%
  summarise(
    duracao_media = mean(duracao_dias, na.rm = TRUE),
    duracao_mediana = median(duracao_dias, na.rm = TRUE),
    .groups = "drop"
  )

media_BR  <- duracao_media_pais$duracao_media[duracao_media_pais$Pais == "Brasil"]
media_EUA <- duracao_media_pais$duracao_media[duracao_media_pais$Pais == "EUA"]

dif_absoluta <- media_EUA - media_BR
dif_percentual <- (dif_absoluta / media_BR) * 100

Além do tratado na sessão anterior, podemos investigar uma outra dimensão importante para entender o desempenho comercial: por quanto tempo os filmes permanecem em cartaz.

Como mostrado no gráfico abaixo, filmes dos Estados Unidos têm uma duração média em cartaz 14.5 dias maior do que os filmes brasileiros — o que representa aproximadamente 26.8% de tempo adicional nos cinemas.

# Gráfico interativo
fig <- plot_ly(
  duracao_media_pais,
  x = ~Pais,
  y = ~duracao_media,
  type = "bar",
  text = ~paste0(
    "Média: ", round(duracao_media, 1), " dias<br>",
    "Mediana: ", round(duracao_mediana, 1), " dias"
  ),
  hoverinfo = "text"
)

fig <- fig %>%
  layout(
    title = "Duração média em cartaz: Brasil vs EUA",
    yaxis = list(title = "Dias em cartaz"),
    xaxis = list(title = ""),
    showlegend = FALSE
  )

fig

Essa diferença reforça ainda mais o desequilíbrio observado: com mais sessões e mais semanas de exibição, filmes estadunidenses acumulam naturalmente mais público, independentemente de preferência intrínseca. O cenário indica, assim, que parte significativa do desempenho inferior dos filmes brasileiros se explica pelo menor acesso aos espaços de exibição, e não apenas pela demanda do público.


Acessibilidade das Salas de Cinema do Brasil

Uma hipótese adicional para explicar possíveis diferenças na distribuição de público seria a variação na acessibilidade das salas de cinema entre estados ou regiões. Em teoria, limitações de acesso — como ausência de rampas, assentos reservados ou banheiros acessíveis — poderiam afetar a frequência de determinados grupos, impactando a demanda e, potencialmente, o desempenho de filmes exibidos em diferentes localidades.

No entanto, os resultados mostram que, embora exista alguma variação, não há discrepâncias significativas entre os estados. A proporção média de salas acessíveis por região também permanece relativamente homogênea, sem concentração extrema em uma região específica.

Em outras palavras, os dados não indicam que a acessibilidade seja um fator determinante para as diferenças de público entre estados ou regiões. A infraestrutura básica de acessibilidade tende a ser distribuída de forma relativamente equilibrada pelo país, não sustentando a hipótese de que disparidades nesse aspecto expliquem diferenças relevantes na audiência.

Assim, este aspecto reforça o entendimento de que a variação no público entre regiões está associada a outros elementos — como distribuição de sessões, oferta cinematográfica ou presença de grandes centros urbanos — e não a limitações de acesso físico às salas.

acessibilidade_estado <- df_salas_filtrado %>%
  group_by(UF_COMPLEXO) %>%
  summarise(
    total_salas = n(),
    total_assentos = sum(ASSENTOS_SALA, na.rm = TRUE),

    # total de assentos acessíveis por estado
    assentos_cadeirantes = sum(ASSENTOS_CADEIRANTES, na.rm = TRUE),
    assentos_mob_reduzida = sum(ASSENTOS_MOBILIDADE_REDUZIDA, na.rm = TRUE)
  ) %>%
  mutate(
    perc_cadeirantes = round(assentos_cadeirantes / total_assentos * 100, 1),
    perc_mobilidade_reduzida = round(assentos_mob_reduzida / total_assentos * 100, 1)
  )

acessibilidade_regiao_resumo <- acessibilidade_estado %>%
  left_join(ufs, by = "UF_COMPLEXO") %>%
  filter(!is.na(REGIAO)) %>%
  group_by(REGIAO) %>%
  summarise(
    perc_cadeirantes = round(mean(perc_cadeirantes, na.rm = TRUE), 1),
    perc_mobilidade_reduzida = round(mean(perc_mobilidade_reduzida, na.rm = TRUE), 1)
  ) %>%
  arrange(desc(perc_cadeirantes))

datatable(
  acessibilidade_regiao_resumo,
  rownames = FALSE,
  colnames = c(
    "Região",
    "% Assentos Cadeirantes",
    "% Assentos Mobilidade Reduzida"
  ),
  caption = htmltools::tags$caption(
    style = "caption-side: top; text-align: center; font-size: 18px; font-weight: bold;",
    "Acessibilidade por Região (Percentual de Assentos Acessíveis)"
  ),
  options = list(
    pageLength = 10,
    autoWidth = TRUE,
    dom = "ftip"
  )
)

Apesar disso, ao comparar os resultados observados com o que estabelece o “Decreto Nº 9.404” (2018), nota-se que, mesmo que não haja grande variação entre regiões, os percentuais médios de assentos acessíveis ficam em geral abaixo do mínimo recomendado.

A legislação determina que, nos teatros, cinemas, auditórios, estádios, ginásios de esporte, locais de espetáculos e de conferências e similares, devem ser reservados, no mínimo:

  • 2% de espaços para pessoas em cadeira de rodas;
  • 2% de assentos para pessoas com deficiência ou mobilidade reduzida.

Entretanto, os percentuais calculados mostram que a maioria das regiões apresenta valores inferiores a 2% tanto para assentos destinados a cadeirantes quanto para assentos destinados a pessoas com mobilidade reduzida.

Isso indica que, embora a acessibilidade não seja um fator que explique diferenças de público entre regiões, ela ainda está aquém do patamar previsto pela legislação, evidenciando uma carência estrutural generalizada no país. Em síntese:

  • não há desigualdade relevante entre regiões;
  • mas a maioria opera abaixo do mínimo exigido, sugerindo que melhorias são necessárias em âmbito nacional, não regional.

Conclusão

A análise exploratória da indústria cinematográfica brasileira em 2024, confrontando a infraestrutura de exibição com os padrões de consumo, solidifica a percepção de um mercado marcado por profunda concentração geográfica e uma acentuada disparidade na sustentação da produção nacional.


A Concentração Geográfica Define o Acesso e a Oferta

O principal desafio estrutural do cinema no Brasil não é apenas a baixa cobertura geral (apenas 8% dos municípios com cinemas), mas a hiperconcentração da infraestrutura na região Sudeste.

A Região Sudeste detém aproximadamente 51% das salas e, consequentemente, concentra a maior parte do público e a maior média de títulos por estado. Esta disparidade de infraestrutura cria um ciclo vicioso de acesso: o público nas demais regiões, notadamente Norte e Nordeste, tem uma oferta cinematográfica e diversidade de títulos significativamente limitada, o que perpetua a desigualdade regional no consumo.

Predomínio Estrangeiro: Uma Questão de Distribuição

Apesar de o restabelecimento da Cota de Tela ter reforçado a presença de filmes nacionais em número de títulos, a audiência é esmagadoramente dominada por produções estrangeiras, especialmente as estadunidenses.

A causa central da menor audiência nacional não reside na falta de interesse do público em si, mas sim no acesso desigual ao espaço de exibição. Filmes dos Estados Unidos se beneficiam de um volume de sessões significativamente maior e de um tempo de permanência em cartaz cerca de 26.8% superior ao das produções brasileiras. A concentração de público em grandes blockbusters internacionais, especialmente nos picos anuais, sugere que o maior apelo comercial é potencializado por uma distribuição mais robusta e sustentada, relegando grande parte da produção nacional para as listas dos filmes com menor repercussão.

Acessibilidade como Desafio Nacional (Não Regional)

A análise da acessibilidade física das salas não se mostrou um fator explicativo para as diferenças de público entre as regiões, pois a distribuição de assentos acessíveis é relativamente homogênea no país.

No entanto, a infraestrutura de acessibilidade opera, em média, abaixo do patamar de 2% exigido pelo “Decreto Nº 9.404” (2018) em grande parte do território nacional.

Isso indica uma carência estrutural generalizada que exige melhorias em âmbito nacional, mas que não sustenta a hipótese de que a falta de público em regiões específicas se deva a barreiras de acesso físico mais acentuadas do que em outras.


Implicações Finais

Para o cinema brasileiro alcançar um patamar mais equilibrado de sustentabilidade e representatividade, a política pública e as estratégias de mercado devem focar em superar dois obstáculos cruciais:

  1. Desconcentração da Infraestrutura: É vital que as políticas de fomento incentivem a expansão de salas qualificadas fora dos grandes centros do Sudeste, combatendo a baixa cobertura e levando a experiência cinematográfica a uma parcela maior da população.
  2. Sustentação na Exibição: A Cota de Tela precisa ser complementada por mecanismos que garantam não apenas o lançamento do filme nacional, mas sim uma distribuição mais equitativa de sessões e um tempo de permanência em cartaz prolongado para obras com potencial, permitindo que elas acumulem público e compitam de forma mais justa com as produções estrangeiras.

Em resumo, a indústria no Brasil está em recuperação, mas o desempenho da produção nacional é severamente limitado pela desigualdade no acesso ao espaço de exibição, um reflexo direto da concentração geográfica da infraestrutura de salas.


Referências

AIC - Academia Internacional de Cinema. 2019. A História do Cinema Brasileiro.” Website. https://www.aicinema.com.br/a-historia-do-cinema-brasileiro/.
ANCINE. 2015. Instrução Normativa n.º 123, de 22 de Dezembro de 2015. https://www.gov.br/ancine/pt-br/acesso-a-informacao/legislacao/instrucoes-normativas/instrucao-normativa-no-123.
———. n.d. Instrução Normativa n.º 91. https://www.gov.br/ancine/pt-br/acesso-a-informacao/legislacao/instrucoes-normativas/instrucao-normativa-no-91.
“Decreto Nº 9.404.” 2018. Decreto. Presidência da República. https://www2.camara.leg.br/legin/fed/decret/2018/decreto-9404-11-junho-2018-786845-publicacaooriginal-155826-pe.html.
IBGE. 2024. “Estimativas de População 2024.” IBGE. https://ftp.ibge.gov.br/Estimativas_de_Populacao/Estimativas_2024/estimativa_dou_2024.pdf.
“Lei Nº 14.814, de 15 de Janeiro de 2024.” n.d. Lei. Presidência da República. http://www.planalto.gov.br/ccivil_03/_ato2023-2026/2024/lei/l14814.htm.
“Relatório de Bilheteria Diária de Obras Informadas Pelas Distribuidoras.” 2024. Portal Dados Abertos Gov.br. https://dados.gov.br/dados/conjuntos-dados/relatorio-de-bilheteria-diaria-de-obras-informadas.
“Salas de Exibição e Complexos Registrados Na ANCINE.” 2024. Portal Dados Abertos Gov.br. https://dados.gov.br/dados/conjuntos-dados/salas-de-exibicao-e-complexos-registrados-na-ancine.
Salgado, Lucas. 2024. O cinema no Brasil vai acabar? Saiba a evolução dos números de público e salas no país.” O Globo, June. https://oglobo.globo.com/cultura/noticia/2024/06/23/cinema-no-brasil-circuito-do-pais-busca-se-recuperar-da-pandemia-e-fazer-frente-ao-streaming.ghtml.