A shiny app to convert sports scores

I’m a huge sports fan, but I certainly don’t have extended knowledge about all team sports. Sometimes when I hear about scores in a sports I’m not quite “fluent” in, I wonder how they would translate in a sports I know better. I guess many people ask the same question from time to time. For instance, three years ago, many americans started wondering how the 7-1 blowout that happened during the World Cup semifinals would translate in basketball, football or hockey. ESPN first came up with an absurd answer, and then Neil Paine of FiveThirtyEight wrote a much more sensible paper on the question.

I created a shiny app that finds a statistical equivalent of a game score in one sports in other sports:

The program is very simple, let me show you on an example how it works. Suppose you want to know how a 103 – 97 home win in basketball translates in other sports.

The program starts by computing the score difference between the two teams (103-97 = +6), and looks how many basketball games have ended with a home team win by 6 points or less. In this case, the number is 30.7% of games.

Histogram and density of score differences in basketball games

Then the program looks among the home wins in other sports what score difference corresponds to the same 30.7% (the 30.7% quantile). This corresponds to +1 in soccer and hockey and +6 in football.

Finally, it does the same operation by comparing the offensive score of the winning team. In 50.4% of basketball games, the home team scores 103 points or less when it wins, which corresponds to 2 scored goals in soccer, 4 in hockey and 28 points scored in football. The final result is thus:

The full code of the shiny app is available on the GitHub page of the project. The dataset is made of all NBA, NHL, NFL and Champions League games since the year 2000. If you want to see other sports, make a pull request or ping us on Twitter or Mastodon!

Marges d’erreurs, approche modèle et sondages

Si cette élection présidentielle aura permis quelque chose, c’est bien d’avoir des discussions intéressantes sur les sondages ! Cette course à quatre est inédite dans l’histoire de la Vème République, et avec les grosses surprises de l’actualité récente (Trump et Brexit), il est normal de s’interroger sur l’incertitude réelle contenue dans ces données de sondages. Je propose donc de parler aujourd’hui des “marges d’erreurs” (dits aussi “intervalles de confiance à 95%”) qui ont pour but de quantifier cette incertitude. Je proposerai aussi une idée pour estimer une marge d’erreur prenant en compte à la fois les sondages (“le plan”) et l’évolution du paysage politique (“le modèle”).

Les “marges d’erreur” légales

Commençons par le début : aujourd’hui, on utilise une formule simple pour estimer les marges d’erreur d’un sondage : on prend le chiffre estimé et on effectue +/- deux fois l’erreur-type du sondage aléatoire simple de même taille. Malheureusement, ce mode de calcul ne repose sur aucun socle mathématique. La méthode utilisée par les instituts français, le sondage par quotas est en réalité très éloigné d’un sondage à probabilités égales, et les marges d’erreurs calculées ainsi ne correspondent pas à grand chose. C’est embêtant pour deux raisons qui peuvent sembler contradictoire :
– l’erreur aléatoire du sondage par quotas est probablement plus faible que celle utilisée pour calculer les marges (ce qui a amené des débats sur le “herding”)
– l’erreur totale est sans nul doute plus forte, car elle contient d’autres termes en plus de l’aléatoire (“vote caché”, profils difficiles à joindre, formulation des questions non neutres, etc.)

Le plan et le modèle

En plus de ces erreurs de mesure, on comprend bien que l’intention de vote sous-jacente des électeurs peut être elle-même variable ! Pour comprendre mieux ce dont on est en train de parler, on peut utiliser la formalisation suivante, empruntée à Binder et Roberts et illustrer avec le sondage politique :

Chaque observation à un instant t des intentions de vote consiste en un sondage en deux phases :

  • 1ère phase (modèle) : les intentions de vote des français varient en fonction des événements et du temps. Ce phénomène (supposé aléatoire) produit une population (ou “super-population”) de taille N = 47 millions, le nombre d’inscrits sur les listes électorales.
  • 2ème phase (plan) : les sondeurs sélectionnent n personnes de la population (typiquement n = 1000) et mesurent les intentions de vote à l’instant t, avec une certaine erreur de mesure.
    Comme le notait récemment Freakonometrics, il est difficile de vraiment séparer les deux phénomènes, et ne prendre en compte que l’erreur d’échantillonnage comme c’est fait aujourd’hui est très peu satisfaisant.
Approche en deux phases modèle / plan selon Binder – Roberts

