Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS STAT
SAS STAT Forum d'entraide sur les fonctionnalités liées à la statistique sur SAS : statistique descriptive, test, régression, classification
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/12/2011, 09h37   #1
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
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 :
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 :
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.
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 13h00   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/12/2011, 11h30   #3
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Merci beaucoup.

J'ai repris ton code pour ajouter des détails et j'obtiens maintenant à peu près le résultat escompté :
Code :
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.
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 08h34   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h26.


 
 
 
 
Partenaires

Hébergement Web