Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
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 23/09/2011, 16h46   #1
 
Inscription : mars 2008
Messages : 18
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 18
Points : -1
Points : -1
Par défaut Question sur le PROC FREQ

J'aimerais faire un PROC FREQ
selon une variable STATUT et le % de PLUSIEURS VARIABLES

Par exemple:
Dépenses
M1 M2 M3 M4 M5 M6
P. seule % % % % % %
C. sans enfants % % % % % %
C. avec enfants % % % % % %
Monoparentales % % % % % %
Autres % % % % % %

Comment faire ?

J'ai fais un petit test....

Code :
1
2
3
4
5
6
7
 
PROC FREQ DATA = NEW; 
    TABLE STATUT*M161 / NOFREQ NOROW NOCOL; 
    WEIGHT WEIGHT;
    WHERE PROVINCP = "24"
          & M11 > "0" ; 
RUN;
catherineh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 14h09   #2
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Peux tu donner plus d'élément sur la nature de ta table en entrée ?

Par ailleurs, un proc tabulate sera peut être plus adapté à ton besoin (à confirmer selon tes données en entrée justement)
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 15h46   #3
 
Inscription : mars 2008
Messages : 18
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 18
Points : -1
Points : -1
J'ai une seule table qui comprend toutes les variables.

J'ai des variables qui concernent les dépenses des ménages.

M101 (Dépense en loisir en $)
M102 (Dépense en lecture en $)
M103 (Dépense en spectacle en $)
M104 (Dépense en cinéma en $)

J'ai une variable qui concerne le statut.

1: Célibataire
2: Monoparentale
3: Couple sans enfant
4: Couple avec enfant
5: Autres


J'ai besoin de connaitre :
- le % de célibataire qui font des dépenses en loisir
- le % de célibataire qui font des dépenses en lecture
- le % de célibataire qui font des dépenses en spectacle
- le % de célibataire qui font des dépenses en cinéma
- le % de Monoparentale qui font des dépenses en loisir
- le % de Monoparentale qui font des dépenses en lecture
- le % de Monoparentale qui font des dépenses en spectacle
- le % de Monoparentale qui font des dépenses en cinéma
Etc... Etc... pour chacun des statut....

Quel pourrait être la procédure ?

Merci....
catherineh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 18h20   #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
Bonjour Catherine.
Ce que tu peux faire, c'est procéder en 2 temps.
Car dans ce que je lis, tu veux surtout séparer "fait des dépenses" / "ne fait pas de dépenses". Donc il faut déjà distinguer les cas dans tes données.
Avec une étape DATA, tu peux créer des nouvelles versions de tes variables
M101 (Dépense en loisir en $)
M102 (Dépense en lecture en $)
M103 (Dépense en spectacle en $)
M104 (Dépense en cinéma en $)
Par exemple avec un ARRAY pour les traiter toutes d'un coup.
Code :
1
2
3
4
5
6
7
DATA work.nouvelle ;
   SET ... ;
   ARRAY depenses M101-M104 ;
   DO OVER depenses ;
     depenses = (depenses > 0) ;
   END ;
