Seleção do Campeonato Brasileiro 2016: melhores aproveitamentos dos jogadores

Sabe aquela sensação que o torcedor tem que quando determinado jogador está em campo, o time vai bem? Podemos traduzir isso através dos números, analisando o aproveitamento de cada jogador no campeonato (considerando apenas os pontos da partida para o jogador quando ele esteve em campo). E se fizéssemos isso para todos os jogadores do Campeonato Brasileiro 2016 e montássemos a seleção dos jogadores com melhores aproveitamentos?

No Brasileirão 2016, ninguém foi melhor nesta estatística que o goleiro Jaílson, do Palmeiras. Ele terminou o campeonato invicto (14V – 5E – 0D), o que dá um aproveitamento de 82,5%. Evidentemente a maioria dos jogadores da seleção é do Palmeiras, que foi o campeão com boa vantagem. Dos outros clubes, destaque para Ricardo Oliveira (Santos) e Diego (Flamengo), que tiveram aproveitamentos superiores a 70% quando estiveram em campo (para se ter uma ideia, o Palmeiras foi campeão com 76,9% de aproveitamento). Se eles tivessem disputado todos os jogos…

Importante: para entrar na seleção, o jogador precisou disputar pelo menos 40% dos minutos do campeonato (ou seja, 1368 minutos). Acredito que definir o mínimo de minutos ao invés de jogos é mais justo, pois muitos jogadores têm muitos jogos mas sempre entrando no final, participando pouco.

Segue abaixo a seleção dos melhores aproveitamentos (titulares e reservas):

selecao_brasileirao_16.PNG

TOP 3 de cada clube

Quer saber quem foram os jogadores de melhor aproveitamento do seu clube? Segue abaixo o TOP 3:

Palmeiras: 1- Jaílson (82,5%), 2- Gabriel Jesus (72,8%), 3- Jean (72,4%)
Santos: 1- Ricardo Oliveira (73,3%), 2- Thiago Maia (65,6%), 3- Luiz Felipe (65,4%)
Flamengo: 1- Diego (70,6%), 2- Pará (69,1%), 3- Rafael Vaz (64,4%)
Atlético-MG: 1- Erazo (63,3%), 2- Leonardo Silva (61,3%), 3- Robinho (58,9%)
Botafogo: 1- Carli (62,5%), 2- Airton (61,9%), 3- Rodrigo Lindoso (60,0%)
Atlético-PR: 1- Léo (58,9%), 2- Thiago Heleno (54,5%), 3- André Lima (54,3%)
Corinthians: 1- Uendel (53,5%), 2- Guilherme (53,3%), 3- Giovanni Augusto (50,0%)
Ponte Preta: 1- Jeferson (56,7%), 2- Douglas Grolli (53,6%), 3- João Vitor (49,0%)
Grêmio: 1- Everton (56,8%), 2- Douglas (52,9%), 3- Maicon (50,8%)
São Paulo: 1- João Schmidt (53,0%), 2- Buffarini (52,1%), 3- Rodrigo Caio (50,0%)
Chapecoense: 1- Kempes (50,7%), 2- Josimar (50,6%), 3- Lucas Gomes (50,0%) #ForçaChape
Cruzeiro: 1- Rafael (54,9%), 2- Lucas Romero (51,4%), 3- Manoel (50,0%)
Fluminense: 1- Diego Cavalieri (51,4%), 2- Wellington (48,3%), 3- William Matheus (48,3%)
Sport: 1- Ronaldo Alves (53,3%), 2- Rogério (46,2%), 3- Magrão (46,1%)
Coritiba: 1- Raphael Veiga (52,6%), 2- Edinho (50,0%), 3- Luccas Claro (44,9%)
Vitória: 1- Amaral (49,2%), 2- Euller (44,4%), 3- Marcelo (43,9%)
Internacional: 1- Danilo Fernandes (49,4%), 2- Vitinho (44,0%), 3- Fabinho (42,7%)
Figueirense: 1- Marquinhos (44,4%), 2- Elicarlos (40,4%), 3- Rafael Moura (37,9%)
Santa Cruz: 1- Neris (39,7%), 2- Tiago Costa (37,3%), 3- Tiago Cardoso (30,4%)
América-MG: 1- Ernandes (31,9%), 2- Jonas (29,6%), 3- Juninho (27,5%)

