seq(1,20) # création de séquence de nombre de 1 à 20. [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1:20 # Une 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
1:Initiation à markdwon
Gras/italique gras: texte italique: texte
On peut écrire du texte en gras et italique. On peut écrire des formules mathématiques en \(\LaTeX\).
Par exemple une intégrale
\[ \int_{-\infty}^{+\infty}e^{-x^2}dx=\sqrt{\pi} \] 2:Créer des séquences
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) # création de séquence de nombre de 1 à 20. [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1:20 # Une 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
sec()fabrique une séquence régulière de 1 à 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) # de 1970 à 2026 tous les 4 ans. [1] 1970 1974 1978 1982 1986 1990 1994 1998 2002 2006 2010 2014 2018 2022 2026
3:Tidyverse
Nous allons apprendre à coder avec R en utilisant de maniére intensive le “Tidyverse”
-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 Wickham et al. (2019) 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.
library(tidyverse)── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.2.0 ✔ readr 2.2.0
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.3 ✔ tibble 3.3.1
✔ lubridate 1.9.5 ✔ tidyr 1.3.2
✔ purrr 1.2.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Nous installons tidyverse pour pouvoir les utiliser. On doit ensuite appeler le package .
4:Data frame:manipulation”base R”
Petite illustration,chargeons des données disponible dans R.
data()
dfcars<-mtcars
dfcars mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
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
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
dfcars$mpg # on affiche les 32 valeurs pour la variable mpg (lilles par gallon) nombre de miles par gallon [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
[16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
[31] 15.0 21.4
dfcars[,1] # Affiche la premiére variable du dataframe [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
[16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
[31] 15.0 21.4
dfcars[1,] # Affiche la variable 11 pour la premiere voiture mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
dfcars[1,1] # Affiche la premiére variable pour la premiére voiture |[1] 21
mtcars: tableau (data frame) fourni dans R ( 32 voiture, 11 variables).
5:Même chose avec tidyverse + pipe |> ou %>%
Les memes manipulations mais avec le tidyverse avec utilisation de pipes |> Le pipe ou %>% sert à enchaîner des opérations
dfcars |> select(mpg) # Sélectionne la variable mpg. ( |> ou %>% c'est le pipe il sert à enchaîner des opérations) mpg
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Valiant 18.1
Duster 360 14.3
Merc 240D 24.4
Merc 230 22.8
Merc 280 19.2
Merc 280C 17.8
Merc 450SE 16.4
Merc 450SL 17.3
Merc 450SLC 15.2
Cadillac Fleetwood 10.4
Lincoln Continental 10.4
Chrysler Imperial 14.7
Fiat 128 32.4
Honda Civic 30.4
Toyota Corolla 33.9
Toyota Corona 21.5
Dodge Challenger 15.5
AMC Javelin 15.2
Camaro Z28 13.3
Pontiac Firebird 19.2
Fiat X1-9 27.3
Porsche 914-2 26.0
Lotus Europa 30.4
Ford Pantera L 15.8
Ferrari Dino 19.7
Maserati Bora 15.0
Volvo 142E 21.4
select(dfcars,mpg) # Refaison la même ligne ci-dessus sans pipe mpg
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Valiant 18.1
Duster 360 14.3
Merc 240D 24.4
Merc 230 22.8
Merc 280 19.2
Merc 280C 17.8
Merc 450SE 16.4
Merc 450SL 17.3
Merc 450SLC 15.2
Cadillac Fleetwood 10.4
Lincoln Continental 10.4
Chrysler Imperial 14.7
Fiat 128 32.4
Honda Civic 30.4
Toyota Corolla 33.9
Toyota Corona 21.5
Dodge Challenger 15.5
AMC Javelin 15.2
Camaro Z28 13.3
Pontiac Firebird 19.2
Fiat X1-9 27.3
Porsche 914-2 26.0
Lotus Europa 30.4
Ford Pantera L 15.8
Ferrari Dino 19.7
Maserati Bora 15.0
Volvo 142E 21.4
dfcars |> select(7,8,9,10,11) # Sélectionne les variables de 7 à 11 qsec vs am gear carb
Mazda RX4 16.46 0 1 4 4
Mazda RX4 Wag 17.02 0 1 4 4
Datsun 710 18.61 1 1 4 1
Hornet 4 Drive 19.44 1 0 3 1
Hornet Sportabout 17.02 0 0 3 2
Valiant 20.22 1 0 3 1
Duster 360 15.84 0 0 3 4
Merc 240D 20.00 1 0 4 2
Merc 230 22.90 1 0 4 2
Merc 280 18.30 1 0 4 4
Merc 280C 18.90 1 0 4 4
Merc 450SE 17.40 0 0 3 3
Merc 450SL 17.60 0 0 3 3
Merc 450SLC 18.00 0 0 3 3
Cadillac Fleetwood 17.98 0 0 3 4
Lincoln Continental 17.82 0 0 3 4
Chrysler Imperial 17.42 0 0 3 4
Fiat 128 19.47 1 1 4 1
Honda Civic 18.52 1 1 4 2
Toyota Corolla 19.90 1 1 4 1
Toyota Corona 20.01 1 0 3 1
Dodge Challenger 16.87 0 0 3 2
AMC Javelin 17.30 0 0 3 2
Camaro Z28 15.41 0 0 3 4
Pontiac Firebird 17.05 0 0 3 2
Fiat X1-9 18.90 1 1 4 1
Porsche 914-2 16.70 0 1 5 2
Lotus Europa 16.90 1 1 5 2
Ford Pantera L 14.50 0 1 5 4
Ferrari Dino 15.50 0 1 5 6
Maserati Bora 14.60 0 1 5 8
Volvo 142E 18.60 1 1 4 2
dfcars |> select(7:11) # Sélectionne de 7 à 11 qsec vs am gear carb
Mazda RX4 16.46 0 1 4 4
Mazda RX4 Wag 17.02 0 1 4 4
Datsun 710 18.61 1 1 4 1
Hornet 4 Drive 19.44 1 0 3 1
Hornet Sportabout 17.02 0 0 3 2
Valiant 20.22 1 0 3 1
Duster 360 15.84 0 0 3 4
Merc 240D 20.00 1 0 4 2
Merc 230 22.90 1 0 4 2
Merc 280 18.30 1 0 4 4
Merc 280C 18.90 1 0 4 4
Merc 450SE 17.40 0 0 3 3
Merc 450SL 17.60 0 0 3 3
Merc 450SLC 18.00 0 0 3 3
Cadillac Fleetwood 17.98 0 0 3 4
Lincoln Continental 17.82 0 0 3 4
Chrysler Imperial 17.42 0 0 3 4
Fiat 128 19.47 1 1 4 1
Honda Civic 18.52 1 1 4 2
Toyota Corolla 19.90 1 1 4 1
Toyota Corona 20.01 1 0 3 1
Dodge Challenger 16.87 0 0 3 2
AMC Javelin 17.30 0 0 3 2
Camaro Z28 15.41 0 0 3 4
Pontiac Firebird 17.05 0 0 3 2
Fiat X1-9 18.90 1 1 4 1
Porsche 914-2 16.70 0 1 5 2
Lotus Europa 16.90 1 1 5 2
Ford Pantera L 14.50 0 1 5 4
Ferrari Dino 15.50 0 1 5 6
Maserati Bora 14.60 0 1 5 8
Volvo 142E 18.60 1 1 4 2
dfcars |> select(mpg) mpg
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Valiant 18.1
Duster 360 14.3
Merc 240D 24.4
Merc 230 22.8
Merc 280 19.2
Merc 280C 17.8
Merc 450SE 16.4
Merc 450SL 17.3
Merc 450SLC 15.2
Cadillac Fleetwood 10.4
Lincoln Continental 10.4
Chrysler Imperial 14.7
Fiat 128 32.4
Honda Civic 30.4
Toyota Corolla 33.9
Toyota Corona 21.5
Dodge Challenger 15.5
AMC Javelin 15.2
Camaro Z28 13.3
Pontiac Firebird 19.2
Fiat X1-9 27.3
Porsche 914-2 26.0
Lotus Europa 30.4
Ford Pantera L 15.8
Ferrari Dino 19.7
Maserati Bora 15.0
Volvo 142E 21.4
6:Statistiques descriptives
Moyenne
dfcars |>
select(mpg) |>
summarise(moy_mpg = mean(mpg) ) # Nombre de miles moyen par gallon pour les 32 voitures moy_mpg
1 20.09062
Moyenne,écart-type,min,max
stat_des<-dfcars |>
select(mpg) |>
summarise("moyenne" = mean(mpg), "écart-type" = sd(mpg),minimum=min(mpg), maximum=max(mpg) )
stat_des moyenne écart-type minimum maximum
1 20.09062 6.026948 10.4 33.9
7:Introduction aux graphiques Histogramme de la variable mpg
On commence par un histogramme trés basique et on fera ensuite du ggplot de tidyverse
dfcars$mpg |>hist(main="Histogramme de MPG pour les 32 voitures ")filtrer des lignes
dfcars |>
filter(mpg >= 30 & mpg <=35) # filter sert à garder seulement certains lignes d'un tableau (data frame) 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
Histogramme ggplot2
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() # En Résumé il affiche un histogramme,variables: mpg(miles par gallon), barres rouges avec contours noirs, classes de largeur 5 , style visuel inspiré du journal the Economist.8:Projet Keno
Charger des données excel ou csv sur R
Il faut mettre les data sur votre disque,charger dans positcloud
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>
# En Résumé un data frame propre avec seulement les colonnes utiles , colonnes inutiles ignorées.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 lignes 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
Pivot longer
le pivot longer sert à transformer un tableau “large” en tableau “long”c’est une fonction du package tidyverse).
# 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
# En Résumé: pour chaque pays,jai maintenant une ligne par année,la colonne country est répétée,les années sont dans year,les valeurs sont dans cases.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
# En Résumé: On supprime la colonne multiplicateur, transforme les colonnes 2 à 17 en lignes, les noms de colonnes (boule1,boule2...)deviennent boule,on enléve le mot "boule" et laisse les nombres "boule1" -> "1", les valeurs deviennent numéro.Tableau de fréquences
freq_boules<-keno_longer|>
count(Numéro, name="frequence")# Regroupe les données par numéro,compte le nombre d'apparitions de chaque numéro et crée une colonne appelée 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
Trouver le numéro le moins fréquent
freq_boules <-keno_longer |>
count(Numéro, name = "frequence")
freq_boules|>filter(frequence == min(frequence))# Garder uniquement les numéros dont la frequence est égale à la fréquence minimale.# A tibble: 1 × 2
Numéro frequence
<dbl> <int>
1 5 17
Transformation des données (pivot_longer+mutate)
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
# mutate(boule=as.integer(boule))=convertir la colonne boule en nombre.-Peut-on s’interroger sur la valeur aussi base (17) alors qu’on s’attendait à une valeur moyenne comprise entre 28 et 29 ?
Définir le modéle binomial
-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.
Calcul des probalités
plot(0:100,dbinom(0:100,100,16/56)) # fonction de la loi binomiale on suppose 100 tirages, avec une probalité de succés de 16 sur 56, on calcule la probalité d'avoir 0,1,2,...100 succés.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.
Calcul de la p-value
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 # nombre se simulations indépendantes
valmin<-c() # vecteur qui va stoquer la fréquence minimale observé à chaque simulation
for (i in 1:N) # répéte l'expérience N fois
{
numeros<-c() # vecteur qui va contenir tous les numéros tirés
for (t in 1:100 ){
numeros<-c(numeros,sample(1:56, 16, replace = FALSE))
} # à chaque itération on simule 100 tirages chaque tirage contient 16 numéros distinct parmi 56
table(numeros)|>min()->min
valmin<-c(valmin,min)
} # stoque le minimum
# 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.
Tableau des fréquences
table_freq <- keno_longer|>
count(`Numéro `,name = "Nombre de sorties") %>%
arrange(`Numéro `) # Regrouper les données par numéro, compter le nombre d'apparition de chaque numéro, crée une colonne appelée nombre de sorties, trier le tableau par ordre croissant des numéros.library(knitr) # knitr sert à produire des documents propres
table_freq %>%
kable(
col.names = c("Numéro de la boule", "Nombre de sorties"), # kable permet d'afficher de jolie tables dans R Markdown
caption = "Fréquence d'apparition des numéros (Keno novembre 2025)"
) # Ajoute un titre sous la table | 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 |
9:Représentation graphiqiue
Diagramme à bandes ou bâtons
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") # faire un graphique ggplot à partir du tableau freq_boules, ajouter un diagramme en barres, ajouter un titre, definir les libellés des axes (x,y)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 transformer le graphique en representation circulaire
theme_minimal() +
labs(
title = "Répartition circulaire des fréquences",
x = NULL,
y = NULL
)+
# ajoute un titre et supprime les libellés des axes x et y
theme(
axis.text.x = element_text(face = "bold"),
panel.grid.major = element_line(color = "gray90")
) # Ajuster finement l'apparence 10 Les probas Loi hypergéométrique
Elle modelise le nombre de succés obtenus lors d’un tirage sans remise )
tibble(x=0:10,proba=dhyper(0:10,16,40,10))|>
mutate(chance=round(1/proba)) # Crée un tableau avec une premier colonne x contenant les valeurs 0, 1, 2, ...10, calculer la loi hypergéométrique , ajouter une nouvelle colonne chance # 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) # Créer le tableau, arrondir la cote à l'entier le plus proche afin de faciliter la lecture, triées les ligne du tableau par ordre décroissant# 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
Calcul de l’espérance du gain d’un joueur qui coche 10 numéros en misant 1 euro.
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 mathé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