Annonce

Bienvenue sur le site support des ouvrages :
SAS - Introduction au décisionnel : méthode et maîtrise du langage
(1ère édition - épuisée)
SAS - Introduction pratique : du data management au reporting (2ème édition - épuisée)
SAS - Introduction au décisionnel : du data management au reporting (3ème édition - épuisée (hélas...))

la réponse à la question "mais où trouver la 3ème édition ?" est précisée ici


Retrouvez dans ce tiré à part, la préface écrite par Mouloud Dey, Directeur Business solutions et marchés émergents, SAS France,
l’introduction générale ainsi que le plan complet de l’ouvrage

#1 21-06-2017 11:23:01

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Amigo ! tu veux jouer avec moi !

J'étais l'autre jour dans un café (ça m'arrive...) et j'ai découvert un jeu de la Française des jeux appelé "Amigo".

Vous trouverez des informations sur ce jeu ici : https://www.fdj.fr/jeux/jeux-de-tirage/amigo/regles

vous cochez 7 numéros sur une grille 1-28
12 numéros sont tirés à chaque tirage, 7 numéros bleus et 5 numéros bonus.
vos gains dépendent du nombre de numéros bleus et de numéros bonus
vous avez 1 chance sur 3.05 de gagner !

certes.... mais combien ?
si je joue 2 euros, quelle est mon espérance de gain ?

il y a deux façons de répondre... soit vous vous souvenez que vos cours de probabilités et vous vous attaquez au tableau des gains : https://www.fdj.fr/jeux/jeux-de-tirage/ … -des-gains

soit, vos souvenirs sont vagues... et vous vous dites qu'en jouant 1 000 000 de fois, on doit bien avoir une idée de l'espérance de gain à ce jeu...

Evidemment, nous allons adopter la seconde approche et on va jouer 1 000 000 de fois à ce jeu, voir le nombre de fois où on aura gagné et nos gains au bout d'un million de parties.

bon... 250 tirages par jour (toutes les 5 minutes en fait) et seulement 227 tirages possibles quand on joue en métropole...

1 000 000 / 227 = 4405 jours, soit un peu plus de 12 ans à passer dans un café pour avoir la réponse si on ne joue qu'une fois à chaque tirage.

Je suis un peu long en ce moment avec mes réponses aux sujets des beaux mercredis mais de là à vous faire attendre 12 ans la réponse (et de là à me faire dépenser 2 000 000 d'euros dans un jeu...)

Mais pourquoi jouer en vrai puisqu'on dispose de SAS !

Pour la semaine prochaine, vous vérifierez que vous avez bien 1 chance sur 3.05 de gagner et vous calculerez votre espérance de gain.

Nous répondrons ensuite à la question posée dans le sujet... (mon programme, écrit à la va-vite, met 5 secondes à répondre à la question... nettement mieux que 12 ans !)

cadeau : voici une table qui reprend les données du tableau des gains si vous jouez 2 euros :

Code:

data gain;
input bl bo gain ;
cards;
7 0 25000
6 1 600
5 2 140
4 3 105
3 4 100
2 5 100
6 0 500
5 1 55
4 2 20
3 3 15
2 4 15
1 5 15
5 0 40
4 1 8
3 2 3
2 3 3
1 4 3
0 5 3
4 0 5
3 1 2
2 2 2
1 3 2
0 4 2
;

à la semaine prochaine

Hors ligne

 

#2 28-06-2017 09:13:06

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: Amigo ! tu veux jouer avec moi !

puisqu'il faut jouer un million de fois, jouons....

Notre objectif pour cette semaine est de construire une table d'un million de ligne proposant d'une part 7 variables représentant les numéros cochés sur ma grille et d'autre part, 12 variables représentant les numéros obtenus au tirage. On considèrera par la suite que sur ces 12 numéros, les 7 premiers représentent les numéros "bleus" et que les 5 derniers représentent les numéros "bonus".

La question est maintenant : comment effectuer des tirages sans remise ?

Les lecteurs attentifs des beaux mercredis ont déjà la réponse puisque nous allons utiliser une routine déjà évoquée dans le premier sujet des beaux mercredis : CALL RANPERM

(ce premier sujet date de 2011... Jouons au poker avec SAS comme le temps passe vite...)

Code:

data amigo(keep=n1-n7 t1-t12);
      array moi{28} n1-n28 (1:28);
      array tirage{28} t1-t28 (1:28);
      seed = 38924889392;
      do n=1 to 1000000;
         call ranperm(seed, of n1-n28);
         call ranperm(seed, of t1-t28);
         output;
      end;
run;

Le principe est le suivant : vous définissez un tableau au moyen de l'instruction ARRAY et vous précisez des valeurs de départ de vos variables. Les 28 variables de notre tableau prennent les valeurs 1 à 28. Vous définissez une variable appelée SEED et vous lui donnez une valeur. En argument de CALL RANPERM, vous citez en premier votre variable SEED puis vos 28 variables : SAS, au hasard, permutera les 28 valeurs : vous obtenez un tirage sans remise.

Vous insérez votre CALL RANPERM à l'intérieur d'une boucle DO qui ira de 1 à 1000000 : vous obtenez votre table d'un million d'observations !

Il n'y a plus qu'à voir, pour chaque tirage (observations) si nous avons gagné et combien...

à la semaine prochaine

Hors ligne

 

#3 07-07-2017 07:37:04

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: Amigo ! tu veux jouer avec moi !

Poursuivons...

Pour cette semaine, nous allons modifier notre programme pour ajouter deux variables à la table construite la semaine dernière. Ces deux variables vont nous indiquer combien nous avons de numéros bleus et combien nous avons de numéros bonus.

Code:

data amigo(keep=n1-n7 t1-t12 bleu bonus);
      array moi{28} n1-n28 (1:28);
      array tirage{28} t1-t28 (1:28);
      seed = 38924889392;
      do n=1 to 1000000;
         call ranperm(seed, of n1-n28);
         call ranperm(seed, of t1-t28);
         bleu=0;
         bonus=0;
         do i=1 to 7;
            do k=1 to 7;
                if moi(i)=tirage(k) then bleu+1;
            end;
            do k=8 to 12;
               if moi(i)=tirage(k) then bonus+1;
            end;
         end;
         output;
      end;
run;

Les variables BLEU et BONUS vont être construites par incrémentation. Il est donc nécessaire de les fixer à 0 avant de voir si dans nos numéros, il y a des numéros qui sont parmi les 12 numéros tirés.

la boucle sur i va nous permettre de regarder les numéros que nous avons joué. On considère que les 7 premiers numéros du tirage sont les numéros bleus et donc, à l'intérieur de notre boucle sur I, on présente une boucle sur K afin de comparer nos numéros avec les numéros bleus.

La seconde boucle sur K (8 à 12) nous permet de voir si nous avons des numéros bonus.

et voilà !

qu'obtient-on ?

ceci :
http://www.sas-sr.com/img/amigo.png

le bol !! sur 1 000 000 tirages, on a une fois les 7 numéros bleus ! 25 000 euros !!

bon, ce n'est pas vraiment du bol... 7*6*5*4*3*2/(28*27*26*25*24*23*22) * 1 000 000 = 0.8445

sur 1 000 000 de tirage, on a 0.8445 tirage à 7 numéros bleus.... ou autrement dit, sur 20 séries de 1 000 000 de tirages, on aura 17 fois les 7 numéros bleus...

il ne nous reste plus qu'à calculer nos gains (et aussi nos pertes... parce qu'il ne faut pas oublier que pour jouer une partie, il faut miser deux euros...)

à la semaine prochaine

Hors ligne

 

#4 12-07-2017 12:50:44

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: Amigo ! tu veux jouer avec moi !

Bon... les vacances approchent... il est temps de clore ce sujet.

Nous avons d'une part une table (voir le premier post) qui vous présente les différents gains en fonction du nombre de numéros bleus et du nombre de numéros bonus et d'autre part, une table d'un million de lignes qui nous dit, pour un million de tirages, combien nous avons de numéros bleus de de numéros bonus : vous me direz donc qu'il suffit de les fusionner...

et je vous dirai : "bof...., il y a mieux à faire..."

je vous donne quand même les programmes....

au moyen du langage SAS :

Code:

proc sort data=gain(rename=(bl=bleu bo=bonus));
by bleu bonus;
run;

proc sort data=amigo(drop=n: t:);
   by bleu bonus;
run;

data amigogain;
   merge amigo gain;
   by bleu bonus;
run;
 
proc means data=amigogain sum;
   var gain;
run;

et vous avez le résultat que l'on commentera plus tard : 1 364 974

je dis "bof" parce que nous avons ici l'idée de proposer des programmes efficaces... deux proc sort, une étape data, un proc means... on doit pouvoir faire mieux...

passons par SQL... (mais on continuera à dire "bof")

Code:

proc sql ;
** si vous repartez d'une table GAIN avec des variables appelées bl et bo, exécutez cette requête ;
select sum(gain) from amigo left join gain on gain.bl=amigo.bleu and gain.bo=amigo.bonus;

** exécutez cette requête si les noms des variables de la table gain ont été modifiées ;
select sum(gain) from amigo left join gain on gain.bleu=amigo.bleu and gain.bonus=amigo.bonus;
quit;

Plus de tri, aucune étape DATA, plus de PROC MEANS.... et le même résultat (c'est rassurant...)

Vous vous direz : "mais pourquoi dit-il bof ?"

et bien parce qu'on a quand même créé deux tables qui, une fois le résultat obtenu ne nous intéressent plus. On peut en fait éviter de créer ces tables !

Commençons avec ce qui était la table GAIN et construisons des macro-variables au lieu d'une table :

Code:

data _null_;
input bl bo gain ;
call symputx(compress("gain"||bl||"_"||bo),gain);
cards;
7 0 25000
6 1 600
5 2 140
4 3 105
3 4 100
2 5 100
6 0 500
5 1 55
4 2 20
3 3 15
2 4 15
1 5 15
5 0 40
4 1 8
3 2 3
2 3 3
1 4 3
0 5 3
4 0 5
3 1 2
2 2 2
1 3 2
0 4 2
;

Au moyen de cette première étape data _null_, vous allez créer des macro-variables qui, en fonction du nombre de numéros bleus et du nombre de numéros bonus vous donnera votre gain.

Exemple : gain7_0 pour 7 bleus et 0 bonus vous donne 25000.

aucune table créée...

Continuons en modifiant l'étape DATA qui crée la table AMIGO :

Code:

data _null_;
      array moi{28} n1-n28 (1:28);
      array tirage{28} t1-t28 (1:28);
      seed = 389289392;
      do n=1 to 1000000;
         call ranperm(seed, of n1-n28);
         call ranperm(seed, of t1-t28);
         bleu=0;
         bonus=0;
         do i=1 to 7;
            do k=1 to 7;
               if moi(i)=tirage(k) then bleu+1;
            end;
            do k=8 to 12;
               if moi(i)=tirage(k) then bonus+1;
            end;
         end;
         if symexist(compress("gain"||bleu||"_"||bonus)) then gain+symgetn(compress("gain"||bleu||"_"||bonus));
      end;
      put gain ;
run;

à la place de l'instruction OUTPUT, nous avons mis cette instruction :

Code:

if symexist(compress("gain"||bleu||"_"||bonus)) then gain+symgetn(compress("gain"||bleu||"_"||bonus));

à ce stade du programme, pour un tirage donné, on dispose du nombre de numéros bleus et du nombre de numéros bonus. La condition IF nous permet de vérifier si une macro-variable associée à ce couple (bleus ; bonus) existe. Si c'est le cas, alors c'est qu'on a gagné ! on va donc augmenter la variable GAIN du montant stocké dans la macro variable gainbleu_bonus.

Après le dernier END, nous avons effectué notre million de tirage. PUT GAIN nous donnera dans le journal notre gain : 1 364 974

Conclusion : pour jouer un million de partie, nous avons dépensé 2 000 000 d'euros.
In fine, nous gagnons 1 364 974 euros.
Notre espérance de gain, en jouant un euro est donc de 0.682 euros.

Répondons (enfin) à la question : Amigo, tu veux jouer avec moi ?

je ne joue qu'aux jeux auxquels je gagne.... alors non merci (mais c'est gentil d'avoir demandé).

Les beaux mercredis ferment leurs portes pour les vacances...

Réouverture normalement vers le 15 septembre 2017 pour la saison 7 des beaux mercredis : de l'intrigue, de l'amour, des trahisons, des rebondissements inattendus.... je saurai vous détendre (avec SAS...)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS