Když lidé slyší, co dělám, mají tendenci se mě ptát na stejnou otázku:Dokážete vyvinout systém, který předpovídá výsledky fotbalových zápasů? Nebo výsledky olympijských medailí? Osobně předpovědím moc nevěřím. Přesto, pokud bychom měli velké množství historických dat a relevantních ukazatelů, určitě bychom mohli navrhnout systém, který by nám pomohl přijít s přesnějšími předpoklady. V tomto článku se budeme zabývat modelem, který může ukládat výsledky zápasů a turnajů.
Tento model je primárně zaměřen na evropské fotbalové (fotbalové) zápasy, statistiky a výsledky, ale lze jej snadno upravit tak, aby vyhovoval mnoha dalším sportům. Mojí hlavní motivací pro tento článek byly dvě letošní velké fotbalové události:mistrovství UEFA Euro 2016, které se právě stalo, a letní olympijské hry 2016, které se právě konají.
Co víme před začátkem turnaje?
Než turnaj začne, víme o něm téměř vše — kromě toho nejdůležitějšího:kdo vyhraje. Pojďme si stručně říci, co přesně už víme:
- Data zahájení a ukončení turnaje
- Místa, kde se budou zápasy konat
- Přesné časy zahájení zápasů
- Které týmy se do turnaje kvalifikovaly
- Hráči každého z těchto týmů
- Minulý výkon každého hráče a jeho současná forma
Jaké podrobnosti o shodě chceme uložit?
Turnaje se skládají z více zápasů. Než uložíme jakékoli podrobnosti o shodě, musíme:
- Spojit každý zápas s turnajem
- Zaznamenejte fázi turnaje, kdy se zápas odehrál (např. skupinová fáze, semifinále)
Potřebujeme také uložit podrobnosti o jednotlivých shodách, včetně:
- Týmy zapojené do zápasu
- Úvodní sestavy a střídání
- Události zápasů (ve fotbale to jsou:gól, penalta, faul, žlutá karta atd.)
- Konečné skóre
- Akce hráčů během zápasu
Tato data použijeme k zachycení všech důležitých zápasů. Porovnání výkonu hráče před zápasem a během něj by mohlo vést k určitým závěrům. Možná bychom nebyli schopni předpovědět konečné výsledky jejich výkonu (tj. výhru nebo prohru), ale statistiky by nám určitě mohly pomoci vytvořit předpoklady s určitou mírou spolehlivosti.
Představení modelu
Model je rozdělen do čtyř hlavních oblastí:
Tournament details
Match details
Events
Indicators and Performance
Tabulky mimo tyto oblasti jsou slovníky (sport
, phase
, position
), katalogy (sport_event
, team
, player
) a jeden vztah many-to-many (plays
).
Nejprve popíšeme nekategorizované tabulky a poté se podrobně podíváme na každou oblast.
Nekategorizované tabulky
Tyto tabulky jsou důležité, protože tabulky ze všech čtyř oblastí je používají jako slovníky nebo katalogy.
sport
tabulka uvádí všechny sporty, které uložíme do naší databáze. Pravděpodobně zde budeme mít pouze jeden sport, mužský fotbal, ale tato tabulka nám umožňuje v případě potřeby přidat podobné sporty (např. ženský fotbal).
V sport_event
tabulky, uložíme události spojené s naším sportem(y). Jedním z příkladů mohou být „Olympijské hry 2016“.
phase
table je slovník, který obsahuje všechny možné fáze turnaje. Obsahuje hodnoty jako „skupinová fáze“ , „kolo 16“ , „čtvrtfinále“ , „semifinále“ , „konečný“ .
team
tabulka je, jak byste uhodli, jednoduchý seznam všech týmů. Možné hodnoty jsou „Chorvatsko“ , „Polsko“ , „USA“ atd. Pokud bychom databázi používali k ukládání informací o klubové nebo ligové soutěži, měli bychom také hodnoty jako „Barcelona“ , „Real Madrid“ , „Bayern“ , „Manchester United“ atd.
V player
tabulky, uložíme záznamy pro všechny hráče patřící do příslušných týmů.
plays
tabulka je náš jediný vztah mnoho k mnoha a týká se hráčů a týmů. Hráč může patřit do více než jednoho týmu současně (např. národní tým a klub), ale během turnaje bude samozřejmě hrát pouze za jeden tým.
Nakonec tu máme position
stůl. Tento jednoduchý slovník uloží seznam všech požadovaných pozic. Ve fotbale mezi ně patří brankář, střední poločas, útočník atd.
Podrobnosti o turnaji
Poznámka: Pokud chcete pouze ukládat výsledky jednotlivých zápasů, nemusíte tuto sekci používat.
Turnaj se skládá z více než jednoho zápasu; UEFA Euro 2016 i fotbalové události na Letních olympijských hrách 2016 jsou turnaje. Jak jsme řekli dříve, můžeme uložit jeden zápas do naší databáze, ale také můžeme zápasy přiřadit k jejich relevantním turnajům. Tabulky v sekci Turnaj jsou:
tournament
– Obsahuje všechny základní údaje o turnaji:sport, datum zahájení, datum ukončení atd. Musíme také uložit název turnaje a popis místa, kde se koná.sport_event_id
atribut je volitelný, protože turnaj nemusí být spojen s větší událostí (jako je olympiáda).group
– Zde jsou uvedeny všechny skupiny v tomto turnaji. UEFA Euro 2016 mělo šest skupin, A až F.participant
– Toto jsou týmy hrající v turnaji; každý účastník může být zařazen do skupiny. Většina turnajů začíná skupinovou fází a poté pokračuje do vyřazovací fáze (např. UEFA Euro, UEFA World Cup, olympijský fotbal). Některé turnaje budou mít pouze skupinovou fázi (např. národní ligy), zatímco jiné budou mít pouze vyřazovací fázi (např. národní poháry).in_team
– Tato tabulka poskytuje vztah many-to-many, který ukládá informace o hráčích registrovaných pro daný turnaj a jejich očekávaných pozicích.tournament_schedule
– Podle mého názoru je to nejzajímavější tabulka v této sekci. Zde je uložen seznam všech her odehraných během tohoto turnaje.tournament_id
atribut označuje, do kterého turnaje každý zápas patří, aphase_id
atribut definuje fázi, během které bude zápas probíhat. Uložíme také místo zápasu a čas, kdy začíná. Oba účastníci budou popsáni textovými poli. Až skupinová fáze skončí, budeme znát všechny zápasy vyřazovací části. Například na začátku UEFA Euro 2016 jsme věděli, že vítěz skupiny E (1E) se utká s vicemistrem skupiny D (2D). Po odehrání všech tří kol ve skupinové fázi byla tato dvojice Itálie vs. Španělsko.
Podrobnosti o shodě
Match details
oblast se používá k ukládání dat pro jednotlivé zápasy. Použijeme dvě tabulky:
match
– Obsahuje všechny podrobnosti o jednom zápase; tento zápas může souviset s turnajem, ale může to být také jedna hra. Takžetournament_schedule_id
atribut je volitelný a uložímesport_id
,start_time
alocation
atributy opět zde. Pokud je zápas součástí turnaje, paktournament_schedule_id
bude přiřazena hodnota.team_1_id
ateam_1_id
atributy jsou odkazy na týmy zapojené do zápasu.goals_team_1
agoals_team_2
atributy obsahují výsledek zápasu. Jsou povinné a pro oba by měly mít výchozí hodnotu „0“.in_match
– Tato tabulka obsahuje seznam všech hráčů, kteří jsou registrováni pro daný zápas; hráči, kteří se nezúčastní, budou mít vstarted_at
NULL atribut, zatímco hráči, kteří přišli jako střídání, budou mítstarted_at
> 0 . Pokud byl hráč nahrazen, bude mítended_at
atribut, který se shoduje s atributemstarted_at
atribut hráče, který je nahradil. Pokud hráč zůstal po celý zápas, jehoended_at
atribut bude mít stejnou hodnotu jakoend_time
atribut.
Události zápasů
Tato sekce je určena k uložení všech podrobností nebo událostí, které se staly během hry. A tabulky jsou:
event
– Toto je slovník, který obsahuje seznam všech událostí, které chceme uložit. Ve fotbale jsou to hodnoty jako „faul commited“ , „trpí faulem“ , „žlutá karta“ , „červená karta“ , „volný kop“ , „pokuta“ , „cíl“ , „offside“ , „náhrada“ , „hráč vyloučen ze zápasu“ .match_event
– To souvisí s událostmi se zápasem. Uložímeevent_time
a také informace o hráči související s touto událostí (in_match_id
).related_event
– To je to, co spojuje informace o událostech. Pro vysvětlení se podívejme na příklad, kdy hráč A fauluje hráče B. Vložíme záznam domatch_event
tabulka, která ukazuje, že hráč A se dopustil faulu, a další, která ukazuje, že hráč B utrpěl faul. Přidáme také záznam dorelated_event
stůl, kde ‚spáchal faul‘ bude rodič a ‚utrpěný faul‘ bude dítě. Zaznamenáme také výsledky faulu:žlutá karta, volný kop nebo pokutový kop a možná i gól.
Ukazatele a výkon
Tato sekce by nám měla pomoci analyzovat hráče a týmy před a po zápase.
indicator
tabulka je slovník s předdefinovanou sadou ukazatelů pro každého hráče před každým zápasem. Tyto ukazatele by měly popisovat aktuální formu hráče. Tento seznam může obsahovat hodnoty jako:„počet gólů v posledních 10 zápasech“ , „průměrná vzdálenost ujetá za posledních 10 zápasů“ , „počet uložení pro GK za posledních 10 zápasů“ .
performance
slovník je velmi podobný indicator
, ale použijeme jej k uložení pouze hodnot, které souvisejí s jednou shodou:„pokrytá vzdálenost“ , „přesné přihrávky“ , atd.
player_indicator
a performance_indicator
tabulky sdílejí téměř identickou strukturu:
in_match_id
– označuje hráče účastnícího se určitého zápasuindicator_id
/performance_id
– odkazuje naindicator
nebo „slovníky výkonuvalue
– uloží hodnotu pro tento indikátor (např. hráč urazil vzdálenost 10,72 km)description
– v případě potřeby obsahuje další popis
Co se stalo během zápasu?
Se všemi těmito vloženými daty jsme mohli snadno získat podrobnosti o zápase, události a statistiky pro každý zápas v naší databázi.
Tento jednoduchý dotaz vrátí základní podrobnosti pro nadcházející zápas:
SELECT team_1.`team_name`, team_2.`team_name`, `match`.`start_time`, `match`.`location` FROM `match`, `team` AS team_1, `team` AS team_2 WHERE `match`.`team_1_id` = team_1.`id` AND `match`.`team_2_id` = team_2.`id`
K získání seznamu všech událostí ve hře během určitého zápasu bychom použili dotaz níže:
SELECT `event`.`event_name`, `match_event`.`event_time`, `player`.`first_name`, `player`.`last_name` FROM `match`, `match_event`, `event`, `in_match`, `player` WHERE `match_event`.`match_id` = `match`.`id` AND `event`.`id` = `match_event`.`event_id` AND `in_match`.`id` = `match_event`.`in_match_id` AND `player`.`id` = `in_match`.`player_id` AND `match`.`id` = @match ORDER BY `match_event`.`event_time` ASC
Napadá mě mnoho dalších dotazů; je snadné provést analýzu, když máte data. Pokud jste změřili a uložili velké množství ukazatelů a dat o výkonu hráče, možná budete schopni spojit tyto parametry s konečným výsledkem. Osobně takovým předpovědím nevěřím; je tu faktor štěstí během zápasů a mnoho dalších faktorů, které nemůžete vědět, dokud hra nezačne. Přesto, pokud máte velký soubor dat a mnoho parametrů, vaše šance na přesnější předpovědi se zvyšuje.
Model uvedený v tomto článku nám umožňuje ukládat zápasy, podrobnosti o zápasech a historii výkonu každého hráče. Můžeme také nastavit indikátory formy pro každého hráče před zápasem. Uložení dostatečného množství podrobností by nám mělo poskytnout více parametrů, na kterých můžeme založit naše předpoklady. Neříkám, že bychom mohli předvídat výsledek hry, ale mohli bychom se s tím trochu pobavit.
Tento model bychom také mohli snadno vyladit pro ukládání dat pro jiné sporty. Tyto změny by neměly být příliš složité. Přidání sport_id
atribut do slovníků by měl stačit. Přesto si myslím, že by bylo moudré mít novou instanci pro každý jiný sport.