seq(1,20) # premiére maniere [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1:20 # Autre maniére de créer cette séquence de nombres [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
On peut écrire du texte en gras et italique. On peut ecrire des formules mathématiques en \(\LaTeX\).
Par exemple une intégrale
\[ \int_{-\infty}^{+\infty}e^{-x^2}dx=\sqrt{\pi} \]
si vous voulez exécuter les codes R, il suffit de créer un Chunk. Le chunk qui suit affiche les nombres entiers de 1 à 20.
seq(1,20) # premiére maniere [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1:20 # Autre maniére de créer cette séquence de nombres [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Si on veut afficher les années des coupes du monde de football de 1970 (Mexico) et 2026 (Amérique)
seq(1970,2026,4) [1] 1970 1974 1978 1982 1986 1990 1994 1998 2002 2006 2010 2014 2018 2022 2026
Nous allons apprendre à coder avec R en utilisant de maniére intensive le “Tidyverse”
Faisons un histogramme de la variable mpg
On commence par un histogramme trés basique et on fera ensuite du ggplotde tidyverse
dfcars$mpg |>hist(main="Histogramme de MPG pour les 32 voitures ")dfcars |>
filter(mpg >= 30 & mpg <=35) mpg cyl disp hp drat wt qsec vs am gear carb
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
library(ggthemes)
dfcars |> ggplot(aes(x = mpg)) +
geom_histogram(fill ="red",binwidth =5,col="black")+
ggtitle("Histogramme de MPG")+ylab("Nombre de Voitures")+theme_economist()library(readr)
keno_202511_5_1_ <- read_delim("keno_202511 5 (1).csv",
delim = ";", escape_double = FALSE, col_types = cols(annee_numero_de_tirage = col_skip(),
date_de_forclusion = col_skip(),
numero_jokerplus = col_skip(), devise = col_skip(),
...23 = col_skip()), trim_ws = TRUE)New names:
• `` -> `...23`
keno_202511_5_1_# A tibble: 100 × 18
date_de_tirage boule1 boule2 boule3 boule4 boule5 boule6 boule7 boule8 boule9
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 10/02/2026 12 13 17 20 22 23 26 27 39
2 09/02/2026 1 3 4 9 11 12 14 15 25
3 08/02/2026 2 7 13 19 21 23 26 29 35
4 07/02/2026 2 3 4 7 9 12 14 23 27
5 06/02/2026 1 3 7 9 12 13 14 16 30
6 05/02/2026 4 6 7 12 14 19 25 28 36
7 04/02/2026 8 11 14 16 17 18 19 23 25
8 03/02/2026 1 2 11 13 16 17 18 20 26
9 02/02/2026 5 8 10 13 16 24 26 34 41
10 01/02/2026 1 9 10 12 20 21 25 36 42
# ℹ 90 more rows
# ℹ 8 more variables: boule10 <dbl>, boule11 <dbl>, boule12 <dbl>,
# boule13 <dbl>, boule14 <dbl>, boule15 <dbl>, boule16 <dbl>,
# multiplicateur <dbl>
Ce data frame a un format wide.On va le transformer en format long qui est plus approprié pour les calculs statistiques .. Au lieu de 100 ligne et 17 Colonnes ( la date et les 16 numéros de boules) on obtiendra 1600 lignes et 3 colonnes, la colonne date, la colonne numéros et la colonne boule
# Un tible c'est une sorte de data frame spécifique au tidyverse
table4a <- tibble(
country = c("A", "B", "C"),
`1999` = c(700, 37000, 212000),
`2000` = c(2000, 80000, 213000)
)
table4a# A tibble: 3 × 3
country `1999` `2000`
<chr> <dbl> <dbl>
1 A 700 2000
2 B 37000 80000
3 C 212000 213000
table4a |> pivot_longer(cols = 2:3, names_to ="year",
values_to = "cases")# A tibble: 6 × 3
country year cases
<chr> <chr> <dbl>
1 A 1999 700
2 A 2000 2000
3 B 1999 37000
4 B 2000 80000
5 C 1999 212000
6 C 2000 213000
keno_longer<-
keno_longer<-keno_202511_5_1_|>select(-c("multiplicateur"))|>pivot_longer(cols=2:17,
names_to="boule",names_prefix="boule",values_to = "Numéro")
keno_longer# A tibble: 1,600 × 3
date_de_tirage boule Numéro
<chr> <chr> <dbl>
1 10/02/2026 1 12
2 10/02/2026 2 13
3 10/02/2026 3 17
4 10/02/2026 4 20
5 10/02/2026 5 22
6 10/02/2026 6 23
7 10/02/2026 7 26
8 10/02/2026 8 27
9 10/02/2026 9 39
10 10/02/2026 10 42
# ℹ 1,590 more rows
freq_boules<-keno_longer|>
count(Numéro, name="frequence")
freq_boules# A tibble: 56 × 2
Numéro frequence
<dbl> <int>
1 1 30
2 2 26
3 3 28
4 4 32
5 5 17
6 6 21
7 7 37
8 8 23
9 9 33
10 10 30
# ℹ 46 more rows
freq_boules# A tibble: 56 × 2
Numéro frequence
<dbl> <int>
1 1 30
2 2 26
3 3 28
4 4 32
5 5 17
6 6 21
7 7 37
8 8 23
9 9 33
10 10 30
# ℹ 46 more rows
freq_boules <-keno_longer |>
count(Numéro, name = "frequence")
freq_boules|>filter(frequence == min(frequence))# A tibble: 1 × 2
Numéro frequence
<dbl> <int>
1 5 17
keno_longer<-keno_202511_5_1_|>pivot_longer(cols=2:17,names_to ="Boule",
names_prefix = "ordre de tirage",values_to = "Numéro ")|>
mutate(Boule = str_remove(Boule, "boule"),Boule = as.integer(Boule))
keno_longer# A tibble: 1,600 × 4
date_de_tirage multiplicateur Boule `Numéro `
<chr> <dbl> <int> <dbl>
1 10/02/2026 2 1 12
2 10/02/2026 2 2 13
3 10/02/2026 2 3 17
4 10/02/2026 2 4 20
5 10/02/2026 2 5 22
6 10/02/2026 2 6 23
7 10/02/2026 2 7 26
8 10/02/2026 2 8 27
9 10/02/2026 2 9 39
10 10/02/2026 2 10 42
# ℹ 1,590 more rows
-Peut -on s’interroger sur la valeur aussi base (17) alors qu’on s’attendait à une valeur moyenne comprise entre 28 et 29 ?
-La loi du nombre de fois ou sort le “5” sur les 100 jours est une loi binomiale de paramètres \(n=100\) et \(p=16/56\). -Avec R, on peut faire tous les calculs imaginable sur les lois de probabilités
plot(0:100,dbinom(0:100,100,16/56))La densité a une forme en cloche pour des raisons qui seront expliquées plus tard.
-En Inference statistique, on répondrait à la question de savoir si le 17 est plausible grâce aux testes statistiques. Le statiscien va calculer une probalité appelée p-value. On calcule, sous l’hypothèse que le jeu n’est pas truqué, le 5 aurait la même probalité que les autres , 16/56, la probalité d’avoir un nombre de succés (17) aussi petit.On va calculer la probabilité pour qu’une loi binomiale x de parametre 100 et 16/56 sorte un numero inférieur ou égal à 17. Cela se calcule facilement.
sum(dbinom(0:17,100,16/56))[1] 0.005328807
pbinom(17,100,16/56)|>round(6)[1] 0.005329
On le fait avec une fonction
binom.test(17,100,p=16/56,alternative="less")#un test binomiale de la valeur obsevée (17),du nombre de repétion (100),nbre de bon tirage 16/54, rejet l'hypothése quant c'est petit (alternative="less")
Exact binomial test
data: 17 and 100
number of successes = 17, number of trials = 100, p-value = 0.005329
alternative hypothesis: true probability of success is less than 0.2857143
95 percent confidence interval:
0.0000000 0.2440168
sample estimates:
probability of success
0.17
Exact binomial test data: 17 and 100 Number of successes = 17, number of trials = 100 , p-value = 0,005329 alternative hypothesis: true probability of success is less than 0,2857143 95 percent confidence interval: 0,0000000 0,2440168 Sample estimates: probability of success 0,17
Le raisonnement est faux car il y’a sélection a posteriori de celui qui est sorti le moins souvent parmi les 56. On ne connait la loi de celui qui sort le moins souvent. On va simuler plusieur fois ces 100 tirages et sélectionner à chaque fois la fréquence de sortie minimale (Monte-Carlo)…
-On va tirer 16 numéro parmi 56 numéros pendant 100 jours de suite. -On va repérer la fréquence de sortie la plus faible. -On stock cette fréquence dans une liste. -Cette liste nous donnera une idée de la distribution de ces fréquence si on le fait un grand nombre de fois. -Aprés, on ira voir la fréquence de sorties inférieur ou égale au 17. Cela sera proche de la p-value correcte.
set.seed(123) # Graine du tirage aléatoire
N<-50000
valmin<-c()
for (i in 1:N)
{
numeros<-c()
for (t in 1:100 ){
numeros<-c(numeros,sample(1:56, 16, replace = FALSE))
}
table(numeros)|>min()->min
valmin<-c(valmin,min)
}
# p-value
sum(valmin<=17)/N[1] 0.26204
La p-value etait de environ de 26.15%, rien à voir avec les 0.5% annoncés avant.
table_freq <- keno_longer|>
count(`Numéro `,name = "Nombre de sorties") %>%
arrange(`Numéro `)library(knitr)
table_freq %>%
kable(
col.names = c("Numéro de la boule", "Nombre de sorties"),
caption = "Fréquence d'apparition des numéros (Keno novembre 2025)"
)| Numéro de la boule | Nombre de sorties |
|---|---|
| 1 | 30 |
| 2 | 26 |
| 3 | 28 |
| 4 | 32 |
| 5 | 17 |
| 6 | 21 |
| 7 | 37 |
| 8 | 23 |
| 9 | 33 |
| 10 | 30 |
| 11 | 28 |
| 12 | 28 |
| 13 | 38 |
| 14 | 35 |
| 15 | 21 |
| 16 | 23 |
| 17 | 33 |
| 18 | 19 |
| 19 | 38 |
| 20 | 24 |
| 21 | 29 |
| 22 | 20 |
| 23 | 29 |
| 24 | 29 |
| 25 | 27 |
| 26 | 28 |
| 27 | 36 |
| 28 | 33 |
| 29 | 26 |
| 30 | 35 |
| 31 | 29 |
| 32 | 24 |
| 33 | 24 |
| 34 | 25 |
| 35 | 29 |
| 36 | 24 |
| 37 | 29 |
| 38 | 31 |
| 39 | 27 |
| 40 | 27 |
| 41 | 38 |
| 42 | 30 |
| 43 | 25 |
| 44 | 30 |
| 45 | 25 |
| 46 | 32 |
| 47 | 31 |
| 48 | 30 |
| 49 | 32 |
| 50 | 30 |
| 51 | 30 |
| 52 | 29 |
| 53 | 32 |
| 54 | 24 |
| 55 | 33 |
| 56 | 24 |
#Représentation graphiqiue
freq_boules|>ggplot(aes(Numéro,frequence))+
geom_bar(stat="identity",fill="red")+ggtitle("Fréquencede de Sortie des boules sur une période de 100 jours")+labs(x= " Numéro de la boule",y="Fréquence de Sortie")##Diagramme Circulaire
freq_boules |>
ggplot(aes(x = as.factor(Numéro), y = frequence)) +
# On garde le geom_bar mais on ajuste la largeur
geom_bar(stat = "identity", fill = "red", color = "white", width = 0.8) +
# C'est ici que la magie opère : on enroule l'axe X (les numéros)
coord_polar(theta = "x", start = 0) +
# Nettoyage du thème pour l'aspect circulaire
theme_minimal() +
labs(
title = "Répartition circulaire des fréquences",
x = NULL,
y = NULL
) +
theme(
axis.text.x = element_text(face = "bold"),
panel.grid.major = element_line(color = "gray90")
)##Les probas
#Décrire la loi hypergéométrique
tibble(x=0:10,proba=dhyper(0:10,16,40,10))|>
mutate(chance=round(1/proba))# A tibble: 11 × 3
x proba chance
<int> <dbl> <dbl>
1 0 0.0238 42
2 1 0.123 8
3 2 0.259 4
4 3 0.293 3
5 4 0.196 5
6 5 0.0807 12
7 6 0.0206 49
8 7 0.00317 315
9 8 0.000282 3547
10 9 0.0000129 77813
11 10 0.000000225 4446435
tibble(x=0:10,proba=dhyper(x,16,40,10),cote = 1/proba)|>
mutate(cote=round(cote))|> arrange(desc(x))|> filter(!x %in% 1:4)|>select(-2)# A tibble: 7 × 2
x cote
<int> <dbl>
1 10 4446435
2 9 77813
3 8 3547
4 7 315
5 6 49
6 5 12
7 0 42
Nous devons d’abord définir le gain du joueur quand il a x bon numéros, on va l’appeler \(g(x)\)$
Rappel du calcul de l’espérance mùathématique
\[ \sum_{x=0}^{10}g(x)p(x) \] ou les \(p(x)\) on été calculés dans la colonne proba ci-dessus.
tibble(x=0:10,"p(x)"=dhyper(x,16,40,10))|>arrange(desc(x))|> filter(!x %in% 1:4)|>
mutate("g(x)"=c(200000,2000,150,15,5,2,2),.after=x)->result
(result$`g(x)`*result$`p(x)`)|>sum()[1] 0.4724045
tibble(x=0:10,"p(x)"=dhyper(x,16,40,10))|>arrange(desc(x))|> filter(!x %in% 1:4)|>
mutate("g(x)"=c(200000,2000,150,15,5,2,2))|> select(x, `g(x)`, `p(x)`)# A tibble: 7 × 3
x `g(x)` `p(x)`
<int> <dbl> <dbl>
1 10 200000 0.000000225
2 9 2000 0.0000129
3 8 150 0.000282
4 7 15 0.00317
5 6 5 0.0206
6 5 2 0.0807
7 0 2 0.0238
L’éspérence du gain (brut) du joueur est 47 centimes.Comme il a misé 1 euro, il subit en moyenne une perte de 53 centimes .
Comment citer une référence bibliographie dans quarto
Je vous montre comment citer une référence bibliographie avec Bibtex
Nous allons citer l’article de @wickham2019welcome comme exemple.
Le tidyverse est un ensemble de packages R dédiés à la science. Ces packages reposent sur une même grammaire et des structures de données communes, ce qui permet de manupuler,transformer et visualiser les données de façon simple et harmonisée. Installons ces packages pour pouvoir lés utiliser.
Nous installons tidyverse pour pouvoir les utiliser. on doit ensuite appeler le package .
Petite illustration.Chargeons des données disponible dans R.
Manipulation standard de data frame dans R
Les memes manipulations mais avec le tidyverse avec utilisation de pipes|
Calculer des statistiques avec tidyverse