Criei um Bolão da Copa usando Power BI, Flourish e Google Forms

Felipe Gollnick
7 min readDec 30, 2022

Já mostrei neste portfólio a minha paixão por campeonatos e organização de torneios. Com a chegada da Copa do Mundo deste ano, resolvi botar em prática o que aprendi em Power BI nos últimos meses e criar um projeto pessoal: apresento o Qatar Gollnick 22, meu próprio Bolão da Copa.

Meu objetivo era desenvolver um produto completo, e isso envolveu trabalhar com tratamento e modelagem de dados, lógica em fórmulas DAX, visualização de dados, UX, design e criação de identidade visual, story telling, debug de projeto já em produção, atendimento ao cliente e engajamento e moderação de comunidade digital.

Antes de lançar o bolão em si, ainda realizei um BOLÃO TESTE, no qual alguns amigos serviram de “beta testers” e enviaram palpites de jogos do Campeonato Brasileiro; dessa forma pude validar as fórmulas e o desenvolvimento no Power BI.

Ao longo da Copa, foram coletadas quase quatro mil linhas de palpites em uma plataforma com um layout para desktop e outro para smartphones — o gran finale foi uma grande cobertura com atualizações em tempo real durante a inesquecível final entre Argentina e França.

Vou tentar ser o mais conciso possível. Se preferir, venha direto para a parte 2, onde falo sobre design, comunicação e experiência do usuário.

  1. MODELAGEM DE DADOS

Chegar ao Esquema Estrela (star scheme) no relacionamento entre as tabelas foi um pequeno desafio, pois, além das tabelas Dimensão (com os nomes dos participantes e os nomes das seleções) havia duas tabelas Fato: uma com os resultados de todos os 64 jogos da Copa e outra com todos os palpites enviados pelos participantes.

Estas, na verdade, acabaram virando tabelas “Sub-Fato”, pois todo o conceito de um bolão está em torno de o palpite de um participante ser igual, próximo ou completamente diferente do que aconteceu na vida real no jogo entre os dois times. Portanto eu precisava comparar os palpites (em uma tabela) com os resultados (em outro).

Portanto, era necessário fazer um JOIN entre essas duas tabelas.Para isso, usei o comando Nova Consulta > Combinar > Mesclar Consultas como Nova no Power Query do Power BI, que te permite fazer o equivalente ao INNER JOIN ou LEFT JOIN do SQL sem necessariamente digitar códigos.

Com a junção das tabelas Jogos e Palpites, aí sim eu pude criar a tabela Fato para comparar os resultados e calcular as pontuações de cada participante em cada jogo.

As tabelas Jogos e Palpites eram alimentadas por arquivos .CSV. A tabela Fato foi criada no Power BI

2. FÓRMULAS DAX E CÁLCULOS DOS RESULTADOS

Cada participante poderia pontuar de várias formas. Por exemplo: acertar o placar exato da partida valia 10 pontos (a famosa CHINELADA); acertar apenas o vencedor da partida valia 4 pontos; acertar o vencedor e também a distância no placar entre os times (digamos, você palpitou 2x0 mas a partida terminou 3x1) valia 7 pontos.

Como fazer o Power BI calcular isso sozinho? Foram várias etapas.

2.1. Calcular o resultado da partida e o resultado do palpite

Se o Time A venceu o Time B por 2x0, o resultado da partida é: “Vitória do Time A”. Para isso, primeiro calculamos o saldo do placar:

[Jogo_Saldo] = [Jogo_Placar_A] - [Jogo_Placar_B]

E depois mandamos a condicional em código, que o Power Query transformou sozinho em uma janela visual. Assim descobrimos o Resultado:

Table.AddColumn(#"Tipo Alterado1", "Jogo_Resultado", 
each if [Jogo_Saldo] > 0 then "Vitória Time A"
else if [Jogo_Saldo] < 0 then "Vitória Time B"
else if [Jogo_Saldo] = 0 then "Empate"
else "ERRO")
Janela gerada automaticamente pelo Power Query a partir do código

Depois, era só realizar o mesmo procedimento na tabela de Palpites. Ao fazer o JOIN das duas tabelas e gerar a tabela Fato, seria só comparar os dois resultados usando DAX (no Power BI mesmo, já fora do Power Query):

Acertou_Resultado = IF(Fato[Jogo_Resultado] = Fato[Palpite_Resultado], 1, 0)

Assim, tenho a minha coluna condicional que mostra 1 para verdadeiro se a pessoa acertou o vencedor da partida (ou o empate) e 0 para falso caso tenha errado. Da mesma forma usei o IF pra descobrir se a pessoa acertou o placar de cada time na partida:

Acertou_Placar_Time_A = IF(Fato[Palpite_Placar_A] = Fato[Jogo_Placar_A], 1, 0)

Se a pessoa acertasse os placares do time A e do time B no mesmo jogo, ela fazia uma CHINELADA e somava 10 pontos. E assim fui seguindo com um monte de novas colunas com valores 1 e 0 para verificação de cada parte do resultado.

