Raio-R de uma campanha vitoriosa

O que os dados sobre gastos da campanha de Lula nos diz sobre a estratégia da candidatura?

Fernando Barbalho
datavizbr
9 min readJan 10, 2023

--

Posse de Lula. foto do autor

Uma forte ênfase na produção de conteúdo, uma abordagem estratégica para a comunicação, o impulso da mídia social e da internet, campanhas de rua e um conjunto de eventos significativos em todo o Brasil são os principais elementos associados aos dados abertos sobre os gastos presidenciais de Lula nas eleições de 2022. Nos parágrafos e gráficos seguintes, veremos como um conjunto de códigos R pode traduzir as linhas e colunas de uma tabela de dados em conclusões empolgantes que revelam a estratégia geral da campanha.

Coleta de dados antes da criação de gráficos

Para fazer a análise foi necessária apenas uma tabela disponível no data lake da Base dos Dados. Para ter acesso ao dado já filtrado com as condições necessárias e suficientes para a minha análise, desenvolvi o código abaixo.

library(basedosdados)
library(tidyverse)
library(tidytext)
library(wordcloud)
library(widyr)
library(igraph)
library(ggraph)
library(ggrepel)
library(colorspace)

basedosdados::set_billing_id(<your_project>)

despesa_candidatos<-
basedosdados::bdplyr("basedosdados.br_tse_eleicoes.despesas_candidato")
despesas_lula<-
despesa_candidatos%>%
dplyr::filter(ano==2022,
cargo == "presidente",
sigla_partido== "PT")

despesas_lula<- basedosdados::bd_collect(despesas_lula)

Uma observação antes de prosseguir: como os dados podem ser constantemente atualizados, esse código acima pode trazer dados brutos que gerem diferenças com os achados que fiz no momento da confecção desse texto. A título de registro, os dados para o texto foram coletados em 27/12/2022.

Agora os gráficos e a algumas análises

A primeira análise foi a de identificar os fornecedores mais significativos para a campanha. Utilizei o total gasto por fornecedor como referência, classifiquei-os e selecionei os 20 valores mais importantes. Veja o código e o gráfico abaixo.

#Gráfico de barras
maiores_gastos<-
despesas_lula %>%
group_by(cpf_cnpj_fornecedor,
nome_fornecedor) %>%
summarise(
quantidade = n(),
total_gasto = sum(valor_despesa)
) %>%
ungroup() %>%
slice_max(order_by = total_gasto, n=20)

maiores_gastos %>%
mutate(nome_fornecedor = reorder(nome_fornecedor, total_gasto)) %>%
ggplot() +
geom_col(aes(x=total_gasto, y= nome_fornecedor), fill = "red")+
scale_x_continuous(labels= function(x)format(x, big.mark = ".", scientific = FALSE ))+
theme_light()+
theme(
panel.background = element_rect(fill = "#575756"),
panel.grid = element_blank(),
axis.title.y = element_blank()

) +
labs(
x= "Total spend per supplier"
)
Os 20 maiores fornecedores por gasto total. Imagem do autor.

Uma empresa de comunicação, M4 comunicação e propaganda LTDA, ocupou a primeira posição no ranking. Já a gigante da internet Google ficou na segunda posição. Vale a pena ver que estas duas empresas estão muito distantes de todas as outras 18 quando visualizamos o comprimento das barras.

Uma análise que passou a ser interessante com a descoberta do raking foi a identificação de qual variável é mais importante na formação do valor total gasto por fornecedor. Apostanto na comparação de preço de serviço e quantidade demandada, elaborei dois gráficos para essa investigação. O primeiro é um gráfico de dispersão onde se compara simultaneamente a quantidade de transações e o total gasto para cada fornecedor.

top_4<- 
maiores_gastos %>%
slice_max(order_by = total_gasto, n=4)

set.seed(1972)
#Gráfico de dispersão
despesas_lula %>%
group_by(cpf_cnpj_fornecedor,
nome_fornecedor) %>%
summarise(
quantidade = n(),
total_gasto = sum(valor_despesa)
) %>%
ungroup() %>%
ggplot() +
geom_point(aes(x=quantidade, y=total_gasto),
pch=21,
fill = "black",
color = "#575756") +
geom_point(data= maiores_gastos,
aes(x=quantidade, y=total_gasto),
pch=21,
fill = "red",
color = "#575756",
size=2)+
geom_text_repel(data= top_4,
aes(x=quantidade,
y=total_gasto,
label= str_wrap(nome_fornecedor,20)),
color = "white",
size =3,
nudge_x = c(0,0.1,0,0),
nudge_y = c(0,0,0,0),
force_pull = 5)+
scale_x_log10() +
scale_y_log10(labels=function(x) format(x, big.mark = ".", scientific = FALSE)) +
theme_light()+
theme(
panel.background = element_rect(fill = "#575756"), # "#121212" ##808080 #000080 #575756
panel.grid = element_blank()

) +
labs(
x= "Number of transactions - logarithmic scale",
y= "Total spend per supplier - logarithmic scale"
)

O código acima gera a figura abaixo.

A importância do número de transações no ranking. Imagem do autor.

Os pontos em vermelho estão relacionados aos 20 fornecedores mais críticos, enquanto os pontos em preto representam todas as outras empresas. Podemos ver que a maioria dos fornecedores esteve associada a muito menos do que 100 pagamentos. Por outro lado, uma empresa estava envolvida em mais de 1000 transações. Foi o caso de uma agência de viagens, a Nix Travel Agência de viagens e turismo. A quantidade de transações envolvendo esta empresa é uma pista essencial para o framework que apresentarei mais adiante.

Para completar esta análise, vamos ver um gráfico mostrando a distribuição de todas as transações da campanha.

Mas, vamos primeiro ao código.

#Gráfico de jitter, destacando os maiores gastos
despesas_maiores_fornecedores<-
despesas_lula %>%
inner_join(
maiores_gastos %>%
distinct(cpf_cnpj_fornecedor,
nome_fornecedor)
) %>%
select(cpf_cnpj_fornecedor, nome_fornecedor, valor_despesa) %>%
mutate(categoria = "Despesas Lula")

top_6_transacaoes<-
despesas_lula %>%
slice_max(order_by = valor_despesa, n=6) %>%
select(cpf_cnpj_fornecedor, nome_fornecedor, valor_despesa) %>%
mutate(categoria = "Despesas Lula")

despesas_lula %>%
anti_join(despesas_maiores_fornecedores, by= "cpf_cnpj_fornecedor") %>%
anti_join(top_6_transacaoes) %>%
mutate(categoria = "Despesas Lula") %>%
ggplot() +
geom_jitter(aes(x=categoria, y=valor_despesa),
pch=21,
fill = "black",
color = "#575756") +
geom_jitter(data= despesas_maiores_fornecedores%>%
anti_join(top_6_transacaoes), aes(x=categoria, y=valor_despesa),
pch=21,
fill = "red",
color = "#575756")+
geom_text_repel(data = top_6_transacaoes ,aes(x=categoria, y=valor_despesa, label= str_wrap(nome_fornecedor,40)),
color = "white",
size = 3,
nudge_x = c(0,3,0,0,0,0)) +
geom_point(data = top_6_transacaoes,aes(x=categoria, y=valor_despesa),
color = "red")+
scale_y_log10(labels=function(x) format(x, big.mark = ".", scientific = FALSE)) +
theme_light()+
theme(
panel.background = element_rect(fill = "#575756"), # "#121212" ##808080 #000080 #575756
panel.grid = element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_blank()

) +
labs(
y= "Value of each transaction - logarithmic scale"
)
A importância dos valores das transações no ranking. Imagem do autor.

O gráfico mostra que as quatro transações mais caras estão relacionadas à M4 e ao Google. Seus valores estão em torno de R$ 10.000.000, muito acima dos outros pontos mostrados no gráfico. Com tal desempenho, você verá que a M4 e o Google são atores-chave na definição da estrutura.

Mas quais foram os produtos e serviços que a campanha comprou de seus fornecedores? E o que estes produtos e serviços nos dizem sobre a estratégia nas eleições? Uma coluna na tabela indica uma descrição das transações. Eu desenhei uma rede de palavras correlacionadas com estas informações para ver qual padrão surgiria. Com a ajuda desses padrões, pude identificar algumas características da campanha do Lula.

Vamos ver o código.

#Rede de palavras
stop_words_grupo<- c(stopwords::stopwords("pt"),stopwords::stopwords("en"))

stop_words_grupo<- c(stop_words_grupo, c("ltda")) #