Para consolidar estes dados foi aplicada uma técnica que é muito utilizada pelos cientistas de dados chamada de web scraping, que consiste basicamente em capturar dados da web. Foi escolhido o site do Fox Sports para buscar os dados de todas as escalações de todos os 379 jogos do campeonato.

Referências:

Lineup Builder – Site para montar esquemas táticos

Fox Sports – Campeonato Brasileiro 2016

Sugestão de leitura relacionada:

Estatísticas destacam os melhores jogadores na luta pelo título brasileiro

Web scraping com Power BI Desktop: o que você precisa saber

Web scraping é a técnica computacional que permite extrair informações dos websites. Este processo de busca de dados da internet certamente é uma das atividades que um cientista de dados precisar realizar, já que atualmente a maior parte dos dados estão na web. O processo basicamente consiste na busca de dados não estruturados das páginas web, normalmente em formato HTML, e a transformação destes dados em estruturados, possibilitando a criação de relatórios com maior facilidade.

São bons exemplos de aplicações de web scraping buscas de ofertas em sites de comércio eletrônico, monitoramento de palavras mais pesquisadas em mecanismos de busca, consultas às redes sociais para identificar a reputação da empresa, entre outras.

Existem diversas ferramentas especializadas em web scraping, mas neste post vou comentar um pouco sobre conceitos básicos da funcionalidade de web scraping em uma ferramenta que, além da captura dos dados, permite também realizar a limpeza e a organização destes dados; gerar modelos lógicos relacionando estes dados; e, ainda, a criação de relatórios e dashboards interativos: o Power BI Desktop!

Seguem abaixo algumas dicas úteis para buscar dados da web utilizando o Power BI Desktop:

O básico

Se você nunca utilizou o Power BI Desktop para capturar dados da web, recomendo começar por este tutorial: Tutorial: Importing and analyzing data from a Web Page using Power BI Desktop . O Power BI Desktop possui diversas funcionalidades disponíveis que permitem rapidamente buscar os dados e organizá-los em um formato ideal.

Utilize funções para percorrer várias páginas

Buscar dados de uma única URL é útil mas pode não ser suficiente, dependendo da quantidade de dados que precisamos. Para isso o Power BI Desktop dá a possibilidade de criarmos funções, que permitem percorrer mais de uma página tendo como base um diretório raiz. Ou seja, com base em uma URL principal, podemos retornar dados de várias páginas que são subdiretórios desta URL.  Estes exemplos de como buscar dados de medalhas nas Olimpíadas e da bilheteria dos filmes explicam detalhadamente o uso de funções para percorrer múltiplas páginas web.

pbidesktop_function

Consulta utilizando função no Power BI Desktop

 

Opção de timeout

Conforme aumentamos a complexidade da nossa captura dos dados, especialmente percorrendo várias páginas, e dependendo da velocidade da conexão, pode acontecer o que chamamos de “timeout”, ou seja, foi atingido o tempo limite de conexão. No Power BI Desktop, em alguns minutos de busca isso já acontece. Mas como então podemos aumentar este tempo?

Para isso temos que adicionar um comando de timeout com a opção duration após a URL chamada pela função Web.Contents(), modificando a query na linguagem “M” que é gerada (que pode ser encontrada na opção “Editor Avançado”). Abaixo um exemplo em que estamos definindo o tempo de timeout como 5 horas:

Web.Contents(“http://bing.com/“, [Timeout=#duration(0,5,0,0)])

Atualização dos dados

Um recurso importante e muito útil no Power BI Desktop é a possibilidade de atualização dos dados. É comum para quem quer utilizar dados da web sempre procurar alguma opção nos sites para exportar os dados para o formato CSV ou algo do tipo. Mas e se estes dados sofrerem inclusões ou modificações?

Visando manter sempre os dados atualizados, o Power BI Desktop cria consultas às páginas web, e assim podemos estar buscando os dados mais recentes sempre que quisermos clicando no botão “Atualizar”.

pbidesktop_atualizar

Botão “Atualizar” no Power BI Desktop

 

Podemos configurar também quais consultas são estáticas, ou seja, que não precisam ser atualizadas já que os dados não sofrerão alterações. Assim, ao clicar no botão “Atualizar”, todas as consultas serão atualizadas, exceto aquelas que estiverem com a opção “Incluir na atualização do Relatório” desmarcada.

pbidesktop_carregamento

Opção “Incluir Na Atualização do Relatório” desmarcada

 

Também é possível atualizar cada uma das consultas individualmente, clicando com botão direito nela e clicando em “Atualizar dados”.

pbidesktop_atualizarconsulta

Opção “Atualizar Dados” de apenas uma consulta

 

É importante explicar o funcionamento do Power BI Desktop para as atualizações. Ao enviar o comando para atualizar os dados, na prática o processo que ocorre é a exclusão dos dados antigos e a inclusão dos novos, ou seja, não é feita uma atualização incremental. Caso ocorra alguma falha na atualização, os dados serão perdidos. Por isso, é importante testar o funcionamento das consultas para garantir que tudo funcione corretamente.

Inclusive existe uma ideia com bastante votos no site Power BI Ideas solicitando uma modificação nesta funcionalidade de atualização: Incremental Data Loads .

Lembrando que o Power Query para Excel também possui estes mesmos recursos para tarefas de web scraping.

Referências:

Web scraping

What are examples of how real businesses use web scraping?

Power Query HTTP timeout setting

Sugestão de leitura relacionada:

Power BI Desktop Web Queries to Screen Scrape Data from Websites

Parte 1: Capturando dados das medalhas nas Olimpíadas de múltiplas páginas web utilizando Power Query/ Power BI Desktop

Este post será divido em duas partes. O nosso objetivo principal é conseguir prever – com base nos dados históricos do total de medalhas – quantas medalhas os países devem ganhar nas próximas Olimpíadas. Na parte 1 iremos buscar e carregar os dados necessários sobre o histórico de medalhas conquistadas por cada país em todas as Olimpíadas utilizando o Power Query; na parte 2, iremos gerar os gráficos com as informações de previsão usando o software estatístico R.

Onde encontrar os dados

A etapa mais difícil em qualquer processo de análise de dados é encontrar os dados, garantir que eles estejam corretos e dentro de um formato esperado. Para buscar dados da quantidade de medalhas conquistada por cada país em cada uma das edições da história das Olimpíadas utilizaremos o site Sports Reference, que possui todas estas informações até os Jogos Olímpicos de 2012*.

Captura dos dados utilizando Power Query

Mas e como capturar dados da web? Para isso vamos utilizar o Power Query, que é um add-in para Excel, mas que também funciona dentro do Power BI Desktop, a ferramenta de criação de relatórios de BI da Microsoft. O Power Query é considerado uma ferramenta de “self-service ETL”, ou seja, permite que usuários sem tanto conhecimento de técnicas de extração de dados consigam buscar e transformar seus dados com facilidade. Utilizando tanto o Power Query para Excel como ele no Power BI Desktop conseguimos obter o mesmo resultado. No exemplo a seguir vou utilizar o Power Query para Excel 2013 para no final exportamos o resultado para o formato CSV.

Criando uma função para buscar dados de várias páginas web

Para ler uma página web utilizando o Power Query temos que, na aba “Power Query”, escolher a opção “From Web” e inserirmos a URL que desejamos nos conectar (na imagem abaixo, colocamos o endereço da página das Olimpíadas de 2012). Após isso, clicar em “OK”:

powerquery_web

Realizando a conexão no Power Query com a página web que possui dados de medalhas das Olimpíadas de 2012

Vamos precisar fazer algumas alterações na consulta do Power Query para conseguirmos ler todas as páginas, com dados de todas as Olimpíadas. Para verificarmos a consulta que o Power Query está fazendo, basta clicar na opção “Advanced Editor”:

powerquery_advanced_editor

Query inicial na opção “Advanced Editor”

A query abaixo é a nossa query inicial, que traz dados de uma única edição das Olimpíadas:

let
    Source = Web.Page(Web.Contents("http://www.sports-reference.com/olympics/summer/2012/")),
    Data0 = Source{0}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Rk", Int64.Type}, 
{"Country", type text}, {"Gold", Int64.Type}, {"Silver", Int64.Type}, 
{"Bronze", Int64.Type}, {"Total", Int64.Type}})
in
    #"Changed Type"

 

