Debreceni Egyetem
Természettudományi és Technológiai Kar
Matematikai Intézet

Szakdolgozat

Interaktı́v alkalmazások
implementálása SageMath
programcsomagbakészı́tette:Félegyházi Dávid
témavezető: Dr. Tengely Szabolcs

Debrecen, 2018

Tartalomjegyzék1.

Bevezető . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

2.

Colley-módszer . . . . . . . . . . . . . . . . . . . . . . . . .

5

2.1.

A példa . . . . . . . . . . . . . . . . . . . . . . . . . .

5

2.2.

A Colley-módszer matematikája . . . . . . . . . . . . .

6

2.3.

Előnyei és hátrányai . . . . . . . . . . . . . . . . . . .

6

2.4.

A fejlesztett Colley-módszer . . . . . . . . . . . . . . .

7

2.5.

Program és programkód . . . . . . . . . . . . . . . . .

93.

Massey-módszer . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.

Példa és az eredeti Massey módszer matematikája . . . 21

3.2.

Előnyei és hátrányai . . . . . . . . . . . . . . . . . . . 24

3.3.

A szezonális Massey-módszer

3.4.

Példa a szezonális Massey-módszerhez . . . . . . . . . 25

3.5.

Előnyei és hátrányai a szezonális Massey-módszernek . 26

3.6.

Programok és programkódok . . . . . . . . . . . . . . . 27

1

. . . . . . . . . . . . . . 24

4.

Keener-módszer . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.

Az alapötlet . . . . . . . . . . . . . . . . . . . . . . . . 52

4.2.

A direkt módszer . . . . . . . . . . . . . . . . . . . . . 53

4.3.

A nemlineáris módszer . . . . . . . . . . . . . . . . . . 56

4.4.

Program és programkód . . . . . . . . . . . . . . . . . 592

Köszönetnyilvánı́tás
Első körben szeretném megköszönni családomnak, hogy támogattak egész
tanulmányaim alatt, illetve motiváltak a nehezebb napokon. Szeretnémmegköszönni a barátaimnak, akik a monoton munkából kizökkentettek és ı́gytették könnyebbé mindennapjaim. Szeretném megköszönni a tanáraimnak,
illetve csoporttársaimnak, hogy segı́tséget nyújtottak az egyetemi tanulmányaim alatt.
Ezenkı́vül szeretném megköszönni Dr. Tengely Szabolcsnak, hogy vállalta éssegı́tett engem, illetve Dsupin Krisztiánnak, aki javaslatokkal és tanácsokkal
látott el a teljes munkám ideje alatt.

3

1. BevezetőA szakdolgozatom témája a TeamRanking algoritmusokkal és azok matematikájával foglalkozik. A TeamRanking egy rangsorolt táblázat, amely a csapatokat hasonlı́tja össze és egy rangsort állı́t fel, a csapat sikerességétől függően.
A szakdolgozatomhoz a Bajnokok ligája 2016-2017-es kiı́rását használtam
fel, mivel a felépı́tésében megtalálható a tabella alapú, illetve kieséses alapú
verseny egyaránt. Az algoritmusokat a SageMath nevű matematikai programcsomagba implementáltam. A szakdolgozatban a Colley-módszerrel, a
Massey-módszerrel, illetve a Keener-módszerrel foglalkozok. Elsőnek az adatok feldolgozásával kezdtem. A 32 csapatnak, illetve a helyszı́nnek és avégkimenetelnek adtam egy-egy kódot, amely ı́gy néz ki:
Helyszı́n:1 Hazai 2 Vendég 3 Semleges
Eredmény:1 Győzelem 2 Vereség 3 Döntetlen

Csapatok:
01: Club Brugge
02: Leicester
04: FC Kovenhavn
05: Juventus
07: Legia Warszawa 08: Borussia Dortmund
10: CSZKA Moszkva
11: Lyon
13: Manchester City
14: Monchengladbach
16: Sporting CP
17: Tottenham
19: Barcelona
20: Celtic
22: Ludogorets
23: Bayern Munchen
25: Benfica
26: Besiktas
28: Napoli
29: PSG
31: PSV Eindhoven
32: Atletico Madrid

03: FC Porto
06: Sevilla
09: Bayer Leverkusen
12: Dinamo Zagreb
15: Real Madrid
18: Monaco
21: Basel
24: FK Rosztov
27: Dinamo Kijev
30: Arsenal

Ezenkı́vül pedig minden egyes meccsről készı́tettem két vektort, amely az
alábbi elemeket tartalmazza: [Csapat, Ellenfél, Helyszı́n, Eredmény, Rúgott
gól, Kapott gól, Kapuralövés, Kaput találó lövés, Szöglet, Passz, Labdabirtoklás, Szabálytalanság, Sárga lap, Piros lap].
4

2. Colley-módszer
A legrégebbi értékelő (rating) módszer a százalékos módszer volt, ahol kiszámolták, hogy melyik csapat hány meccset nyert és mennyi volt az összes
meccsek száma, és ez alapján értékelték őket. Viszont Colley módszerében [1]a kezdőérték nem 0, ahogy a százalékos értékelésnél lehet, hanem 1/2. Ezzel
a aránnyal Colley meg tudta állapı́tani a csapatok erejét. Meg fogom mutatni, hogy hogyan értékel a Colley-módszer a különböző tabellaeredmények
alapján.

2.1. A példa
Vegyük példának a bevezetőben megemlı́tett Bajnokok Ligájának a selejtezőben lévő A-csoportot, amelyre fogok hivatkozni a jövőben: az Arsenal, a
PSG, a Basel FC, és a Ludogorets meccseit tartalmazza, ahol az bal oszlopban lévő csapat a hazait jelöli, a felső sorban lévő együttes pedig a vendéget.
A meccset végeredménye az alábbi módon alakult:

Ha megfigyeljük a táblázatot, akkor könnyen fel tudjuk sorakoztatni a csapatokat a győzelmeik száma alapján:
1. Arsenal
2. PSG
3. Basel
4. Ludogorets
5

Az Arsenalnak 4 győzelme volt, a PSG-nek 3, mı́g a Baselnek és a Ludogoretsnek nem volt egy győzelmük sem.

2.2. A Colley-módszer matematikája
A Colley-módszer egy Cr “ b lineáris egyenlet megoldásán alapszik. A C
egy Mnˆn -es diagonális mátrix, amelynek az aij eleme ´n, ahol az n az
egymás ellen lejátszott meccsek számát jelenti, a mi esetünkben -2-t, mivela csapatok oda-vissza játszottak egy-egy meccset. A főátlóban pedig 2+
az összes játszott meccs száma lesz. Mivel 4 csapatunk van, és összesen 6
meccset játszottak, ı́gy a C mátrix az alábbi:¨˛
8 ´2 ´2 ´2
˚ ´2
8 ´2 ´2 ‹˚‹˝ ´2 ´2
8 ´2 ‚´2 ´2 ´2
8
A b eredményvektor pedig az alábbi formulából áll: bi “ 1 ` 12 pwi ´ li q, ahol
a wi a győztes meccsek számát, az li pedig az elvesztett meccsek számátjelöli. Ez alapján könnyen meg tudjuk határozni a r vektort, amelynél az
ri P r0, 1s. Tehát ha kiszámoljuk a Cr “ b egyenletet, akkor r-re az alábbi
vektort kapjuk:
¨
˛
0.700
˚ 0.650 ‹˚‹
˝ 0.350 ‚0.300

2.3. Előnyei és hátrányai
A módszer egyik legnagyobb előnye, hogy olyan versenyeken, ahol csak győzelem vagy vereség van, könnyen lehet használni. Viszont az algoritmus nem
tudja kezelni azon sporteseményeket, ahol a döntetlen lehetősége is fennáll.
Például a B csoportban a Benfica és a Besiktas értékei megegyeznek, pedig
a Benfica szerzett végül több pontot a táblázatban. A másik nagy hátránya,
hogy az algoritmus nem tud hiányos táblázattal foglalkozni, ami azt jelenti,
6

hogy a Bajnokok Ligájában azon meccseknél nem tudjuk felhasználni az algoritmust, amelyek már a kieséses alapon működtek. Ezáltal a lehetőségek levannak korlátozva csak tabella alapú eseményekre. Az utolsó komoly gondja
ennek, hogy az algoritmus nem értékeli a különböző csapatok elleni egyébstatisztikákat. Például, ha egy gyengébb csapat legyőzz egy erősebb csapatot, azt a metódus ugyanolyan győzelemnek tulajdonı́tja, mint amikor egy
erősebb győz le egy gyengébbet. Ezt a problémát próbálja orvosolni egy
fejlesztett Colley-módszer.

2.4. A fejlesztett Colley-módszer
A fejlesztett Colley-módszer kitér a csapatok közötti erőviszonyokra is. Mivela Colley-módszer esetében az nem volt számottevő, hogy ki hány góllal nyer,
vagy mennyi kapura lövése volt, ı́gy nem tudjuk mindig rangsorolni, hogy
melyik csapat volt legvégül a legerősebb. Erre ad megoldást a fejlesztett
Colley-módszer. Az alapja ennek is egy Cr “ b lineáris egyenlet, de itt ab vektort máshogy választjuk meg. Különböző, úgynevezett súlyzószorzókatállı́tunk be, különböző értékekhez, amelyeket módosı́tva egy más érték jönki. A kezdeti vektorokban feltüntettem ezeket az értékeket, ennek a jelölésea következő:• WH:Győzelem otthon• WA:Győzelem idegenben• TIE:Döntetlen• LOSEHOME:Vereség otthon• LOSEAWAY:Vereség idegenben• RG:Rúgott gól
• KG:Kapott gól
• KL:Kapuralövés• KTL:Kaput találó lövés7• CO:Szöglet• PASS:Passz• POSS:labdabirtoklás,50 százalékhoz viszonyı́tva• SZAB:Szabálytalanság• YC:Sárga lap• RC:Piros lap
Ezáltal a b vektor a következő lesz:bi “ 1 ` 12 pwin ` c1 ˚ RG ` c2 ˚ KG ` c3 ˚ KL ` c4 ˚ KT L ` c5 ˚ CO ` c6 ˚
P ASS ` pc7 ´ 50q ˚ P OSS ´ c8 ˚ SZAB ´ c9 ˚ Y C ´ c10 ˚ RCq, ahol a ci az
adatbázis vektorainak különböző értékeit jelöli illetve a win “ k1 ˚ W H ` k2 ˚
W A ` k3 ˚ T IE ´ k4 ˚ LOSE, ahol ki a különböző meccsek kimeneteleinek aszámát adja meg.
Ezáltal az A csoportban a b vektor:
¨
˛
´1106
˚ ´992 ‹˚‹
˝ 2953.5 ‚2986
Illetve a rangsoroló vektor:

˛
273.550
˚ 284.950 ‹˚‹
˝ 679.550 ‚682.750¨

Itt már sokkal látványosabban elkülönülnek azok a csapatok, akik több pontot szereztek azoktól, akik csak néhányat, viszont az súlyzószorzó módosı́tásávalérdekesebb dolgokat is kiszűrhetünk. Például ha nagyon magasra állı́tjuk asárga lapokért, piros lapokért, illetve a szabálytalanságokért járó büntetőpontokat,és minden mást pedig nullára, akkor egy rangsort kaphatunk a legszabályosabbanjátszó csapatokról. Viszont ennek a módszernek is ugyanazok a hibái, mintaz alap Colley-módszernek: nem értékeli, hogy ki ellen játszott a csapat, nem
alkalmazható hiányos táblázattal, illetve a döntetleneket sem kezeli rendesen.

82.5. Program és programkód
A módszerekhez a SageMath [5] matematikai programcsomagban készı́tettünk
interaktı́v alkalmazást. A programkód:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

BL1617= matrix(QQ,[[1,2,1,2,0,3,11,2,5,585,59,7,4,0],[2,1,2,1,3,0,10,7,4,348,41,10,2,0],[3,4,1,3,1,1,10,2,6,596,56,5,1,0],[4,3,2,3,1,1,6,2,3,470,44,11,2,1],[5,6,1,3,0,0,16,4,4,519,51,16,0,0],[6,5,2,3,0,0,3,1,2,417,49,22,3,0],[7,8,1,2,0,6,7,2,8,284,36,12,3,0],[8,7,2,1,6,0,30,15,7,627,64,9,1,0],[9,10,1,3,2,2,18,9,4,679,62,5,2,0],[10,9,2,3,2,2,8,4,5,336,38,11,0,0],[11,12,1,1,3,0,22,10,7,534,55,9,1,0],[12,11,2,2,0,3,14,2,6,391,45,7,3,0],[13,14,1,1,4,0,22,11,6,561,58,8,1,0],[14,13,2,2,0,4,3,1,6,415,42,14,1,0],[15,16,1,1,2,1,15,5,5,628,59,9,1,0],[16,15,2,2,1,2,9,4,2,431,41,14,3,0],[17,18,1,2,1,2,15,5,11,582,58,11,1,0],[18,17,2,1,2,1,7,2,0,336,42,4,2,0],[19,20,1,1,7,0,15,9,9,852,67,8,2,0],[20,19,2,2,0,7,4,2,2,324,33,3,1,0],[21,22,1,3,1,1,13,5,1,560,57,26,1,0],[22,21,2,3,1,1,4,2,0,432,43,17,2,0],[23,24,1,1,5,0,19,8,8,797,72,13,0,0],[24,23,2,2,0,5,5,2,2,247,28,12,0,0],[25,26,1,3,1,1,14,6,6,416,47,17,2,0],[26,25,2,3,1,1,12,5,5,470,53,11,2,0],[27,28,1,2,1,2,9,2,8,551,54,13,3,1],[28,27,2,1,2,1,14,2,6,580,46,17,1,0],[29,30,1,3,1,1,14,5,11,581,56,10,3,1],[30,29,2,3,1,1,11,3,7,504,44,12,3,1],[31,32,1,2,0,1,12,4,2,514,50,6,2,0],[32,31,2,1,1,0,16,3,4,603,50,10,2,0],[30,21,1,1,2,0,18,7,8,787,61,4,0,0],[21,30,2,2,0,2,7,3,7,411,39,12,2,0],[32,23,1,1,1,0,16,5,4,325,37,13,1,0],[23,32,2,2,0,1,13,4,6,692,63,17,4,0],[26,27,1,3,1,1,14,5,10,373,50,18,2,0],[27,26,2,3,1,1,12,4,4,358,50,19,3,0],[20,13,1,3,3,3,8,3,4,359,43,8,0,0],[13,20,2,3,3,3,21,9,9,567,57,8,0,0],[24,31,1,3,2,2,8,4,4,427,53,15,2,0],[31,24,2,3,2,2,9,4,3,344,47,12,2,0],[22,29,1,2,1,3,8,4,0,445,41,9,3,0],[29,22,2,1,3,1,17,7,4,779,59,14,2,0],[14,19,1,2,1,2,8,1,2,445,38,8,0,0],[19,14,2,1,2,1,11,8,5,683,62,10,3,0],[28,25,1,1,4,2,14,7,6,624,55,7,1,0],[25,28,2,2,2,4,7,3,0,505,45,19,4,0],[8,15,1,3,2,2,18,11,6,655,59,14,4,0],[15,8,2,3,2,2,11,4,6,446,41,11,1,0],[10,17,1,2,0,1,8,2,4,341,35,5,1,0],[17,10,2,1,1,0,22,2,8,698,65,6,1,0],[12,5,1,2,0,4,4,0,0,299,34,10,0,0],[5,12,2,1,4,0,16,6,6,808,66,13,0,0],[4,1,1,1,4,0,17,10,7,534,58,14,1,0],[1,4,2,2,0,4,6,2,1,347,42,14,3,0],[2,3,1,1,1,0,6,3,2,314,41,24,3,0],[3,2,2,2,0,1,12,4,6,493,59,16,3,0],[18,9,1,3,1,1,6,1,6,468,55,12,1,0],[9,18,2,3,1,1,10,3,7,397,45,15,2,0],[6,11,1,1,1,0,17,6,3,473,56,12,2,0],[11,6,2,2,0,1,15,4,6,307,44,24,3,0],
9

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

[16,7,1,1,2,0,15,5,8,535,55,10,0,0],[7,16,2,2,0,2,6,0,3,408,45,16,3,0],[30,22,1,1,6,0,19,12,6,474,43,12,0,0],[22,30,2,2,0,6,10,3,1,622,57,5,0,0],[19,13,1,1,4,0,12,8,3,449,54,15,2,1],[13,19,2,2,0,4,10,5,4,405,46,17,3,1],[23,31,1,1,4,1,26,13,6,819,63,7,1,0],[31,23,2,2,1,4,7,4,0,385,37,5,0,0],[20,14,1,2,0,2,9,1,4,626,58,9,1,0],[14,20,2,1,2,0,13,6,5,512,42,7,1,0],[27,25,1,2,0,2,16,6,9,493,56,14,1,0],[25,27,2,1,2,0,12,5,1,419,44,15,1,0],[24,32,1,2,0,1,3,3,0,317,34,11,1,0],[32,24,2,1,1,0,15,6,5,712,66,6,2,0],[28,26,1,2,2,3,18,9,17,578,55,11,1,0],[26,28,2,1,3,2,8,3,1,351,45,16,3,0],[29,21,1,1,3,0,13,6,3,711,64,14,1,0],[21,29,2,2,0,3,10,1,5,355,36,18,2,0],[1,3,1,2,1,2,7,5,3,387,41,14,2,0],[3,1,2,1,2,1,20,8,8,556,59,9,1,0],[10,18,1,3,1,1,8,3,2,383,42,14,1,0],[18,10,2,3,1,1,15,6,8,562,58,14,2,0],[12,6,1,2,0,1,5,0,3,221,28,16,2,0],[6,12,2,1,1,0,12,5,5,846,72,13,2,0],[2,4,1,1,1,0,10,2,3,384,45,8,1,0],[4,2,2,2,0,1,9,4,7,525,55,9,1,0],[9,17,1,3,0,0,16,6,5,381,44,15,2,0],[17,9,2,3,0,0,5,1,5,493,56,20,1,0],[11,5,1,2,0,1,13,4,10,425,44,15,5,0],[5,11,2,1,1,0,14,5,4,557,56,7,3,1],[15,7,1,1,5,1,29,11,9,638,56,10,1,0],[7,15,2,2,1,5,12,5,3,407,44,8,2,0],[16,8,1,2,1,2,10,5,2,395,41,10,4,0],[8,16,2,1,2,1,10,3,4,537,59,12,3,0],[8,16,1,1,1,0,10,5,3,603,53,6,1,0],[16,8,2,2,0,1,10,2,2,518,47,18,3,0],[4,2,1,3,0,0,20,2,4,530,57,3,0,0],[2,4,2,3,0,0,10,1,4,407,43,17,4,0],[3,1,1,1,1,0,20,6,10,437,49,16,2,0],[1,3,2,2,0,1,11,4,4,459,51,17,4,0],[5,11,1,3,1,1,10,2,2,592,52,14,4,0],[11,5,2,3,1,1,12,3,4,457,48,20,2,0],[7,15,1,3,3,3,10,4,2,520,45,8,0,0],[15,7,2,3,3,3,28,11,7,690,55,16,0,0],[18,10,1,1,3,0,20,7,6,655,60,8,1,0],[10,18,2,2,0,3,6,3,6,404,40,13,1,0],[6,12,1,1,4,0,30,12,10,720,67,10,0,0],[12,6,2,2,0,4,3,1,0,268,33,12,4,1],[17,9,1,2,0,1,9,2,4,533,59,12,0,0],[9,17,2,1,1,0,11,2,5,368,41,11,0,0],[32,24,1,1,2,1,33,8,11,618,63,8,3,0],[24,32,2,2,1,2,5,4,1,292,37,11,4,0],[21,29,1,2,1,2,9,2,3,353,36,14,3,1],[29,21,2,1,2,1,17,8,10,716,64,8,2,0],[25,27,1,1,1,0,17,4,5,419,51,15,1,0],[27,25,2,2,0,1,9,2,6,394,49,15,6,0],[22,30,1,2,2,3,8,4,4,452,46,10,1,0],[30,22,2,1,3,2,11,4,5,587,54,23,3,0],[13,19,1,1,3,1,13,4,5,323,40,17,2,0],[19,13,2,2,1,3,8,2,7,592,60,16,3,0],[14,20,1,3,1,1,18,5,9,547,47,10,2,1],[20,14,2,3,1,1,10,2,1,611,53,11,1,0],[31,23,1,2,1,2,4,2,0,265,31,10,0,0],[23,31,2,1,2,1,23,9,7,777,69,8,1,0],[26,28,1,3,1,1,7,2,3,480,48,8,2,0],[28,26,2,3,1,1,14,5,8,626,52,20,1,0],[30,29,1,3,2,2,5,1,3,532,48,11,2,0],[29,30,2,3,2,2,15,3,6,629,52,9,2,0],[32,31,1,1,2,0,11,4,9,672,54,6,0,0],[31,32,2,2,0,2,4,2,2,484,46,8,0,0],[20,19,1,2,0,2,7,3,1,413,39,13,3,0],[19,20,2,1,2,0,9,4,5,723,61,12,4,0],[22,21,1,3,0,0,5,0,3,491,55,12,3,0],[21,22,2,3,0,0,11,5,5,452,45,30,4,0],[14,13,1,3,1,1,12,5,2,305,31,13,5,1],[13,14,2,3,1,1,11,7,9,709,69,10,2,1],
10

71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

[28,27,1,3,0,0,17,5,17,513,48,18,1,0],[27,28,2,3,0,0,7,0,2,491,52,15,1,0],[26,25,1,3,3,3,10,5,5,588,56,11,2,0],[25,26,2,3,3,3,15,4,2,446,44,13,2,0],[24,23,1,1,3,2,7,4,3,194,29,9,2,0],[23,24,2,2,2,3,23,10,7,708,71,8,2,0],[8,7,1,1,8,4,17,9,1,794,68,11,1,0],[7,8,2,2,4,8,11,7,1,320,32,11,2,0],[12,11,1,2,0,1,8,3,1,361,37,9,3,0],[11,12,2,1,1,0,17,8,5,763,63,16,1,0],[4,3,1,3,0,0,8,1,3,440,51,16,3,0],[3,4,2,3,0,0,16,5,5,412,49,13,3,0],[2,1,1,1,2,1,13,9,11,464,51,5,1,0],[1,2,2,2,1,2,8,3,7,417,49,8,0,0],[18,17,1,1,2,1,17,11,5,307,40,11,2,0],[17,18,2,2,1,2,7,2,7,559,60,14,3,0],[6,5,1,2,1,3,6,1,5,359,45,13,4,1],[5,6,2,1,3,1,12,5,5,526,55,18,4,0],[16,15,1,2,1,2,10,2,2,441,41,16,3,1],[15,16,2,1,2,1,11,2,8,643,59,9,0,2],[10,9,1,3,1,1,13,5,5,478,54,14,2,0],[9,10,2,3,1,1,8,4,4,365,46,12,3,0],[1,4,1,2,0,2,8,4,6,433,50,15,1,0],[4,1,2,1,2,0,7,5,4,459,50,12,1,0],[3,2,1,1,5,0,18,8,4,613,64,8,0,0],[2,2,2,2,0,5,6,0,1,277,36,11,1,0],[5,12,1,1,2,0,17,9,7,701,62,9,2,0],[12,5,2,2,0,2,3,2,3,405,38,12,1,0],[7,16,1,1,1,0,10,4,2,349,41,14,5,0],[16,7,2,2,0,1,19,5,7,632,59,14,3,1],[9,18,1,1,3,0,12,6,7,443,50,18,1,0],[18,9,2,2,0,3,12,0,5,472,50,13,3,0],[11,6,1,3,0,0,24,5,8,570,58,10,2,0],[6,11,2,3,0,0,2,0,3,396,42,13,2,0],[15,8,1,3,2,2,15,8,6,518,47,9,2,0],[8,15,2,3,2,2,12,7,5,608,53,15,1,0],[17,10,1,1,3,1,23,12,11,724,67,7,0,0],[10,17,2,2,1,3,6,3,1,298,33,15,2,0],[19,14,1,1,4,0,14,8,5,1023,68,7,0,0],[14,19,2,2,0,4,1,0,2,411,32,5,1,0],[21,30,1,2,1,4,15,4,7,483,45,9,1,0],[30,21,2,1,4,1,12,7,2,728,55,13,1,0],[23,32,1,1,1,0,14,4,6,826,68,11,0,0],[32,23,2,2,0,1,5,3,1,318,32,9,1,0],[25,28,1,2,1,2,13,3,7,515,50,15,1,0],[28,25,2,1,2,1,14,7,2,559,50,8,1,0],[27,26,1,1,6,0,17,13,1,569,53,12,1,0],[26,27,2,2,0,6,6,0,3,523,47,9,4,2],[13,20,1,3,1,1,10,2,8,590,55,7,1,0],[20,13,2,3,1,1,15,6,6,448,45,16,2,0],[29,22,1,3,2,2,27,7,19,616,60,10,1,0],[22,29,2,3,2,2,5,2,3,373,40,18,0,0],[31,24,1,3,0,0,17,4,6,695,65,12,2,0],[24,31,2,3,0,0,6,3,1,332,35,8,1,0],[32,9,1,3,0,0,13,4,7,420,45,6,2,0],[9,32,2,3,0,0,18,7,4,548,55,8,2,0],[18,13,1,1,3,1,8,4,3,321,41,12,3,0],[13,18,2,2,1,3,6,3,6,534,59,13,3,0],[5,3,1,1,1,0,15,3,4,775,63,13,1,0],[3,5,2,2,0,1,9,2,1,382,37,12,2,1],[2,6,1,1,2,0,13,4,2,195,33,10,4,0],[6,2,2,2,0,2,13,5,10,531,67,10,3,1],[19,29,1,1,6,1,17,7,6,591,66,16,5,0],[29,19,2,2,1,6,7,3,4,251,34,25,5,0],[8,25,1,1,4,0,13,6,5,473,54,13,3,0],[25,8,2,2,0,4,5,2,5,389,46,17,1,0],[30,23,1,2,1,5,9,3,5,413,44,13,3,2],[23,30,2,1,5,1,16,7,8,556,56,10,2,0],[28,15,1,2,1,3,13,4,9,633,51,17,2,0],[15,28,2,1,3,1,13,5,4,530,49,8,0,0],[3,5,1,2,0,2,3,0,1,232,30,12,5,1],[5,3,2,1,2,0,18,4,8,744,70,13,1,0],[6,2,1,1,2,1,22,8,8,654,68,6,2,0],[2,6,2,2,1,2,8,3,1,234,32,9,2,0],[9,32,1,2,2,4,14,3,6,550,59,14,4,0],[32,9,2,1,4,2,10,7,4,326,41,9,3,0],
11

109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

[13,18,1,1,5,3,8,6,5,590,61,12,4,0],[18,13,2,2,3,5,15,6,6,275,39,15,6,0],[23,30,1,1,5,1,24,11,9,767,69,12,2,0],[30,23,2,2,1,5,8,5,2,273,31,11,3,0],[15,28,1,1,3,1,19,6,5,600,54,9,2,0],[28,15,2,2,1,3,8,2,1,632,46,12,2,0],[25,8,1,1,1,0,4,1,3,303,36,15,1,0],[8,25,2,2,0,1,14,4,10,680,64,10,3,0],[29,19,1,1,4,0,16,10,2,428,43,14,1,0],[19,29,2,2,0,4,6,1,4,591,57,11,3,0],[19,5,1,3,0,0,17,1,13,587,61,10,2,0],[5,19,2,3,0,0,12,4,4,329,39,19,2,0],[18,8,1,1,3,1,15,9,5,280,37,15,0,0],[8,18,2,2,1,3,12,7,3,661,63,8,0,0],[2,32,1,3,1,1,21,4,7,488,51,9,0,0],[32,2,2,3,1,1,6,3,1,400,49,7,0,0],[15,23,1,2,4,2,26,12,7,638,47,7,1,0],[23,15,2,1,2,4,19,2,10,692,53,22,5,1],[32,2,1,1,1,0,15,4,8,632,64,10,0,0],[2,32,2,2,0,1,6,0,1,293,36,16,3,0],[23,15,1,2,1,2,11,3,8,535,49,11,4,1],[15,23,2,1,2,1,22,12,4,589,51,7,2,0],[8,18,1,2,2,3,15,4,7,644,64,9,2,0],[18,8,2,1,3,2,7,2,1,285,36,9,5,0],[5,19,1,1,3,0,14,8,5,280,34,21,4,0],[19,5,2,2,0,3,15,3,8,614,66,18,3,0],[32,15,1,1,2,1,17,7,7,320,40,23,4,0],[15,32,2,2,1,2,19,6,8,582,60,7,2,0],[5,18,1,1,2,1,15,6,6,407,47,11,2,0],[18,5,2,2,1,2,11,2,8,400,53,21,2,0],[18,5,1,2,0,2,14,6,7,448,52,11,1,0],[5,18,2,1,2,0,10,5,3,452,48,13,3,0],[15,32,1,1,3,0,16,8,9,673,61,10,1,0],[32,15,2,2,0,3,4,1,3,422,39,15,3,0],[5,15,2,2,1,4,11,4,1,418,44,23,5,1],[15,5,2,1,4,1,18,5,1,541,56,18,4,0]])

127
128

Codes=[['Club Brugge',1,7],['Leicester',2,7],['FC Porto',3,7],['FC Kobenhavn',4,7],['Juventus',5,8],['Sevilla',6,8],
ãÑ['Legia Warszawa',7,6],['Borussia Dortmund',8,6],['Bayer Leverkusen',9,5],
ãÑ['CSZKA Moszkva',10,5],['Lyon',11,8],['Dinamo Zagreb',12,8],
ãÑ
['Machester City',13,3],['Monchengladbach',14,3],['Real Madrid',15,6],
ãÑ['Sporting CP',16,6],['Tottenham',17,5],['Monaco',18,5],
ãÑ['Barcelona',19,3],['Celtic',20,3],['Basel',21,1],ãÑãÑ['Ludogorets',22,1],['Bayern Munchen',23,4],['FK Rosztov',24,4],['Benfica',25,2],['Besiktas',26,2],['Dinamo Kijev',27,2],
ãÑ['Napoli',28,2],['PSG',29,1],['Arsenal',30,1],ãÑãÑ['PSV Eindhoven',31,4],['Atletico Madrid',32,4]]

129
130
131
132
133
134

html("<h1 align=center>Colley-módszer</h1>")
html("<h2 align=center>Alap formula</h2>")
C=matrix(QQ,[[8,-2,-2,-2],[-2,8,-2,-2],[-2,-2,8,-2],[-2,-2,-2,8]])b=vector(QQ,C.ncols())
badv=vector(QQ,C.ncols())

135
136

def matches(groupcode):
12

137
138
139
140
141
142
143
144
145
146
147
148
149
150

151

A=[]
eredmeny=[]
ellenfel=''for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
A.append([Codes[i][0],Codes[i][1]])for i in [0..3]:for j in [0..BL1617.nrows()-59]:
if A[i][1]==BL1617[j][0]:for k in [0..3]:
if BL1617[j][1]==A[k][1]:ellenfel=A[k][0]if BL1617[j][2]==1:
eredmeny.append([A[i][0],BL1617[j][4],ãÑBL1617[j][5],ellenfel])
return eredmeny

152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173

def basicColley(groupcode):A=[]eredmeny=[]
for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
A.append([Codes[i][0],Codes[i][1],0])
for i in [0..3]:for j in [0..BL1617.nrows()-59]:
if A[i][1]==BL1617[j][0]:for k in [0..3]:
if BL1617[j][1]==A[k][1]:kod=A[k][1]if BL1617[j][2]==1:
if(BL1617[j][3]==1):
A[i][2]=A[i][2]+1
for l in [0..3]:if(A[l][1]==kod):
A[l][2]=A[l][2]-1elif(BL1617[j][3]==2):
A[i][2]=A[i][2]-1
for l in [0..3]:13

if(A[l][1]==kod):
A[l][2]=A[l][2]+1

174
175
176
177
178
179
180

else:
A[i][2]=A[i][2]+0
for l in [0..3]:if(A[l][1]==kod):
A[l][2]=A[l][2]+0

181
182
183
184
185
186
187
188

for i in [0..3]:b[i]=1+0.5*(A[i][2])Y=C.solve_right(b)eredmeny.append([Y[i].n(digits=3),A[i][0]])eredmenysorted=sorted(eredmeny,reverse=1)
eredmenysorted=[[basicColley_r_vektora,csapatnev]]
return eredmenysorted

189
190
191

192
193
194
195
196

197
198
199

200
201
202
203
204

@interactdef colley(a=selector(label="csoportok száma",buttons=True,ãÑnrows=1, values=[1..8], default=1)):
seged=vector(QQ,C.ncols())
html("<center>")for i in [0..len(basicColley(a))-1]:
seged[i]=basicColley(a)[i][0]html("<center><font size='5'>%s<fontãÑcolor='red'>%s</font>Colley pontot szerzett</font></center>"%(basicColley(a)[i][1],basicColley(a)[i][0]))html("<center><font size='5'> Meccseredmények
ãÑ</font></center>")for i in [0..len(matches(a))-1]:
home=matches(a)[i][0]homescore=matches(a)[i][1]guestscore=matches(a)[i][2]guest=matches(a)[i][3]

205
206
207

#táblázatos alaktablew=[]
14

208

209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236

table1=[' ',matches(a)[0][0],matches(a)[0][3],ãÑmatches(a)[1][3],matches(a)[2][3]]table2=[table1[1]]table3=[table1[2]]table4=[table1[3]]table5=[table1[4]]for i in [1..4]:for j in [0..11]:
if matches(a)[j][0]==table2[0]:if matches(a)[j][3]==table1[i]:table2.append(matches(a)[j][1].str()+'-'+matches(a)[j][2].str())
for i in [1..4]:for j in [0..11]:
if matches(a)[j][0]==table3[0]:if matches(a)[j][3]==table1[i]:table3.append(matches(a)[j][1].str()+'-'+matches(a)[j][2].str())
for i in [1..4]:for j in [0..11]:
if matches(a)[j][0]==table4[0]:if matches(a)[j][3]==table1[i]:table4.append(matches(a)[j][1].str()+'-'+matches(a)[j][2].str())
for i in [1..4]:for j in [0..11]:
if matches(a)[j][0]==table5[0]:if matches(a)[j][3]==table1[i]:table5.append(matches(a)[j][1].str()+'-'+matches(a)[j][2].str())

237
238
239
240
241
242
243
244

table2.append('x')
table2[4]=table2[3]table2[3]=table2[2]table2[2]=table2[1]table2[1]='x'table3.append('x')
table3[4]=table3[3]
15

245
246
247
248
249
250

table3[3]=table3[2]table3[2]='x'table4.append('x')
table4[4]=table4[3]table4[3]='x'table5.append('x')

251
252
253
254
255
256
257

tablew.append(table1)
tablew.append(table2)
tablew.append(table3)
tablew.append(table4)
tablew.append(table5)
html("<h2 align=center>%s</h2>"%html.table(tablew))

258
259
260

html("<h2 align=center>Fejlesztett formula</h2>")html('<h3 align=center>Súlyzószorzók meghatározása</h3>')

261
262

@interact(layout=[['WH','WA'],['LOSEHOME','LOSEAWAY'],['RG','KG'],['KL','KTL'],['CO','PASS'],['POSS','SZAB'],['YC','RC']])def sliders(
WH=slider(100,300,5,250, label='Otthoni siker'),
WA=slider(150,400,5,300, label='Idegenbeli siker'),
LOSEHOME=slider(-400,0,5,-250, label='Vereség otthon'),LOSEAWAY=slider(-300,0,5,-200, label='Vereség idegenben'),
RG=slider(0,100,5,75, label='Rúgott Gól'),
KG=slider(-100,0,5,-75, label='Kapott gól'),
KL=slider(0,30,1,10, label='Kapuralövés'),
KTL=slider(0,50,1,20, label='Kaput találó lövés'),
CO=slider(0,30,1,15, label='Szöglet'),
PASS=slider(0,0.5.n(digits=3),.01,0.2, label='Passz'),
POSS=slider(0,10.n(digits=3),0.5,1,
ãÑlabel='Labdabirtoklás'),
SZAB=slider(-10,0.n(digits=3),0.5,-3,ãÑlabel='Szabálytalanság'),
YC=slider(-50,0,1,-15,label='Sárga Lap'),
RC=slider(-100,0,5,-40,label='Piros Lap')):def Completepoint(kod):
ãÑ

263
264
265
266
267
268
269
270
271
272
273
274
275

276

277
278
279

16

280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298

Complete=0
win=0
s=0
while (s!=6):
for i in [0..BL1617.nrows()-59]:
if BL1617[i][0]==kod:
if BL1617[i][2]==1:
if BL1617[i][3]==1:
win=win+WH
else:
win=win+LOSEHOME
elif BL1617[i][2]==2:
if BL1617[i][3]==1:
win=win+WA
else:
win=win+LOSEAWAY
Complete=Complete+win+BL1617[i][4]*RG+
BL1617[i][5]*KG+BL1617[i][6]*KL+
BL1617[i][7]*KTL+BL1617[i][8]*CO+

299

BL1617[i][9]*PASS+(BL1617[i][10]-50)*POSS+
BL1617[i][11]*SZAB+BL1617[i][12]*YC+
BL1617[i][13]*RC
s=s+1
return Complete
def TiePointCalc(groupcode):A=[]
TiePoints=[]
tiecalc=[0,0,0,0]
for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
ãÑ

300
301
302
303
304
305
306
307
308
309
310

311
312
313

314

ãÑ
A.append([Completepoint(Codes[i][1]),Codes[i][1]])for i in [0..len(A)-1]:
for j in [0..BL1617.nrows()-59]:
if A[i][1]==BL1617[j][0] andãÑ
BL1617[j][3]==3:
tiecalc[i]+=1

17

315
316
317
318
319
320

321
322
323

324

325

for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
TiePoints.append([0,Codes[i][1]])for i in [0..len(TiePoints)-1]:
for j in [0..BL1617.nrows()-59]:
if TiePoints[i][1]==BL1617[j][0] andãÑ
BL1617[j][2]==1 and BL1617[j][3]==3:
for k in [0..3]:
if BL1617[j][1]==TiePoints[k][1]:TiePoints[i][0]+=((A[i][0]*ãÑ(1/(tiecalc[i]ˆ3))+ãÑ
A[k][0]*(1/(tiecalc[k]ˆ3)))*0.5).abs()
TiePoints[k][0]+=((A[k][0]*ãÑ(1/(tiecalc[k]ˆ3))+ãÑ
A[i][0]*(1/(tiecalc[i]ˆ3)))*0.5).abs()
return TiePoints

326
327
328
329
330
331
332
333
334

def advancedColley_b(groupcode):A=[]
for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
A.append(Codes[i][1])for i in [0..3]:
badv[i]=1+.5*(Completepoint(A[i])+TiePointCalc(groupcode)[i][0])

335
336
337
338
339
340
341
342

TiePointCalc(a)advancedColley_b(a)html('$$b=%s$$'%latex(badv.n(digits=7)))
html('$$C=%s$$'%latex(C))
r=C.solve_right(badv).n(digits=6)
html('$$r=%s$$'%latex(r))
html('<h3 align=center>Ahol a csapatok sorrendje:ãÑ(%s,%s,%s,%s)</h3>'%(tablew[0][1],ãÑtablew[0][2],tablew[0][3],tablew[0][4]))18Futási kép az alapbeállı́tásokkal:

19Illetve ha a győzelmeket és a vereségeket súlyozzuk ki, a többi adatot pedig
kevésbé a 6-os csoportban:

20

A továbbiakban a többi programkód esetén a BL1617 és a Codes listákugyanazok, ı́gy azokat nem ı́rtam bele a programkódokba.

3. Massey-módszer
1997-ben Kenneth Massey találta ki [4], egyetemista korában, és elsőnek
az egyetemi focibajnokságban alkalmazta. Ezt az eljárást később tovább
fejlesztette azzal a kritériummal, hogy a csapatokat az alapján is értékelte,hogy melyik csapat ellen mikor játszott. A Massey-módszert a mai napig
használják az NFL-ben.

3.1. Példa és az eredeti Massey módszer matematikájaIsmét a Bajnokok Ligájának A csoportját vegyük alapul. Az Arsenalnak
4 győzelme és két döntetlenje, a PSG-nek 3 győzelme és 3 döntetlenje, aLudororetsnek 3 döntetlenje és 3 veresége, mı́g a Baselnek 2 döntetlenje,
illetve 4 veresége volt. A Massey-módszer szintén egy lineáris egyenlet megoldásán alapszik, de most a mátrixot és a vektorokat egy más algoritmussal
határozzuk meg. Legyen az egyenletrendszer a következő: Xr “ b. Elsőnek
konstruáljuk meg az X mátrixot. Mivel 4 csapat összesen 12 meccset játszott,ı́gy legyen az X egy 12 soros és 4 oszlopos mátrix, melynek elemei csak -1,0vagy 1. Legyen az egyik csapat i., a másik pedig j.. Ha i. csapat legyőzte
j.-t, akkor az k.sorban a i.-nek megfelelő oszlophoz tartozó elem 1, j.-nek
pedig -1 lesz, minden más pedig 0 (döntetlen esetén vagy i.-nek vagy j.-nek
1 lesz az értéke, a másiknak -1, és a sorban lévő többi elem pedig 0). Így

21

alakul ki az alábbi mátrix:
¨

1
˚ ´1
˚
˚ ´1
˚
˚ 0
˚
˚ 0
˚
˚ ´1
˚
˚ 0
˚
˚ ´1
˚
˚ 0
˚
˚ ´1
˚
˝ 0
0

˛
´1
0
0
0
1
0 ‹
‹
0
0
1 ‹
‹
´1
1
0 ‹
‹
´1
0
1 ‹
‹
1
0
0 ‹
‹
0
1 ´1 ‹
‹
0
1
0 ‹
‹
´1
1
0 ‹
‹
0
0
1 ‹
‹
´1
0
1 ‚
0 ´1
1
ř
Ezután készı́tsük el a b vektort is. Legyen bk “ |ri ´ rj | ˚ c, ahol ri és rj
az k. meccsen elért statisztikáját jelenti i.-nek és j.-nek, c pedig a Colleymódszernél felhasznált súlyzószorzókat jelenti. Az ı́gy kialakult vektor:¨
˛162
˚ 632 ‹˚‹
˚ 511 ‹˚‹
˚ 138 ‹˚‹
˚ 564 ‹‹˚
˚ 310 ‹‹b“˚
˚ 482 ‹ .
˚‹
˚ 589 ‹˚‹
˚ 151 ‹˚‹
˚ 498 ‹˚‹
˝ 617 ‚
202
Ezután legyen M “ X T X illetve p “ X T ˚ b. Ekkor észre lehet venni, hogy#i. és j. csapat egymás elleni meccsek száma negatı́v előjellel ha i ‰ j
Mi,j “az összes lejátszott meccs
ha i “ jés pi pedig az i.csapat összes szerzett pontját jelenti. Az ı́gy kialakult lineáris
rendszer a következő:Mr “ p22

amelynek a megoldásvektora:
¨

˛
´536
˚ ´404 ‹‹r“˚˝ ´15 ‚
0Ezekből az adatokból pedig a következő módszerrel két fontos információ iskinyerhető. Elsőnek legyen az M “ D ´ A, ahol D egy diagonális mátrix,
amelynek a főátlójában a csapatok lejátszott meccsei találhatóak, mı́g Ai,jelemei a csapatok egymás ellen lejátszott meccseinek a számát taglalja, hai ‰ j, a főátlóban pedig csupa nullák találhatóak. Így az M r “ p lineáris
egyenlet a következőképpen módosul:
Dr ´ Ar “ pés ebből fejezzük ki r-t:
r “ D´1 pAr ` pq “ D´1 Ar ` D´1 p.
Így, i.csapat pontszáma a következő:pi
1 ÿ.
Ai,j rj `ri “
Di,i jDi,iamelyet át tudjuk alakı́tani ri `ri összegre, amely a következő információval
rendelkezik:
p1q

p2q

1. Az algoritmus értékelése az i. csapatnak
1 ÿ
p1q
ri “
Ai,j rj
Di,i j
ˆ
˙
587
587
2852
1095
p1q
r “ ´
,´
,´
,´
10
15
5
2
2. Statisztikákból kapott pontja az i. csapatnak
pi
p2q
ri “
Di,i
ˆ
˙
1115
1319
1095
p2q
r “ ´
,´
, 453,
2
3
2
23

3.2. Előnyei és hátrányai
Az első, amit észre lehet venni, hogy ez az algoritmus sem tud mit kezdeni
a döntetlenekkel. Ha az X mátrixból kihagynánk azon sorokat, amelynél ameccs kimenetele döntetlen lenne, akkor az M mátrix sem pontos értékeket
adna vissza, mivel eltűnne a szimmetria és azon meccseket, amelyek döntetlennel végződtek, nem is nézné, viszont a súlyozásokkal ezt lehet korrigálni,
emiatt tarthatjuk meg ezt a formulát. A Massey-algoritmusnak van egymásik formája is, amely már foglalkozik döntetlenekkel, illetve értékeli a csapatokat aszerint is, hogy a mennyire erős ellenfél ellen játszotta, illetve mikorjátszotta le azt a meccset.

3.3. A szezonális Massey-módszer
Ennél a módszernél az eredeti Massey-módszert alkalmazzuk azzal a változtatással, hogy a lejátszott meccsek ”időértékét” is figyelembe vesszük [2]. Elsőnek
is jelentse si ptq azt a függvényt, amely megadja, hogy mennyi pontot szerzett
i. csapat a j. csapat ellen a t. játéknapon. Ha azon a napon egy csapat nem
játszott meccset, akkor ennek az értéke legyen 0. Legyen mi,t az i. csapat aj. időpontig lejátszott meccsek számát. Legyen j1 , . . . , jmi,t a megfelelő napokon az i. csapat ellenfeleit és legyen t1 , . . . , tmi,t a napokat, amikor játszott
az i. csapat. Ekkor az alábbi függvény megadja, hogy ı́gy mennyi pontot
szerzett i. csapat a j. játéknap után:mi,t1 ÿ
prj ptk ´ 1q ` si ptk qq.
ri ptq “
mi,t k“1 kTermészetesen ri ptq “ 0, ha az i. csapat a t. időpontig nem játszott mérkőzést.
p1q
p2q
Ebben az esetben is fel tudjuk bontani ri ` ri összegre, ahol:
1. A szezonális értékelése az i. csapatnak:
p1q
ri ptq “mi,t1 ÿ
prj ptk ´ 1q
mi,t k“1 k24

2. Statisztikákból kapott pontja az i. csapatnak a j. mérkőzésen:
p1q
ri ptq “mi,t1 ÿ
si ptk q
mi,t k“1

3.4. Példa a szezonális Massey-módszerhez
Vegyük alapul újra az 1.csoport kimeneteleit. Mint tudjuk, az Arsenal lett az
első, majd a PSG, utána a Basel, az utolsó pedig a Ludogorets. A fordulókeredményei a következők:

Viszont a szezonális pontozása nem ebben a sorrendben alakult alakult:

Ahogy lehet látni, az első fordulóban mindkét csapat döntetlent játszott. Viszont az egyéb statisztikák miatt van a PSG és a Basel plusz ponttal, mı́g az
Arsenal és a Ludogorets mı́nusszal. Ezzel az első forduló után egy erősorrendmár ki is alakult, viszont ebből még nem lehet tudni, hogy melyik csapat
a valódi esélyes. A második fordulótól kezdve viszont egyértelműen látszik.
Viszont annak ellenére, hogy a PSG végül 845.6 pontot szerzett, ő lett a25

második, mivel a statisztikái lehet, hogy jobbak lettek, mint az első helyezett Arsenalnak, mégis játszott egy döntetlent a legutolsó meccsén. Viszont
az algoritmus nem azt mutatja meg, hogy matematikailag mely csapat nyerte
meg a csoportkört, hanem mely csapat számı́t a lejátszott meccsek után alegerősebbnek.
Ezenkı́vül az algoritmus nem csak azon csapatokat értékeli, amely szerzett
pontot vagy pontokat az adott meccsen. Például a harmadik fordulóban az
Arsenal 6-0-ra győzte le a Ludogorets csapatát, ı́gy a harmadik fordulóig
az Arsenalnak 549.2 pontja volt, mı́g a Ludogoretsnek -360.3. Viszont akövetkező fordulóban már az Arsenal 2-3-ra tudott diadalmaskodni a Ludogoretsen, mégis mindketten plusz pontokat könyvelhettek el. Az Arsenalazért, mivel meg tudta nyerni a mérkőzést, mı́g a Ludogorets annak ellenére,hogy kikapott, de az aktuális legerősebb csapat ellen vesztett egy szorosmérkőzésen.

3.5. Előnyei és hátrányai a szezonális Massey-módszernek
Ez az algoritmus már tudja kezelni a döntetleneket, sőt ezt már lehet alkalmazni hiányos adattáblázaton is, csak abban az esetben egy újabb függvénytkell kialakı́tani, amely megadja, hogy egy csapat hány meccset játszott összesen. Ezenkı́vül az eljárás már figyelembe veszi azt is, hogy aki ellen játszott
az i. csapat, az erősebb csapatnak számı́t-e, vagy sem. Ezáltal egy sokkal
valósághűbb értékelést mutat be egy bajnokságról.
A hátránya viszont, hogy előzetes rangsorolással már nem tud mit kezdeni.
Ezalatt azt értem, hogy annak ellenére, hogy tudjuk, hogy i. csapat erősebb
j.-nél, az első fordulóban ugyanannyi esélyt adnak i.-nek, mint j.-nek. Emiattmuszáj néhány mérkőzés, hogy meg tudjuk mondani, hogy melyik csapatnak
van nagyobb esélye a másikkal szemben.

26

3.6. Programok és programkódok
Eredeti Massey-módszer:
A programkód:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

16

def matches(groupcode):A=[]eredmeny=[]
ellenfel=''for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
A.append([Codes[i][0],Codes[i][1]])for i in [0..3]:for j in [0..BL1617.nrows()-59]:
if A[i][1]==BL1617[j][0]:for k in [0..3]:
if BL1617[j][1]==A[k][1]:ellenfel=A[k][0]if BL1617[j][2]==1:
eredmeny.append([A[i][0],BL1617[j][4],ãÑBL1617[j][5],ellenfel])
return eredmeny

17
18
19
20
21
22
23
24
25
26
27
28
29

def Xmatrix(groupcode):B=[]
X=matrix(QQ,12,4)
A=vector(QQ,X.ncols())
ellenfel=''
s=0
t=0
r=0
indextarto=[]for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
B.append([Codes[i][0],s])
ãÑ
]
27

30
31
32
33
34
35
36
37
38

39
40
41

42
43
44
45
46
47

s=s+1
for i in [0..len(matches(groupcode))-1]:
for j in [0..3]:
if matches(groupcode)[i][0]==B[j][0]:r=B[j][1]for k in [0..3]:
if B[k][0]==matches(groupcode)[i][3]:t=B[k][1]ifãÑmatches(groupcode)[i][1]>matches(groupcode)[i][2]:X[i,r]=1
X[i,t]=-1
elif
ãÑmatches(groupcode)[i][1]<matches(groupcode)[i][2]:X[i,r]=-1
X[i,t]=1
else:
X[i,r]=1
X[i,t]=-1
return X

48
49
50
51

52
53

html("<h1 align=center>Massey's method</h1>")@interact
def massey(csoportszam=selector(label='CsoportokãÑszáma:',buttons=True, nrows=1, values=[1..8], default=1)):#táblázatos alaktablew=[]54

table1=[' ',matches(csoportszam)[0][0],matches(csoportszam)[0][3],ãÑmatches(csoportszam)[1][3],matches(csoportszam)[2][3]]table2=[table1[1]]table3=[table1[2]]table4=[table1[3]]table5=[table1[4]]for i in [1..4]:for j in [0..11]:
if matches(csoportszam)[j][0]==table2[0]:if matches(csoportszam)[j][3]==table1[i]:
ãÑ

55
56
57
58
59
60
61
62

28

63
ãÑ
ãÑ
64
65
66
67

table2.append(matches(csoportszam)[j][1].str()+'-'+matches(csoportszam)[j][2].str())

for i in [1..4]:for j in [0..11]:
if matches(csoportszam)[j][0]==table3[0]:if matches(csoportszam)[j][3]==table1[i]:

68
ãÑ
ãÑ
69
70
71
72

table3.append(matches(csoportszam)[j][1].str()+'-'+matches(csoportszam)[j][2].str())

for i in [1..4]:for j in [0..11]:
if matches(csoportszam)[j][0]==table4[0]:if matches(csoportszam)[j][3]==table1[i]:

73
ãÑ
ãÑ
74
75
76
77

table4.append(matches(csoportszam)[j][1].str()+'-'+matches(csoportszam)[j][2].str())

for i in [1..4]:for j in [0..11]:
if matches(csoportszam)[j][0]==table5[0]:if matches(csoportszam)[j][3]==table1[i]:

78
ãÑ
ãÑ

table5.append(matches(csoportszam)[j][1].str()+'-'+matches(csoportszam)[j][2].str())

79
80
81
82
83
84
85
86
87
88
89
90
91
92

table2.append('x')
table2[4]=table2[3]table2[3]=table2[2]table2[2]=table2[1]table2[1]='x'table3.append('x')
table3[4]=table3[3]table3[3]=table3[2]table3[2]='x'table4.append('x')
table4[4]=table4[3]table4[3]='x'table5.append('x')
29

93
94
95
96
97
98
99
100

101

tablew.append(table1)
tablew.append(table2)
tablew.append(table3)
tablew.append(table4)
tablew.append(table5)
html("<h2 align=center>%s</h2>"%html.table(tablew))@interact(layout=[['WH','WA'],['RG','KG'],['KL','KTL'],ãÑ['CO','PASS'],['POSS','SZAB'],['YC','RC']])def sliders(WH=slider(0,300,5,250, label='Otthoni siker'),
WA=slider(0,400,5,300, label='Idegenbeli siker'),ãÑ
RG=slider(0,100,5,75, label='Rúgott Gól'),ãÑ
KG=slider(-100,0,5,-75, label='Kapott gól'),ãÑ
KL=slider(0,30,1,10, label='Kapuralövés'),ãÑ
KTL=slider(0,50,1,20, label='Kaput találó lövés'),ãÑ
CO=slider(0,30,1,15, label='Szöglet'),ãÑ
PASS=slider(0,0.5.n(digits=3),.01,0.2, label='Passz'),
ãÑ
POSS=slider(0,10.n(digits=3),0.5,1,label='Labdabirtoklás'),ãÑSZAB=slider(-10,0.n(digits=3),0.5,-3,label='Szabálytalanság'),ãÑ
YC=slider(-50,0,1,-15,label='Sárga Lap'),ãÑ
RC=slider(-100,0,5,-40,label='Piros Lap')): #csúszkák
ãÑ

102
103
104
105
106
107
108
109
110
111
112
113
114
115

116

def Bvector(groupcode):
s=0
B=[]
C=[]
point=0
win=0
for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
B.append([s,Codes[i][1]])s=s+1
for j in [0..3]:for i in [0..BL1617.nrows()-59]:
if B[j][1]==BL1617[i][0] andãÑ
BL1617[i][2]==1:
C.append([B[j][0],B[j][1],BL1617[i][1],ãÑBL1617[i][3]])
30

117
118
119
120
121
122
123
124
125
126
127

128

129
130
131
132

C=sorted(C)Eredmeny=matrix(len(C),1)
for j in [0..len(C)-1]:
for i in [0..BL1617.nrows()-59]:
if C[j][3]==1:
win=WHelif C[j][3]==2:
win=WAelse:
win=0
if C[j][1]==BL1617[i][0] andãÑ
BL1617[i][2]==1 andãÑBL1617[i][1]==C[j][2]:point=win+((BL1617[i][4]-BL1617[i+1][4]).abs())*RG+ãÑ((BL1617[i][5]-BL1617[i+1][5]).abs())*KG+
ãÑ((BL1617[i][6]-BL1617[i+1][6]).abs())*KL+ãÑ((BL1617[i][7]-BL1617[i+1][7]).abs())*KTL+ãÑ((BL1617[i][8]-BL1617[i+1][8]).abs())*CO+ãÑ(floor((BL1617[i][9]-BL1617[i+1][9]).abs()*PASS))+ãÑ((((BL1617[i][10]-50)ãÑ
(BL1617[i+1][10]-50)).abs())*POSS)+ãÑ(((BL1617[i][11]-BL1617[i+1][11]).abs())*SZAB)+
ãÑ(((BL1617[i][12]-BL1617[i+1][12]).abs())*YC)+
ãÑ(((BL1617[i][13]-BL1617[i+1][13]).abs())*RC)ãÑ
Eredmeny[j,0]=point
point=0win=0return Eredmeny

133
134
135
136

M=Xmatrix(csoportszam).transpose()*Xmatrix(csoportszam)
p=Xmatrix(csoportszam).transpose()*Bvector(csoportszam)
r1=M.solve_right(p)

137
138

html("<h2 align=center>$Xr=y$ és $Mr=p$ãÑmeghatározása</h2>")

31

139

140
141

html('$$X=%s,y=%s, M=%s, p=%s,ãÑ
r_1=%s$$'%(latex(Xmatrix(csoportszam)),latex(Bvector(csoportszam))ãÑ,latex(M),latex(p),latex(r1)))
D=matrix(M.ncols(),M.ncols())
A=matrix(M.ncols(),M.ncols())

142
143
144
145
146
147
148
149
150
151
152

153
154
155
156
157
158
159
160
161
162

for i in [0..M.ncols()-1]:
for j in [0..M.ncols()-1]:if(i==j):
D[i,j]=M[i,j]else:
A[i,j]=M[i,j]*-1
html("<h2 align=center>$M=D-A$ meghatározása</h2>")html('$$D=%s, A=%s$$'%(latex(D),latex(A)))
r2=D.inverse()*(A*r1+p)#r_2==r_1
html("<h2 align=center>$r_2ˆ{(1)}$ és $r_2ˆ{(2)}$ãÑmeghatározása </h2>")
r21=vector(QQ,M.ncols())
r22=vector(QQ,M.ncols())
for i in [0..M.ncols()-1]:
asd=0
for j in [0..A.ncols()-1]:
asd+=(A[i,j]*r1[j])asd=asd[0]r21[i]=asd/D[i,i]r22[i]=(p[i,0]/D[i,i])
html('$$r_2ˆ{(1)}=%s,ãÑ
r_2ˆ{(2)}=%s$$'%(latex(r21),latex(r22)))32

Futási kép (az alapbeállı́tások mellett):

33

Futási kép a 8.csoportban úgy, hogy a szabálytalanságokért, illetve sárgaés piros lapokért járó szorzót kihangsúlyozzuk

34

A szezonális Massey-módszer:
A programkód:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

16

def matches(groupcode):A=[]eredmeny=[]
ellenfel=''for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
A.append([Codes[i][0],Codes[i][1]])for i in [0..3]:for j in [0..BL1617.nrows()-59]:
if A[i][1]==BL1617[j][0]:for k in [0..3]:
if BL1617[j][1]==A[k][1]:ellenfel=A[k][0]if BL1617[j][2]==1:
eredmeny.append([A[i][0],BL1617[j][4],ãÑBL1617[j][5],ellenfel])
return eredmeny

17
18
19
20
21
22
23
24
25
26
27
28
29

def matches_by_days(groupcode):A=[]
tmp=[]
eredmeny=[]
day=1
for i in [0..len(Codes)-1]:
if Codes[i][2]==groupcode:
A.append(Codes[i][1])for i in [0..len(A)-1]:
for j in [0..BL1617.nrows()-59]:
if A[i]==BL1617[j][0]:tmp.append([j,A[i],BL1617[j][3],BL1617[j][4],ãÑBL1617[j][5],BL1617[j][6],BL1617[j][7],BL1617[j][8],ãÑBL1617[j][9],BL1617[j][10],BL1617[j][11],ãÑBL1617[j][12],BL1617[j][13]])
35

30
31

tmp=sorted(tmp)
for i in [0..len(tmp)-1,step=4]:

32
ãÑ
ãÑ
ãÑ
ãÑ
ãÑ

eredmeny.append([day,tmp[i][1],tmp[i+1][1],tmp[i][2],tmp[i][3],[i][4],tmp[i][5],tmp[i+1][5],tmp[i][6],tmp[i+1][6],tmp[i][7],tmp[i+1][7],tmp[i][8],tmp[i+1][8],tmp[i][9],tmp[i+1][9],tmp[i][10],tmp[i+1][10],tmp[i][11],tmp[i+1][11],tmp[i][12],tmp[i+1][12]])33

eredmeny.append([day,tmp[i+2][1],tmp[i+3][1],tmp[i+2][2],tmp[i+2][3],tmp[i+2][4],tmp[i+2][5],tmp[i+3][5],ãÑtmp[i+2][6],tmp[i+3][6],tmp[i+2][7],tmp[i+3][7],ãÑ
tmp[i+2][8],tmp[i+3][8],tmp[i+2][9],tmp[i+3][9],ãÑ
tmp[i+2][10],tmp[i+3][10],tmp[i+2][11],ãÑ
tmp[i+3][11],tmp[i+2][12],tmp[i+3][12]])ãÑ
day+=1
return eredmeny
ãÑ

34
35
36
37
38
39
40
41
42
43
44
45

def opponents(teamcode,day):groupcode=0
eredmeny=[]
for i in [0..len(Codes)-1]:
if teamcode==Codes[i][1]:groupcode=Codes[i][2]for i in [0..len(matches_by_days(groupcode))-1]:
if (matches_by_days(groupcode)[i][1]==teamcode):
if (matches_by_days(groupcode)[i][0]<=day):46

eredmeny.append(matches_by_days(groupcode)[i][2])if (matches_by_days(groupcode)[i][2]==teamcode):
if (matches_by_days(groupcode)[i][0]<=day):
ãÑ

47
48
49

ãÑ
50

return eredmenyeredmeny.append(matches_by_days(groupcode)[i][1])

51
52
53

def turn_results(groupcode):
table=[['1.forduló','2.forduló','3.forduló',ãÑ'4.forduló','5.forduló','6.forduló'] ,[],[]]
36

54
55

56

57
58
59
60
61
62
63
64
65
66

67

68

for k in [0..len(matches_by_days(groupcode))-1,step=2]:
table[1].append([matches_by_days(groupcode)[k][1],ãÑmatches_by_days(groupcode)[k][2]])table[2].append([matches_by_days(groupcode)[k+1][1],ãÑmatches_by_days(groupcode)[k+1][2]])for i in [1..len(table)-1]:
for j in [0..len(table[i])-1]:
for k in [0..len(table[i][j])-1]:
for l in [0..len(Codes)-1]:
if table[i][j][k]==Codes[l][1]:table[i][j][k]=Codes[l][0]for i in [1..len(table)-1]:
for j in [0..len(table[i])-1]:
for l in [0..len(matches(groupcode))-1]:
if table[i][j][0]==matches(groupcode)[l][0] andãÑ
table[i][j][1]==matches(groupcode)[l][3]:table[i][j]=matches(groupcode)[l][0]+ ''+matches(groupcode)[l][1].str()+ãÑ'-'+matches(groupcode)[l][2].str()+ 'ãÑ'+matches(groupcode)[l][3]ãÑ
return table

69
70
71
72

73

74

html("<h1 align=center>Szezonális Massey-módszer</h1>")@interact
def massey(csoportszam=selector(label='CsoportokãÑszáma:',buttons=True, nrows=1, values=[1..8], default=1)):
html("<h2ãÑalign=center>%s</h2>"%html.table(turn_results(csoportszam)))@interact(layout=[['WH','WA'],['TIE','RG'],['KL','KTL'],ãÑ['CO','PASS'],['POSS','SZAB'],['YC','RC']])

37

75

def sliders( RG=slider(0,100,5,75, label='Rúgott Gól'),
KL=slider(0,30,1,10, label='Kapuralövés'),ãÑ
KTL=slider(0,50,1,20, label='Kaput találó lövés'),ãÑ
CO=slider(0,30,1,15, label='Szöglet'),ãÑ
PASS=slider(0,0.5.n(digits=3),.01,0.2, label='Passz'),ãÑãÑ
POSS=slider(0,10.n(digits=3),0.5,1,label='Labdabirtoklás'),
SZAB=slider(-10,0.n(digits=3),0.5,-3,ãÑlabel='Szabálytalanság'),ãÑ
YC=slider(-50,0,1,-15,label='Sárga Lap'),ãÑ
RC=slider(-100,0,5,-40,label='Piros Lap'),ãÑ
WH=slider(0,300,5,100,label='Otthoni siker'),ãÑ
WA=slider(0,300,5,150,label='Idegenbeli siker'),ãÑ
TIE=slider(0,100,5,50, label='Döntetlen')):
ãÑ

76
77
78
79
80
81
82
83
84
85
86

def point_difference(teamcode,day):groupcode=0
opponent=0
win=0
for i in [0..len(Codes)-1]:
if teamcode==Codes[i][1]:groupcode=Codes[i][2]for i in [0..len(matches_by_days(groupcode))-1]:
if teamcode==matches_by_days(groupcode)[i][1]:if matches_by_days(groupcode)[i][0]==day:

87
ãÑ
88

89

opponent=matches_by_days(groupcode)[i][2]elifãÑ
teamcode==matches_by_days(groupcode)[i][2]:if matches_by_days(groupcode)[i][0]==day:90

opponent=matches_by_days(groupcode)[i][1]for i in [0..len(matches_by_days(groupcode))-1]:ifãÑ(matches_by_days(groupcode)[i][1]==teamcode):
ãÑ

91
92

93
ãÑ
94

if(matches_by_days(groupcode)[i][2]==opponent):ifãÑ(matches_by_days(groupcode)[i][0]==day):
38

if

95

matches_by_days(groupcode)[i][3]==1:
win=WHelifãÑmatches_by_days(groupcode)[i][3]==3:
win=TIE
returnwin+(matches_by_days(groupcode)[i][4]ãÑ
matches_by_days(groupcode)[i][5])*RG+
ãÑ(matches_by_days(groupcode)[i][6]ãÑ
matches_by_days(groupcode)[i][7])*KL+ãÑ(matches_by_days(groupcode)[i][8]ãÑ
matches_by_days(groupcode)[i][9])*KTL+ãÑ(matches_by_days(groupcode)[i][10]ãÑ
matches_by_days(groupcode)[i][11])*CO+ãÑ(matches_by_days(groupcode)[i][12]ãÑ
matches_by_days(groupcode)[i][13])*PASS+ãÑ(matches_by_days(groupcode)[i][14]ãÑ
matches_by_days(groupcode)[i][15])*POSS+ãÑ(matches_by_days(groupcode)[i][16]ãÑ
matches_by_days(groupcode)[i][17])*SZAB+
ãÑ(matches_by_days(groupcode)[i][18]ãÑ
ãÑmatches_by_days(groupcode)[i][19])*YC+(matches_by_days(groupcode)[i][20]ãÑ
matches_by_days(groupcode)[i][21])*RC
ãÑ
ãÑ

96
97

98
99

100

elif
ãÑ
(matches_by_days(groupcode)[i][2]==teamcode):

101
ãÑ
102

103

104
105

106

if(matches_by_days(groupcode)[i][1]==opponent):ifãÑ(matches_by_days(groupcode)[i][0]==day):ifãÑmatches_by_days(groupcode)[i][3]==2:
win=WAelif
ãÑmatches_by_days(groupcode)[i][3]==3:
win=TIE
39

107

returnwin+(matches_by_days(groupcode)[i][5]ãÑ
matches_by_days(groupcode)[i][4])*RG+
ãÑ(matches_by_days(groupcode)[i][7]ãÑ
matches_by_days(groupcode)[i][6])*KL+ãÑ(matches_by_days(groupcode)[i][9]ãÑ
matches_by_days(groupcode)[i][8])*KTL+ãÑ(matches_by_days(groupcode)[i][11]ãÑ
matches_by_days(groupcode)[i][10])*CO+ãÑ(matches_by_days(groupcode)[i][13]ãÑ
matches_by_days(groupcode)[i][12])*PASS+ãÑãÑ(matches_by_days(groupcode)[i][15]matches_by_days(groupcode)[i][14])*POSS+ãÑ(matches_by_days(groupcode)[i][17]ãÑ
matches_by_days(groupcode)[i][16])*SZAB+
ãÑ(matches_by_days(groupcode)[i][19]ãÑ
matches_by_days(groupcode)[i][18])*YC+
ãÑ(matches_by_days(groupcode)[i][21]ãÑ
matches_by_days(groupcode)[i][20])*RC
ãÑ

108
109
110
111
112
113
114
115
116
117
118

119

120

def total_earned_point(teamcode,day):
opponent=0
groupcode=0
if day==0:
return 0
else:
for i in [0..len(Codes)-1]:
if teamcode==Codes[i][1]:groupcode=Codes[i][2]for i inãÑ
[0..len(matches_by_days(groupcode))-1]:ifãÑteamcode==matches_by_days(groupcode)[i][1]:ifãÑmatches_by_days(groupcode)[i][0]==day:121
ãÑ

opponent=matches_by_days(groupcode)[i][2]
40

122

123

elif
ãÑ
teamcode==matches_by_days(groupcode)[i][2]:ifãÑmatches_by_days(groupcode)[i][0]==day:

124

opponent=matches_by_days(groupcode)[i][1]return (1/day)*(point_difference(teamcode,day)+ãÑ
total_earned_point(opponent,day-1))
ãÑ

125

126
127
128
129
130
131

def szumpoints(teamcode,day):eredmeny=0
for i in [1..day]:eredmeny+=total_earned_point(teamcode,i)return eredmeny

132
133
134

135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

150

def table(groupcode):
table=[['','1.forduló','2.forduló','3.forduló','4.forduló','5.forduló','6.forduló'],ãÑ[matches(groupcode)[0][0]],[matches(groupcode)[0][3]],ãÑ[matches(groupcode)[1][3]],[matches(groupcode)[2][3]]]ãÑ
teams=[]
teams.append(matches_by_days(groupcode)[0][1])teams.append(matches_by_days(groupcode)[0][2])teams.append(matches_by_days(groupcode)[1][1])teams.append(matches_by_days(groupcode)[1][2])M=matrix(QQ,4,6)
for i in [0..M.nrows()-1]:
for j in [0..M.ncols()-1]:
M[i,j]=szumpoints(teams[i],j+1)
M=M.n(digits=4)
for i in [1..4]:for j in [1..6]:
table[i].append(M[i-1,j-1])
return tablehtml("<h2ãÑalign=center>%s</h2>"%html.table(table(csoportszam)))html("Ahol az értékek az addigi fordulóig elértãÑértékelések")
41

151

152
153

html("<h2 align=center>Csapatokra osztott szezonálisãÑ
Massey-módszer</h2>")@interact
def group_temp_massey(teamname=selector(['Basel','Ludogorets','PSG','Arsenal',ãÑ'Dinamo Kijev','Benfica','Besiktas',ãÑ'Napoli','Machester City','Monchengladbach','Celtic',
ãÑ'Barcelona','Bayern Munchen','FK Rosztov',
ãÑ'PSV Eindhoven','Atletico Madrid','Bayer Leverkusen',ãÑ'CSZKA Moszkva','Tottenham','Monaco','Legia Warszawa',
ãÑ'Borussia Dortmund','Real Madrid','Sporting CP',ãÑ'Club Brugge','Leicester','FC Porto','FC Kobenhavn',
ãÑ'Juventus','Dinamo Zagreb','Sevilla','Lyon'],ãÑ
width=25,ncols=4,nrows=8,label='csapatnevek:',default='PSVãÑEindhoven')):
ãÑ

154
155
156
157
158
159
160
161
162

163
164
165

def teammatches(teamname):
eredmeny=[]
teamcode=0
for i in [0..len(Codes)-1]:
if Codes[i][0]==teamname:teamcode=Codes[i][1]for i in [0..BL1617.nrows()-1,step=2]:
if teamcode==BL1617[i][0] orãÑteamcode==BL1617[i][1]:eredmeny.append([BL1617[i],BL1617[i+1]])
return eredmeny@interact(layout=[['WH','WA'],['TIE','RG'],['KL','KTL'],ãÑ['CO','PASS'],['POSS','SZAB'],['YC','RC']])

42

166

def sliders( RG=slider(0,100,5,75, label='Rúgott Gól'),
KL=slider(0,30,1,10, label='Kapuralövés'),ãÑ
KTL=slider(0,50,1,20, label='Kaput találó lövés'),ãÑ
CO=slider(0,30,1,15, label='Szöglet'),ãÑ
PASS=slider(0,0.5.n(digits=3),.01,0.2, label='Passz'),ãÑãÑ
POSS=slider(0,10.n(digits=3),0.5,1,label='Labdabirtoklás'),
SZAB=slider(-10,0.n(digits=3),0.5,-3,label='Szabálytalanság'),ãÑ
YC=slider(-50,0,1,-15,label='Sárga Lap'),ãÑ
RC=slider(-100,0,5,-40,label='Piros Lap'),ãÑ
WH=slider(0,300,5,100,label='Otthoni siker'),ãÑ
WA=slider(0,300,5,150,label='Idegenbeli siker'),ãÑ
TIE=slider(0,100,5,50,label='Döntetlen')):
ãÑ

167
168
169
170
171
172
173
174
175

176
177
178
179

def teampoint(teamname,day):eredmeny=0
teamcode=0
win=0
for i in [0..len(Codes)-1]:
if Codes[i][0]==teamname:teamcode=Codes[i][1]
if (teammatches(teamname)[day-1][0][2]==1 andãÑ
teamcode==teammatches(teamname)[day-1][0][0]):if teammatches(teamname)[day-1][0][3]==1:
win=WHelif teammatches(teamname)[day-1][0][3]==3:
win=TIE

43

180

181

182
183
184
185

eredmeny=win+(teammatches(teamname)[day-1][0][4]ãÑ
teammatches(teamname)[day-1][1][4])*RG+
ãÑ(teammatches(teamname)[day-1][0][6]ãÑ
teammatches(teamname)[day-1][1][6])*KL+ãÑ(teammatches(teamname)[day-1][0][7]ãÑ
teammatches(teamname)[day-1][1][7])*KTL+ãÑ(teammatches(teamname)[day-1][0][8]ãÑ
teammatches(teamname)[day-1][1][8])*CO+ãÑ(teammatches(teamname)[day-1][0][9]ãÑ
teammatches(teamname)[day-1][1][9])*PASS+ãÑãÑ(teammatches(teamname)[day-1][0][10]teammatches(teamname)[day-1][1][10])*POSS+ãÑ(teammatches(teamname)[day-1][0][11]ãÑ
teammatches(teamname)[day-1][1][11])*SZAB+ãÑ(teammatches(teamname)[day-1][0][12]ãÑ
teammatches(teamname)[day-1][1][12])*YC+
ãÑ(teammatches(teamname)[day-1][0][13]ãÑ
teammatches(teamname)[day-1][1][13])*RCãÑelif (teammatches(teamname)[day-1][1][2]==2 andãÑteamcode==teammatches(teamname)[day-1][1][0]):if teammatches(teamname)[day-1][0][3]==1:
win=WAelif teammatches(teamname)[day-1][0][3]==3:
win=TIE

44

186

187

eredmeny=win+(teammatches(teamname)[day-1][1][4]ãÑ
teammatches(teamname)[day-1][0][4])*RG+
ãÑ(teammatches(teamname)[day-1][1][6]ãÑ
teammatches(teamname)[day-1][0][6])*KL+ãÑ(teammatches(teamname)[day-1][1][7]ãÑ
teammatches(teamname)[day-1][0][7])*KTL+ãÑ(teammatches(teamname)[day-1][1][8]ãÑ
teammatches(teamname)[day-1][0][8])*CO+ãÑ(teammatches(teamname)[day-1][1][9]ãÑ
teammatches(teamname)[day-1][0][9])*PASS+ãÑãÑ(teammatches(teamname)[day-1][1][10]teammatches(teamname)[day-1][0][10])*POSS+ãÑ(teammatches(teamname)[day-1][1][11]ãÑ
teammatches(teamname)[day-1][0][11])*SZAB+ãÑ(teammatches(teamname)[day-1][1][12]ãÑ
teammatches(teamname)[day-1][0][12])*YC+
ãÑ(teammatches(teamname)[day-1][1][13]ãÑ
teammatches(teamname)[day-1][0][13])*RCãÑ
return eredmeny

188
189
190
191
192
193
194
195
196
197
198
199
200

def total_team_point(teamname,day):teamcode=0
opponentcode=0
opponentname=''if day==0 :return 0
else:
for i in [0..len(Codes)-1]:
if Codes[i][0]==teamname:teamcode=Codes[i][1]for i in [0..len(teammatches(teamname))-1]:ifãÑteamcode==teammatches(teamname)[i][0][0]:

201
ãÑ
202

opponentcode=teammatches(teamname)[i][0][1]elifãÑ
teamcode==teammatches(teamname)[i][0][1]:
45

203

204
205
206
207

ãÑ
opponentcode=teammatches(teamname)[i][0][0]for i in [0..len(Codes)-1]:
if opponentcode==Codes[i][1]:opponentname=Codes[i][0]return (1/day)*(teampoint(teamname,day)+ãÑ
total_team_point(opponentname,day-1))

208
209
210
211
212
213

def szumteampoint(teamname,day):eredmeny=0
for i in [1..day]:eredmeny+=total_team_point(teamname,i)return eredmeny

214
215
216
217
218
219
220
221
222
223

def teamopponents(teamname):
opponentcode=[]result=[]teamcode=0
for i in [0..len(Codes)-1]:
if Codes[i][0]==teamname:teamcode=Codes[i][1]for i in [0..len(teammatches(teamname))-1]:ifãÑteamcode==teammatches(teamname)[i][0][0]:

224
ãÑ
225

opponentcode.append(teammatches(teamname)[i][0][1])elifãÑteamcode==teammatches(teamname)[i][0][1]:

226

227
228
229

ãÑ
opponentcode.append(teammatches(teamname)[i][0][0])for i in [0..len(opponentcode)-1]:
for j in [0..len(Codes)-1]:
if opponentcode[i]==Codes[j][1]:

230
ãÑ
231

return result

result.append([opponentcode[i],Codes[j][0]])

232
233

def teamtable(teamname):
46

234
235

236
237
238

table=[[],[],[],[]]
fordulok=['1.forduló','2.forduló','3.forduló','4.forduló','5.forduló','6.forduló', 'Legjobb
ãÑtizenhat 1.meccs','Legjobb tizenhatãÑ
2.meccs','Legjobb nyolc 1.meccs', 'Legjobb
ãÑnyolc 2.meccs', 'Legjobb négy 1. meccs',
ãÑ'Legjobb négy 2.meccs','Finálé']ãÑ
for i in [0..len(teammatches(teamname))-1]:
table[0].append(fordulok[i])for i in [0..len(teammatches(teamname))-1]:239

table[1].append([teammatches(teamname)[i][0][0],teammatches(teamname)[i][0][1],teammatches(teamname)[i][0][4],ãÑteammatches(teamname)[i][0][5]])ãÑ
for i in [0..len(table[1])-1]:
for j in [0..1]:for k in [0..len(Codes)-1]:
if table[1][i][j]==Codes[k][1]:table[1][i][j]=Codes[k][0]for i in [0..len(table[1])-1]:
table[1][i]=table[1][i][0]+' '+ãÑtable[1][i][2].str()+'-'+
ãÑtable[1][i][3].str()+' '+table[1][i][1]for i in [1..len(teamopponents(teamname))]:table[2].append('Összontszáma:ãÑ'+szumteampoint(teamname,i).str())
for i in [1..len(teamopponents(teamname))]:table[3].append('Forduló pontszáma:ãÑ'+total_team_point(teamname,i).str())
return tablehtml("<h2ãÑalign=center>%s</h2>"%html.table(teamtable(teamname)))
ãÑ
ãÑ

240
241
242
243
244
245
246

247
248

249
250

251
252

47

Futási kép az 1.csoporttal, illetve az Arsenal eredményeivel:

48

49

Ezenkı́vül pedig ha a 4.csoport, illetve a PSV Eindhoven eredményei:

50

51

4. Keener-módszer
James P. Keener 1993-ban[3] publikálta a rangsorolási módszerét. Az alapötletet az akkori egyetemi futball bajnokság ihlette, amikor a rivális egyetem
nyert, mert ők voltak az egyedüli csapat, akiket nem győztek le. A kérdés,amely megfogalmazódott magában, hogy biztos az a csapat nyerte meg a bajnokságot, amelyik a legjobb volt? Amit megpróbált matematikai módszerekkel
bebizonyı́tani, hogy különböző értékelési formák segı́tségével milyen rangsorolást eredményeztek a csapatok. A metódusok alapja a Perron-Frobeniustétel, amely segı́tségével végül négy különböző rangsorolási algoritmust sikerült publikálnia. Az első egy direkt módszer, mely a Perron-Frobeniustételt direktben használja és ı́gy alkot konklúziót. A második már figyelembe veszi, hogy a különböző erősségű csapatok mikor játszottak egymásellen. A harmadik és a negyedik pedig a meccsek végkimenetelét próbálja
megtippelni, itt már indirekt módon használjuk a Perron-Frobenius tételt.

4.1. Az alapötlet
Első körben minden esetben kell egy r vektor, amely a csapatok erősségét
reprezentálja. Legyen
Wi
Wi
“
,
ri “
Wi ` LiNiahol Wi a győzelmek számát, Li a vereségek számát és Ni pedig a lejátszott
meccsek számát jelenti. Ez nem teljesen adja vissza a valós rangsort, mivel adöntetlenek esetén nem értékel. Viszont vegyünk egy S mátrixot, amely az
alábbi módon legyen értelmezve:#
i csapat összpontszáma j csapat ellen ha játszottak
Si,j “0ha nem játszottak, vagy i “ jLegyen egy Q mátrix, amely a különböző módszerek esetén máshogy vanlegenerálva és legyenr “ Ar0 ,ahol r0 “ 1.

52Ezt erősı́tsük meg azzal, hogy az A mátrixot még n-nel hatványozzuk, és úgyszorozzuk meg r0 -lal, illetve osszuk el a normájával, azaz
r“

An r0
k An r0 k

Már csak az a kérdés, hogy mi van akkor, ha n Ñ 8. A Peron-Frobeniustétel viszont erre ad választ.
4.1. Tétel (Perron-Frobenius). Legyen egy (nemtriviális) A mátrix, úgy,
hogy @Ai,j ě 0. Ekkor létezik egy olyan r sajátvektor, amelynek elemei
nemnegatı́vak, és egy hozzátartozó pozitı́v λ sajátérték. Ezenkı́vül, ha A
irreducibilis, akkor r elemei szigorúan pozitı́vak és r egyértelmű, az r-hez
tartozó λ sajátérték a legnagyobb abszolút értékű és algebrai multiplicitása
1.

4.2. A direkt módszer
Ez a módszer a legegyszerűbb. A csapatok értékelését az egymás ellen elértértékeik segı́tségével határozzuk meg megszorozva a rangjukkal. Legyen r
azon vektor, mely tartalmazza a csapatok erősségét, ni jelentse az i. csapatáltal játszott meccsek számát, N a csapatok számát, illetve legyen ai,j acsapatok értékelését. Ekkor legyen az értékelés a következő:
si “

N
1 ÿ
ai,j rj .
ni j“1

Ha viszont si “ λri , akkor az alábbi egyenlőséget kapjuk:
Ar “ λrÍgy a Perron-Frobenius tétel szerint, ha A irreducibilis és az elemei nemnegatı́vak, akkor létezik pozitı́v értékű r.
Elsőnek definiáljuk A mátrixot. Ezt többféle módszerrel is meg tudjuk tenni.
A legegyszerűbb a következő:$
ha i. csapat legyőzte j. csapatot’&1
Ai,j “ 1/2 ha i. csapat döntetlent ért el j. csapat ellen’%0
ha i. csapat vereséget szenvedett j. csapat ellen53Viszont ez a fajta mátrix nem adná vissza a csapatok teljesı́tményét, illetveazon csapatok, amelyek több győzelmet szereztek gyengébb csapatok ellen,mı́g a rangadókat elvesztették, azok több pontot kapnának, mint azok, akik
a rangadókat nyerték meg, de a gyengébb csapatok ellen botlanának meg.
Így célszerűbb egy másik megoldást választani, amely nem csak a győzelmekszáma alapján értékel, ezenkı́vül a függvény korlátos is lenne, például r0, 1sközött lenne. Ehhez elsőnek készı́tsük el S-t, amelynek Si,j legyen az i. csapat
j. csapat elleni statisztikái. Ezután legyen A az alábbi módon definiálva:
Ai,j “