Notez que l’avantage de la formalisation en deux phases choisie ici est que l’on a :

Erreur totale = Erreur modèle + Erreur de sondage

Une idée simple pour estimer ces marges

Pour le deuxième terme, faute de mieux, on va conserver l’erreur de sondage telle qu’elle est calculée aujourd’hui (avec la formule du sondage aléatoire simple) : elle sur-estime l’erreur aléatoire mais ça n’est pas plus mal car cela permet de prendre en compte au moins en partie l’erreur de mesure (voir ce post qui en parle de façon plus détaillée)

Le premier terme est le plus intéressant ! Une idée très simple pour prendre en compte le modèle et l’erreur de sondage : mettre à profit les deuxièmes choix des électeurs, information que l’on retrouve dans un certain nombre d’enquêtes cette année (par exemple chez Ipsos, en page 11 de ce document). L’idée est que si des événements se produisent qui peuvent faire évoluer les intentions de vote, les électeurs auront tendance à se reporter sur leur deuxième choix plutôt que de changer totalement d’avis. Petite remarque : il faut bien intégrer dans ces choix potentiels la possibilité de l’abstention ou du vote blanc, qui ont bien entendu une influence sur la précision des estimations.

Cette idée permettrait d’intégrer la composante modèle à peu de frais ! Reste bien sûr la question de la quantification, mais je me dis que des règles naïves peuvent suffire à obtenir des estimations d’erreur de bonne qualité. Je serais très curieux de savoir si une définition pareille permet de construire des intervalles de confiance avec de bonnes propriétés de couverture. Je crains cependant que les données de deuxième choix des candidats soient peu disponibles pour les présidentielles précédentes.

Le modèle de “Too close to call” prend justement en compte ces information, et obtient des marges d’erreur très intéressantes :

Distribution de probabilité des scores – modèle Too close to call

Ces marges reflètent en particulier la relative “sûreté” du score de Marine Le Pen, qui semble posséder une base fidèle ; le score d’Emmanuel Macron semble lui beaucoup plus incertain.

Les sondeurs se copient, vraiment ? (le herding)

Un tweet de Nate Silver posté ce lundi semble avoir déchaîné les passions de nombreux observateurs :

Dans ce gazouillis, Nate Silver (célèbre analyste statistique américain, rédacteur en chef du site fivethirtyeight.com) remarque que les estimations des intentions de vote par les instituts de sondage français sont assez proches les unes des autres, et suggère que cela est dû au fait que les sondeurs se “copient” les uns les autres (afin de limiter le risque d’être le seul institut proposant un résultat très éloigné du score final).  Il nomme ceci le herding.

Un article publié dans The Economist hier lui emboîte le pas en s’intéressant notamment au cas de l’estimation du score de Marine Le Pen. Les autres tentent de montrer que la corrélation qu’on observe entre les différents résultats est improbable au sens statistique du terme, et en concluent qu’il y a nécessairement une intervention.

J’ai quelques doutes sur la validité de cette analyse.

Erreur en sondages

L’erreur totale des sondages est composée de deux termes :

Erreur totale de mesure = Erreur d’échantillonnage + Erreur d’observation

  • L’erreur d’échantillonnage vient du fait qu’on ne demande pas leur intention de vote à tous les français mais à seulement un petit nombre d’entre eux, typiquement entre 1000 et 2000 (cela a un coût, que l’on paye en précision). C’est l’erreur aléatoire. On suppose généralement que les tirages sont indépendants et, faute de mieux, on estime cette erreur en utilisant la variance du sondage aléatoire simple de même taille d’échantillon. Rappelons que procéder ainsi ne repose sur aucune règle mathématique rigoureuse !
  • L’erreur d’observation regroupe beaucoup de choses diverses qui ne sont pas vraiment quantifiables, mais qui ont une importance. Par exemple, l’influence de la formulation des questions, la sous-déclaration de votes “honteux”, etc. Notons qu’il y a de fortes chances pour que cette erreur d’observation soit très corrélée entre les instituts de sondage : si vous ne souhaitez pas dévoiler votre vote à un sondeur, je doute que cela change suivant que ledit sondeur travaille pour l’Ifop ou la Sofres.

Ainsi, l’étonnement des auteurs concerne l’erreur aléatoire d’échantillonnage – et c’est bien celle qui est considérée dans leur “test statistique”.

La spécificité française : quotas et redressement

Pour un sondage américain typique, la réflexion fonctionne très bien car l’erreur d’échantillonnage estimée en utilisant la formule du sondage aléatoire simple est en général une sous-estimation de l’erreur d’échantillonnage réelle. L’article original de Nate Silver sur le herding est convainquant à cet égard.

Pour un sondage politique français, c’est beaucoup plus compliqué car les méthodes utilisées (notamment les quotas et l’utilisation intensive de redressements) sont très différentes des méthodes américaines ! La méthode des quotas et le redressement permettent, lorsque les variables mises en jeu (âge, géographie, catégorie socio-professionnelle et vote passé principalement) expliquent correctement le phénomène mesuré (les intentions de vote pour dimanche), de réduire sensiblement l’erreur d’échantillonnage.

De plus, j’ai “l’intuition” que le mode de sélection par quotas et le redressement (qui ne sont en fait pas aléatoire) peuvent eux-mêmes conduire à une corrélation des erreurs d’échantillonnage entre les instituts. J’espère vraiment avoir l’occasion dans des travaux futurs de proposer un modèle pour pouvoir tester cette idée ! La littérature sur les sondages par quotas est très peu développée et on ne peut que le regretter.

Ces deux arguments montrent que la variabilité des sondages “attendue” par les auteurs de l’article de The Economist est peut-être bien plus importante que leur variabilité réelle. Leur “probabilité” estimée que les sondages n’aient pas subi d’intervention est donc à mon avis très largement surestimée, et leur conclusion me semble hâtive.

Autrement dit à propos de leur méthodologie : le fait que peu de sondages sortent des marges d’erreur ne montre pas nécessairement que les sondeurs “trichent”, mais tout simplement… que leurs marges d’erreur sont mal calculées !

Reste… le risque !

Agrégé des estimations d’intentions de vote – Will Jennings and Chris Wlezien, The Economist

Il reste que cette corrélation entre les résultats est à double tranchant. Rien ne garantit que l’erreur totale des sondages français est inférieure à l’erreur totale des sondages américains. En résumé, la méthode française est sans doute plus risquée : il y a des chances que les résultats soient plus précis qu’avec la méthode “américaine”, mais en contrepartie, s’il y a une erreur, tous les sondages seront éloignés de la réalité à la fois ! Etant donné que la course à quatre de cette année est inédite dans l’histoire de la Vème République, rien ne garantit que l’on n’ait pas une grosse surprise dimanche à 20h !

A bientôt pour un post sur les marges d’erreur en sondages politique !

Illustrations : graphiques de l’article de The Economist, par Will Jennings et Chris Wlezien. Je ne possède pas les droits de ces images.

Sampling graphs – MAD-Stat Seminar at Toulouse School of Economics

Tomorrow (march 23rd), I’ll be presenting my work on sampling designs for graph (and particularly extension sampling designs, with an application to Twitter data) at the MAD Stat seminar of the Toulouse School of Economics. Here are my slides:

 

Announcing Icarus v0.3

This weekend I released version 0.3.0 of the Icarus package to CRAN.

Icarus provides tools to help perform calibration on margins, which is a very important method in sampling. One of these days I’ll write a blog post explaining calibration on margins! In the meantime if you want to learn more, you can read our course on calibration (in French) or the original paper of Deville and Sarndal (1992). Shortly said, calibration computes new sampling weights so that the sampling estimates match totals we already know thanks to another source (census, typically).

In the industry, one of the most widely used software for performing calibration on margins is the SAS macro Calmar developed at INSEE. Icarus is designed with the typical Calmar user in mind if s/he whishes to find a direct equivalent in R. The format expected by Icarus for the margins and the variables is directly inspired by Calmar’s (wiki and example here). Icarus also provides the same kind of graphs and stats aimed at helping statisticians understand the quality of their data and estimates (especially on domains), and in general be able to understand and explain the reweighting process.

Example of Icarus in RStudio
Example of Icarus in RStudio

I hope I find soon the time to finish a full well documented article to submit to a journal and set it as a vignette on CRAN. For now, here are the slides (in French, again) I presented at the “colloque francophone sondages” in Gatineau last october: https://nc233.com/icarus.

Kudos to the CRAN team for their amazing work!

A winning strategy at the lottery

tl;dr – It is possible to construct a winning strategy at the lottery by choosing the numbers that other people rarely select. We discuss this and prove it on a small example.

 

There are many things I don’t like with so-called math reasoning and lotteries, and I wanted to write about it for a very long time. So, on the one hand we have the classic scammers who try to sell you the “most probable numbers” (or alternatively the “numbers that are due”). Of course, neither strategy is mathematically valid (because the draws are independent). On the other hand, many “educated” and “rational” people argue that, given that the expected value of a lottery ticket is negative (because the probability of wining a prize at the lottery is very low), smart people should never buy lottery tickets.

Comic by Zach Wiener, http://www.smbc-comics.com
Comic by Zach Wiener, http://www.smbc-comics.com

Now what if we could find a (mathematically correct!) strategy to make the expected value of our ticket positive? The idea is to choose the numbers that other players choose the least often, so that when we win a prize, it will be divided among fewer other players. But will it be enough to make a significant difference?

The example

Let’s consider a lottery where players have to choose 6 numbers out of 19. The total number of players is 10000. The favorite numbers of the players are 1, 2, 3, 4, 5 and the least favorite are 15, 16, 17, 18, 19. They are respectively selected 2 times more often and 2 times less often than the other numbers 6 –  14. The company who runs the lottery decides to give the players back 90 percent of the amount of the tickets (thus ensuring a 10% profit) depending on the number of numbers they have chosen that also are in the right combination:

  • 0 or 1 correct number: 0%
  • 2 correct numbers: 42%, shared with other winners
  • 3 correct numbers: 10%, shared with other winners
  • 4 correct numbers: 3%, shared with other winners
  • 5 correct numbers: 4%, shared with other winners
  • 6 correct numbers (the jackpot): 40%, shared with (the eventual) other winners

Then we compute the expected value for each ticket that was bought. You can find the R code I used on my GitHub page. I plotted the expected gains against an indicator of the rarity of the combination chosen by each player (the harmonic mean of the inclusion probabilities):

 

Expected gains wrt a measure of the frequency of the combination chosen

As we predicted, the expected gains are higher if you chose an “unpopular” combination. But what impresses me most is the order of magnitude of the effect. It is indeed possible to find a combination that yields a positive expected value (points on the left that are above the red line)!

Further work

I have no idea how all this works when we change the parameters of the problem: numbers to choose from (49 in France for example), number of players, choices of the players (inclusion probabilities of the numbers), payoffs, etc. I bet that the shape of the curve remains the same, but I wonder how high the expected value can get for the rarest combinations, and if it is always possible to find a winning strategy. I might try to work on an analytical solution when I find some time because I believe it involves some sampling theory.

Finally, a question to all people who never play the lottery because the expected value is negative, would you start buying tickets now that you know there exists a strategy with positive expected value?

Comic by Zach Wiener, http://www.smbc-comics.com
Comic by Zach Wiener, http://www.smbc-comics.com

PS: Henri pointed out chapter 11 of Jordan Ellenberg’s “How not to be wrong” which deals with interesting mathematical facts about the lottery, including a similar discussion as this post. Be sure to check it out, it’s really great!

[24] Générateur automatique de prénoms

Il est né le divin enfant ! Oui, mais comment va-t-on l’appeler ?  Comme nous l’avons remarqué dans un post précédent du calendrier de l’avent, depuis 1993 le choix des prénoms est “libéralisé” en France. Dès lors, pourquoi ne pas chercher de nouveaux prénoms à l’aide d’une méthode mathématique ? Suivant une idée développée dans un excellent post du blog science étonnante, nous avons créé une “machine a inventer des prénoms”, que vous pouvez tester ici :

 

Mes prénoms préférés générés par la machine pour le moment : Fauliphare et Zauli !

La machine fonctionne a l’aide d’une chaîne de Markov qui indique la probabilité de passage d’une lettre à l’autre. Les probabilités sont calculées à l’aide d’une base de données de prénoms français.

[23] Petite règle statistique pour se représenter une probabilité

Afin de me représenter ce qu’est une probabilité p (particulièrement lorsqu’elle est faible) j’utilise la petite règle suivante :

  • Si je tente l’expérience 1/p fois (arrondi à l’inférieur lorsque ce n’est pas un nombre entier), j’ai “de bonnes chances” que l’événement se réalise
  • Il me faudra attendre 3/p essais pour être “pratiquement certain” que l’événement se réalise

