Vous êtes ici : Accueil > Salle du prof > Il est libre Math > Une expérience aléatoire de seconde avec R
Par : mathazay
Publié : 12 mai 2006

Une expérience aléatoire de seconde avec R

C’est la dernière ligne droite, certains auraient-il "oublié" de "faire" de la simulation avec leurs élèves ? Voici, à partir d’un travail en classe, comment constituer des échantillons de comparaison avec le travail des élèves.

L’expérience

Elle consiste à « jouer » à Pile ou Face et à relever les longueurs des répétitions.

Pour que les élèves se construisent une idée du hasard, on leur fait d’abord faire cette expérience dans leur tête, puis réellement (ça fait un peu de désordre... mais il est constructif), puis au moyen d’une table de chiffres générée aléatoirement (R) puis avec la calculatrice (bien faire mettre les machines en mode FIX sinon il y aura un défaut de zéros).

Mais au bout du compte, il faut relever les moyennes dans un tableur et si possible comparer avec des séries obtenues de façon rigoureuse (on réalise à ce moment ce que l’on subodorait : la rigueur d’exécution, malgré moultes précautions, n’est pas le fort de tous les élèves. ;-)

# Simulation 50 fois Pile/Face et nombre moyen de répétitions de P ou F
# constitution de l'échantillon
> x<-sample(c(0,1),50,T)
# ELO : encodage des longueurs d'occurences (Run Length Encoding)
> y<-rle(x)$lengths
# préparation d'une matrice
> d<-c(1:(2*max(y)))
> dim(d)<-c(2,max(y))
# inscription des occurrences dans la matrice
> for(i in 1:max(y)) {d[2,i]<-length(subset(y,y==i));d[1,i]<-i}
# somme des occurrences
> sum(d[row(d)==2])
[1] 18
# nombre moyen de répétitions
> 50/sum(d[row(d)==2])
[1] 2.777778
> x
[1] 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0
[45] 0 0 0 0 1 0
> y
[1] 1 1 1 2 6 2 2 4 3 4 8 2 2 3 2 5 1 1
> d
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    5    6    2    2    1    1    0    1
> pfrep<-function(taille){x<-sample(c(0,1),taille,T)
+ y<-rle(x)$lengths
+ d<-c(1:(2*max(y)))
+ dim(d)<-c(2,max(y))
+ for(i in 1:max(y)) {d[2,i]<-length(subset(y,y==i));d[1,i]<-i}
+ repmoy<-taille/sum(d[row(d)==2])
+ return(repmoy)
+ }
> pfrep(50)
[1] 2.5
> pfrep(50)
[1] 1.785714
# initialisation de la liste
> sec<-c();nbel<-29
> for(i in 1:nbel){xx<-round(pfrep(50),2);sec<-c(sec,xx);sec}
> sec
[1] 2.17 2.08 2.08 1.72 2.78 2.38 1.85 1.67 1.79 1.92 1.67 2.38 2.17 1.52 1.79 1.52 2.00
[18] 2.17 1.61 1.79 2.00 1.85 1.85 2.50 1.72 2.17 1.92 1.92 1.67
> max(sec)-min(sec)
[1] 1.26
# on remet ça ?
> sec<-c()
> for(i in 1:nbel){xx<-round(pfrep(200),2);sec<-c(sec,xx);sec}
> sec
[1] 1.89 1.90 2.06 2.08 1.89 2.17 1.96 1.90 1.96 2.06 1.69 1.89 2.13 1.83 2.15 1.96 1.92
[18] 1.87 1.79 1.96 2.00 2.11 1.92 1.89 1.92 1.90 1.87 2.17 2.17
> max(sec)-min(sec)
[1] 0.48
# on recommence avec des séries de tailles croissantes
> sec1<-c()
> sec1<-for(i in 1:nbel){xx<-round(pfrep(50),2);sec1<-c(sec1,xx);sec1}
> sec2<-c()
> sec2<-for(i in 1:nbel){xx<-round(pfrep(200),2);sec2<-c(sec2,xx);sec2}
> sec3<-c()
> sec3<-for(i in 1:nbel){xx<-round(pfrep(10000),2);sec3<-c(sec3,xx);sec3}
> sec1
[1] 1.72 2.08 1.85 2.27 1.79 1.72 1.79 1.72 1.67 2.63 1.92 2.38 1.85 1.72 1.79 2.50 2.00
[18] 2.94 1.92 1.79 2.08 1.67 2.50 1.92 1.85 2.38 1.72 2.00 2.00
> sec2
[1] 2.02 1.85 2.06 1.77 2.17 1.89 2.04 1.98 2.17 1.92 1.92 1.94 2.08 1.69 2.22 1.79 2.11
[18] 2.38 2.04 1.80 1.94 1.87 1.96 1.80 1.87 2.04 2.08 1.87 2.06
> sec3
[1] 2.04 2.00 2.02 2.01 1.98 2.03 2.00 2.01 2.01 2.00 2.01 2.01 1.98 2.03 2.00 1.99 2.01
[18] 1.97 2.05 1.99 1.98 2.01 2.04 2.01 1.99 1.98 1.98 2.00 1.99
# pourquoi pas créer un tableau ?
> tableau<-data.frame(sec1,sec2,sec3);colnames(tableau)<-c("50","200","10000")
> tableau
    50  200 10000
1  1.72 2.02  2.04
2  2.08 1.85  2.00
3  1.85 2.06  2.02
4  2.27 1.77  2.01
5  1.79 2.17  1.98
6  1.72 1.89  2.03
7  1.79 2.04  2.00
8  1.72 1.98  2.01
9  1.67 2.17  2.01
10 2.63 1.92  2.00
11 1.92 1.92  2.01
12 2.38 1.94  2.01
13 1.85 2.08  1.98
14 1.72 1.69  2.03
15 1.79 2.22  2.00
16 2.50 1.79  1.99
17 2.00 2.11  2.01
18 2.94 2.38  1.97
19 1.92 2.04  2.05
20 1.79 1.80  1.99
21 2.08 1.94  1.98
22 1.67 1.87  2.01
23 2.50 1.96  2.04
24 1.92 1.80  2.01
25 1.85 1.87  1.99
26 2.38 2.04  1.98
27 1.72 2.08  1.98
28 2.00 1.87  2.00
29 2.00 2.06  1.99
# et tant que faire, l'exporter vers openoffice (ou un autre tableur)
> write.table(tableau,"tableau.csv",sep=";",dec=",")

la fonction à enregistrer


function(taille){x<-sample(c(0,1),taille,T)
y<-rle(x)$lengths
d<-c(1:(2*max(y)))
dim(d)<-c(2,max(y))
for(i in 1:max(y)) {d[2,i]<-length(subset(y,y==i));d[1,i]<-i}
repmoy<-taille/sum(d[row(d)==2])
return(repmoy)
}

Post-scriptum

le mot du collègue : je suis pas doué et les techniques que je propose sont certainement améliorables.... partageons nos efforts :o)