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 09-12-2015 07:47:02

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

[archive] PROC REPORT : le cauchemar !

Bonjour

PROC REPORT est une procédure que pas mal d'utilisateurs de SAS n'aiment pas... c'est vrai qu'elle est un peu étrange et qu'il faut bien comprendre comment elle fonctionne si l'on veut produire des choses intéressantes...

Chez SAS, ils ont dû pleinement intégrer l'étrangeté de cette procédure puisque ça ne les dérange pas de mettre dans l'aide un résultat très intrigant... (et je remercie au passage Julie qui m'a contacté pour me montrer cet étrange résultat...)

Voyez cet exemple donné dans l'aide :
http://support.sas.com/documentation/cd … 9ngxmv.htm

vous allez me dire "ce programme est infernal"
c'est surtout le résultat qui est étrange :

http://support.sas.com/documentation/cdl/en/proc/68954/HTML/default/images/report_ex07.png

Regardez la colonne PROFIT du premier tableau : 168 + 47.5 + 36 + 21.5 = 196.5 ??????????
non, 168 + 47.5 + 36 + 21.5 = 273 (et il y a aussi une erreur dans le second tableau...)

L'objet de ce sujet des beaux mercredis sera, in fine, de trouver le bon résultat... ça risque d'être un peu long parce, même dans des cas plus simples, ce qui apparaît en somme peut ne pas être correct...

Voici le programme qui permet de construire la table GROCERY utilisée par cet exemple :

Code:

data grocery;
   input Sector $ Manager $ Department $ Sales @@;
   datalines;
se 1 np1 50    se 1 p1 100   se 1 np2 120   se 1 p2 80
se 2 np1 40    se 2 p1 300   se 2 np2 220   se 2 p2 70
nw 3 np1 60    nw 3 p1 600   nw 3 np2 420   nw 3 p2 30
nw 4 np1 45    nw 4 p1 250   nw 4 np2 230   nw 4 p2 73
nw 9 np1 45    nw 9 p1 205   nw 9 np2 420   nw 9 p2 76
sw 5 np1 53    sw 5 p1 130   sw 5 np2 120   sw 5 p2 50
sw 6 np1 40    sw 6 p1 350   sw 6 np2 225   sw 6 p2 80
ne 7 np1 90    ne 7 p1 190   ne 7 np2 420   ne 7 p2 86
ne 8 np1 200   ne 8 p1 300   ne 8 np2 420   ne 8 p2 125
;

proc format ;
   value $sctrfmt 'se' = 'Southeast'
                  'ne' = 'Northeast'
                  'nw' = 'Northwest'
                  'sw' = 'Southwest';

   value $mgrfmt '1' = 'Smith'   '2' = 'Jones'
                 '3' = 'Reveiz'  '4' = 'Brown'
                 '5' = 'Taylor'  '6' = 'Adams'
                 '7' = 'Alomar'  '8' = 'Andrews'
                 '9' = 'Pelfrey';

   value $deptfmt 'np1' = 'Paper'
                  'np2' = 'Canned'
                  'p1'  = 'Meat/Dairy'
                  'p2'  = 'Produce';
run;

et voici un programme qui ne doit vous poser aucun problème si vous avez lu avec attention la section 6.4 (ED3) consacrée à PROC REPORT :

Code:

title 'Un rapport nettement plus gentil';
proc report data=grocery;
   column department sales Profit ;

   define department / group format=$deptfmt.;
   define sales / analysis sum format=dollar11.2;
   define profit / computed format=dollar11.2;

   compute profit;
      if department='np1' or department='np2' then profit=0.4*sales.sum;
      else profit=0.25*sales.sum;
   endcomp;

   Rbreak after / summarize ;
run;

Bon... quand je dis que vous devez comprendre ce programme sans aucune difficulté, j'exagère un peu (mais c'était pour vous donner confiance en vous ! ). Les instructions COLUMN et DEFINE ne posent pas de difficultés mais ce que vous avez à l'intérieur du bloc COMPUTE peut vous paraître étrange :

Code:

   compute profit;
      if department='np1' or department='np2' then profit=0.4*sales.sum;
      else profit=0.25*sales.sum;
   endcomp;

Dans les exemples de blocs COMPUTE donnés dans mon ouvrage, je ne fais que de la construction "simple" :

Code:

COMPUTE vitesse ;
   vitesse=3600*2.1/temps.mean;
ENDCOMP;

Vous apprenez aujourd'hui déjà une chose : on peut faire de la construction conditionnelle à l'intérieur des blocs COMPUTE et la syntaxe est quasi identique à de la syntaxe propre à l'étape DATA !

Le profit est ainsi calculé : si DEPARTMENT est égal à np1 ou np2 alors le profit est égale à 40% des ventes (SALES), si ce n'est pas le cas, le produit est égal à 25% des ventes. Nous avons une variable GROUP : nos observations vont donc être regroupées par modalité de la variable DEPARTMENT, le profit, c'est donc un pourcentage de la somme des ventes (d'où SALES.SUM) enregistrées pour un certain département.

On obtient le résultat suivant :
http://www.sas-sr.com/img/report_sum1.png

et la somme des profits sur la dernière ligne est toujours aussi fausse alors que la somme des ventes est, elle, juste...

Donc pour la semaine prochaine, vous allez réfléchir (et déjà peut être relire la section 6.4 de mon bouquin...) afin de comprendre le résultat présenté comme la somme des profits et qui, en fait, n'y correspond pas.

Pourquoi obtient-on ce résultat ?

En passant, si PROC REPORT vous passionne, vous pourrez aussi consulter cet autre sujet des beaux mercredis

amusez vous bien

Ce sujet est maintenant archivé - seuls les utilisateurs inscrits de www.sas-sr.com peuvent consulter l'intégralité du sujet et les réponses aux questions posées.
pour vous identifier, suivez ce lien
pour vous inscrire, suivez ce lien

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS