Como analisar dados de Futebol¶
Neste vídeo eu trago uma introdução sobre como, no geral, você irá encontrar os dados de futebol. Os tipos de tabelas e como unir todas elas.
Espero que ajude a sua jornada de conhecimento.
Link para download da base de dados: https://www.kaggle.com/tiagodatascience/campeonato-paulista-a1
Link para o vídeo do Youtube: https://www.youtube.com/watch?v=5AwqRsMtkCo&t=637s
import datetime
import pandas as pd
import betfairlightweight
import time
pd.set_option('display.max_columns',50)
df_jogos = pd.read_csv('../dados/jogos_paulista.csv')
df_stats = pd.read_csv('../dados/stats_paulista.csv')
df_eventos = pd.read_csv('../dados/events_paulista.csv')
Tabela de Jogos¶
1 jogo por linha
Dados como o estádio, juiz, resultado, id do jogo, nome dos times, etc.
Base para a união dos dados para as demais tabelas
df_jogos.columns
Index(['idEvent', 'dateEvent', 'eventCity', 'eventStatus', 'eventElapsed',
'eventLeague', 'eventRound', 'idHomeTeam', 'strHomeTeam',
'logoHomeTeam', 'idAwayTeam', 'strAwayTeam', 'logoAwayTeam',
'intHomeScore', 'intAwayScore', 'intHomeHt', 'intAwayHt', 'date',
'hour', 'idWinner', 'winner', 'winOrDraw', 'underOver', 'predGoalsHome',
'predGoalsAway', 'advice', 'formHome', 'formAway', 'attHome', 'attAway',
'defHome', 'defAway', 'poissonHome', 'poissonAway', 'h2hHome',
'h2hAway', 'goalsHome', 'goalsAway', 'totalHome', 'totalAway',
'homeOdd', 'drawOdd', 'awayOdd', 'over05', 'over05Ht', 'under15',
'under15Ht'],
dtype='object')
df_jogos.head()
idEvent | dateEvent | eventCity | eventStatus | eventElapsed | eventLeague | eventRound | idHomeTeam | strHomeTeam | logoHomeTeam | idAwayTeam | strAwayTeam | logoAwayTeam | intHomeScore | intAwayScore | intHomeHt | intAwayHt | date | hour | idWinner | winner | winOrDraw | underOver | predGoalsHome | predGoalsAway | advice | formHome | formAway | attHome | attAway | defHome | defAway | poissonHome | poissonAway | h2hHome | h2hAway | goalsHome | goalsAway | totalHome | totalAway | homeOdd | drawOdd | awayOdd | over05 | over05Ht | under15 | under15Ht | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 317888 | 2020-02-02 19:00:00-03:00 | Campinas, São Paulo | Match Finished | 90 | Paulista - A1 | Regular Season - 4 | 138 | Guarani Campinas | https://media.api-sports.io/football/teams/138... | 10003 | Santo André | https://media.api-sports.io/football/teams/100... | 2 | 1 | 1 | 1 | 2020-02-02 00:00:00 | 19:00:00 | 10003.0 | Santo André | False | 1.5 | -2.5 | -4.5 | Combo Winner : Santo André and +1.5 goals | 31 | 69 | 50 | 50 | 50 | 50 | 24 | 76 | 0 | 0 | 0 | 0 | 38.8 | 61.3 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 317890 | 2020-02-03 20:00:00-03:00 | Ribeirão Preto, São Paulo | Match Finished | 90 | Paulista - A1 | Regular Season - 4 | 2618 | Botafogo SP | https://media.api-sports.io/football/teams/261... | 7848 | Mirassol | https://media.api-sports.io/football/teams/784... | 0 | 6 | 0 | 3 | 2020-02-03 00:00:00 | 20:00:00 | 7848.0 | Mirassol | True | 0.0 | -1.5 | -1.5 | Double chance : draw or Mirassol | 25 | 75 | 50 | 50 | 30 | 70 | 0 | 100 | 0 | 0 | 0 | 0 | 35.0 | 65.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 317891 | 2020-02-03 20:00:00-03:00 | São Paulo, São Paulo | Match Finished | 90 | Paulista - A1 | Regular Season - 4 | 126 | Sao Paulo | https://media.api-sports.io/football/teams/126... | 7834 | Novorizontino | https://media.api-sports.io/football/teams/783... | 1 | 1 | 0 | 0 | 2020-02-03 00:00:00 | 20:00:00 | 7834.0 | Novorizontino | True | -3.5 | -2.5 | -2.5 | Combo Double chance : draw or Novorizontino an... | 50 | 50 | 50 | 50 | 0 | 100 | 0 | 0 | 0 | 0 | 0 | 0 | 50.0 | 50.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 317892 | 2020-02-07 19:15:00-03:00 | Barueri, São Paulo | Match Finished | 90 | Paulista - A1 | Regular Season - 5 | 143 | Oeste | https://media.api-sports.io/football/teams/143... | 138 | Guarani Campinas | https://media.api-sports.io/football/teams/138... | 1 | 1 | 1 | 1 | 2020-02-07 00:00:00 | 19:15:00 | 138.0 | Guarani Campinas | False | 1.5 | -1.5 | -4.5 | Combo Winner : Guarani Campinas and +1.5 goals | 30 | 70 | 20 | 80 | 27 | 73 | 8 | 92 | 71 | 29 | 69 | 31 | 37.5 | 62.5 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | 317907 | 2020-02-21 16:00:00-03:00 | Ribeirão Preto, São Paulo | Match Finished | 90 | Paulista - A1 | Regular Season - 7 | 2618 | Botafogo SP | https://media.api-sports.io/football/teams/261... | 1201 | Inter De Limeira | https://media.api-sports.io/football/teams/120... | 2 | 1 | 0 | 1 | 2020-02-21 00:00:00 | 16:00:00 | 1201.0 | Inter De Limeira | True | 0.0 | -1.5 | -2.5 | Double chance : draw or Inter De Limeira | 18 | 82 | 43 | 57 | 25 | 75 | 10 | 90 | 0 | 0 | 0 | 0 | 24.0 | 76.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Tabela Estatísticas¶
Pode variar, neste caso são 2 linhas por jogo (1 para o time da casa e 1 para o visitante)
Trazem os dados como posse de bola, chutes a gol, escanteios, cartões, etc.
Com os tratamentos, transformando 1 linha por jogo, geralmente é o input para análises e modelos estatísticos
df_stats.head()
idEvent | idTeam | strTeam | isHome | shots_on_goal | shots_off_goal | total_shots | blocked_shots | shots_insidebox | shots_outsidebox | fouls | corner_kicks | offsides | ball_possession | yellow_cards | red_cards | goalkeeper_saves | total_passes | passes_accurate | passes_% | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 317952 | 10018 | Água Santa | True | 4.0 | 3.0 | 11.0 | 4.0 | 6.0 | 5.0 | 15.0 | 7.0 | 1.0 | 42% | 1.0 | NaN | 3.0 | 312.0 | 242.0 | 78% |
1 | 317952 | 7826 | Ferroviária | False | 2.0 | 7.0 | 17.0 | 8.0 | 8.0 | 9.0 | 13.0 | 8.0 | NaN | 58% | 3.0 | NaN | 3.0 | 418.0 | 334.0 | 80% |
2 | 317953 | 2618 | Botafogo SP | True | 5.0 | 3.0 | 12.0 | 4.0 | 10.0 | 2.0 | 18.0 | 7.0 | 1.0 | 60% | 4.0 | NaN | 4.0 | 478.0 | 394.0 | 82% |
3 | 317953 | 10018 | Água Santa | False | 5.0 | 4.0 | 13.0 | 4.0 | 8.0 | 5.0 | 10.0 | 5.0 | NaN | 40% | 3.0 | NaN | 4.0 | 307.0 | 239.0 | 78% |
4 | 317954 | 10018 | Água Santa | True | 2.0 | 2.0 | 5.0 | 1.0 | 3.0 | 2.0 | 20.0 | 1.0 | 3.0 | 35% | 6.0 | NaN | 5.0 | 305.0 | 240.0 | 79% |
Tabela Eventos¶
1 linha por tipo de evento/time/jogador/tempo
Geralmente traz os principais eventos do jogos: Substituições, cartões, gols
Interessante para montar uma linha do tempo do jogo e entender o efeito destes eventos no resultado. Será que um cartão vermelho acima dos 30 minutos garante que o time com 1 a mais será vencedor? Fica a questão para análises…hehe
df_eventos.head()
idEvent | timeElapsed | idTeam | strTeam | idPlayer | strPlayer | tipo | detail | comments | |
---|---|---|---|---|---|---|---|---|---|
0 | 317952 | 32 | 7826 | Ferroviária | 15278 | Carlão | Card | Yellow Card | NaN |
1 | 317952 | 40 | 7826 | Ferroviária | 9457 | Rayan | subst | Substitution 1 | NaN |
2 | 317952 | 55 | 10018 | Água Santa | 55298 | Uederson | subst | Substitution 1 | NaN |
3 | 317952 | 59 | 7826 | Ferroviária | 80600 | Tony | Card | Yellow Card | NaN |
4 | 317952 | 65 | 10018 | Água Santa | 9852 | Felipe Azevedo | subst | Substitution 2 | NaN |