piątek, 22 czerwca 2018

Czy mamy jeszcze szanse?

Mundial zaczął się dla jak zwykle w tym milenium, od porażki w żenującym stylu. Rozsądek podpowiada, że przed nami kolejna porażka i koniec emocji. Serce przekonuje, że szanse jeszcze przecież są. Rozsądek na to: sprawdźmy jak duże.
Można to zrobić m.im. odwołując się do danych historycznych. Znajdziemy je np. tutaj https://github.com/openfootball/world-cup. Są w formacie txt. Niestety nie do końca spójnym z imprezy na imprezę, ale wystarczająco, żeby zautomatyzować ich obróbkę. Choć dostępne dane sięgają 1930 r. ograniczam się do 1998-2014, gdyż tylko w tych latach imprezy miały ten sam format - osiem czterodrużynowych grup, z których awansują dwie najlepsze.
Pobieranie danych i ich obróbkę załatwił poniższy kod w R:


 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
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
71
72
73
74
library(tidyverse)
library(RCurl)
library(tidyr)
library(glue)


# do testowania impreza = "2002--south-korea-n-japan"
#do testowania lewe_ciecie = ".*[0-9]+\\s[A-z]+"

ZrobTabele <- function(impreza,lewe_ciecie){
page_url <- glue("https://raw.githubusercontent.com/openfootball/world-cup/master/{impreza}/cup.txt")
my_data <- read.delim(page_url)

my_data <- as.vector(my_data$X............................)
mecze <- my_data[grepl("@", my_data)]
nr.meczu <- as.numeric(gsub(".*\\(([0-9]+)\\).*","\\1",mecze)) #ma zastapic dzien bo ten jest w roznych formatach
mecze <- gsub("@.*","",mecze)
mecze <- gsub(lewe_ciecie,"",mecze)
mecze <- gsub("\\(.-.\\)","",mecze)
mecze <- gsub(" ","",mecze)
mecze <- gsub("Republicof","",mecze) #bo w 2002 irlandia jest zapisana raz tak raz tak
wynik <- gsub(".*([0-9]-[0-9]).*","\\1",mecze)
p.druzyna <- gsub("(.*)[0-9]-[0-9].*","\\1",mecze)
d.druzyna <- gsub(".*[0-9]-[0-9](.*)","\\1",mecze)
grupa <- sort(rep(LETTERS[1:8],6))
tabela <- data.frame(grupa, nr.meczu, p.druzyna,d.druzyna,wynik)
tabela$p.gole <- as.numeric(substr(tabela$wynik,1,1))
tabela$d.gole <- as.numeric(substr(tabela$wynik,3,3))
tabela$roz.gole <- (tabela$p.gole - tabela$d.gole)
tabela$p.wynik <- ifelse(tabela$p.gole>tabela$d.gole,3,ifelse(tabela$p.gole<tabela$d.gole,0,1)) 
tabela$d.wynik <- ifelse(tabela$p.gole<tabela$d.gole,3,ifelse(tabela$p.gole>tabela$d.gole,0,1)) 

pierwsze <- tibble(grupa=tabela$grupa, nr.meczu=tabela$nr.meczu, druzyna=tabela$p.druzyna, 
                   goleF=tabela$p.gole, goleA=tabela$d.gole, goleR=tabela$roz.gole, 
                   punkty=tabela$p.wynik, przeciwnik=tabela$d.druzyna)
drugie <- tibble(grupa=tabela$grupa, nr.meczu=tabela$nr.meczu, druzyna=tabela$d.druzyna, 
                 goleF=tabela$d.gole, goleA=tabela$p.gole, goleR=-tabela$roz.gole, 
                 punkty=tabela$d.wynik, przeciwnik=tabela$p.druzyna)
tabela <- rbind(pierwsze, drugie)
tabela <- tabela[order(tabela$druzyna,tabela$nr.meczu),] #ulozenie wg druzyny i daty
mecz <- rep(c("fst","snd", "trd"),32) #tworzy ciąg 1,2,3,1,2,3 itd.
tabela$k.mecz <- as.factor(mecz) #przypisanie trzem meczom kazdej druzyny kolejnosci 1,2,3

#tworze tabele 'long' czyli tylko kolumny powtarzajace + jedna do rozciągnięcia w 'wide'
tabela_long <- tibble(grupa=tabela$grupa, druzyna=tabela$druzyna, 
                      punkty=tabela$punkty, k.mecz=tabela$k.mecz)
#przerobienie long na wide
tabela_wide <- spread(tabela_long,k.mecz,punkty)
tabela_wide <- tabela_wide %>% mutate(pkt=fst+snd+trd)


#tworzy z pierwszej tabeli sumaryczna roznice goli dla kazzdej druzyny
tabela_gr <- tabela %>% group_by(druzyna) %>% summarise(goleF = sum(goleF), goleA = sum(goleA)) %>%
  mutate(roznica=goleF-goleA) %>% select(druzyna, roznica)
# i dodaje taka kolumnę do table_wide
tabela_wide <- merge(tabela_wide, tabela_gr ,by.x = "druzyna", by.y = "druzyna")
# sortowanie wg grupy i punktów
tabela_wide <- tabela_wide[order(tabela_wide$grupa,-tabela_wide$pkt,-tabela_wide$roznica),]

pozycja <- rep(seq(1:4),8) #tworzy ciąg 1-4 pozycji w grupie
awans <- rep(c("T","T","N","N"),8) #tworzy ciąg 1-4 pozycji w grupie
tabela_wide$pozycja <- as.numeric(pozycja)
tabela_wide$awans <- awans

return(tabela_wide)
} #koniec funkcji ZrobTabele