Si par exemple on me dit que “un français sur cinq a plus de 65 ans“, je sais qu’en prenant 5 français au hasard dans la population, j’ai de bonnes chances qu’au moins un ait plus de 65 ans parmi eux, et que je suis presque certain d’en trouver un si je sélectionne 15 français.

Il est facile de voir pourquoi ça marche : la probabilité d’obtenir au moins un succès en n lancers est :

\(\Pr(un~succes) = 1-\Pr(aucun~succes)\)

La probabilité de n’avoir aucun succès vérifie une loi binomiale de paramètre p, soit :

\(\Pr(un~succes) = 1-(1-p)^{\frac{1}{p}} = 1 – \exp ( \frac{1}{p} \log(1-p) )\)

Or, quand p est petite, on a:

\(\log(1-p) \sim -p\)

Donc finalement :

\(\Pr(un~succes) \sim 1-\exp(-1) \sim 0.63\)

De la même façon avec 3/p essais :

\(\Pr(un~succes) \sim 1-\exp(-3) \sim 0.95\)

 

On peut vérifier la qualité des deux approximations avec deux petits graphes (pour p compris entre 0 et 0.5 – au-delà de 0.5, l’arrondi de 1/p étant égal à 1, cela n’aurait plus beaucoup de sens) :

Simulation de l'approximation 1/p pour différentes valeurs de p
Simulation de l’approximation 1/p pour différentes valeurs de p
Simulation de l'approximation 3/p pour différentes valeurs de p
Simulation de l’approximation 3/p pour différentes valeurs de p

Voilà, mis à part quelques effets de seuil et le fait que l’approximation est un peu trop conservative lorsqu’on se rapproche de p = 0.5, ce n’est pas trop mal !

 

[20] Données du chômage au format “xkcd”

Aujourd’hui on reprend les données du chômage récupérées hier sur le site de l’Insee. On va transformer le graphe qu’on a créé avec ggplot2 pour le faire ressembler aux graphes de l’excellent comic xkcd. On va utiliser pour cela le package R xkcd :

install.packages("xkcd", dependencies = T)

Il faut ensuite installer la police “xkcd”. Le script suivant fait l’affaire :

library(extrafont)

download.file("http://simonsoftware.se/other/xkcd.ttf",
 dest="xkcd.ttf", mode="wb")
system("mkdir ~/.fonts")
system("cp xkcd.ttf ~/.fonts")
font_import(pattern = "[X/x]kcd", prompt=FALSE)
fonts()
fonttable()
if(.Platform$OS.type != "unix") {
 ## Register fonts for Windows bitmap output
 loadfonts(device="win")
} else {
 loadfonts()
}

Il ne reste plus qu’à modifier un peu notre graphe original et utiliser le thème theme_xkcd() dans ggplot2. Notez l’utilisation de geom_smooth à la place de geom_line afin de lisser la courbe pour renforcer l’aspect bande dessinée.

library(xkcd)
library(ggplot2)

plot_chomage <- ggplot(donnees_chomage, aes(x=TIME_PERIOD, y=OBS_VALUE)) +
 geom_smooth(colour="red", size=2, level=0, formula = y ~ poly(x, 9), method="lm") +
 xlab("Annee") +
 ylab("Taux de chomage") +
 geom_vline(xintercept = c(1993,2008), color="grey", linetype="dashed") +
 annotate("text", c(1993,2008), c(0.15), label=c("1993","2008"), 
 color="grey", family="xkcd") +
 theme_xkcd()

print(plot_chomage)
Taux de chômage en France entre 1975 et 2016 – style “xkcd”

Et voilà un graphe au style “xkcd” pour le taux de chômage en France ! Le sujet n’étant peut-être pas le plus adapté au format BD, je donne pour l’exemple le graphe des prénoms de l’article du 13 décembre que je me suis également amusé à xkcd-iser :

Part des 10 prénoms les plus populaires en France - style xkcd
Part des 10 prénoms les plus populaires en France – style xkcd

[19] Données du chômage avec R et SDMX-ML

Aujourd’hui un petit post un peu plus “pratique”. On va réaliser le graphique du taux de chômage en France depuis 1975 en utilisant R. Les données sont disponibles sur le site de l’INSEE. En suivant ce lien on va pouvoir les télécharger au format csv. Mais il est beaucoup plus sympathique d’utiliser une méthode un peu plus automatique pour récupérer ces données. Ainsi, dès que l’INSEE les mettra à jour (le trimestre prochain par exemple), il suffira de relancer le script R et le graphe se mettra automatiquement à jour.