RUN ;
Dans ce code, on remplace les valeurs avec des montants par des 0 (s'il n'y a pas de dépenses : 0 ou manquant) ou des 1 (s'il y a un montant positif). Attention à créer une nouvelle table SAS pour ne pas massacrer l'information d'origine !
Ensuite tu peux faire une proc TABULATE pour obtenir ton tableau. Comme les variables valent 0 ou 1, leur moyenne est le % de fois où elles valent 1.
Code :
1
2
3
4
5
PROC TABULATE DATA=work.nouvelle FORMAT=PERCENTN12.2 ;
  CLASS statut ;
  VAR m101 m102 m103 m104 ;
  TABLE statut, MEAN="" * (m101 m102 m103 m104) ;
RUN ;
Bon courage.
Olivier

PS : Rémi, arrête de travailler le samedi !
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 18h40   #5
 
Inscription : mars 2008
Messages : 18
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 18
Points : -1
Points : -1
Merci Olivier pour ton aide

J'ai une vingtaine de variables commençant par M...
Je ne les ai pas tous écrits mais ce sont toutes des
dépenses de ménage et c'est toujours le même principe.

Puis-je toujours faire un "ARRAY depenses M101-M104"
même s'ils ne suivent pas.

Est-ce que c'est la même chose principe que tu parles,
je veux connaitre le pourcentage et non la moyenne, mais pour cela, j'ai besoin d'obtenir la somme de toutes les dépenses ?
catherineh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 20h37   #6
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Hello,

Normalement pas de problème pour l'array, même si les variables de ne suivent pas.

Pour compléter l'exemple d'Olivier, si tu ne veux pas écraser tes variables, tu peux créer un vecteur de nouvelles variables "top".

1- Création données test :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA TABLE ;
    attrib M101   length =  8 format = 8.2 label = "Dépense en loisir" 
           M102   length =  8 format = 8.2 label = "Dépense en lecture" 
           Statut length = $1 format = $1.  label = "Statut familial"
           M103   length =  8 format = 8.2 label = "Dépense en spectacle" 
           M104   length =  8 format = 8.2 label = "Dépense en cinéma"   
            ;
    input M101 M102 statut $ M103 M104 ; 
    cards ;
        100 50 C  0 60
        200 0  C  0 80
        50  60 M 50 0 
        ;
run ;
2- Retraitement de la table avec des array
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA nouvelle ;
    SET TABLE ;
    attrib TP_M101   length =  3  label = "Top Dépense en loisir" 
           TP_M102   length =  3  label = "Top Dépense en lecture" 
           TP_M103   length =  3  label = "Top Dépense en spectacle" 
           TP_M104   length =  3  label = "Top Dépense en cinéma" 
            ;
   array Depenses    M101-M104 ;
   array TP_Depenses TP_M101-TP_M104 ;
   DO loop = 1 TO dim(Depenses) ;
     TP_depenses(loop) = (depenses(loop) > 0) ;
   END ;
   DROP loop ;
RUN ;
3- Calcul des indicateurs avec proc tabulate
Code :
1
2
3
4
5
6
PROC TABULATE DATA=work.nouvelle FORMAT=PERCENTN12.2 ;
  CLASS statut ;
  VAR TP_M: ;
  TABLE statut,                                  
        MEAN   ="" * (TP_M101 TP_M102 TP_M103 TP_M104)  ;
RUN ;
Concernant ta dernières question
"je veux connaitre le pourcentage et non la moyenne, mais pour cela, j'ai besoin d'obtenir la somme de toutes les dépenses ?"
--> Cela signifie que tu veux calculer également un autre indicateur, du type :
"le % moyen que les célibataires consacrent aux loisirs" (etc.) ?
Auquel cas, c'est la la moyenne des pourcentages pour tous les célibataires, ou le pourcentage du total dépensé par les célibataires

PS @ Olivier : je travaille pas, je fais du SAS, ça n'a rien à voir !
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 22h01   #7
 
Inscription : mars 2008
Messages : 18
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 18
Points : -1
Points : -1
--> Cela signifie que tu veux calculer également un autre indicateur, du type :
"le % moyen que les célibataires consacrent aux loisirs" (etc.) ?
Auquel cas, c'est la la moyenne des pourcentages pour tous les célibataires, ou le pourcentage du total dépensé par les célibataires


La réponse que je voudrais calculer le pourcentage de chacune des dépenses
pour tous les célibataires sur tous les dépenses pour connaitre la dépense en loisir qu'il consacre le plus.

J'ai aussi une variable WEIGHT pour pondérer chacune des dépenses.
catherineh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 08h59   #8
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 Catherine.
J'avais oublié la pondération. Il y a une instruction WEIGHT dans la proc TABULATE comme dans la proc FREQ.
Pour le % des dépenses en montant, plutôt qu'une variable 0/1, il faut calculer le pourcentage dans une étape DATA. La piste de l'array reste valable, puisqu'elle évite de copier/coller la formule pour toutes les variables M... en changeant les noms.
Code :
1
2
3
4
5
6
7
8
DATA work.nouvelle ;
   SET ... ;
   ARRAY depenses M101-M104 ;
   total = SUM(OF depenses[*]) ;
   DO OVER depenses ;
     depenses = depenses / total ;
   END ;
RUN ;
Et pour répondre à la question sur la liste de variables, pour l'écriture M101-M104 il faut une série continue (pas d'absence de M103 par exemple) et sinon, il faut écrire M1: pour "toutes les variables dont le nom commence par M1". Attention dans ce cas à ne pas en prendre trop.
Et il reste la solution d'énumérer les noms, séparés par des espaces.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web