2.2. Calcular os pontos realizados em cada palpite

A pontuação do Qatar Gollnick 22 funcionava desse jeito:

  • 10 pontos: CHINELADA — Acertar o vencedor/empate e o placar dos dois times;
  • 7 pontos: Acertar o time vencedor + a diferença de gols entre os dois times;
  • 5 pontos: Acertar o time vencedor + o placar de um dos times;
  • 4 pontos: Acertar apenas o time vencedor ou o empate, porém errar o placar;
  • 2 pontos: Acertar o placar de um dos times, porem errar o time vencedor/empate;
  • 0 ponto: Não palpitar ou não acertar o time vencedor/empate e o placar de nenhum dos times;
  • 1 ponto extra: Acertar o vencedor em caso de pênaltis.

Aí é que quebrei a cabeça pra gerar o código abaixo, um IF enorme que calcularia esses pontos para cada palpite enviado — sei que a função SWITCH também poderia funcionar, mas não tive tempo hábil de validar se ela teria o mesmo comportamento que o IF.

Pontos = IF(
Fato[Acertou_Chinelada] = 1, 10, IF(
Fato[Acertou_Saldo] = 1 && Fato[Jogo_Resultado] <> "Empate", 7, IF(
Fato[Acertou_Resultado] = 1 && Fato[Acertou_Placar_Qtd] = 1, 5, IF(
Fato[Acertou_Resultado] = 1 && Fato[Acertou_Placar_Qtd] = 0, 4, IF(
Fato[Acertou_Placar_Qtd] = 1, 2, 0) ) ) ) )

A coluna [Acertou_Placar_Qtd] não era booleana como as outras, mas sim uma somatória: se você acertasse o placar dos dois times no mesmo jogo, a coluna trazia o valor 2; se acertasse de um time apenas, trazia 1; e zero para o erro total.

Além de tudo isso, ainda havia um BÔNUS: para dar mais emoção, a partir do mata-mata as pontuações seriam multiplicadas — por 2 nas oitavas-de-final; por 3 nas quartas; por 5 nas semi-finais e por 7 na final. Esse bônus vinha descrito para cada jogo na tabela de Jogos.

Então era necessário criar uma nova coluna de cálculo multiplicando o IF acima pelo bônus e ainda adicionar o ponto extra em caso de pênaltis (que era verificado por AINDA OUTRA coluna condicional. Ufa).

Print da versão de testes do Bolão, ainda completamente descaracterizado

Mas e os palpites? Como as pessoas enviavam? E como eles eram inputados no Power BI?

3. GOOGLE FORMS E INPUT DOS DADOS

No início de cada rodada, eu enviava aos participantes um novo formulário do Google, onde cada um enviava os palpites de cada jogo daquela rodada. O formulário estava customizado com a identidade visual do Qatar Gollnick 22, sobre a qual falo mais pra frente.

Depois que todos enviavam seus placares, era possível gerar uma planilha com todos os palpites pelo próprio Google. Mas aí é que entrava uma das minhas maiores dores: o formulário ficava com os jogos lado a lado e sem um ID identificando o jogo. Então para cada linha eu precisava incluir a ID do jogo e também a do participante.

E eu precisava incluir a ID do participante manualmente porque, em cada rodada, as pessoas escreviam seus próprios nomes com grafias diferentes. A ID permitia o Power BI reconhecer o participante sem erros. Mas, pra isso, em cada formulário eu precisava fazer um PROCV e puxar os IDs certos.

Tabela de formulário com várias colunas, já com os IDs dos participantes mas ainda sem redistribuir

Além disso, eu precisava copiar e colar manualmente as colunas dos jogos de forma que ficassem todos em colunas únicas de uma tabela plana. Esse foi um dos meus maiores gastos de tempo de todo o projeto.

(Com certeza deve haver formas de automatizar essa coleta e manipulação de dados de formulários, mas simplesmente não tive tempo hábil para pesquisar isso antes do início da Copa.)

Essa era a tabela plana, com os palpites de todos os jogos, um abaixo do outro e não em colunas separadas

Era a partir daí que eu gerava os arquivos .CSV, e eram esses arquivos que utilizava para inputar os resultados no Power BI.

A tabela com os Palpites precisava ser atualizada e inputada a cada início de rodada. Já a tabela de Jogos, com os resultados das partidas reais, precisava ser atualizada manualmente e inputada todos os dias — já que os boletins de participação e desempenho eram enviados todos os dias aos participantes.

Ao final de cada dia, a tabela com os jogos precisava ser atualizada manualmente, exportada em .CSV e atualizada no Power BI

Continua na parte 2, onde falo sobre design, comunicação e experiência do usuário. Aproveite e me adicione no LinkedIn enquanto isso!

--

--

Felipe Gollnick

SQL | BI | Data | Power BI & Qlik | Passionate about sea trade logistics, music and Bahia