Para buscarmos dados desta e de todas as outras Olimpíadas ao mesmo tempo, precisaremos criar uma função que realize esta consulta a todas as páginas e acrescentar o parâmetro desta função (chamaremos de “year”) no lugar do ano. Para isso, vamos adicionar duas novas expressões no código:

  • (year as number) as table => : para criar a função;
  • “& Number.ToText(year) &” : para concatenar o ano na URL.

A nova query com a função criada ficará desta forma:

= (year as number) as table =>
let
    Source = Web.Page(Web.Contents
("http://www.sports-reference.com/olympics/summer/"& Number.ToText(year) &"")),
    Data0 = Source{0}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Rk", Int64.Type}, 
{"Country", type text}, {"Gold", Int64.Type}, {"Silver", Int64.Type}, 
{"Bronze", Int64.Type}, {"Total", Int64.Type}})
in
    #"Changed Type"

É possível testar o funcionamento da função clicando no botão “Invoke” e passando o ano de referência (imagem a seguir):

powerquery_function

Botão “Invoke” para testar o funcionamento da função

Vamos renomear a query para “GetData” (este nome será importante para a chamada da função a seguir).

Adicionando dados dos anos olímpicos à função

Testado o funcionamento da função, iremos criar uma tabela com os anos em que houve Olimpíadas para, dessa forma, podermos passar estes anos como parâmetros para a função, retornando assim os dados de todas as páginas. Na aba “Power Query”, vamos escolher criar uma nova conexão “From Other Sources”, “Blank Query”.

No primeiro passo, adicionaremos os anos dentro do espaço disponível para preenchimento da fórmula. Chamaremos esta consulta de “Medalhas”:

{2012,2008,2004,2000,1996,1992,1988,1984,1980,1976,1972,1968,1964,1960,1956,1952,1948,1936,1932,1928,1924,1920,1912,1908,1904,1900,1896}

No segundo, é preciso converter a lista gerada em tabela clicando na opção “To Table” (imagem abaixo):

powerquey_convert_to_table

Botão “To Table” dentro do Power Query

No terceiro passo, vamos adicionar uma nova coluna (imagem a seguir) nesta consulta “Medalhas” com a seguinte chamada da função:

GetData([Year])
powerquery_customcolumn

Botão “Add Custom Column” no Power Query

Feito isso, o Power Query irá carregar a página conforme a imagem abaixo. Vamos expandir todas as colunas para carregar todas linhas referentes às medalhas conquistadas pelo países em todas as edições das Olimpíadas para o Power Query (imagem abaixo):

powerquery_expand_columns

Tela que retorna dados de todas as Olimpíadas

Para finalizar esta etapa, como iremos trabalhar com séries temporais no R para realizar as previsões (parte 2), vamos criar uma coluna customizada de data para facilitar nosso trabalho (imagem abaixo):

powerquery_date_column

Adicionando coluna de data no formato YYYY-MM-DD

Complementando com dados das Olimpíadas Rio 2016

Feita esta etapa inicial, agora vamos adicionar as informações de medalhas das Olimpíadas Rio 2016. Para isso, vamos utilizar o quadro de medalhas da Wikipédia. De forma idêntica ao que fizemos na etapa anterior, basta criar uma nova consulta para buscar os dados da Wikipédia e realizarmos algumas transformações básicas para deixar esta nova consulta com as mesmas colunas que a consulta já criada.

Por fim, precisamos unir as informações de medalhas de 1896 até 2012 com a lista de medalhas de 2016. Para isso vamos utilizar a funcionalidade de “Append Queries” do Power Query. Selecionamos a nova consulta (chamamos de “Medalhas Atualizado”) e clicamos nesta opção (imagem abaixo) para juntar os dados da consulta “Medalhas” com os dados da consulta “Medalhas Atualizado”.

powerquery_append_medalhas_atualizado

Botão “Append Queries” do Power Query

Pronto! Basta clicar em “Close em Load” para carregar os dados para o Excel e depois salvá-los no formato CSV.

Na parte 2, iremos utilizar estes dados já organizados para criar os gráficos de forecast utilizando o R para prever o total de medalhas que os países devem conquistar nas próximas Olimpíadas.

P.S: Para facilitar, adicionei os scripts do Power Query (linguagem M) no GitHub (quem quiser reproduzir, é só copiar estes scripts e colar na aba “Advanced Editor” do Power Query para obter os dados sem precisar fazer todos estes passos). Quem quiser somente o arquivo CSV final para testar, também está lá.

*Acesso: 24/08/2016

Referências:

Iterating over multiple pages of web data using Power Query

Sugestão de leitura relacionada:

Tutorial: análise do Facebook com o Power BI Desktop

Parte 2: Gerando gráficos de forecast utilizando R para previsão de medalhas nas Olimpíadas

Automatizando a extração de dados da web com Power Query para Excel: exemplo prático

No post anterior realizamos a análise dos dados de público do Campeonato Brasileiro de 2015, e criamos alguns relatórios para visualizar de forma simples os resultados. Agora vamos ver como realizar a extração destes dados acessando diretamente o site da CBF e como mantê-los atualizados utilizando mais um add-in para o Excel – o Power Query.

No Excel 2013, na aba “Power Query”, vamos escolher a opção “From Web” para extrair dados da web (imagem a seguir):

powerquery_excel

Obs: o Power Query é um add-in para o Excel 2013 (precisa ser habilitado para estar disponível).

Logo após vamos inserir a URL do site da CBF onde se encontram as informações sobre os jogos do campeonato (imagem abaixo):

powerquery_web

Como os dados desta página web estão armazenados na forma de tabela, as informações já são carregadas para o editor do Power Query, dentro da planilha do Excel.

Assim, tendo os dados carregados, podemos identificar que alguns campos não estão trazendo os valores no formato ideal para o tipo de relatório que queremos gerar, como por exemplo:

  • Os gols marcados pelo clube mandante e visitante estão na mesma coluna, o que dificultaria a realização de somatórios de gols por clube, e também a identificação de qual clube fez aquela quantidade de gols;
  • Data e hora estão na mesma coluna: para facilitar a criação de colunas calculadas é interessante separar estes valores;
  • Estádio, cidade e estado na mesma coluna: para gerar relatórios por cidade e por estado é interessante separar estes valores.

Visando atender a estas necessidades vamos utilizar a função “Split Column” do Power Query para “quebrar” estes valores em múltiplas colunas (imagem abaixo).

powerquery_split

Na opção “Split by Delimiter”, vamos escolher o delimitador de acordo com a coluna: para o número de gols iremos utilizar o “x”; e para as colunas de data e estádio iremos utilizar o ” – ” para separar os valores (imagem abaixo).

powerquery_split_delimiter

Após a transformação, foram criadas as colunas “Data”, “Hora”, “Gols Mandante”, “Gols Visitante”, “Estádio”, “Cidade” e “Estado”. Confira o resultado na imagem abaixo:

powerquery_result

Terminado o processo de transformação, podemos finalmente carregar os dados já formatados para nossa planilha do Excel. A query do Power Query que foi gerada para buscar os dados aparece no lado direito da tela, e é possível clicar no botão “Refresh” (imagem a seguir). Assim, sempre teremos na nossa planilha os dados mais recentes assim que forem publicados no site.

powerquery_queryrefresh

Mas e os dados de público e renda?

