Prevendo a pontuação final do Campeonato Brasileiro — Parte II

Gabriel Aparecido Fonseca
Data Hackers
Published in
8 min readDec 1, 2019

Outras partes dessa série:

Prevendo a pontuação final do Campeonato Brasileiro — Parte I

Prevendo a pontuação final do Campeonato Brasileiro — Parte III

Fala pessoal, voltando com a segunda parte do tutorial de como prever a pontuação dos times no campeonato brasileiro. Para quem está por fora, na primeira parte desse tutorial eu mostrei como fiz para montar o banco de dados utilizado na previsão da pontuação dos times no Campeonato Brasileiro. Esse material foi utilizado pelo Clube da Aposta em uma série de postagens no nosso blog prevendo a pontuação e chance de rebaixamento e título para times de diversos campeonatos:

Veja a nossa análise para título e classificação para os principais campeonatos: https://clubedaposta.com/probabilidade-titulo-classificacao/

E confira também a nossa análise de rebaixamento: https://clubedaposta.com/probabilidade-rebaixamento/

Nessa segunda parte do tutorial vou apresentar as técnicas e métodos que foram utilizados na etapa de pré-processamento dos dados. Essa é uma fase crucial que se bem realizada pode contribuir e muito para diminuir o tempo de treinamento e a complexidade dos modelos que serão implementados.

Chega de papo e vamos codar!!!

1 — Pré-processamento

Em todo trabalho com análise de dados ou machine learning vai ser necessário trabalhar e modificar os dados. No primeiro tutorial eu destaquei a importância da qualidade dos dados. Então antes de qualquer coisa, é necessário fazer uma exploração dos dados, verificar se existem amostras repetidas, valores faltantes, outliers ou alguma anomalia.

Os dados que peguei estavam mais ou menos estruturados e não apresentavam nenhum problema. Pelo menos era o que eu achava… Analisando um pouco os dados, observei que alguns times estavam com pontuação negativa, o que é algo bem estranho porque isso não deveria ocorrer.

O que descobri foi que em alguns campeonatos clubes foram punidos com perda de pontos devido a diversas irregularidades. O mais famoso desses ocorridos foi o esquema de compra de resultados do campeonato italiano de 2005-2006. Agora sabendo dessa anomalia fica simples tratar os dados… Como não são muitas ocorrências eu vou simplesmente deletar elas. E é possível fazer isso com apenas uma linha de código:df=df['points_for']>=0].

2 — Normalização

A próxima etapa de processamento realizado nos dados é a normalização. Os modelos utilizados em predição e classificação são baseados em estatística, probabilidade, cálculos matemáticos, etc, dessa maneira eles trabalham com número a fim de reconhecer os padrões existentes nos dados. Em geral, é comum encontrar nos dados variáveis que possuam ordem de grandezas completamente diferentes, como por exemplo, em um mesmo banco de dados alguma variável é mensurada em quilômetros enquanto outra em milímetros. Essas diferenças podem prejudicar muito o treinamento e conduzir a resultados que não sejam satisfatórios. Para corrigir isso é importante normalizar ou padronizar os dados.

A etapa de normalização é crucial em projetos de machine learning, e existem diversas técnicas para realizá-la. A biblioteca scikit-learn do Python possui diversos métodos para pré-processamento de dados. Não vou entrar muito as fundo em todos, então se você quiser pode dar uma olhada na documentação oficial, ou nesse post bem bacana que o @stevenvandorpe publicou no Towards Data Science.

Nesse trabalho eu utilizei o método standard scaler, ele padroniza os dados removendo a média e fazendo que tenham variância unitária. Isso pode ser calculado pela equação abaixo:

z = (x — u) / s

onde u é a média das amostras e s o desvio padrão.

Para utilizar esse método é muito simples, basta chamar a classe e passar os dados no método fit_transform()como no código:

3 — Seleção de características

Outra etapa crucial em projetos de machine learning é a seleção de características, um conjunto de dados pode possuir inúmeras variáveis e algumas delas podem ser idênticas ou possuírem o mesmo nível de representatividade. O que quero dizer com isso? Simples, variáveis de entrada podem explicar de maneira idêntica a variável de saída, então porque não eliminar aquelas que são praticamente repetidas? A redução de características permite criar modelos mais simples além de facilitar e reduzir o tempo de treinamento.

3.1 — Correlação de Pearson

Uma técnica usada para verificar se duas variáveis são semelhante é a correlação de Pearson. Esse método verifica pares de características e gera coeficientes, aqueles com valores próximo a 1 mostram que as variáveis possuem correlação altamente positiva, ou seja, se uma aumenta de valor a outra também aumenta em uma proporção bem semelhante. Por sua vez, valores de correlação próximo a -1 mostram que as variáveis são inversamente proporcionais, assim quando uma aumenta de valor a outra diminui e vice-versa. Para fazer essa análise em Python basta utilizar o método .corr(). Esse método irá gerar um DataFrame como mostrado a seguir:

Cada número nesse DataFrame representa a correlação entre duas variáveis, como observa-se a diagonal principal é sempre 1 porque representa a correlação de uma variável com ela mesma. Apesar de ser uma maneira interessante de ver a correlação entre variáveis, é mais fácil realizar essa análise de forma gráfica.

3.2 — Heatmap

Para isso, é utilizado o heatmap. Ele representa de forma condensada a correlação colorindo as células de cores distintas a depender do grau de correlação entre as variáveis. O heatmap para para esses dados que estou utilizando seria:

Com o heatmap só de bater olho vemos que quanto maior a intensidade do vermelho na célula, maior também será o valor da correlação. Agora quanto mais azul, menor será o seu valor. Com essa análise podemos estipular um valor de corte para eliminar variáveis, isso depende do problema mas valores como 0,8 ou 0,9 geralmente são mais utilizados. Para gerar o heatmap mostrado utilizei o seguinte código:

Apesar de tudo o que disse não foi essa técnica que usei para selecionar características. Vocês deve estar pensando: “nossa, pra que esse lenga-lenga então Gabriel?” Bem… porque isso pode ser útil pra você em algum momento, e é sempre interessante realizar essa análise para poder conhecer mais as variáveis com as quais você está lidando.

3.3 — PCA

“Mas então como você selecionou as características?” Bom, pra isso eu usei uma técnica chamada análise de componentes principais (ou principal component analysis — PCA). Essa é uma técnica estatística bem interessante e poderosa, ela é utilizada principalmente para redução de dimensionalidade, ou seja para reduzir/selecionar características.

De maneira simples, o PCA projeta os dados na direção que maximiza a variância. Pode ser entendido como um mapeamento linear dos dados em um espaço dimensional menor no qual a variabilidade dos dados é maximizada. Achou complexo? Na verdade é bem simples, tem um tutorial muito explicativo disponível nesse site: http://setosa.io/ev/principal-component-analysis/.

Para simplificar, vamos imaginar um conjunto de dados que possua apenas duas variáveis (características), se plotarmos os dados em um gráfico de duas dimensões nós teríamos:

Por esse gráfico observamos que existe variabilidade dos dados tanto no eixo X, quanto no eixo Y. Isso pode ser mais fácil de ser verificado se projetarmos os pontos em cada um dos eixos, como na figura abaixo.

E ao aplicar o PCA qual será a nossa saída? Observe na imagem abaixo como as saída gerada pelo PCA é interessante.

A partir desse gráfico é possível observar que a variância é praticamente nula na segunda componente. Assim, a primeira componente principal explica praticamente toda variância dos dados e o dataset pode ser reduzido a apenas uma dimensão.

Tem muito material interessante na internet explicando PCA, o objetivo aqui não é aprofundar demais, e sim apenas entender qual o funcionamento básico dele. Se quiserem maiores informações você pode acessar o tutorial do @GalarnykMichael para a Towards Data Science, a documentação oficial do scikit-learn, esse tutorial mostrando como fazer o PCA passo a passo em Python, ou esse artigo do DataCamp.

Entendido com funciona o PCA, vai ficar mais fácil de entender o código que utilizei para reduzir a dimensionalidade e selecionar as características. Inicialmente eu tenho que saber qual o percentual da variância eu desejo manter para então saber quantas componente podem ser consideradas. Para isso utilizei o código a seguir.

No construtor da classe PCA são passados o número de componentes, no caso considerei todas as variáveis (15), depois é utilizado o método fit para ajustar o PCA. Após isso, gerei um vetor com a soma cumulativa explicada pelas componentes. Assim o código retorna:

array([51.96689, 82.15692, 89.47236, 93.23823, 96.09423, 98.39308,
99.09342, 99.65312, 99.98183, 99.99999, 99.99999, 99.99999,
99.99999, 99.99999, 99.99999])

Isso indica que somente a primeira componente explica aproximadamente 52% da variância dos dados, a primeira e a segunda 82% e assim sucessivamente. Pode-se inferir, portanto, que até a sétima componente 99% da variância dos dados é preservada. É possível observar isso graficamente também.

Por essa análise, podemos concluir que ao se utilizar as 7 primeiras componentes principais, 99% da variância dos dados é preservada. Assim parece coerente manter essa quantidade, o que é feito com o código a seguir:

Percentual de variância explicada por cada componente: [51.967 30.19   7.315  3.766  2.856  2.299  0.7  ]
Percentual total de variância explicada pelas componente: 99.093%

Você conseguiu observar a beleza do PCA, nós reduzimos a dimensão do nosso problema praticamente pela metade. Isso vai diminuir o tempo de treinamento e a complexidade dos modelos que serão utilizados. É óbvio que essa redução depende significativamente dos dados utilizados, e no meu caso existiam muitas variáveis com alta correlação entre si.

Por fim, cabe destacar um ponto. Após utilizar o PCA perde-se a noção física ou de significado das variáveis. Elas são convertidas em componentes principais e passa-se a se trabalhar em outro espaço de dados diferente daquele que os seus dados representavam inicialmente. Tenha isso em mente.

Por esse tutorial é isso pessoal! Na terceira e última parte explicarei especificamente os modelos e métodos utilizados na predição. Até :)

Achou interessante esse trabalho e quer ver o resultado prático? Clica nos banners abaixo para ir para o blog do Clube da Aposta e conferir.

Se tiver dúvidas, questões ou críticas pode me chamar nas redes sociais:

Twitter: https://twitter.com/gabriel1991

Instagram: https://www.instagram.com/gabrielfonseca1991/

Linkedin: https://www.linkedin.com/in/gabrielfonseca91/

GitHub: https://github.com/gabriel19913

--

--

Gabriel Aparecido Fonseca
Data Hackers

Data Scientist — Master Degree @ UFLA — Bachelor degree in Mechatronics Engineer @ CEFET — Python and data scientist enthusiast