Si,j
Si,j ` Sj,iEz viszont azért nem a legideálisabb, ha egy olyan statisztikánk van, amely
kevés adattal rendelkezik, akkor nagyon nem releváns értéket fog mutatni. Például, ha csak a gólok számát vesszük, akkor egy 6-0-val végződőmérkőzésen ugyanannyi pont jár a győztes csapatnak, mint egy 1-0-val végződőn.
Ezenkı́vül ha ez lenne az alapja a csapatok rangsorolásának, akkor az erősebb
csapatok a gyengébbek elleni meccsre fókuszálnának, hogy ott minél több
pontot szeretve nyerjék meg a bajnokságot. Mivel a BL nem az meccsenelért teljesı́tményből vonatkoztat a bajnokra, illetve több, különféle adattal
rendelkezünk, ı́gy érdemesebb egy nem lineáris függvényt használni. Erre alegjobb a következő¸˜Si,j ` 1
ai,j “ hSi,j ` Sj,i ` 2
hpxq “

1 1
1 a` sgnpx ´ q |2x ´ 1|
2 2
2

54

A hpxq függvény (folytonos vonal) összehasonlı́tva az f pxq “ x függvénnyel (szaggatott vonal).

Azon csapatok, amelyek nem játszottak egymás ellen, 12 pontot szereztek,afüggvény értékkészlete még mindig r0, 1s között van, illetve egy nagyobb
győzelem esetén a győztes nem húzz el a többiektől. Miután megvan az A
mátrix, meg kell határozni egy sajátvektorát. A Sage direktben tud számolni
sajátvektort, de egy 32 ˆ 32-es mátrixban memóriaigényes, és emiatt, haegyáltalán ki tudja számolni, pontatlan értéket ad vissza, ı́gy érdemesebb egy
iterációs módszert használni. Ezt az iterációt fogalmaztam meg az alapötletben. Vegyünk egy nemnegatı́v kezdővektor, legyen ez r0 . Ezt szorozzuk bebalról A-val, illetve vegyük ennek a normáját, azaz
Ar0,
k Ar0 kEzt tegyük meg n-szer, és kapunk egy jól közelı́tett pozitı́v sajátvektort,
illetve ha
An r0
“ r.
lim
nÑ8 k An r k0Mivel az iteráció csak egy jól közelı́tett becslést ad a sajátvektornak, ı́gy egy
bizonyos hibahatárt eltekintve vehetjük ezt a sajátvektornak. Mivel az n tarta végtelenbe, ez megint vagy végtelen ciklushoz, vagy memóriatúlcsorduláshoz
vezethet, ı́gy az iteráció befejeződik, ha nem történik értékmódosı́tás. Ha
55

megvan a sajátvektor, abból az elején megadott si -vel pedig meg is kapjuk
az értékelést.

4.3. A nemlineáris módszer
Ez a módszer leginkább a szezonális Massey-módszerre hasonlı́t. Az alapötlet
e mögött is az, hogy számı́t-e az, hogy egy csapat egy erősebb vagy egy
gyengébb ellen érte el a győzelmet, illetve ha vesztett, akkor is milyen meccsvégi
statisztikát tud felmutatni. Eredetileg az amerikai bajnokságokban használták,ahol nem minden csapat játszott minden csapat ellen. Ott a tabella állásátbefolyásolta a meccsen elért fontosabb statisztikai adatok, mint a meccs
végén szerzett gólok/pontok. Így az edzők jobban készültek azon meccsekre,ahol egy gyengébb csapat ellen játszhatnak, és a rangadókra pedig kevésbé.
Mivel ez az algoritmus az értékelésnél számı́tásba veszi, hogy ki ellen nyert,ı́gy az edzők nem vehették félvállról a rangadókat sem, viszont a kisebb csapat elleni meccseket sem, mivel egy ellenük elszenvedett vereség sok pontot
le tudna vonni tőlük.
Az alapötlet az, hogy számoljuk ki a csapatok erősségét az alábbi módon:N
1 ÿ
f pei,j rj q.
ri “
ni j“1

Ahol az ei,j a meccsek végkimenetelei, amelyet i. csapat játszott j. ellen, rj
a j csapat erőssége, ni pedig az i. csapat meccseinek a számát, illetve N azösszes csapat számát jelöli.
Elsőként értelmezzük az E mátrixot az alábbi módon:
2{3ei,j “5 ` Si,j ` Si,j2{35 ` Sj,i ` Si,j56

Értelmezzük az ei,j pSi,j , Sj,i q-t, mint egy függvényt, és helyettesı́tsük be a 0 (zöld), 50 (kék),100(narancssárga), 150 (fekete), 200 (citromsárga), illetve 300 (lila) értékeket Sj,i helyére, ései,i px, xq “ 1 függvény (szaggatott vonal)

Az előnye ennek a választásnak a következő: ha valamelyik csapat nagy
előnnyel nyer, akkor az az E mátrixban meg fog mutatkozni, de nem annyiraszámottevő módon, hogy a kisebb csapatok ne tudják utolérni. Ez annyit
tesz, hogy a mátrix minden eleme pozitı́v, ha nem játszott két csapat egymásellen, akkor azon értékek nullák, illetve korlátosak az értékek, és a maximumérték pedig 8,45. Ezután vegyünk egy olyan f függvényt, amely pozitı́v,
növekvő és konkáv r0, 8r között. Legyen ez a
0.05x ` x2
f pxq “2 ` 0.05x ` x2
függvény.