Uma das grandes dificuldades para quem trabalha com extração, tratamento e análise de dados são os diferentes formatos de onde nós precisamos buscar as informações. Quando os dados estão armazenados em tabelas ou bancos de dados estruturados a extração é realizada de forma relativamente simples. Mas muitas vezes, por diversos motivos que vão desde regras de negócio específicas, ausência de sistemas para armazenar estas informações e até mesmo desconhecimento da importância de ter os dados em um formato adequado para que seja possível gerar relatórios que irão apoiar a tomada de decisão, os dados só estão disponíveis em formatos de difícil extração.

No caso do site da CBF, os dados de público e renda são preenchidos manualmente por algum funcionário da federação estadual responsável pela organização do jogo. Estes documentos (boletins financeiros das partidas) são digitalizados e disponibilizados no site no formato PDF. Esta regra de negócio faz com que cada federação tenha um modelo próprio de boletim financeiro, além do fato dos dados estarem armazenados em arquivos (.doc, .pdf) inviabiliza a extração automática pelo Power Query ou por meio de alguma outra ferramenta (pelo menos com relação às tecnologias que eu conheço até aqui).

Sendo assim, como não temos acesso a outro sistema que possua estes dados em formato adequado, a solução que utilizei foi realizar a inclusão manual destes dados em duas novas colunas na planilha Excel para gerar os gráficos e relatórios do post anterior. Como esta foi uma análise pontual que precisamos realizar e são poucos valores que precisaram ser incluídos, foi possível cadastrar estas informações em um tempo razoável.

Este cenário acabou nos proporcionando um exemplo interessante das dificuldades encontradas para extrair e consolidar os dados, mas também de como conseguimos facilitar a nossa vida utilizando ferramentas poderosas, como é o Power Query para Excel.

Obs: Como referência, adicionei abaixo o script que realiza as tarefas de transformação exemplificadas neste post. Quem quiser reproduzir este exemplo, basta criar a conexão com a mesma URL que eu utilizei, copiar a query abaixo e colar, dentro do Power Query, na opção “Advanced Editor”:

 let
Source = Web.Page(Web.Contents("http://www.cbf.com.br/competicoes/brasileiro-serie-a/tabela/2015")),
Data0 = Source{0}[Data],
#"Changed Type" = Table.TransformColumnTypes(Data0,{{"Jogo", Int64.Type}, {"Rodada", Int64.Type}, {"Data", type text}, {"Mandante", type text}, {"", type text}, {"Visitante", type text}, {"Estádio", type text}, {"2", type text}}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Changed Type","Data",Splitter.SplitTextByDelimiter("-"),{"Data.1", "Data.2"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Data.1", type date}, {"Data.2", type time}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Data.1", "Data"}, {"Data.2", "Hora"}}),
#"Split Column by Delimiter1" = Table.SplitColumn(#"Renamed Columns","",Splitter.SplitTextByDelimiter("x"),{".1", ".2"}),
#"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{".1", Int64.Type}, {".2", Int64.Type}}),
#"Renamed Columns1" = Table.RenameColumns(#"Changed Type2",{{".1", "Gols Mandante"}, {".2", "Gols Visitante"}}),
#"Split Column by Delimiter2" = Table.SplitColumn(#"Renamed Columns1","Estádio",Splitter.SplitTextByDelimiter(" - "),{"Estádio.1", "Estádio.2", "Estádio.3"}),
#"Changed Type3" = Table.TransformColumnTypes(#"Split Column by Delimiter2",{{"Estádio.1", type text}, {"Estádio.2", type text}, {"Estádio.3", type text}}),
#"Renamed Columns2" = Table.RenameColumns(#"Changed Type3",{{"Estádio.1", "Estádio"}, {"Estádio.2", "Cidade"}, {"Estádio.3", "Estado"}}),
#"Sorted Rows" = Table.Sort(#"Renamed Columns2",{{"Jogo", Order.Ascending}})
in
#"Sorted Rows"

Sugestão de leitura relacionada:

Introdução ao Microsoft Power Query para Excel

Download Microsoft Power Query para Excel