IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ODS et reporting Discussion :

Tableau avancé sous SAS


Sujet :

ODS et reporting

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Stat
    Inscrit en
    Janvier 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Stat
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Tableau avancé sous SAS
    Bonjour à tous,
    Je cherche à réaliser un tableau dans SAS dont la structure n'est pas vraiment classique (voir pièce jointe). Il s'agit de décrire le nombre de personnes ayant accepté de participer à un jeu (= personnes inscrites) à la suite d'un entretien, en fonction de son pays et de la semaine. Pour cela je voudrais afficher dans un tableau 3 colonnes pour chaque semaine: le taux d'inscription (nb de personnes inscrites divisé par le nb total de personnes interrogées), le nombre d'inscrits, le nombre d'interrogés.

    Voici un exemple de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DATA test;
    input semaine lieu $ inscrip;
    datalines;
    45 france 1
    45 france 1
    45 france 0
    45 espagne 1
    45 espagne 0
    45 espagne 0
    45 espagne 0
    45 espagne 0
    46 france 1
    46 france 1
    46 france 1
    46 france 0
    46 france 0
    RUN;
    J'ai pensé à 3 solutions différentes mais me heurte à chaque fois à un problème.

    --> un PROC TABULATE affiche une colonne en trop (celle des personnes non inscrites) et ne me permet pas de calculer le taux d'inscription

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROC TABULATE DATA=test;
    CLASS LIEU SEMAINE INSCRIP;
    TABLE LIEU,SEMAINE * (INSCRIP ALL);
    RUN;
    --> un PROC SQL ne me permet pas d'afficher toutes les semaines dans un même tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROC SQL;
    SELECT lieu, (sum(inscrip)/count(inscrip))*100 as taux, sum(inscrip) as inscrip, count(inscrip) as total
    FROM test
    WHERE semaine=45
    GROUP BY lieu;
    QUIT;
    --> avec un PROC REPORT, je n'ai pas trouvé comment ajouter le taux d'inscription

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PROC REPORT DATA=TEST nowindows;
    columns lieu (semaine, (inscrip n)) (inscrip n);
    define lieu / group ;
    define inscrip / analysis sum;
    define n/ 'Total';
    define semaine/across;
    rbreak after / summarize;
    compute after;
    lieu="Total";
    endcomp;
    RUN;
    EDIT:
    J'ai réussi à introduire le taux pour la colonne Total avec un PROC REPORT. Mon problème est maintenant d'avoir le taux pour chaque semaine...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PROC REPORT DATA=TEST nowindows;
    columns lieu (semaine, (inscrip n)) (inscrip n taux);
    define lieu / group ;
    define inscrip / analysis sum;
    define n/ 'Total';
    define semaine/across;
    rbreak after / summarize;
    compute after;
    lieu="Total";
    endcomp;
    define taux / computed format=NPLCTN12.2;
    compute taux;
    taux = inscrip.sum/n;
    endcomp
    RUN;
    J'imagine qu'une solution adaptée existe mais mon manque d'expérience ne m'a pas permis à ce jour de la trouver... Mille merci d'avance !

    Garpe
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Une solution simple est d'utiliser quasiment la même astuce que pour tes effectifs inscrits : dans ce cas tu fais déjà une somme ; le taux d'inscription est une moyenne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    DATA test;
    input semaine lieu $ inscrip;
    datalines;
    45 france 1
    45 france 1
    45 france 0
    45 espagne 1
    45 espagne 0
    45 espagne 0
    45 espagne 0
    45 espagne 0
    46 france 1
    46 france 1
    46 france 1
    46 france 0
    46 france 0
    RUN;
    PROC REPORT DATA=TEST nowindows;
    columns lieu (semaine, (inscrip n inscrip=tx)) (inscrip n inscrip=tx);
    define lieu / group ;
    define inscrip / analysis sum;
    define tx / analysis mean format=NLPCT32.1 "Taux"  ;
    define n/ 'Total';
    define semaine/across;
    rbreak after / summarize;
    compute after;
    lieu="Total";
    endcomp;
    RUN;
    Bon courage.
    Olivier

  3. #3
    Membre du Club
    Femme Profil pro
    Formatrice en SAS (en ligne)
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Formatrice en SAS (en ligne)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Points : 46
    Points
    46
    Par défaut
    Bonjour,
    Je te propose une solution où tu réalises les calculs indépendamment de proc report pour réserver proc report au reporting pur.
    En pièce jointe, tu trouveras le résultat obtenu dans le fichier Excel.
    Bien à toi
    Véronique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    %let xxroot     = C:/Users/xxformat/Documents/SASUniversityEdition/myfolders;
    %let xxdemo = &xxroot./training/demo;
     
     
    data test;
    input semaine lieu $ inscrip;
    datalines;
    45 france 1
    45 france 1
    45 france 0
    45 espagne 1
    45 espagne 0
    45 espagne 0
    45 espagne 0
    45 espagne 0
    46 france 1
    46 france 1
    46 france 1
    46 france 0
    46 france 0
    ;
    run;
     
    *1. Setting;
    *---------------------------------------;
     
    proc format;
        value $xxlieu '1' = 'France'
                      '2' = 'Espagne'
                      '3' = 'Total';
     
        value xxnlpct .    ='--'
                      other=[nlpct6.1];
    run;
     
     
    * 2. Data Preparation;
    *---------------------------------------;
     
    data test;
        set test;
        if lieu='france' then lieu='1';
        else if lieu='espagne' then lieu='2';
        output;
        lieu='3'; output;
    run;
     
     
    ods exclude all;
    ods output CrossTabFreqs=result (keep=lieu semaine inscrip frequency
                                     where=(inscrip in (1,.)));
    proc freq data=test ;
        tables lieu*semaine*inscrip;
    run;
    ods exclude none;
     
     
    proc sort data=result;
        by lieu semaine inscrip;
    run;
     
    data result (drop=frequency where=(inscrip=1));
        set result;
        length rapport $10;
        tx      = round(frequency/lag(frequency),.001);
        rapport = catx('/',put(frequency,3.),put(lag(frequency),3.));
    run;
     
    data result (drop=semaine inscrip);
        merge result (rename=(tx=tx45  rapport=rapport45)  where=(semaine=45))
              result (rename=(tx=tx46  rapport=rapport46)  where=(semaine=46))
              result (rename=(tx=txtot rapport=rapporttot) where=(semaine=.));
       by lieu;    
    run;
     
    * 3. Reporting;
    *---------------------------------------;
     
    ods excel file="&xxdemo./reporting/xxformat.xlsx"
              options(sheet_name='Feuil1');
    proc report data=result split='*' style(header)=[background        = white
                                                     foreground        = black
                                                     font_weight       = medium
                                                     vjust             = bottom
                                                     borderbottomcolor = black]
                                      style(column)=[just=right];
         column lieu ('Semaine 45' tx45  rapport45)
                     ('Semaine 46' tx46  rapport46)
                     ('Total'      txtot rapporttot);
         define lieu       / display ' ' style(column)=[just=left];
         define tx45       / display "Taux d'inscription";
         define rapport45  / display 'Rapport*Inscrits/interrogés';
         define tx46       / display "Taux d'inscription";
         define rapport46  / display 'Rapport*Inscrits/interrogés';
         define txtot      / display "Taux d'inscription";
         define rapporttot / display 'Rapport*Inscrits/interrogés';
         compute lieu;
             if lieu='3' then call define (_row_,'style','style=[borderbottomcolor=black]');
         endcomp;
         format lieu $xxlieu. tx45 tx46 txtot xxnlpct.;
    run;
    ods excel close;
    Fichiers attachés Fichiers attachés

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Stat
    Inscrit en
    Janvier 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Stat
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Merci beaucoup pour ces deux réponses, c'est exactement ce que je recherchais. Elles m'ont été et me seront d'une grande aide pour mes tableaux futurs !

    Bien à vous,
    GP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réaliser un tableau sous sas sous forme de liste
    Par poupounne56 dans le forum Débutez
    Réponses: 2
    Dernier message: 08/06/2012, 08h13
  2. Tableau de bord web sous sas
    Par bibson5 dans le forum Outils BI
    Réponses: 0
    Dernier message: 14/07/2010, 22h34
  3. Réponses: 2
    Dernier message: 16/06/2006, 09h15
  4. Rendre un tableau inextensible sous ie?
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 23/12/2005, 10h49
  5. Etat d'avancement sous forme de boite de dialogue
    Par Madeso dans le forum Access
    Réponses: 1
    Dernier message: 11/10/2005, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo