Introduction au language R et à quarto

Author

Françoise

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.

Question légitime

-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 a trouver une p-value égal à 0,5% ce qui est petit .On va rejeter l’hypothese nulle p=16/56 et conclure que la FDJ “triche”

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 
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

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

References

Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the Tidyverse.” Journal of Open Source Software 4 (43): 1686.