analise_secoes <- tibble(texto= str_c(descricao_despesa$nome_fornecedor,descricao_despesa$descricao_despesa, sep = " ") )%>% #
mutate(section = row_number() %/% 10) %>%
filter(section > 0) %>%
unnest_tokens(word, texto) %>%
filter(!word %in% stop_words_grupo)
word_cors <- analise_secoes %>%
group_by(word) %>%
filter(n() >= 4) %>%
filter(str_detect(word, pattern = "[:digit:]", TRUE)) %>%
pairwise_cor(word, section, sort = TRUE)
set.seed(2016)

word_cors %>%
filter(correlation > .75) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
geom_node_point(color = "red", size = 3) +
geom_node_text(aes(label = name), color="white", repel = TRUE, max.overlaps = 20, size=4) + ##FFA07A
theme_void()+
theme(
panel.background = element_rect(fill = "#575756")
)

E abaixo, o gráfico.

Uma rede de palavras surge das descrições das transações. Imagem do autor

Da rede acima, percebi as seguintes características da campanha:

  • Alvo na Internet e na rede social: duas cadeias cruciais de palavras enfocam o desenvolvimento de um público na Internet e na rede social. Você pode ver isto no conjunto envolvendo google, anúncios, internet e propaganda no centro inferior da imagem e na sub-rede que surgiu da combinação de Facebook, digital e impulsionamento .
    Aliás, impulsionamento nas redes sociais foi uma prática comum nas eleições de 2022, como visto neste painel.
  • A campanha nas ruas não está morta: se a internet foi uma questão importante, poderíamos afirmar que a campanha nas ruas ainda é muito crítica nas eleições do século 21. Na imagem, podemos ver que houve uma demanda por muitos materiais impressos que normalmente são usados por militantes em eventos de rua, tais como bandeiras, adesivos e panfletos (santinhos).
  • Gênero e cor importam: Um par de palavras, negros e negras , aparece nas descrições das transações associado a materiais de campanha, tais como adesivos e bandeiras. Esses objetos foram desenvolvidos para um público interessado em políticas afirmativas.
  • Um desafio logístico: Muitas cadeias de palavras estão relacionadas ao trabalho implementado por agências de viagem e empresas de transporte. O Brasil é enorme, a campanha foi muito curta no tempo e, como mostrado mais adiante, houve um foco significativo em grandes eventos em todo o país. Portanto, os parceiros logísticos foram vitais para a estratégia geral.
  • Os VIPs da campanha: Muitos pares de palavras são os nomes de pessoas importantes na campanha. Estes são o caso de Aluizo Mercante e Franklin Martins, por exemplo. O gráfico mostra estes nomes por fazerem parte de algumas transações que envolveram transações de hospedagem e viagens.
  • Grandes eventos: Lula foi uma grande estrela pop nesta eleição. Em todas as cidades onde ele esteve presente, grandes multidões o seguiram. As palavras evento e campanha estão relacionadas a transações com uma empresa que produz eventos e shows.
  • Abordagem federada: Em 2022, todos os estados brasileiros tiveram eleições estaduais para governador, senador e deputados. É uma prática comum desenvolver materiais e estratégias que combinem candidatos. No gráfico, podemos ver algumas teias de palavras que demonstram isso. Uma das mais interessantes é a que combina df, ms, go, rosilene, e leandro. As três primeiras palavras são a abreviação de três UFs, e as duas últimas são o nome de dois candidatos no Distrito Federal (DF). Neste caso, a campanha contratou o desenvolvimento de adesivos e panfletos com os nomes de Lula e dos outros candidatos aliados.

Finalmente, o framework.

Considerando todos os gráficos e análises anteriores, elaborei uma estrutura que indica os pilares mais importantes da estratégia da campanha. As categorias envolvidas são:

  • Estratégia e conteúdo: esse pilar é decorrente da constatação das opções de abordagem levantadas na análise de redes de palavra, como também da contratação da empresa M4 para o serviço de estratégia de comunicação.
  • Internet e redes sociais
  • Campanha de rua
  • Logística
  • Eventos de campanha
  • Advogados: essa categoria surge da presença de dois escritórios de advocacia no ranking dos 20 principais fornecedores. Para saber mais sobre a importância do pilar jurídico na campanha, recomendo a leitura desse texto.