Pour ce faire, on va utiliser la compatibilité du nouveau site de l’Insee avec la norme SDMX. Le package R rsdmx va nous permettre de récupérer facilement les données en utilisant cette fonctionnalité :

install.packages("rsdmx")
library(rsdmx)

Sur la page correspondant aux données sur le site de l’Insee, on récupère l’identifiant associé : 001688526. Cela permet de construire l’adresse à laquelle on va pouvoir demander à rsdmx de récupérer les données : http://www.bdm.insee.fr/series/sdmx/data/SERIES_BDM/001688526. On peut également ajouter des paramètres supplémentaires en les ajoutant à la suite de l’url (en les séparant par un “?”). On utilise ensuite cette adresse avec la fonction readSDMX:

url_chomage_insee <- "http://www.bdm.insee.fr/series/sdmx/data/SERIES_BDM/001688526?periodeDebut=1&anneeDebut=1975&periodeFin=3&anneeFin=2016&recherche=criteres&codeGroupe=1533"
donnees_chomage_sdmx <- readSDMX(url_chomage_insee)
donnees_chomage <- as.data.frame(donnees_chomage_sdmx)

On peut regarder la structure des données que l’on a à ce stade :

> str(donnees_chomage)
'data.frame':	167 obs. of  12 variables:
 $ IDBANK          : Factor w/ 1 level "001688526": 1 1 1 1 1 1 1 1 1 1 ...
 $ FREQ            : Factor w/ 1 level "T": 1 1 1 1 1 1 1 1 1 1 ...
 $ TITLE           : Factor w/ 1 level "Taux de chômage au sens du BIT - Ensemble - France métropolitaine - Données CVS": 1 1 1 1 1 1 1 1 1 1 ...
 $ LAST_UPDATE     : Factor w/ 1 level "2016-11-17": 1 1 1 1 1 1 1 1 1 1 ...
 $ UNIT_MEASURE    : Factor w/ 1 level "PCT": 1 1 1 1 1 1 1 1 1 1 ...
 $ UNIT_MULT       : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
 $ REF_AREA        : Factor w/ 1 level "FM": 1 1 1 1 1 1 1 1 1 1 ...
 $ DECIMALS        : Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ...
 $ TIME_PER_COLLECT: Factor w/ 1 level "PERIODE": 1 1 1 1 1 1 1 1 1 1 ...
 $ TIME_PERIOD     : chr  "2016-Q3" "2016-Q2" "2016-Q1" "2015-Q4" ...
 $ OBS_VALUE       : chr  "9.7" "9.6" "9.9" "9.9" ...
 $ OBS_STATUS      : chr  "P" "A" "A" "A" ...

Les deux colonnes qui vont nous intéresser sont “TIME_PERIOD” (date de la mesure) et “OBS_VALUE” (taux de chômage estimé). Pour le moment, ces données sont au format “caractère”. On va les transformer respectivement en “date” et en “numérique”. Notez que l’intégration du trimestre nécessite de passer par le package “zoo” (pour la fonction as.yearqtr) :

library(zoo)

donnees_chomage$OBS_VALUE <- as.numeric(donnees_chomage$OBS_VALUE)

donnees_chomage$TIME_PERIOD <- as.yearqtr(donnees_chomage$TIME_PERIOD, format = "%Y-Q%q")

Il ne reste plus qu’à utiliser l’excellent package ggplot2 pour créer le graphe. On en profite pour ajouter des lignes verticales en 1993 et 2008 (dates des deux dernières crises économiques majeures) :

library(ggplot2)
 
plot_chomage <- ggplot(donnees_chomage, aes(x=TIME_PERIOD, y=OBS_VALUE)) +
 geom_line(colour="red") +
 xlab("Annee") +
 ylab("Taux de chomage") +
 geom_vline(xintercept = c(1993,2008), color="grey", linetype="dashed") +
 annotate("text", c(1993,2008), c(0.15), label=c("1993","2008"), 
 color="grey")

print(plot_chomage)
Taux de chômage en France entre 1975 et 2016
Taux de chômage en France entre 1975 et 2016

Rendez-vous demain pour un article où on s’amusera à faire ressembler ce graphe à ceux du comic xkcd.