57

Az f pxq függvény.

Ez alapján már minden adatunk meglenne az ri elkészı́téséhez, de még kellrj , amit nem ismerünk. Emiatt ı́rjuk fel az r vektort egy függvényként:
Fi prq “N
1 ÿ
f pei,j rj q.
ni j“1

Ez a függvény is pozitı́v, növekvő és konkáv, ı́gy megadható egy alábbi
iteráció: rk “ F prk´1 q, r0 “ 1 és ez a monoton csökkenő sorozat, amelylimnÑ8 rn “ r. Ezenkı́vül pedig F prq “ r. Ezt az iteráció pedig létezik ésvéges a Perron-Frobenius tétel szerint.

58

4.4. Program és programkód
A programkód:1

html("<h1 align=center>Keener-módszer</h1>")

2
3
4
5
6
7

8

9

10
11
12
13
14
15
16
17
18

S=matrix(RR,32,32)
for k in [0..BL1617.nrows()-1]:
for i in [0..S.nrows()-1]:
for j in [0..S.ncols()-1]:
if i+1==BL1617[k][0] and j+1==BL1617[k][1] andãÑ
BL1617[k][2]==1:
S[i,j]=S[i,j]+BL1617[k][4]+BL1617[k][6]+BL1617[k][7]+BL1617[k][8]+BL1617[k][9]+ãÑBL1617[k][10]+BL1617[k][11]+ãÑBL1617[k][12]+BL1617[k][13]ãÑS[j,i]=S[j,i]+BL1617[k+1][4]+BL1617[k+1][6]+BL1617[k+1][7]+BL1617[k+1][8]+BL1617[k+1][9]+ãÑBL1617[k+1][10]+BL1617[k+1][11]+ãÑBL1617[k+1][12]+BL1617[k+1][13]ãÑA=matrix(RR,32,32)
for i in [0..S.nrows()-1]:
for j in [0..S.ncols()-1]:x=(S[i,j])/(S[i,j]+S[j,i]+1)
A[i,j]=((1/2)+(1/2)*(sgn(x-(1/2)))*sqrt((2*x-1).abs()))
AA=matrix(RR,32,32)
for i in [0..S.nrows()-1]:
for j in [0..S.ncols()-1]:x=(S[i,j]+1)/(S[i,j]+S[j,i]+2)19
ãÑ

AA[i,j]=((1/2)+(1/2)*(sgn(x-(1/2)))*sqrt((2*x-1).abs()))

20
21
22
23
24
25

def PFiter1(m):a = random()
V = vector([a, 1-a] + [0 for i in range(len(m[0])-2)])
while True:
W = m*V
59

26
27
28
29
30

W = W/sum(W)if V == W: #or s>100:
return V
else:
V = W

31
32
33
34
35
36
37
38
39
40
41

n=[]
counter=0
for i in [0..S.nrows()-1]:
for j in [0..S.ncols()-1]:
if S[i,j]>0:
counter+=2
n.append(counter)counter=0n[4]-=1n[14]-=1

42
43
44
45
46
47

48

html("<h3 align=center>1.módszer: A direkt eljárás</h3>")
pf1=PFiter1(A)print
r=[(k/pf1[0]).n(digits=3) for k in pf1]
html('Az direkt iteráció megoldása, amely aãÑ$h((S_{i,j})/(S_{i,j}+S_{j,i}+1))$ módon lett definiálva:ãÑ')
print r

49
50
51
52
53

54

pf1A=PFiter1(AA)print
rA=[(k/pf1A[0]).n(digits=3) for k in pf1A]
html('Az direkt iteráció megoldása, amely aãÑ$h((S_{i,j}+1)/(S_{i,j}+S_{j,i}+2))$ módon lett definiálva:ãÑ')
print rA

