Introduction au language R et à quarto

Author

Françoise

Initiation à markdwon

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

Quelques généralités

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

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 .

Petite illustration.Chargeons des données disponible dans R.

Manipulation standard de data frame 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 milles 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 11 variable pour la premiére 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

Les memes manipulations mais avec le tidyverse avec utilisation de pipes|

library(dplyr)

select(dfcars, 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
dfcars |> select(mpg) # Sélectionne la variable mpg. ( |> c'est le 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
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

Calculer des statistiques avec tidyverse

dfcars |>
 select(mpg) |>
 summarise(moy_mpg = mean(mpg) ) # Nombre de miles moyen par gallon pour les 32 voitures
   moy_mpg
1 20.09062
# Faisons moyenne écart-type
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

Introduction aux graphiques avec R

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

Les graphiques avec 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()

Charger des données excel ou csv sur R

  1. Il faut mettre les data sur votre disque.
  2. 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>

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

Pivot longer

# 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

tableau de fréquence

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

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 ?

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

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

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

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