Escrevi um código que associou os principais fornecedores às categorias e criei uma nova versão do ranking inicial. Aqui vale salientar que excluí do ranking a campanha de Fernando Haddad por não haver descrição das transações o que inviabilizou a associação aos pilares do framework.

maiores_gastos %>%
select(cpf_cnpj_fornecedor, nome_fornecedor)

estrategia<- c("46522760000160","04386913000149")
redes_sociais_internet<- c("06990590000123", "42618722000154","13486843000191","25021356000132" )
evento_campanha<- c("09604690000162")
viagens<- c("11473674000120","20846034000109","09355190000134")
campanha_rua<- c("35659497000139","64428337000187","08540403000135","30889903000136","23412180000114","23412180000114","27885500000104", "22317550000171","35659497000139")
advogados<- c("27539297000114","46800692000153")

maiores_gastos %>%
mutate(categoria_despesa = case_when(
cpf_cnpj_fornecedor %in% estrategia ~ "Strategy & content",
cpf_cnpj_fornecedor %in% redes_sociais_internet ~"Internet & Social Network",
cpf_cnpj_fornecedor %in% evento_campanha ~ "Campaign events",
cpf_cnpj_fornecedor %in% viagens ~"Logistics",
cpf_cnpj_fornecedor %in% campanha_rua ~"Street campaign",
cpf_cnpj_fornecedor %in% advogados ~"Lawyers"
)) %>%
filter(!is.na(categoria_despesa)) %>%
mutate(nome_fornecedor = reorder(nome_fornecedor,total_gasto)) %>%
ggplot()+
geom_col(aes(x=total_gasto, y= nome_fornecedor, fill= fct_reorder(categoria_despesa,total_gasto,sum, .desc = TRUE) ))+
scale_x_continuous(labels= function(x)format(x, big.mark = ".", scientific = FALSE ))+
scale_fill_discrete_qualitative(palette="Pastel 1")+
theme_light()+
theme(
panel.background = element_rect(fill = "#575756"), # "#121212" ##808080 #000080 #575756
panel.grid = element_blank(),
axis.title.y = element_blank(),
legend.position = "bottom"

) +
labs(
x= "Total spend per supplier",
fill = "Category"
)

Veja a nova versão do gráfico.

Ranking dos fornecedores colorido pelas categorias. Imagem do author.

Agora foi possível somar os valores para cada pilar e preparar um novo ranking, mostrando os valores gastos.

maiores_gastos %>%
mutate(categoria_despesa = case_when(
cpf_cnpj_fornecedor %in% estrategia ~ "Strategy & content",
cpf_cnpj_fornecedor %in% redes_sociais_internet ~"Internet & Social Network",
cpf_cnpj_fornecedor %in% evento_campanha ~ "Campaign events",
cpf_cnpj_fornecedor %in% viagens ~"Trips",
cpf_cnpj_fornecedor %in% campanha_rua ~"Street campaign",
cpf_cnpj_fornecedor %in% advogados ~"Lawyers"
)) %>%
filter(!is.na(categoria_despesa)) %>%
group_by(categoria_despesa) %>%
summarise(
total_gasto_categoria = sum(total_gasto)
) %>%
mutate(categoria_despesa = reorder(categoria_despesa, total_gasto_categoria)) %>%
ggplot()+
geom_col(aes(x=total_gasto_categoria/10^6, y= categoria_despesa), fill= "red")+
scale_x_continuous(labels= function(x)format(x, big.mark = ".", scientific = FALSE ))+
theme_light()+
theme(
panel.background = element_rect(fill = "#575756"), # "#121212" ##808080 #000080 #575756
panel.grid = element_blank(),
axis.title.y = element_blank(),
legend.position = "bottom"

) +
labs(
x= "Total spend per category (values in R$ millions)"
)
Ranking das categorias. Imagem do autor.

Na visão do dinheiro gasto, Estratégia e Conteúdo foi o pilar mais crucial da campanha, seguido por Internet e Rede Social. Por outro lado, outros pilares que requerem muito menos dinheiro podem ter sido bastante eftivos para determinar o resultado de uma campanha. Entendo que algumas abordagens qualitativas, como entrevistas com executivos de campanha, podem lançar mais luz sobre esta questão.

--

--

Fernando Barbalho
datavizbr

Doctor in Business Administration from UNB (2014). As data scientist, researches and implements products for transparency in the Brazilian public sector.