Et si la France votait comme les États-Unis ?

En France comme dans la plupart des pays du monde, nous avons suivi avec attention l’élection du 45ème président des États-Unis, Donald Trump (si vous n’étiez pas au courant, il est temps de sortir de votre grotte !). Cela a été l’occasion de mieux connaître le système électoral américain, et de réviser sa géographie des états américains : quels états sont démocrates ? Où se situe vraiment le Wisconsin ? Comment fonctionne le système de grands électeurs ?

Il faut dire que pour nous, français, le système est très éloigné de notre élection présidentielle. Certes, les primaires des différents partis sont un phénomène qui tend à se développer en France, mais nous restons attachés à l’élection directe du président, marqueur politique important de la Ve République. Cependant, cela n’empêche pas de réfléchir à d’autres systèmes de vote (l’article wikipedia est d’excellente qualité, et je ne développerai pas le sujet ici, mais peut-être dans un prochain article !). Par exemple, serait-il possible de transposer le système américain des grands électeurs par état à la France ?

Un bref rappel du système américain

Si vous êtes experts en politique américaine, ou si avez suivi le Monde ces derniers mois, vous pouvez sauter cette partie ! Sinon, profitons en pour faire un bref rappel de ce qu’il faut savoir sur le système politique américain pour l’adapter à la France. Les États-Unis, comme leur nom l’indique, sont découpés en 50 états qui ont chacun un gouvernement, des lois et des réglementations propres. Un système politique et administratif fédéral complète ce dispositif, pour les sujets tels que les relations internationales sur lesquels le pays ne doit porter qu’une seule voie. Le président des États-Unis, actuellement Barack Obama, dispose du pouvoir exécutif au niveau fédéral. Il existe de nombreux contre-pouvoirs au POTUS, principalement au niveau des chambres de représentants, bien plus qu’en France.

Le président est élu au suffrage universel indirect. Chaque état vote pour élire ses représentant au collège des grands électeurs, qui votent ensuite pour élire le président. Les règles d’élection des grands électeurs au sein de chaque état peuvent varier, mais globalement, elles respectent la règle dite du “winner takes all” : le parti ou les candidats qui ont la majorité des votes de l’état remportent la totalité des sièges mis en jeu. Ce système est à l’opposé des systèmes dits proportionnels. En France, les législatives reprennent un peu ce système, sauf qu’un seul siège est mis en jeu dans chaque circonscription ; les débats autour de l’introduction d’une “dose de proportionnelle” sont fréquents à ce sujet.

Le nombre de sièges attribué à chaque état correspond globalement à sa population, hormis que les états les moins peuplés sont favorisés par rapport aux grands états. Par exemple, la Californie a 55 grands électeurs pour 38,8 millions d’habitants, tandis que le Wyoming en a 3 pour 500 000 habitants, soit cinq à six fois plus de sièges par habitant. Nous discutions déjà de ce point dans l’article précédent (en). Il y a en tout 538 grands électeurs à pourvoir ; les projections les plus fiables en donnent 306 à Donald Trump pour l’élection de 2016.

Adaptation au système français

Nous allons essayer d’adapter le système de collège électoral de grands électeurs à la France. Pour cela, nous allons nous intéresser aux seconds tours des élections présidentielles (pour coller au plus près du système bi-partisan des États-Unis), en excluant ceux atypiques (1969 et 2002), en se limitant à la France métropolitaine (dans une optique de simplification, les modalités de vote dans les DOM et pour les français à l’étranger évoluant beaucoup). Les données sont disponibles sur data.gouv pour la période 1965 – 2002.

On va réaliser le découpage au niveau départemental de la France, en considérant qu’un département correspond à un état américain (hormis pour la Corse, qu’on regroupe en un seul département pour des questions de comparabilité). Nous avons donc 95 “états” français, et chacun d’entre eux doit se voir attribuer un nombre de sièges dans notre collège de grands électeurs fictif. Pour cela, nous allons répliquer la méthodologie américaine, et répartir 538 sièges en favorisant les départements les moins peuplés. Nous obtenons alors 3 grands électeurs dans la Creuse et la Lozère, et jusqu’à 13 grands électeurs dans le Nord.

On calcule ensuite pour chaque élection quel parti sort vainqueur du vote au niveau de chacun des départements ; les grands électeurs associés lui sont alors attribués. Une fois ce processus effectué pour tous les départements, nous avons une idée de la composition du collège électoral, et ainsi du nom du président qui aurait été élu via ce dispositif. Voici les résultats obtenus :

1965 1974 1981 1988 1995 2007 2012
Droite 373 298 156 113 389 384 203
Gauche 123 240 382 425 149 154 335

On remarque que ce système fictif conduit tout de même à l’élection du même président pour les sept échéances électorales considérées que ce qui s’est réellement passé. Les écarts de composition du collège électoral sont plus intéressants : le plus grand est en 1988, avec 425 des 638 grands électeurs acquis à la gauche (et François Mitterrand avait largement gagné, avec 54,02 % des voix), et le plus faible est en 1974 (et effectivement l’écart était très faible). Le système semble donc fiable.

Les “swing” départements

Aux États-Unis, l’élection se joue souvent sur un petit nombre d’états, appelés swing states ou états pivots. En effet, une grande partie des états sont acquis dès le début par un parti, qui y réalise d’excellents scores, et il n’y a donc pas d’intérêt stratégique pour le candidat du parti adversaire à faire campagne là-bas (par exemple, la Californie est démocrate). Ce sont les états fortement en bleu ou en rouge dans le modèle de prédiction de FiveThirtyEight (en) (on ne reviendra pas sur le candidat qui avait le plus de chances de l’emporter, surtout que leur modèle de prédiction était largement meilleur que celui des autres médias américains).

On peut se poser la même question en France : si l’on adoptait le sytème américain, y aurait-il des fiefs acquis à la droite et à la gauche ? quels seraient les départements pivots ? La question est assez complexe, mais nous allons tenter de donner quelques éléments de réponse. Tout d’abord, le gif suivant montre l’évolution des votes par département depuis 1974 :

C’est assez difficile à lire, mais on peut en tirer plusieurs enseignements :

  • Il semblerait que le vote soit moins hétérogène entre les départements français qu’aux États-Unis, car l’évolution est plus globale quand la majorité est renversée.
  • On remarque néanmoins que certains fiefs électoraux se dessinent avec par exemple le sud-ouest de la France pour la gauche, et un arc ouest/sud-est de la Bretagne à Nice en passant par Paris pour la droite.

Pour étudier plus précisément ce second point, nous allons regarder quelques autres indicateurs. Tout d’abord, les deux cartes suivantes indiquent les départements avec lesquels chaque parti a toujours gagné, c’est à dire que, pour la droite, ils ont remporté ces départements en 65, 74, 95 et 2007, et pour la gauche en 81, 88 et 2012. On retrouve les fiefs évoqués précédemment.

On peut faire plus largement une typologie des départements en comptant combien de fois ils ont voté à droite ou à gauche lors de ces dernières élections. Les départements en bleu ont bien plus fréquemment voté majoritairement à droite qu’à gauche, ceux en rose pour la gauche, et ceux en gris n’ont pas un comportement partisan qui se dégage clairement des sept élections considérées.

Ce sont ces département en gris, les plus indécis, qui sont les plus proches conceptuellement des swing states américains ! En termes de grands électeurs :

  • 213 grands électeurs sont “acquis” à la droite ;
  • 182 sont “acquis” à la gauche ;
  • les 147 restants sont indécis.

Parmi les départements pivot les plus peuplés, on retrouve les Bouches-du-Rhône, qui seraient un peu notre Floride à nous. Qui sait, peut-être que les candidats français seraient tous obligés dans ce système de concourir avec un vice-président (ou premier ministre) qui aurait l’accent du sud ? Je ne sais pas si les campagnes électorales gagneraient en crédibilité.

Si vous voulez utiliser les données : https://nc233.com/wp-content/uploads/2016/11/FranceAmericanSystem.csv

Riddler and Voter Power Index

Oliver Roeder has a nice puzzle: the riddler. Just like last week, this week’s puzzle has an interesting application to the US Election and I enjoyed it really much, so I figured I might just write a blog post 🙂 In this article, we’ll solve this week’s riddler two different ways (just because :p) and discuss an indicator used on FiveThirtyEight’s prediction model for the election: the Voter Power Index.

Exact solution and Stirling approximation

I won’t write again the problem and notations, but you can find them here. We’ll also assume N is odd (as precised later by Ollie on Twitter). This assumption won’t matter much because we’ll only look at applications for large values of N. Let’s write:

\(\mathbb{P} = \Pr(you~decide~the~election)\)

 

Your vote is obviously going to be decisive if there is a tie between the N-1 other votes (convienently, N-1 is even). The votes are all independant with same probability p=1/2, so they are Bernoulli trials. Consequently, the probability we’re looking for is the probability that exactly half of these Bernoulli trial succeed, which is by definition the binomial distribution. Thus:

\(\mathbb{P} = {{N-1}\choose{\frac{N-1}{2}}} p^{\frac{N-1}{2}} {(1-p)}^{\frac{N-1}{2}} \)

 

As p=0.5, the exact value for the probability of your vote being decisive is thus:

\(\fbox{$\mathbb{P} = \frac{{{N-1}\choose{\frac{N-1}{2}}}}{{2}^{N-1}}$}\)

 

So, here is the exact solution, but it’s not super useful as is. Much more interesting is how this varies with N (with N sufficiently large). We can use Stirling’s approximation:

\(\log \mathbb{P} = \log {{N-1}\choose{\frac{N-1}{2}}} – (N-1) \log 2 \\
~~~~\sim N \log N – \frac{N}{2} \log \frac{N}{2} – \frac{N}{2} \log \frac{N}{2} + \frac{1}{2} \left( \log N – \log \frac{N}{2} \\~~~~~~~- \log \frac{N}{2} – \log 2\pi \right) – N \log 2 \\~~~~\sim – \frac{1}{2} \log N + \log 2 – \frac{1}{2} \log 2\pi \)

Thus for sufficiently large N, the probability your vote is the decisive vote varies like the inverse of the square root of N:

\(\fbox{$\mathbb{P}\sim \sqrt{\frac{2}{N\pi}} \approx \frac{0.8}{\sqrt{N}}$}\)

A very simple solution for large N

Actually, we could have obtained this result for large N much more simply. We know that asymptotically the binomial distribution is gonna converge to a normal distribution. The event that your vote is the decisive one is actually the most probable event, as probabilities that the other people vote for either candidates are equal to 1/2. So the solution to the riddler can be easily computed using the density of the normal distribution:

\(\mathbb{P} = \phi(0) = \frac{1}{\sqrt{2\pi \sigma^2}}\)

with:

\(\sigma^2 = Np(1-p) = \frac{N}{4}\)

(the variance of the binomial distribution), we get the same result as in the first paragraph:

\(\fbox{$\mathbb{P}\sim \sqrt{\frac{2}{N\pi}} \approx \frac{0.8}{\sqrt{N}}$}\)
Mode of normal distribution for various standard deviations. © W. R. Leo
Mode of normal distribution for various standard deviations. © W. R. Leo

Voter Power Index

Caption from FiveThirtyEight's model
Caption from FiveThirtyEight’s model

In the US Presidential election, voters don’t elect directly their preferred candidates, but “electors” who will eventually get to vote for the president. For example, California get 55 electors while Wyoming only get 3. But divided by the number of voters in each of these states, it appears that there are approximately 510 000 voters for each elector in California while only 150 000 voters get to decide an electoral vote in Wyoming. If we assumed that probabilities of voting for each candidate was equal in these states, we can use our formula to get the relative likelihood that one vote is going to change the outcome in the election in these two states:

\(\sqrt{\frac{510000}{150000}} \approx 1.8\)

So in a way, a vote by a Californian is nearly 2 times less important than a vote cast in Wyoming!

Of course, probabilities are far from being equal for this year’s 2 candidates in California and Wyoming. And as Michael Vartan noted, the value of this probability matters very much!

All parameters taken into account (also including the different configurations of the electoral college in other states), this is what Nate Silver call the Voter Power Index. For this year, the probabilities that one vote will change the outcome of the whole election is highest in New Hampshire and lowest in DC.

Featured image: Number of electoral votes per voter for each state. Made using the awesome tilegram app

[Sampling] Icarus et calage sur bornes minimales au 9ème colloque francophone sondages

Du 11 au 14 octobre dernier, nous étions à Gatineau (Québec) pour participer au 9ème colloque francophone sur les sondages de la SFdS. Un grand bravo à toute l’équipe organisatrice pour ce contenu scientifique de grande qualité et ce programme social très sympathique !

Nous avons donné les présentations suivantes :

Data analysis of the French football league players with R and FactoMineR

This year we’ve had a great summer for sporting events! Now autumn is back, and with it the Ligue 1 championship. Last year, we created this data analysis tutorial using R and the excellent package FactoMineR for a course at ENSAE (in French). The dataset contains the physical and technical abilities of French Ligue 1 and Ligue 2 players. The goal of the tutorial is to determine with our data analysis which position is best for Mathieu Valbuena 🙂

The dataset

A small precision that could prove useful: it is not required to have any advanced knowledge of football to understand this tutorial. Only a few notions about the positions of the players on the field are needed, and they are summed up in the following diagram:

Positions of the fooball players on the field
Positions of the fooball players on the field

The data come from the video game Fifa 15 (which is already 2 years old, so there may be some differences with the current Ligue 1 and Ligue 2 players!). The game features rates each players’ abilities in various aspects of the game. Originally, the grade are quantitative variables (between 0 and 100) but we transformed them into categorical variables (we will discuss why we chose to do so later on). All abilities are thus coded on 4 positions : 1. Low / 2. Average / 3. High / 4. Very High.

Loading and prepping the data

Let’s start by loading the dataset into a data.frame. The important thing to note is that FactoMineR requires factors. So for once, we’re going to let the (in)famous stringsAsFactors parameter be TRUE!

> frenchLeague <- read.csv2("french_league_2015.csv", stringsAsFactors=TRUE)
> frenchLeague <- as.data.frame(apply(frenchLeague, 2, factor))

The second line transforms the integer columns into factors also. FactoMineR uses the row.names of the dataframes on the graphs, so we’re going to set the players names as row names:

row.names(frenchLeague) <- frenchLeague$name
frenchLeague$name <- NULL

Here’s what our object looks like (we only display the first few lines here):

> head(frenchLeague)
                     foot position league age height overall
Florian Thauvin      left       RM Ligue1   1      3       4
Layvin Kurzawa       left       LB Ligue1   1      3       4
Anthony Martial     right       ST Ligue1   1      3       4
Clinton N'Jie       right       ST Ligue1   1      2       3
Marco Verratti      right       MC Ligue1   1      1       4
Alexandre Lacazette right       ST Ligue1   2      2       4

Data analysis

Our dataset contains categorical variables. The appropriate data analysis method is the Multiple Correspondance Analysis. This method is implemented in FactoMineR in the method MCA. We choose to treat the variables “position”, “league” and “age” as supplementary:

> library(FactoMineR)
> mca <- MCA(frenchLeague, quali.sup=c(2,3,4))

This produces three graphs: the projection on the factorial axes of categories and players, and the graph of the variables. Let’s just have a look at the second one of these graphs:

Projection of the players on the first two factorial axes (click to enlarge)
Projection of the players on the first two factorial axes (click to enlarge)

Before trying to go any further into the analysis, something should alert us. There clearly are two clusters of players here! Yet the data analysis techniques like MCA suppose that the scatter plot is homogeneous. We’ll have to restrict the analysis to one of the two clusters in order to continue.

On the previous graph, supplementary variables are shown in green. The only supplementary variable that appears to correspond to the cluster on the right is the goalkeeper position (“GK”). If we take a closer look to the players on this second cluster, we can easily confirm that they’re actually all goalkeeper. This absolutely makes a lot of sense: in football, the goalkeeper is a very different position, and we should expect these players to be really different from the others. From now on, we will only focus on the positions other than goalkeepers. We also remove from the analysis the abilities that are specific to goalkeepers, which are not important for other players and can only add noise to our analysis:

> frenchLeague_no_gk <- frenchLeague[frenchLeague$position!="GK",-c(31:35)]
> mca_no_gk <- MCA(frenchLeague_no_gk, quali.sup=c(2,3,4))

And now our graph features only one cluster.

Interpretation

Obviously, we have to start by reducing the analysis to a certain number of factorial axes. My favorite method to chose the number of axes is the elbow method. We plot the graph of the eigenvalues:

> barplot(mca_no_gk$eig$eigenvalue)

 

barplot
Graph of the eigenvalues

Around the third or fourth eigenvalue, we observe a drop of the values (which is the percentage of the variance explained par the MCA). This means that the marginal gain of retaining one more axis for our analysis is lower after the 3rd or 4th first ones. We thus choose to reduce our analysis to the first three factorial axes (we could also justify chosing 4 axes). Now let’s move on to the interpretation, starting with the first two axes:

> plot.MCA(mca_no_gk, invisible = c("ind","quali.sup"))
Projection of the abilities on the first two factorial axes
Projection of the abilities on the first two factorial axes

We could start the analysis by reading on the graph the name of the variables and modalities that seem most representative of the first two axes. But first we have to keep in mind that there may be some of the modalities whose coordinates are high that have a low contribution, making them less relevant for the interpretation. And second, there are a lot of variables on this graph, and reading directly from it is not that easy. For these reasons, we chose to use one of FactoMineR’s specific functions, dimdesc (we only show part of the output here):

> dimdesc(mca_no_gk)
$`Dim 1`$category
                      Estimate       p.value
finishing_1        0.700971584 1.479410e-130
volleys_1          0.732349045 8.416993e-125
long_shots_1       0.776647500 4.137268e-111
sliding_tackle_3   0.591937236 1.575750e-106
curve_1            0.740271243  1.731238e-87
[...]
finishing_4       -0.578170467  7.661923e-82
shot_power_4      -0.719591411  2.936483e-86
ball_control_4    -0.874377431 5.088935e-104
dribbling_4       -0.820552850 1.795628e-117

The most representative abilities of the first axis are, on the right side of the axis, a weak level in attacking abilities (finishing, volleys, long shots, etc.) and on the left side a very strong level in those abilities. Our interpretation is thus that axis 1 separates players according to their offensive abilities (better attacking abilities on the left side, weaker on the right side). We procede with the same analysis for axis 2 and conclude that it discriminates players according to their defensive abilities: better defenders will be found on top of the graph whereas weak defenders will be found on the bottom part of the graph.

Supplementary variables can also help confirm our interpretation, particularly the position variable:

> plot.MCA(mca_no_gk, invisible = c("ind","var"))
Projection of the supplementary variables on the first two factorial axis
Projection of the supplementary variables on the first two factorial axis

And indeed we find on the left part of the graph the attacking positions (LW, ST, RW) and on the top part of the graph the defensive positions (CB, LB, RB).

If our interpretation is correct, the projection on the second bissector of the graph will be a good proxy for the overall level of the player. The best players will be found on the top left area while the weaker ones will be found on the bottom right of the graph. There are many ways to check this, for example looking at the projection of the modalities of the variable “overall”. As expected, “overall_4” is found on the top-left corner and “overall_1” on the bottom-right corner. Also, on the graph of the supplementary variables, we observe that “Ligue 1” (first division of the french league) is on the top-left area while “Ligue 2” (second division) lies on the bottom-right area.

With only these two axes interpreted there are plenty of fun things to note:

  • Left wingers seem to have a better overall level than right wingers (if someone has an explanation for this I’d be glad to hear it!)
  • Age is irrelevant to explain the level of a player, except for the younger ones who are in general weaker.
  • Older players tend to have more defensive roles

Let’s not forget to deal with axis 3:

> plot.MCA(mca_no_gk, invisible = c("ind","var"), axes=c(2,3))
Projection of the variables on the 2nd and 3rd factorial axes
Projection of the variables on the 2nd and 3rd factorial axes

Modalities that are most representative of the third axis are technical weaknesses: the players with the lower technical abilities (dribbling, ball control, etc.) are on the end of the axis while the players with the highest grades in these abilities tend to be found at the center of the axis:

Projection of the supplementary variables on the 2nd and 3rd factorial axes
Projection of the supplementary variables on the 2nd and 3rd factorial axes

We note with the help of the supplementary variables, that midfielders have the highest technical abilities on average, while strikers (ST) and defenders (CB, LB, RB) seem in general not to be known for their ball control skills.

Now we see why we chose to make the variables categorical instead of quantitative. If we had kept the orginal variables (quantitative) and performed a PCA on the data, the projections would have kept the orders for each variable, unlike what happens here for axis 3. And after all, isn’t it better like this? Ordering players according to their technical skills isn’t necessarily what you look for when analyzing the profiles of the players. Football is a very rich sport, and some positions don’t require Messi’s dribbling skills to be an amazing player!

Mathieu Valbuena

Now we add the data for a new comer in the French League, Mathieu Valbuena (actually Mathieu Valbuena arrived in the French League in August of 2015, but I warned you that the data was a bit old ;)). We’re going to compare Mathieu’s profile (as a supplementary individual) to the other players, using our data analysis.

> columns_valbuena <- c("right","RW","Ligue1",3,1
 ,4,4,3,4,3,4,4,4,4,4,3,4,4,3,3,1,3,2,1,3,4,3,1,1,1)
> frenchLeague_no_gk["Mathieu Valbuena",] <- columns_valbuena

> mca_valbuena <- MCA(frenchLeague_no_gk, quali.sup=c(2,3,4), ind.sup=912)
> plot.MCA(mca_valbuena, invisible = c("var","ind"), col.quali.sup = "red", col.ind.sup="darkblue")
> plot.MCA(mca_valbuena, invisible = c("var","ind"), col.quali.sup = "red", col.ind.sup="darkblue", axes=c(2,3))

Last two lines produce the graphs with Mathieu Valbuena on axes 1 and 2, then 2 and 3:

Axes 1 and 2 with Mathieu Valbuena as a supplementary individual
Axes 1 and 2 with Mathieu Valbuena as a supplementary individual (click to enlarge)
Axes 2 and 3 with Mathieu Valbuena as a supplementary individual
Axes 2 and 3 with Mathieu Valbuena as a supplementary individual (click to enlarge)

So, Mathieu Valbuena seems to have good offensive skills (left part of the graph), but he also has a good overall level (his projection on the second bissector is rather high). He also lies at the center of axis 3, which indicates he has good technical skills. We should thus not be surprised to see that the positions that suit him most (statistically speaking of course!) are midfield positions (CAM, LM, RM). With a few more lines of code, we can also find the French league players that have the most similar profiles:

> mca_valbuena_distance <- MCA(frenchLeague_no_gk[,-c(3,4)], quali.sup=c(2), ind.sup=912, ncp = 79)
> distancesValbuena <- as.data.frame(mca_valbuena_distance$ind$coord)
> distancesValbuena[912, ] <- mca_valbuena_distance$ind.sup$coord

> euclidianDistance <- function(x,y) {
 
 return( dist(rbind(x, y)) )
 
}

> distancesValbuena$distance_valbuena <- apply(distancesValbuena, 1, euclidianDistance, y=mca_valbuena_distance$ind.sup$coord)
> distancesValbuena <- distancesValbuena[order(distancesValbuena$distance_valbuena),]

> names_close_valbuena <- c("Mathieu Valbuena", row.names(distancesValbuena[2:6,]))

And we get: Ladislas Douniama, Frédéric Sammaritano, Florian Thauvin, N’Golo Kanté and Wissam Ben Yedder.

There would be so many other things to say about this data set but I think it’s time to wrap this (already very long) article up 😉 Keep in mind that this analysis should not be taken too seriously! It just aimed at giving a fun tutorial for students to discover R, FactoMineR and data analysis.

 

[Sports] Fifa et analyse de données

Après un été chargé en sports, l’automne et la Ligue 1 reprennent peu à peu leurs droits. C’est l’occasion de détailler un sujet d’analyse de données élaboré pour un cours à l’ENSAE. Il s’agit d’analyser des données qualitatives (caractéristiques physiques, tactiques et aptitudes relatives à certains aspects techniques du jeu) décrivant les joueurs du championnat de France de football. Le but final est de déterminer “statistiquement” à quel poste faire jouer Mathieu Valbuena 🙂 On utilise le langage R et l’excellent package d’analyse de données FactoMineR.

Les données

Comme indiqué dans l’énoncé du TD, il n’est pas nécessaire de bien connaître le football pour pouvoir suivre cet article. Seule une notion de l’emplacement des joueurs sur le terrain en fonction de leur poste (correspondant à la colonne “position” du dataset) est souhaitable. Voici un petit schéma pour aider les moins avertis :

disposition_terrain

Les données sont issues du jeu vidéo Fifa 15 (les connaisseurs auront remarqué que les données datent donc d’il y a déjà deux saisons, il peut donc y avoir quelques différences avec les effectifs actuels !), qui donne de nombreuses statistiques pour chaque joueur, incluant une évaluation de leurs capacités. Les données de Fifa sont quantitatives (par exemple chaque capacité est notée sur 100) mais pour cet article on les a rendues catégorielles sur 4 positions : 1. Faible / 2. Moyen / 3. Fort / 4. Très fort. On verra l’intérêt d’avoir procédé ainsi un peu plus loin !

Préparation des données

Commençons par charger les données. Notez l’utilisation de l’option stringsAsFactors=TRUE (plus d’explications sur ce fameux paramètre stringsAsFactors ici). Eh oui, une fois n’est pas coutume, FactoMineR utilise des facteurs pour effectuer l’analyse de données !

> champFrance <- read.csv2("td3_donnees.csv", stringsAsFactors=TRUE)
> champFrance <- as.data.frame(apply(champFrance, 2, factor))

La deuxième ligne sert à transformer les colonnes de type int créés par read.csv2 en factors.

FactoMineR utilise le paramètre “row.names” des data.frame de R pour l’affichage sur les graphes. On va donc indiquer qu’il faut utiliser la colonne “nom” en tant que row.names pour faciliter la lecture :

> row.names(champFrance) <- champFrance$nom
> champFrance$nom <- NULL

Voilà à quoi ressemble désormais notre data.frame (seules les premières lignes sont affichées) :

> head(champFrance)
                      pied position championnat age taille general
Florian Thauvin     Gauche      MDR      Ligue1   1      3       4
Layvin Kurzawa      Gauche       AG      Ligue1   1      3       4
Anthony Martial      Droit       BU      Ligue1   1      3       4
Clinton N'Jie        Droit       BU      Ligue1   1      2       3
Marco Verratti       Droit       MC      Ligue1   1      1       4
Alexandre Lacazette  Droit       BU      Ligue1   2      2       4

Analyse des données

Nous avons affaire à un tableau de variables catégorielles : la méthode adaptée est l’Analyse des Correspondances Multiples, qui est implémentée dans FactoMineR par la méthode MCA. Pour le moment on exclut de l’analyse les variables “position”, “championnat” et “âge” (que l’on traite comme variables supplémentaires) :

> library(FactoMineR)
> acm <- MCA(champFrance, quali.sup=c(2,3,4))

Trois graphes apparaissent dans la sortie : la projection sur les deux premiers axes factoriels des catégories et des individus, ainsi que le graphe des variables. A ce stade, seul le second nous intéresse :

2_nuages_points_2
Projection des individus sur les deux premiers axes factoriels

Avant même d’essayer d’aller plus loin dans l’analyse, quelque chose doit nous sauter aux yeux : il y a clairement deux nuages de points ! Or nos méthodes d’analyse de données supposent que le nuage qu’on analyse est homogène. Il va donc falloir se restreindre à l’analyse de l’un des deux nuages que l’on observe sur ce graphe.

Pour identifier à quels individus le nuage de droite correspond, on peut utiliser les variables supplémentaires (points verts). On observe que la projection de la position goal (“G”) correspond bien au nuage. En regardant de plus près les noms des individus concernés, on confirme que ce sont tous des gardiens de but.

On va se concentrer pour le reste de l’article sur les joueurs de champ. On en profite également pour retirer les colonnes ne concernant que les capacités de gardien, qui ne sont pas importantes pour les joueurs de champ et ne peuvent que bruiter notre analyse :

> champFrance_nogoals <- champFrance[champFrance$position!="G",-c(31:35)]
> acm_nogoals <- MCA(champFrance_nogoals, quali.sup=c(2,3,4))

Et l’on vérifie bien dans la sortie graphique que l’on a un nuage de points homogène.

Interprétation

On commence par réduire notre analyse à un certain nombre d’axes factoriels. Ma méthode favorite est la “règle du coude” : sur le graphe des valeurs propres, on va observer un décrochement (le “coude”) suivi d’une décroissance régulière. On sélectionnera ensuite un nombre d’axes correspondant au nombre de valeurs propres précédant le décrochement :

> barplot(acm_nogoals$eig$eigenvalue)

 

barplot
Éboulis des valeurs propres

Ici, on peut choisir par exemple 3 axes (mais on pourrait justifier aussi de retenir 4 axes). Passons maintenant à l’interprétation, en commençant par les graphes des projections sur les deux premiers axes retenus pour l’étude.

> plot.MCA(acm_nogoals, invisible = c("ind","quali.sup"))
axes_1_2_modalites
Projection des modalités sur les axes factoriels 1 et 2 (cliquer pour agrandir)

On peut par exemple lire sur ce graphe le nom des modalités possédant les plus fortes coordonnées sur les axes 1 et 2 et commencer ainsi l’interprétation. Mais avec un tel de nombre de modalités, la lecture directe sur le graphe n’est pas si aisée. On peut également obtenir un résultat dans la sortie texte spécifique de FactoMineR, dimdesc (seule une partie de la sortie est donnée ici) :

> dimdesc(acm_nogoals)
$`Dim 1`$category
                         Estimate       p.value
finition_1            0.700971584 1.479410e-130
volees_1              0.732349045 8.416993e-125
tirs_lointains_1      0.776647500 4.137268e-111
tacle_glisse_3        0.591937236 1.575750e-106
effets_1              0.740271243  1.731238e-87
[...]
finition_4           -0.578170467  7.661923e-82
puissance_tir_4      -0.719591411  2.936483e-86
controle_balle_4     -0.874377431 5.088935e-104
dribbles_4           -0.820552850 1.795628e-117

Les modalités les plus caractéristiques de l’axe 1 sont, à droite, un niveau faible dans les capacités offensives (finition, volées, tirs lointains), et de l’autre un niveau très fort dans ces même capacités. L’interprétation naturelle est donc que l’axe 1 discrimine selon les capacités offensives (les meilleurs attaquants à gauche, les moins bons à droite). On procède de même pour l’axe 2, et on observe le même phénomène, mais avec les capacités défensives : en haut on trouvera les meilleurs défenseurs, et en bas les moins bons défenseurs.

Les variables supplémentaires peuvent aussi aider à l’interprétation, et vont confirmer notre interprétation, notamment la variable de position :

> plot.MCA(acm_nogoals, invisible = c("ind","var"))
var_sup_axes_1_2
Projection des variables supplémentaires sur les axes factoriels 1 et 2 (cliquer pour agrandir)

On trouve bien à gauche du graphe les les postes offensifs (BU, AIG, AID) et en haut les postes défensifs (DC, AD, AG).

Une conséquence de cette interprétation est que l’on risque de trouver les joueurs de meilleur niveau organisés le long de la seconde bissectrice, avec les meilleurs joueurs dans le quadrant en haut à gauche, et les plus faibles dans le quadrant en bas à droite. Il y a beaucoup de moyens de le vérifier, mais on va se contenter de regarder dans le graphe des modalités l’emplacement des observations de la variable “général”, qui résume le niveau d’un joueur. Comme on s’y attend, on trouve “général_4” dans en haut à gauche et “général_1” dans le quadrant en bas à droite. On peut observer aussi le placement des variables supplémentaires “Ligue 1” et “Ligue 2” pour s’en convaincre 🙂

A ce stade, il y a déjà plein de choses intéressantes à relever ! Parmi celles qui m’amusent le plus :

  • Les ailiers gauches semblent avoir un meilleur niveau que les ailiers droits (si un spécialiste du foot voulait bien m’en expliquer la raison ce serait top !)
  • L’âge n’est pas explicatif du niveau du joueur, sauf pour les plus jeunes qui ont un niveau plus faible
  • Les joueurs les plus âgés ont des rôles plus défensifs.

N’oublions pas de nous occuper de l’axe 3 :

> plot.MCA(acm_nogoals, invisible = c("ind","var"), axes=c(2,3))
axes_2_3
Modalités projetées sur les axes 2 et 3

Les modalités les plus caractéristiques de ce troisième axe sont les faiblesses techniques : les joueurs les moins techniques sont sur les extrémités de l’axe, et les joueurs les plus techniques au centre. On le confirme sur le graphe des variables supplémentaires : les buteurs et défenseurs centraux sont en effet moins réputés pour leurs capacités techniques, tandis que tous les postes de milieux se retrouvent au centre de l’axe :

sup_axes_2_3
Variables supplémentaires sur les axes 2 et 3 (cliquer pour agrandir)

C’est l’intérêt d’avoir rendu ces variables catégorielles. Si l’on avait conservé le caractère quantitatif des données originelles de Fifa et effectué une ACP, les projections de chaque caractéristique sur chaque axe auraient été ordonnées par niveau, contrairement à ce qui se passe sur l’axe 3. Et après tout, discriminer les joueurs suivant leur niveau technique ne reflète pas forcément toute la richesse du football : à certains postes, on a besoin de techniciens, mais à d’autres, on préférera des qualités physiques !

Mathieu Valbuena

On va maintenant ajouter les données d’un nouvel entrant dans le championnat de France : Mathieu Valbuna (oui je vous avais prévenu, les données commencent à dater un peu :p) et le comparer aux autres joueurs en utilisant notre analyse.

> columns_valbuena <- c("Droit","AID","Ligue1",3,1
 ,4,4,3,4,3,4,4,4,4,4,3,4,4,3,3,1,3,2,1,3,4,3,1,1,1)
> champFrance_nogoals["Mathieu Valbuena",] <- columns_valbuena

> acm_valbuena <- MCA(champFrance_nogoals, quali.sup=c(2,3,4), ind.sup=912)
> plot.MCA(acm_valbuena, invisible = c("var","ind"), col.quali.sup = "red", col.ind.sup="darkblue")
> plot.MCA(acm_valbuena, invisible = c("var","ind"), col.quali.sup = "red", col.ind.sup="darkblue", axes=c(2,3))

Les deux dernières lignes permettent de représenter Mathieu Valbuena sur les axes 1 et 2, puis 2 et 3 :

Axes factoriels 1 et 2 avec Mathieu Valbuena en point supplémentaire (cliquer pour agrandir)
Axes factoriels 1 et 2 avec Mathieu Valbuena en point supplémentaire (cliquer pour agrandir)
Axes factoriels 2 et 3 avec Mathieu Valbuena en point supplémentaire (cliquer pour agrandir)
Axes factoriels 2 et 3 avec Mathieu Valbuena en point supplémentaire (cliquer pour agrandir)

Résultat de notre analyse : Mathieu Valbuena a plutôt un profil offensif (gauche de l’axe 1), mais possède un bon niveau général (sa projection sur la deuxième bissectrice est assez élevée). Il possède également de bonnes aptitudes techniques (centre de l’axe 3). Enfin, ses qualités semblent plutôt bien convenir aux postes de milieu offensif (MOC) ou milieu gauche (MG). Avec quelques lignes de code, on peut trouver les joueurs du championnat dont le profil est le plus proche de celui de Valbuena :

> acm_valbuena_distance <- MCA(champFrance_nogoals[,-c(3,4)], quali.sup=c(2), ind.sup=912, ncp = 79)
> distancesValbuena <- as.data.frame(acm_valbuena_distance$ind$coord)
> distancesValbuena[912, ] <- acm_valbuena_distance$ind.sup$coord

> euclidianDistance <- function(x,y) {
 
 return( dist(rbind(x, y)) )
 
}

> distancesValbuena$distance_valbuena <- apply(distancesValbuena, 1, euclidianDistance, y=acm_valbuena_distance$ind.sup$coord)
> distancesValbuena <- distancesValbuena[order(distancesValbuena$distance_valbuena),]

# On regarde les profils des 5 individus les plus proches
> nomsProchesValbuena <- c("Mathieu Valbuena", row.names(distancesValbuena[2:6,]))

Et l’on obtient : Ladislas Douniama, Frédéric Sammaritano, Florian Thauvin, N’Golo Kanté et Wissam Ben Yedder.

Il y aurait plein d’autres choses à dire sur ce jeu de données mais je préfère arrêter là cet article déjà bien long 😉 Pour finir, gardez à l’esprit que cette analyse n’est pas vraiment sérieuse et sert surtout à présenter un exemple sympathique pour la découverte de FactoMineR et de l’ADD.

 

[Games] Quels mots faut-il jouer à Motus ?

Après avoir tenté de percer les mystères des mots des Chiffres et des Lettres, nous allons nous attaquer à un autre jeu emblématique de France Télévisions : Motus ! Est-ce que l’analyse statistique du dictionnaire français va nous permettre de trouver des astuces pour mieux jouer à ce jeu et plus facilement trouver les mots cachés ?

Un bref rappel des règles

Le jeu de motus est basé sur un mélange entre les jeux de lettres (Scrabble, etc.) et le jeu de Mastermind, qui consiste à deviner une combinaison de couleurs en le moins de coup possibles : à chaque étape, le joueur tente une combinaison et le maître de jeu indique si des couleurs font partie de la combinaison choisie et si elles sont à la bonne position.

Pour motus, le principe est adapté de la façon suivante : un mot est à deviner. Il peut faire 7, 8, 9 ou 10 lettres (parfois 6 dans certaines variantes du jeu, par exemple pour les enfants). La première lettre du mot est toujours donnée : il faut deviner le mot le plus rapidement possible, et toujours en moins de 6 coups. Pour cela, lorsqu’un mot acceptable (c’est à dire dans le dictionnaire, commençant par la bonne lettre, et de la bonne longueur) est donné, des informations sur chacune des lettres sont donnés. Si la lettre est à la bonne place dans le mot à deviner, elle est encadrée de rouge. Si elle n’est pas à la bonne place, mais qu’elle est bien dans le mot à deviner, elle est encerclée de jaune. Par exemple, pour le mot suivant :

Obtenue

Il faut donc deviner un mot de 7 lettres commençant par O. Notre tentative, OBTENUES, nous permet d’apprendre que le mot commence par OB, et qu’il y a un E dans le mot à deviner. Mais nous apprenons aussi que le mot à deviner n’a pas de T, de N ou de U, et qu’il n’y a qu’un seul E. C’est déjà beaucoup d’informations ! En rajoutant un autre mot, on a un peu de chance :

Obliger

On a 6 des 7 lettres, et il reste donc deux mots possibles : OBLIGES et OBLIGÉE. Or, on a appris avec le premier mot qu’il n’y a qu’un seul E. Le mot à deviner est donc :

Obligés

Le meilleur mot

On voit bien que le choix du premier mot nous a permis de choisir le bon mot au troisième essai. La question que nous allons nous poser ici est la suivante : existe t-il des mots meilleurs que d’autres à utiliser en “ouverture”, c’est à dire au premier coup ? Pour y répondre, il va falloir bien définir ce que nous entendons par “meilleur”. L’approche que nous allons utiliser ici est celle de la minimisation du nombre de possibles une fois que le mot est joué. Concrètement, plaçons nous dans un exemple simple où les codes qu’on pourrait deviner sont les suivants :

1112
1113
1114
1234
1999

Si l’on joue 1999, hormis si l’on a un coup de chance et que c’était le code à deviner, on va avoir comme information que le premier “1” est bien placé, mais que les trois “9” ne sont pas présents dans le code à deviner : on n’a aucune information utile pour la suite du jeu. En revanche, si on joue 1234, les réponses possibles seront les suivantes :

Codes

On voit alors qu’avec un seul coup, on sait exactement quel est le code caché. Le choix de 1234 plutôt que 1999 semble ainsi meilleur. Dans le cas de Motus, on va regarder si certains mots à jouer en premier permettent de limiter les choix parmi lesquels le mot caché peut se retrouver. Concrètement, on s’attend à ce que AUTORISE, qui contient plusieurs voyelles différentes, un T, un R, et un S, sera plus informatif que AGARAGAR, qui est une répétition des mêmes voyelles et avec des G qui sont des consonnes rares.

Nous allons donc parcourir tous les mots possibles à jouer au premier coup. Pour chacun d’entre eux, on souhaite calculer un score qui correspond au nombres de mots moyens qui restent possibles après les informations obtenues après avoir joué son premier coup. Concrètement, ce score se calcule en regardant tous les mots cachés possibles, et on compte à chaque fois combien de mots sont encore possibles.

Mais nous n’allons pas nous limiter à un seul mot, car pour certaines des lettres, cela n’est pas suffisant ! Nous poursuivons ainsi en analysant pour les meilleurs “premiers coups”, quels sont les bons seconds choix, puis troisièmes, afin de garantir une facilité de découverte du mot final.

Résultats

7 lettres
ACTIONS AMPLEUR ABREGEE
BURSITE BALCONS BRIDGER
CARTONS CHIPEUR COMBLEE
DIRECTS DEVALUE DUMPING
ENCULES ETIRAGE EPOXYDE
FARINES FLUCTUE FIBROME
GRATINS GOLFEUR GAMBADE
HURLANT HOSPICE
INSURGE IMPACTS IDOINES
JESUITE JOURNAL
KASCHER KARTING
LUTINER LASCIVE
MARTINS MODULEE
NAUTILE NOCIVES
OBSTRUE ORDINAL
PASTOUR PELVIEN PROCEDE
QUALITE QUINTES
RANIMES RECOLTE REPERDU
SAURETS SINOPLE SMICARD
TAMISER TOLUENE TRICARD
URBAINS UNICITE
VALIDES VENGEUR
WILDCAT WALLABY
YAOURTS YAKUZAS
ZAIROIS ZAPPANT
8 lettres
ADROITES ANTICLUB AMPERAGE
BASCULER BEOTIENS BOURGADE
CARLISTE COMPOUND CHANVRES
DECLINER DOMPTAGE DEFAVEUR
ENTOURES EMPILAGE EXCEDENT
FAUTRICE FIGNOLES
GALIOTES GONFLEUR
HUMANITE HARCELES
INSULTES IMPAVIDE INCONGRU
JALOUSER JUNGIENS
KALMOUKS KACHOUBE
LUSTRAGE LINOLEUM
MANITOUS MORCELEE
NATURELS NEGOCIEE
OCULAIRE OBSEDANT
PRALINES POUCETTE PEGAMOID
QUANTITE QUELQUES
RALINGUE REPORTES RECESSIF
SARDOINE SCULPTES
TAULIERS TRONCHER
URANISTE UFOLOGIE
VAURIENS VITILIGO
WARNINGS WAGONBAR
XIPHOIDE
YACHTMAN YACHTING
ZAIROISE ZAIBATSU
9 lettres
ANTICORPS AMPLITUDE
BOUCLIERS BADMINTON
CONTIGUES CHAMELIER
DECANTEUR DIPLOMEES
ENTOURAGE ECLIPSEES
FORMALITE FECONDEES
GALOPINES GRATITUDE
HURLANTES HEDONISTE
INTERLUDE IPSOFACTO
JAPONISER JOUISSIFS
KAYAKISTE KAMIKAZES
LANGOUSTE LUCRATIVE
MAROCAINS MULTITUDE
NATURISME NORMALITE
OUTRANCES OLYMPIADE
PRODUITES PLACEMENT
QUANTIEME QUENOTTES
RALINGUES RECOMPTER
SURACTIVE SOULIGNES
TRACTIONS TELEGUIDE
ULTRASONS UKRAINIEN
VIRULENTS VAGABONDE
WAGNERIEN
XENOPHOBE
YACHTCLUB
ZIGOUILLE ZAIROISES
10 lettres
ANTIODEURS ACCEPTABLE
BRILLANCES BOUGREMENT
CONSTITUER CALVINISME
DESACTIVER DECOUPLAGE
ENCAGOULES EXPEDITEUR
FIGURANTES FALCIFORME
GRIMPANTES GRENOUILLE
HONORAIRES HEMATOCELE
INTERLOPES INDICATEUR
JANISSAIRE JACASSANTE
KANGOUROUS
LUXURIANTS LOCOMOBILE
MATRICULES MODERNISME
NOVATRICES NAPHTALENE
ORIENTEURS OMBILICALE
PREDICANTS PORTEPLUME
QUANTIEMES QUADRANGLE
RECAPITULE REVIGOREES
SARDONIQUE SIMPLISTES
TRAINGLOTS TUMESCENCE
ULTRACHICS UKRAINIENS
VARIATIONS VALDINGUER
WAGONSALON
XENOPHOBES XENOGENESE
YACHTWOMAN
ZENITHALES

[Sports] On peut rater une flèche aux JO

En cette période de Jeux Olympiques d’été, c’est l’occasion de regarder à la télévision sur des chaînes de grande écoute et à des heures décentes (modulo le décalage horaire !) des sports méconnus du grand public. Nous avons déjà parlé ici du biathlon (en ce qui concerne les JO d’Hiver, qu’on retrouvera en 2018), mais ce billet va parler d’un autre sport : le tir à l’arc. Le but du tir à l’arc est de placer ses flèches sur une cible, assez souvent très éloignée, dans des cercles concentriques qui valent de plus en plus de points au fur et à mesure qu’on se rapproche du centre, de 1 à 10 (voire 0 si l’on rate la cible, ce qui est assez rare aux JO !).

Les règles semblent simples, mais il y a une petite subtilité qui est apparue cette année. En effet, jusqu’à présent les archers tiraient quatre volées de trois flèches chacun, de façon alternée, et on sommait les points obtenus : celui qui avait le meilleur score était qualifié pour la manche suivante. En cas d’égalité, une flèche était tirée pour chaque archer, et le plus proche gagne le match.

Les nouvelles règles mettent en avant la notion de “set” : désormais, chaque volée de trois flèches est considérée de façon indépendante. L’archer qui a un meilleur score que son adversaire à la fin d’un set marque 2 points, et en cas d’égalité au set, les deux marquent 1 point, sachant que le match se joue en 6 points. On joue alors cinq sets, et si personne n’est arrivé à 6 à la fin de ces cinq sets, chacun tire une flèche et la plus proche gagne le match.

Selon les journalistes sportifs de France Télévisions, ces nouvelles règles permettent à un tireur de rattraper un mauvais tir (c’est à dire un tir en dessous du 8, à ce niveau de compétition) plus facilement que lorsque l’on somme la totalité des points, où une flèche ratée pénalise toute la partie. Nous allons à l’aide d’un exemple et de quelques simulations vérifier si cette affirmation est vraie.

Considérons deux archers, Arthur et Bastien. Les deux archers ont un niveau équivalent, mais ils n’ont pas le même profil : Arthur ne met jamais de flèches en dessous de 8, mais tire souvent dans le 8. Bastien, lui, peut rater un tir et toucher un 5 ou un 7, mais arrive plus souvent à toucher la partie jaune de la cible (9 ou 10). Plus précisément, leurs chances pour chaque tir sont les suivantes :

Flèche Arthur Bastien
1 à 4 0 % 0 %
5 0 % 2 %
6 0 % 0 %
7 0 % 1 %
8 50 % 40 %
9 40 % 47 %
10 10 % 10 %

Un rapide calcul permet de constater que pour les deux archers, chaque flèche rapporte en moyenne 8,6 points. Ils ont donc bien un niveau comparable. Nous allons maintenant simuler plusieurs dizaines de milliers de matchs en suivant les deux jeux de règles possibles afin de déterminer qui gagne, et si Bastien est bien favorisé par les nouvelles règles. Les résultats obtenus sont les suivants :

Règles Arthur gagne… Bastien gagne…
Somme totale 48,2 % des matchs 51,8 % des matchs
Jeu par sets 44,2 % des matchs 55,9 % des matchs

Cela se confirme donc bien : les nouvelles règles favorisent Bastien, qui rate de temps en temps son tir, et permettent donc plus facilement de revenir dans le match après une flèche ratée. Cela permet également un suspens plus important, car rien n’est jamais joué d’avance !

[Geekery] Dodging 9s

Today I found via FiveThirtyEight a riddle about arithmetic progressions: it’s called “Dodging 9s”. The question is to find the longest arithmetic progression (which means a collection of numbers in which each number is equal to the precedent plus some constant number (called the common difference), for instance 4 7 10 13 16) in which there is no 9 in any number. The repartition of the integers which contain a 9 is shown in the following figure, where the first row is 1 to 100, the second 101 to 200 and the last 9 901 to 10 000.

This repartition leads me to think that the progression must be built around the idea that it should avoid the black areas by making a “jump” over the portion of the integers which contains a 9. For instance, the progression 8 32 56 80 104 128 152 176 200 224 248 272 avoids the 90s and the 190s (but not the 290s, sadly). In order to determine the best progression, I will use R to calculate the length of the acceptable progression for multiple starting points and common difference. The following functions use regex in order to compute the length of the longest acceptable progression with these parameters:

nine  0) {return(1)}
  else {return(0)}
}

progression_length

Using this function on values bewteen 1 and 10 000 for the starting point and the common difference of the progression allows us to determine the maximum length achievable (within these parameters!). It appears that the longest one is the progression starting at 1 with a common difference of 125, which is :

1  126  251  376  501  626  751  876 1001 1126 1251 1376 1501 1626 1751 1876 2001 2126 2251 2376 2501 2626 2751 2876
3001 3126 3251 3376 3501 3626 3751 3876 4001 4126 4251 4376 4501 4626 4751 4876 5001 5126 5251 5376 5501 5626 5751 5876
6001 6126 6251 6376 6501 6626 6751 6876 7001 7126 7251 7376 7501 7626 7751 7876 8001 8126 8251 8376 8501 8626 8751 8876

and which is represented in the following graph by the grey tiles:

Adding one more term to the progression leads to 9001, which obviously contains a 9. This little exploration is of course no proof of any maximum length, but it shows that my hypothesis of some “jumps” over the 9 areas wasn’t wrong!

[Sports] What the splines model for UEFA Euro 2016 got right and wrong

UEFA Euro 2016 is over! After France’s heartbreaking loss to Portugal in the Final, it’s now time to assess the performance of our “splines model“. On the main page of the project you can now find the initial predictions we made before the start on our competition. I also added a link to the archives of the odds we updated after each day (EDIT: I realize I made a mistake with a match that was played on Day 2, I’ll correct this asap – results should not be altered much though.)

screenshot Euro 2016
Screenshot predictions Euro 2016

What went well (Portugal, Hungary, Sweden)

Let’s begin with our new European champions: Portugal. They were our 5th favorite, with an estimated 8.3% chance of winning the title. To everyone’s surprise (including ours to be honest 😉 ), they finished 3rd in group F. However, the odds of this happening were estimated at 20%, so we can hardly say the splines model was completely stunned by this outcome! In fact, except for the initial draw against Iceland, we had all calls correct for Portugal games!

Hungary were described by some as the weakest team of the tournament, so by extension as the weakest team of group F. But they won it! Our model didn’t agree with those pundits, estimating the chances of advancing to the second round for Gábor Király‘s teammates at almost 3 out of 4.

Sweden certainly had one of the best players in the world with Zlatan Ibrahimovic. But our model was never a fan of their squad, and they did end up at the last place in group E. Similarly, Ukraine was often referred to as a potential second-rounder but ended up at the last place (losing all their games), which was the most likely outcome according to the splines model.

What went wrong (Iceland, Austria, England)

Austria were seen by the splines model as outsiders for this competition (4.7% of becoming champs – for instance, Italy’s chances were estimated at 4.2%). We evaluated their chances of advancing to the second round to be greater than 70%. They ended up at the last place of Group F with a single point.

On the contrary, Iceland were seen as one of the weakest teams of the competition and a clear favorite for last place in Group F. Eventually, they were astonishingly successful! On their way to the quarter-finals, they eliminated England. Our model gave England a good 85% probability to win the match. But, surprising as it was, this alone does not prove our model was not reliable (more on upsets on the next paragraph). Yet we can’t consider the projections for the Three Lions other than a failure, because they also ended up second in group B when we thought they would easily win the group.

Spain lost in round of 16 to Italy and in the group phase to Croatia. The estimated probabilities for these events were 40% and 16%.

Hard to say

We almsot included Turkey in the previous paragraph: after all, we gave them the same chances as Italy for winning the tournament, and we estimated their odds of advancing to the round of 16 to more than 70%, yet they failed. In addition, their level was described by experts as rather poor. But paradoxically, the splines model had all calls correct for Turkey games! What doomed them was the 3-0 loss against the defending champions, Spain. With a final goal average of -2 and 3 points, they couldn’t reach the second round as one of the four best thirds.

Wales unexpectedly beat Belgium, one of our favorites, in quarter-finals. But is this a sign of a bad model or bad luck? Upsets happen, and they’re not necessarily a sign that a team’s strength was incorrectly estimated.

Home field advantage

Our model stood out from others (examples here, here or here) on predictions for France. As a matter of fact, it valued much less home field advantage than the other models. But France didn’t win the Euro! Similarly, nearly all models predicted a Brazil victory in World Cup 2014, mostly because of home field advantage… and we all know what happened!

To us, it is unclear whether home field advantage during Euro or the World Cup can compare to home field advantage for a friendly match or a qualifier. I hope someone studies this particular point in the future!

Conclusion

We had a lot of fun building this model and it helped us enjoy the competition! I hope you guys enjoyed it too!

[Sports] L’adversaire des bleus en 8èmes

Après la première place du groupe acquise par l’équipe de France, Baptiste Desprez de Sport24 se demandait aujourd’hui quel est l’adversaire le plus probable pour les Bleus en huitièmes.

Ça tombe bien, on dispose d’un modèle capable de calculer des probabilités pour les matches de l’Euro. Je vous laisse lire l’article de Sport24 si vous voulez comprendre toutes les subtilités concoctées par l’UEFA pour ce premier Euro à 24. Nous, on va se contenter de faire tourner le modèle pour obtenir les probabilités. On obtient (avec arrondis) :

Irlande du Nord : 72% ; République d’Irlande : 14% ; Allemagne : 8% ; Belgique : 4% ; Pologne : 2%

probas_huitiemes

Voilà, il est extrêmement probable que le prochain adversaire de l’équipe de France se nomme “Irlande” 🙂 . Curieusement, la probabilité de rencontrer l’Allemagne est bien plus forte que de rencontrer la Pologne, alors même que le modèle donne une forte probabilité pour que l’Allemagne termine première de son groupe devant la Pologne… C’est complexe un tableau de l’Euro ! On va quand même croiser les doigts pour ne pas croiser la route de Müller et cie aussi tôt dans le tableau !

Il est également amusant de constater que, bien que ce soit possible, un huitième contre une équipe du groupe D (Tchéquie, Turquie ou Croatie) est hautement improbable (<0.2% de chances d’après les simulations). Il semblerait que les configurations permettant à ces équipes de se qualifier en tant que meilleurs troisièmes sont incompatibles avec les configurations les envoyant en huitième contre la France. Si un opérateur vous proposait ce pari, je ne saurais trop vous conseiller de l’éviter 😉