RPA <- ZrobTabele("2010--south-africa",".*:[0-9]{2}")
Brazylia <- ZrobTabele("2014--brazil",".*:[0-9]{2}")
Niemcy <- ZrobTabele("2006--germany",".*/[0-9]+")
KorJap <- ZrobTabele("2002--south-korea-n-japan",".*[0-9]+\\s[A-z]+")
Francja <- ZrobTabele("1998--france",".*[0-9]+\\s[A-z]+")

zbiorcza <- rbind(Brazylia,RPA,Niemcy,KorJap,Francja)

To daje nam zbiorczą tabelę z wynikami wszystkich meczów grupowych ostatnich lat w następującym formacie:


1
2
3
4
5
6
7
      druzyna grupa fst snd trd pkt roznica pozycja awans
6       Brazil     A   3   1   3   7       5       1     T
23      Mexico     A   3   1   3   7       3       2     T
12     Croatia     A   0   3   0   3       0       3     N
8     Cameroon     A   0   0   0   0      -8       4     N
24 Netherlands     B   3   3   3   9       7       1     T
9        Chile     B   3   3   0   6       2       2     T

Więc teraz wystarczy policzyć ile razy drużyna przegrywająca pierwszy mecz (fst=0) dawała radę awansować (awans=T). Dodatkowo sprawdźmy jak szanse te zmieniają się w zależności od wyniku drugiego meczu.



1
2
3
4
5
6
7
8
#jaki % pregranych w pierwszym meczu awansowal
zbiorcza %>% count(fst,awans) %>% filter(fst==0) %>% mutate(procenty = n/ sum(n)) 
#jaki procent przegranych w pierwszym wygranych w drugim awansowal
zbiorcza %>% count(fst,snd,awans) %>% filter(fst==0 & snd==3) %>% mutate(procenty = n/ sum(n))
#jaki procent przegranych w pierwszym remis w drugim awansowal
zbiorcza %>% count(fst,snd,awans) %>% filter(fst==0 & snd==1) %>% mutate(procenty = n/ sum(n))
#jaki procent przegranych w pierwszym przegranych w drugim awansowal
zbiorcza %>% count(fst,snd,awans) %>% filter(fst==0 & snd==0) %>% mutate(procenty = n/ sum(n))

No więc tak - szanse są :) ale prawdopodobieństwo nie napawa optymizmem. Podsumować je można poniższym schematem.


Jeśli powtórzy się scenariusz z poprzednich dwóch imprez, w których Polacy brali udział, to po drugim meczu wszystko będzie jasne :)

Brak komentarzy:

Prześlij komentarz

Szukaj na tym blogu

Archiwum bloga