Notes de cours 2024

Author

Karim Kilani

library(tidyverse)

Polices dans markdown

Bonjour

Bonjour

Bonjour

Bonjour

Les sous-sections

Les sous-sous-sections

Allez regarder Quarto dans R sur youtube

Ce que vous voyez dans le bandeau grisé s’appelle un Chunk c’est dans cet espace que nous allons écrire les codes R

1+1 # Un simple calcul
[1] 2
cars # Afficher le data frame
   speed dist
1      4    2
2      4   10
3      7    4
4      7   22
5      8   16
6      9   10
7     10   18
8     10   26
9     10   34
10    11   17
11    11   28
12    12   14
13    12   20
14    12   24
15    12   28
16    13   26
17    13   34
18    13   34
19    13   46
20    14   26
21    14   36
22    14   60
23    14   80
24    15   20
25    15   26
26    15   54
27    16   32
28    16   40
29    17   32
30    17   40
31    17   50
32    18   42
33    18   56
34    18   76
35    18   84
36    19   36
37    19   46
38    19   68
39    20   32
40    20   48
41    20   52
42    20   56
43    20   64
44    22   66
45    23   54
46    24   70
47    24   92
48    24   93
49    24  120
50    25   85
dim(cars) # Dimension du dataframe
[1] 50  2
names(cars) # Me donne le nom des colonnes (ou des variables
[1] "speed" "dist" 
help(cars)      
cars$speed # Afficher la variable speed
 [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15
[26] 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24 24 24 24 25
cars[,1] # Idem
 [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15
[26] 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24 24 24 24 25
cars[28,1] # Afficher la 28 eme observation de la variable speed
[1] 16
plot(cars)

cars%>%plot()

# Charger les données cars et sélectionner la variable speed
speed_data <- 
  
  


cars$speed%>%mean() # Moyenne
cars$speed%>%var() # Variance
[1] 27.95918
cars$speed%>%sum() # Somme
[1] 770
cars$speed%>%sd() # Ecart-type
[1] 5.287644
cars$speed%>%quantile()
  0%  25%  50%  75% 100% 
   4   12   15   19   25 
select(cars,speed)
   speed
1      4
2      4
3      7
4      7
5      8
6      9
7     10
8     10
9     10
10    11
11    11
12    12
13    12
14    12
15    12
16    13
17    13
18    13
19    13
20    14
21    14
22    14
23    14
24    15
25    15
26    15
27    16
28    16
29    17
30    17
31    17
32    18
33    18
34    18
35    18
36    19
37    19
38    19
39    20
40    20
41    20
42    20
43    20
44    22
45    23
46    24
47    24
48    24
49    24
50    25
# Afficher les premières lignes du nouveau data frame contenant uniquement la variable speed
head(speed_data)
[1] 15.4
cars%>%mutate(vitesse = speed *1.60934,speed = NULL, distance = dist*1.60934, dist= NULL)->frcars

frcars
    vitesse  distance
1   6.43736   3.21868
2   6.43736  16.09340
3  11.26538   6.43736
4  11.26538  35.40548
5  12.87472  25.74944
6  14.48406  16.09340
7  16.09340  28.96812
8  16.09340  41.84284
9  16.09340  54.71756
10 17.70274  27.35878
11 17.70274  45.06152
12 19.31208  22.53076
13 19.31208  32.18680
14 19.31208  38.62416
15 19.31208  45.06152
16 20.92142  41.84284
17 20.92142  54.71756
18 20.92142  54.71756
19 20.92142  74.02964
20 22.53076  41.84284
21 22.53076  57.93624
22 22.53076  96.56040
23 22.53076 128.74720
24 24.14010  32.18680
25 24.14010  41.84284
26 24.14010  86.90436
27 25.74944  51.49888
28 25.74944  64.37360
29 27.35878  51.49888
30 27.35878  64.37360
31 27.35878  80.46700
32 28.96812  67.59228
33 28.96812  90.12304
34 28.96812 122.30984
35 28.96812 135.18456
36 30.57746  57.93624
37 30.57746  74.02964
38 30.57746 109.43512
39 32.18680  51.49888
40 32.18680  77.24832
41 32.18680  83.68568
42 32.18680  90.12304
43 32.18680 102.99776
44 35.40548 106.21644
45 37.01482  86.90436
46 38.62416 112.65380
47 38.62416 148.05928
48 38.62416 149.66862
49 38.62416 193.12080
50 40.23350 136.79390
# Créer une variable vitesse en kmh


dplyr::summarise(cars, Vitesse_moyenne_mph  = mean(speed),Distance_moyenne_m  = mean(dist),
  Vitesse_sd_mph  = sd(speed),Distance_sd_m  = sd(dist)
                 )
  Vitesse_moyenne_mph Distance_moyenne_m Vitesse_sd_mph Distance_sd_m
1                15.4              42.98       5.287644      25.76938

Tidyverse

Pipe

Cheat sheet Importer des données excel

library(readxl)
Exercice4 <- read_excel("Exercice4.xlsx")
Exercice4%>%table() # Table de fréquence
Vote
  A   B 
512 488 

Vecteurs

c(12,15,17)%>%mean()
[1] 14.66667
age<-c(12,15,17)
age%>%mean()
[1] 14.66667
(age+5)%>%mean()
[1] 19.66667
#c(1,2,3,..)

1:100
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
 [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
 [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
 [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
 [91]  91  92  93  94  95  96  97  98  99 100

Les probabilités dans R

La loi binomiale

  • On réplique une expérience \(n\) fois une expérience de manière indépendante qui peut conduire à un succès ou un échec avec une même probabilté \(p\). A la fin de l’expérience on compte le nombre de succès. Le nombre de succès peut varier pour tous les entiers entre \(0\) à \(n\), i.e. \(0, 1,\cdots,n\). On les appelle mles modalités possibles.

  • Comme le résultat de cet expérience est aléatoire, on le note en utilsant une variable dite aléatoire. On les notes généralement avec des lettres majuscules, en général \(X,Y,Z,\cdots\). Appelons-là \(X\) dans notre contexte. Dans notre expérience, on dit que \(X\) suit une loi binomiale de paramètres \(n\) et \(p\). On utilise cette notation mathématique \(X\sim\mathcal{B}(n,p)\).

Nous devons rappeler les probabilités de chaque modalité. On sait que \[ \Pr(X=x)=\binom{n}{x}p^{x}(1-p)^{n-x},\:x=0,\cdots,n. \] ## La loi binomiale sur R

Les coefficient binomaiaux dans R. Combien à t’on de manières de choisir \(2\) personnes parmi \(10\).

# Les paramètres 
n <- 10 
x <- 2 
choose(n,x)
[1] 45
# Si je fais la somme de 9 à 1 
9:1%>%sum()
[1] 45
# 9+8+...+1

Allons plus loins, je veux afficher le nomnre de façons de choisir \(x\) objets parmi 10 pour toutes les valeurs de \(x\).

choose(n,0:10)
 [1]   1  10  45 120 210 252 210 120  45  10   1
n%>%choose(0:10)
 [1]   1  10  45 120 210 252 210 120  45  10   1

La fonction pour calculer les probabilités pour une loi binomiale

p<-0.5
dbinom(0:10,n,p)
 [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250
 [6] 0.2460937500 0.2050781250 0.1171875000 0.0439453125 0.0097656250
[11] 0.0009765625
dbinom(0:10,10,.5)%>%sum()
[1] 1

CDF

Quelle est la probabilité d’avoir 5 ou moins de 5 succès (au plus 5 succès) \[ \Pr(X\leq 5) \]

dbinom(0:5,10,0.5)%>%sum() # Manière non élégante
[1] 0.6230469
pbinom(5,10,0.5) # Manière plus élégante
[1] 0.6230469

Quelle est la probabilité plus de 5 \[ \Pr(X> 5)=1-\Pr(X\leq 5) \]

dbinom(6:10,10,0.5)%>%sum() # Manière non élégante
[1] 0.3769531
1-pbinom(5,10,0.5) # Manière intermédiaire
[1] 0.3769531
pbinom(5,10,0.5,lower.tail=FALSE) # Manière plus élégante
[1] 0.3769531

Faire un beau tableau avec deux colonnes x et les probas

Utilisation de Stargazer

Je vais illustrer l’utilisation de Stargazer et autres avec un exemple simple sur la loi binomiale.

# Définir les paramètres de la loi binomiale
n <- 5 #  nombre d'expériences
p <- 0.2 # probabilité de succès

res<-tibble(x = 0:n)%>%mutate(Pr= dbinom(x,n,p))
library(stargazer)

Please cite as: 
 Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
 R package version 5.2.3. https://CRAN.R-project.org/package=stargazer 
res%>%stargazer(type = "text",summary = F,title = "Distribution de probabilité de la Loi Binomiale",header = FALSE)

Distribution de probabilité de la Loi Binomiale
===========
  x   Pr   
-----------
1 0 0.32768
2 1 0.4096 
3 2 0.2048 
4 3 0.0512 
5 4 0.0064 
6 5 0.00032
-----------
# Calculer les probabilités et créer un dataframe
data <- tibble(Modalités = 0:n) %>%
  mutate(Probabilités = dbinom(Modalités, size = n, prob = p))

# Charger Stargazer pour la mise en forme du tableau
library(stargazer)

# Générer le tableau en LaTeX
stargazer(data, type = "latex", title = "Distribution de probabilité de la Loi Binomiale", summary = FALSE, header = FALSE)

Espérance mathématique

# Ajouter l'espérance à la fin du dataframe
res
# A tibble: 6 × 2
      x      Pr
  <int>   <dbl>
1     0 0.328  
2     1 0.410  
3     2 0.205  
4     3 0.0512 
5     4 0.00640
6     5 0.00032
x<-1:5
y<-seq(10,18,2)
x
[1] 1 2 3 4 5
y
[1] 10 12 14 16 18
(x*y)%>%sum()
[1] 230
x%*%y
     [,1]
[1,]  230

Je vais écrire dans le texte $ 230

35.2941176

x=10^(-(1:5))

paste0("$","10^",log10(x))
[1] "$10^-1" "$10^-2" "$10^-3" "$10^-4" "$10^-5"
# Création des chaînes de caractères avec les puissances en exposant
chaînes_exposant <- paste0("$10^{", -(1:5), "}$")

chaînes_exposant
[1] "$10^{-1}$" "$10^{-2}$" "$10^{-3}$" "$10^{-4}$" "$10^{-5}$"

Génération de variables aléatoires avec R

Nous allons explorer la génération de variables aléatoires avec R, en nous concentrant sur l’utilisation de la loi binomiale comme illustration. Vous devrez l’adapter au cas du Keno avec la loi hypegéométrique.

Utilisation de la fonction rbinom()

La fonction rbinom() permet de générer des échantillons aléatoires à partir d’une distribution binomiale. Elle prend en paramètres le nombre de tirages (N), le nombre d’essais (size = n), et la probabilité de succès (prob = p). Par exemple :

# Génération de 100 échantillons aléatoires à partir d'une loi binomiale de paramètres n=
set.seed(123)
echantillon <- rbinom(1000, size = 50, prob = 0.5)
echantillon|>mean()
[1] 24.951
# Par exemple 100 personnes lancent chacun 10 fois une pièce de monnaie
hist(echantillon)

En générant un grand nombre d’échantillons aléatoires et en calculant la moyenne, nous pouvons observer la convergence vers l’espérance théorique de la distribution binomiale. Cela illustre la loi des grands nombres, qui stipule que la moyenne empirique converge vers l’espérance lorsque la taille de l’échantillon tend vers l’infini.

Première rencontre avec ggplot2

echantillons_binomiaux <- rbinom(10000, size = 10, prob = 0.5)
df<-data.frame(x=echantillons_binomiaux)
df|>ggplot(aes(x=x))+
geom_histogram(binwidth = 1, fill = "red", color = "black", alpha = 0.7)+
  ggtitle("Distribution des échantillons binomiaux") + 
  xlab("Nombre de succès") + ylab("Nombre d'échantillons")

Keno

Explication du jeu

Nous expliquons la version du Keno utilisée dans l’article.

Il y a \(80\) numéros, de \(1\) à \(80\). Le joueur coche sur un bulletin \(15\) numéros de son choix. Ensuite, l’organisateur du jeu (casino ou autre institution), tire au hasard \(20\) numéros parmi les \(80\), numéros désignés comme “gagnants”. Le gain du joueur dépend du nombre de numéros gagnants qui figurent sur son bulletin.

On veut calculer la probabilité que le joueur ait, par exemple, exactement \(10\) des numéros sélectionnés qui fassent partie des numéros gagnants.

Nous commençons d’abord par un peu de combinatoire. Calculez le nombre de façons de sélectionner les \(15\) numéros. C’est le nombre de manières de sélectionner \(15\) objets parmi \(80\). Mathématiquement, on note ce nombre \[ \binom{80}{15} \]

Nous pouvons le calculer avec R en utilisant le code suivant

choose(80,15)
[1] 6.63587e+15

C’est un nombre très grand qu’il est inutilile de calculer pour des raisons évidentes.

Pour calculer la probabilité demandée, nous devons effectuer deux tâches :

  1. Calculer le nombre de manières de sélectionner 10 numéros parmi les \(20\) gagnants, ce qui donne \(\binom{20}{10}\);

  2. Calculer le nombre de manières de sélectionner les \(5\) numéros restants parmi les 60 perdants, ce qui fait \(\binom{60}{5}\).

La probabilté peut à présent être obtenue en effectuant le calcul suivant

\[ \frac{\binom{20}{10}\binom{60}{5}}{\binom{80}{15}} \]

Nous allons tenter de le faire avec R.

choose(20,10)*choose(60,5)/choose(80,15)
[1] 0.0001520595

Le joueur a une probabilité qui vaut environ \(1.5\) chances pour \(10000\).

Le nombre de numéros gagnants parmi ceux du joueur peuvent varier entre \(0\) à \(15\). Si nous appellons \(r\) le nombre de bons numéros, la probabilité d’obtenir \(r\) bons numéros sera donné plus généralement par

\[ \frac{\binom{20}{r}\binom{60}{15-r}}{\binom{80}{15}},\:r=0,\cdots,15. \]

library(tidyverse)
r<-0:15
choose(20,r)%>%length()
[1] 16
choose(60,15-r)%>%length()
[1] 16
choose(20,r)*choose(60,15-r)/choose(80,15)
 [1] 8.016144e-03 5.227920e-02 1.479390e-01 2.404009e-01 2.502132e-01
 [6] 1.761501e-01 8.634808e-02 2.988972e-02 7.331441e-03 1.267163e-03
[11] 1.520595e-04 1.234249e-05 6.496049e-07 2.067708e-08 3.504590e-10
[16] 2.336393e-12