55
56
57
58
59

for i in [0..len(r)-1]:r[i]=[r[i],i+1]
r=sorted(r,reverse=1)
for i in [0..len(r)-1]:60

60r[i]=[r[i][0],r[i][1],i+1]

61
62
63
64
65
66

for i in [0..len(rA)-1]:
rA[i]=[rA[i],i+1]
rA=sorted(rA,reverse=1)
for i in [0..len(rA)-1]:
rA[i]=[rA[i][0],rA[i][1],i+1]

67
68
69
70
71

E=matrix(RR,32,32)
for i in [0..E.nrows()-1]:
for j in [0..E.ncols()-1]:
E[i,j]=(5+S[i,j]+(S[i,j]ˆ(2/3)))/ãÑ(5+S[j,i]+(S[i,j]ˆ(2/3)))

72
73
74

def f(u):return (0.05*u+uˆ2)/(2+0.05*u+uˆ2)

75
76

F=matrix(RR,32,32,lambda i, j:f((5+S[i,j]+ãÑ(S[i,j]ˆ(2/3)))/(5+S[j,i]+(S[i,j]ˆ(2/3)))))

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

def PFiter2(m):a = random()
V = vector([a,1-a] + [0 for i in range(len(m[0])-2)])
W=[1.00000000000 for i in F]
s=0
while True:
W=m*V
W=W/sum(W)if V == W or s>100:
return V
else:
V = W
s+=1
html("<h3 align=center>2.módszer: A nemlineáris eljárás</h3>")
pf2=PFiter2(E)html('Az nemlineáris iteráció megoldása: ')print pf2
print
61

96
97
98
99
100
101
102

M2=[]
for i in [0..len(pf2)-1]:M2.append([pf2[i].n(digits=3),i+1])
M2=sorted(M2,reverse=1)
for i in [0..len(M2)-1]:
M2[i]=[M2[i][0],M2[i][1],i+1]

103
104

105
106
107
108

109
110
111
112
113
114

115
116
117
118
119
120

table=[[' ','Direkt módszer $(S_{i,j})/ (S_{i,j}+S_{j,i}+1)$ãÑmódon adva: (Helyezés,Pontszám)','Direkt módszer
ãÑ$(S_{i,j}+1)/(S_{i,j}+S_{j,i}+2)$ módon adva:
ãÑ(Helyezés,Pontszám)', 'Nemlineáris fixpont módszer:
ãÑ(Helyezés,Pontszám)']]for i in [0..len(r)-1]:
for j in [0..len(Codes)-1]:
if r[i][1]==Codes[j][1]:table.append([Codes[j][0],r[i][2].str()+',
ãÑ'+r[i][0].str()])
for i in [0..len(rA)-1]:
for j in [0..len(Codes)-1]:
if rA[i][1]==Codes[j][1]:for k in [0..len(table)-1]:
if Codes[j][0]==table[k][0]:table[k].append(rA[i][2].str()+',
ãÑ'+rA[i][0].str())
for i in [0..len(M2)-1]:
for j in [0..len(Codes)-1]:
if M2[i][1]==Codes[j][1]:for k in [0..len(table)-1]:
if Codes[j][0]==table[k][0]:table[k].append(M2[i][2].str()+',
ãÑ'+M2[i][0].str())

121
122
123

html("<h3 align=center>Összesı́tett táblázat</h3>")
html("<h2 align=center>%s</h2>"%html.table(table))62

Futási kép:63Illetve az összesı́tett táblázat:

64

Irodalomjegyzék[1] W. N. Colley. Colley’s Bias Free College Football Ranking Method:The Colley
Matrix Explained, 2003. http://www.colleyrankings.com/matrate.pdf.
[2] M. Franceschet, E. Bozzo, and P. Vidoni. The temporalized Massey’s method.
Journal of Quantitative Analysis in Sports, 13(2):37–48, June 2017.
[3] J. P. Keener. The Perron–Frobenius Theorem and the Ranking of Football
Teams. SIAM Review, 35(1):80–93, 1993.
[4] K. Massey.
Statistical Models Applied to the Rating ofSportsTeams.
Master’s
thesis,Bluefield
College,1997.
https://www.masseyratings.com/theory/massey97.pdf.
[5] W. A. Stein et al. Sage Mathematics Software (Version 8.1). The Sage Development Team, 2018. http://www.sagemath.org.

65