czwartek, 14 czerwca 2018

Alternatywne historie mistrzostw świata w piłce nożnej

Na stronie Economist.com można znaleźć wykres prezentujący wszystkie gole strzelone na wszystkich dotychczasowych mistrzostwach świata. Fajna wizualizacja pokazuje kto, komu, w której minucie, fazie i jaki był ostateczny wynik. Wygląda to mniej więcej tak:


Gole nie są rozłożone równomiernie - są takie minuty w których padło więcej niż 40 goli i takie, w których mniej niż 10. Zatem czy jest to rozkład losowy, czy też jednak piłką rządzi jakaś prawidłowość?
Żeby to sprawić wygenerowałem alternatywne, zupełnie losowe historie mistrzostw świata. Zadane kryteria - ta sama liczba goli, karnych i samobójczych, ale dla uproszczenia usunąłem minuty dodatkowe - wszystko co ponad 45 w pierwszej połowie i 90 w drugiej (również dogrywki). Oczywiście odpowiednio zmniejszyłem liczbę goli.

Generowanie losowych historii i umieszczenie ich na wykresie zrobiłem w R.  Poniżej kod:


 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
library(ggplot2)
library(gridExtra)

kolory <- c("lightblue", "red", "yellow", "green") #wektor kolorow, zeby wykresy mialy rozne kolory
kolory1 <- c("#FF0000", "pink", "#000000")
kolory2 <- c("#FF0000", "yellow", "#000000")
kolory3 <- c("#FF0000", "lightgreen", "#000000")
kolory4 <- c("#FF0000", "lightblue", "#000000")
kolory <- list(kolory1, kolory2, kolory3, kolory4)

for(wykres in 1:4){ #petla robi 4 wykresy
x <- sample(1:90, 2259, replace=TRUE)  # losowy szereg z zakesu 1-90 o dlugosci 2259

x1 <- as.data.frame(table(x)) #przerobienie wektora szeregu na tabele z liczebnosciami i df
x1$x <- strtoi(x1$x)     #zamiana char na integer, bo w table pierwsza zmienna to char. z tego beda pobrane dane do petli 

x2 <- as.data.frame(x)    ##przerobienie wektora szeregu na df
x2 <- as.data.frame(x2[order(x),])   #sortowanie - do tego beda dodane sekwencje z petli. znowu as.data.frame, bo traci sie 
colnames(x2) <- "minuty" #nadanie nazwy kolumny, bo jakas dziwna powstaje


calosciowy <- vector()   #inicjacja wektora do petli


#petla tworz9ca wektory z sekwencjami od 1 do dlugosci rownej liczebnosci kazdej z minut

#nastjpnie sumowanie tych wektorow do jednego, ktory bedzie dodany jako kolumna do x2
for (wiersz in 1:90){      
minuta <- x1[wiersz, "x"]
ilosc <- x1[wiersz, "Freq"]
kolejny <- seq(1,ilosc)
calosciowy <- c(calosciowy,kolejny)}

x2$liczbagoli <- calosciowy

karny <- rep("karny", 174)
samob <- rep("samob", 38)
normalny <- rep("normalny", 2047)
rodzajgola <- c(karny,samob,normalny)
numerki <- seq(1,2259)
numerki <- sample(numerki)  #losowe ulozenie
typgola <- as.data.frame(rodzajgola)
typgola$numerki <- numerki
typgola <- as.data.frame(typgola[order(numerki),])
x2$typgola <- typgola$rodzajgola

assign(paste("p",wykres,sep=""), ggplot(x2, aes(minuty, liczbagoli, color=typgola)) +
   geom_point(size = 1.5) +
   theme(panel.border = element_blank(),
          panel.grid.major = element_line(size = 0.3, linetype = 'solid',
                                          colour = "#444444"),
          panel.grid.minor = element_blank(),
          panel.background = element_rect(fill="white")) +
   scale_color_manual(values=kolory4,guide=FALSE))
}

grid.arrange(p1, p2, p3, p4)



A tak wyglądają wyniki, bardzo podobnie do tych rzeczywistych. również są minuty z 30-40 golami i więcej, jak i takie poniżej 20.

Wniosek - nie ma żadnych prawidłowości gole padają i będą padać od 1 do ostatniej minuty i nie mamy jak tego przewidzieć. Przynajmniej jeśli chodzi o całą historię i wszystkie reprezentacje. Na pojedynczych przypadkach może to wyglądać inaczej, o czym niedługo we wpisie na FB @ZabawaDanymi.

Brak komentarzy:

Prześlij komentarz

Szukaj na tym blogu

Archiwum bloga