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

SAS STAT Discussion :

Calcul d'un sex-ratio


Sujet :

SAS STAT

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Points : 39
    Points
    39
    Par défaut Calcul d'un sex-ratio
    Bonjour,

    Je dispose de la table suivante que j'affiche sous forme de tableau avec une proc tabulate :
    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
    DATA test;
    INPUT Class_age $ Sexe $ Id;
    CARDS;
    ]40et+] F 1
    ]10-20] M 2
    ]20-30] M 3
    ]30-40] F 4
    ]30-40] M 5
    ]30-40] M 6
    ]40et+] M 7
    [0-10] F 8
    ]20-30] M 9
    ]40et+] F 10
    ]20-30] F 11
    ]10-20] F 12
    [0-10] M 13
    ]10-20] F 14
    ]30-40] F 15
    [0-10] M 16
    ]10-20] M 17
    ]20-30] F 18
    ]40et+] M 19
    ]30-40] F 20
    [0-10] M 21
    ]40et+] M 22
    [0-10] F 23
    ]20-30] M 24
    ;
    RUN;
     
    PROC TABULATE DATA = test;
    	CLASS sexe class_age;
    	TABLE (class_age all), (sexe all) * (n);
    RUN;
    Je cherche maintenant à calculer le sex-ratio en fonction de la classe d'âge.
    Est-ce faisable avec la proc tabulate ou faut-il procéder autrement ?

    J'ai calculé le sex-ratio d'une autre manière en passant par une data set :
    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
    PROC TABULATE DATA = test OUT = test1;
    	CLASS sexe class_age;
    	TABLE (class_age all) (sexe all) * (n);
    RUN;
     
    PROC SORT DATA = test1;
    	BY class_age;
    RUN;
     
    PROC TRANSPOSE DATA = test1 OUT = test2 (KEEP = F M class_age);
    	BY class_age;
    	VAR N;
    	ID sexe;
    	COPY _all_;
    RUN;
     
    DATA test2;
    SET test2;
    	sex_ratio = M/F;
    	IF sex_ratio = . THEN DELETE;
    RUN;
    mais je ne sais pas comment retrouver ensuite le même tableau d'initialement avec le sex-ratio en plus.

    Une idée ? Merci.

  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.
    Les calculs à la volée ne sont pas possibles dans la proc TABULATE, sauf de très rares cas particuliers.
    Par contre la proc REPORT fait ça très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PROC REPORT DATA=test NOWD ;
      COLUMNS class_age sexe ratio ;
      DEFINE class_age / GROUP ;
      DEFINE sexe / ACROSS ;
      DEFINE ratio / COMPUTED FORMAT=NLPCTN12.2 ;
      COMPUTE ratio ;
        ratio = _c2_ / _c3_ ;
      ENDCOMP ;
    RUN ;
    Seul bémol à la lisibilité du programme : comme tu veux des colonnes par sexe, on doit ensuite repêcher les effectifs de filles et de garçons avec les numéros des colonnes (C2 et C3).
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    Merci beaucoup.

    J'ai repris ton code pour ajouter des détails et j'obtiens maintenant à peu près le résultat escompté :
    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 NOWD;
    	COLUMNS Class_age sexe,(N PCTN) N PCTN sex_ratio;
    	DEFINE Class_age / DISPLAY "Classe d'âge" GROUP;
    	DEFINE sexe / DISPLAY "Sexe" ACROSS;
    	DEFINE PCTN / "%" FORMAT = nlpctn6.2;
    	DEFINE N / "Fréq.";
    	DEFINE sex_ratio / DISPLAY "Sex-ratio" COMPUTED FORMAT=4.2;
    	COMPUTE sex_ratio;
    		sex_ratio = _c4_ / _c2_;
    	ENDCOMP;
    	RBREAK AFTER / SUMMARIZE STYLE = [font_weight = bold font_style = roman];
    	COMPUTE Class_age;
    		IF _break_="_RBREAK_" THEN Class_age = "TOTAL";
    	ENDCOMP;
    RUN;
    Il reste cependant quelques problème "d'esthétique" que je n'arrive pas à régler :
    1. J'aimerais ordonner les classes d'âge différemment. Par exemple avoir en premier ]20-30] puis ]40 et +[ puis etc.
    2. Si possible, fusionner les cellules têtes de sorte à ne pas avoir 2 cellules vides en tête de colonne.
    3. Mettre en gras les Fréq. et % totaux, et seulement ceux-là.

    Encore merci.

  4. #4
    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
    Réponses à tes questions :
    1) si dans la table tes tranches sont déjà dans l'ordre que tu souhaites, tu ajoutes ORDER=DATA dans le DEFINE de ta colonne CLASS_AGE
    2) là, de bon matin, je ne vois pas vraiment comment faire. La proc REPORT n'est pas la championne de la cellule fusionnée
    3) il faut donner des alias à tes colonnes de totaux (avec =alias dans l'instruction COLUMNS) et ensuite leur faire des DEFINE juste pour ces alias.
    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=sashelp.class NOWD ;
      COLUMNS age 
              sex,(N PCTN) 
              ("Total" N=nTot PCTN=pctTot) 
              ratio ;
      DEFINE age / GROUP ORDER=DATA ;
      DEFINE sex / ACROSS "" ;
      DEFINE ratio / COMPUTED FORMAT=NLPCTN12. ;
      DEFINE pctn / FORMAT=NLPCTN12. "%" ;
      DEFINE pctTot / FORMAT=NLPCTN12. STYLE=[FONT_WEIGHT=BOLD] "%" ;
      DEFINE nTot / STYLE=[FONT_WEIGHT=BOLD] ;
      COMPUTE ratio ;
        ratio = _c2_ / _c4_ ;
      ENDCOMP ;
    RUN ;
    Bon courage.
    Olivier
    Bon courage.
    Olivier

Discussions similaires

  1. Calcul d'un ratio
    Par roman33 dans le forum Requêtes et SQL.
    Réponses: 55
    Dernier message: 07/03/2010, 22h20
  2. Réponses: 19
    Dernier message: 23/03/2009, 13h58
  3. calcul ratio par select simple
    Par gg2vig dans le forum SQL
    Réponses: 1
    Dernier message: 17/06/2008, 18h21
  4. [CR ?]Calcul d'un ratio
    Par Herman dans le forum SAP Crystal Reports
    Réponses: 25
    Dernier message: 20/04/2008, 14h46
  5. calcul de ratios
    Par papawemba dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/01/2007, 19h42

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