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 :

Proc gplot : nombre d'observations en abscisse


Sujet :

ODS et reporting

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Proc gplot : nombre d'observations en abscisse
    Bonjour,

    J'apprends à manipuler SAS sur le tas, donc s'il vous plait ayez pitié de ma question!

    J'aimerais générer des nuages de points portant sur une variable (somme-des-points) et le nombre d'observations de celle-ci au sein d'une catégorie donnée (j'ai 4 catégories qu'on appellera categorie1, categorie2, etc).

    Le nombre d'entrées dans chaque catégories est assez important (plusieurs milliers), et ma variable somme_des_points a été calculée par rapport à leurs caractéristiques.
    Je pense qu'en résultat j'obtiendrai un truc qui ressemble plus ou moins à une courbe de gausse, étalée différemment selon les catégories, si j'arrive à afficher les valeurs de somme_des_points en fonction du nombre d'observations.

    J'ai lu plein de choses sur la syntaxe de gplot, mais dans ce que j'ai lu il faut deux variables, et je n'ai pas de variable "nombre d'observations" (je sais pas si je suis très claire, là).

    Quelqu'un aurait-il une solution??

  2. #2
    Membre habitué
    Homme Profil pro
    Chargé d'études stats
    Inscrit en
    Mai 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'études stats
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 49
    Points : 186
    Points
    186
    Par défaut
    Bonjour

    Ton fichier actuel a une structure "1 ligne par individu", avec les variables CATEGORIE et SOMME_DES_POINTS ?

    Si oui, pour tracer le graph qui je pense t'intéresse, il faut agréger le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc sql;
    create table agreg as
    select distinct categorie, somme_des_points, count(somme_des_points) as eff
    from fichier
    group by categorie, somme_des_points;
    quit;
    Puis PROC GPLOT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    symbol i=join;
    proc gplot data=agreg;
    by categorie;
    plot eff*somme_des_points;
    run;
    Je suis pas sûr d'avoir bien compris ton besoin, possible que ma proposition ne colle pas.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour BayHaym,

    Merci pour ta réponse , effectivement ma structure est bien de ce type là, et ça correspond bien à ce dont j'avais besoin!!

    Pour peaufiner la chose, est-il possible de définir lors de l'agrégation la variable eff en pourcentage?

    Je m'explique : je voudrais que eff définisse le nombre d'individus de ma catégorie qui ont la même somme_des_points par rapport au total de la catégorie concernée...

    C'est possible?


    EDIT : à chaque individu est également affecté un coefficient d'extrapolation (qui s'appelle extr2), qui traduit sa représentativité dans mon univers statistique. Dans mes autres procédures, je mets en application en utilisant l'option freq, mais j'ai l'impression que ce n'est pas possible dans une proc sql. Une idéee?? =)

  4. #4
    Membre habitué
    Homme Profil pro
    Chargé d'études stats
    Inscrit en
    Mai 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'études stats
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 49
    Points : 186
    Points
    186
    Par défaut
    Bonjour

    Concrètement, tu as défini une variable de pondération pour chacun de tes individus ? Si c'est le cas, il faut sommer les poids plutôt que de compter des occurences.

    Je t'envoie un exemple de table en entrée, et le code pour le traiter. A toi de voir si ça colle avec ton cas :
    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
    /*Exemple de table en entrée*/
    data fichier;
    input categorie $4. somme_des_points extr2;
    cards;
    cat1 10 3
    cat1 10 5
    cat1 43 2
    cat1 26 4
    cat2 10 9
    cat2 10 4
    cat2 78 6
    ;run;
     
    /*Calculer le poids agrégé par catégorie et par somme des points, le diviser
    par la somme des poids de la catégorie*/
    proc sql;
    CREATE TABLE agreg AS
    SELECT DISTINCT a.categorie, a.somme_des_points, sum(a.extr2) as eff,
    eff_tot, sum(a.extr2)/eff_tot AS pct
    FROM fichier a
    LEFT JOIN 
    	(SELECT DISTINCT b.categorie, sum(b.extr2) AS eff_tot
    	FROM fichier b
    	GROUP BY b.categorie) total
    on a.categorie=total.categorie
    GROUP BY a.categorie, a.somme_des_points;
    quit;

  5. #5
    Membre actif Avatar de tdiallo
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 118
    Points : 264
    Points
    264
    Par défaut
    Bonjour,

    Tu n'a pas bien copié le code de BayHaym.
    Il manque juste une parenthèse avant le ON. Tu ferme la parenthèse du (SELECT *****)

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci de bien vouloir te pencher encore un peu sur mon problème, c'est super sympa!

    Alors ton code a eu l'air d'avoir fonctionné (même si je t'avoue ne pas y avoir compris grandchose !!), mais quand je sors mon graphique, ça ne correspond pas à ce à quoi je m'attendais...

    Dans ton code tu as "calculé le poids agrégé par catégorie et par somme des points, que tu as divisé par la somme des poids de la catégorie"
    Donc avec ton exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    input categorie $4. somme_des_points extr2;
    cards;
    cat1 10 3
    cat1 10 5
    cat1 43 2
    cat1 26 4
    cat2 10 9
    cat2 10 4
    cat2 78 6
    en théorie ça a fait :
    catégorie 1, pour somme des points = 10, 8 individus
    catégorie 1, pour somme des points = 43, 2 individus
    catégorie 1, pour somme des points = 26, 4 individus (etc)
    donc un total de 14 individus, donc sur mon graph, la courbe de la catégorie 1 devrait avoir un maximum de 8/14=0.57, et tous mes points devraient être <1...

    Je n'ai pas sorti de graph avec les données de cet exemple (je devrais peut etre essayer tiens) mais sur le graph qui sort avec mes vraies données, mon max est vers 4500 :/

    Autre pb, j'ai l'impression de pas retomber sur mes pieds au niveau des chiffres...
    J'ai fait une proc print pour vérifier le total d'observations dans ma catégorie 1 compte tenu du coef extr2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Proc print data=agreg;
    where categorie = categorie1;
    var eff_tot;
    run;
    et pour cette catégorie j'ai eff_tot = 51778 alors que dans cette catégorie j'ai 51 251 individus...

    Je désespère un peu

    EDIT j'ai sortie le graph avec les données test, ça donne le fichier en PJ
    Images attachées Images attachées  

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tdiallo Voir le message
    Bonjour,

    Tu n'a pas bien copié le code de BayHaym.
    Il manque juste une parenthèse avant le ON. Tu ferme la parenthèse du (SELECT *****)
    tout à fait, j'ai supprimé mon message quand je m'en suis aperçue mais je n'avais pas vu ta réponse!

  8. #8
    Membre habitué
    Homme Profil pro
    Chargé d'études stats
    Inscrit en
    Mai 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'études stats
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 49
    Points : 186
    Points
    186
    Par défaut
    Non, ce n'est pas la bonne interprétation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DATA fichier;
    input categorie $4. somme_des_points extr2;
    cards;
    cat1 10 3
    cat1 10 5
    cat1 43 2
    cat1 26 4
    cat2 10 9
    cat2 10 4
    cat2 78 6
    ;run;
    Ici j'ai 7 individus (1 ligne par individu), chacun a une pondération différente : le 1er individu a un poids de 3, le second a 5, le 3eme a 2 .... C'est ce que j'avais compris de ton explication.

    Le plus simple serait que tu donnes un exemple de ta table en entrée, pour mieux comprendre ta problématique.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Je ne comprends pas trop la différence...
    Je te donnerais bien ma table mais elle est vraiment lourde et comporte plus de 600 variables par observation...

    En fait c'est le résultat d'une enquête statistique, chaque observation décrit les caractéristiques d'un individu, qui appartient à une catégorie. En fonction de ces caractéristiques j'ai attribué un certain nombre de points à chaque individu.
    Et vu que mon univers statistique c'est la France, et qu'il n'était pas possible d'enquêter tous les concernés par cette étude, on considère que chaque individu, chaque observation représente un certain nombre de personnes. Mais chaque individu enquêté ne représente pas le même nombre de personnes.
    Extr2 est un coefficient d'extrapolation qui traduit la représentativité de chaque individu.

    Donc si on reprend ton exemple qui est pratique et bien plus simple que ma table, j'ai 7 individus enquêtés, mais dans mes analyses, je vais faire comme si j'en avais enquêté 33. Et dans mes catégories, je vais considérer que j'ai respectivement 14 et 19 individus.

    Je voudrais comparer le niveau de points de mes catégories qui n'ont pas le même nombre d'individus, donc c'est pour ça que je voudrais afficher le nombre d'individus qui on n points rapporté au nombre d'individu de la catégorie...

    Est-ce que j'ai été plus claire?

  10. #10
    Membre habitué
    Homme Profil pro
    Chargé d'études stats
    Inscrit en
    Mai 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'études stats
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 49
    Points : 186
    Points
    186
    Par défaut
    Ok, on est bien d'accord. Le second code que je t'ai envoyé répond à ta problématique, sur la table de test tout du moins. En PJ le graph obtenu avec les pourcentages : pas de valeur aberrante sur l'axe des ordonnées.

    Il doit y avoir quelque chose dans ta base qui fausse les résultats obtenus. A priori un problème de doublons lors du LEFT JOIN.

    Le fait que tu ne retombes pas sur le bon effectif total par catégorie avec mon bout de code n'est pas normal. Tu as bien les mêmes résultats en lançant ces deux codes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    proc sql;
    SELECT DISTINCT b.categorie, sum(b.extr2) AS eff_tot
    FROM fichier b
    GROUP BY b.categorie;
    quit;
     
    proc means data=fichier sum;
    class categorie;
    var extr2;
    run;
    Images attachées Images attachées  

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    *_* je n'avais pas pris pct, mais eff dans la gplot... je suis un boulet fini, désolée... je vais retester ça cet aprem ça devrait vachement mieux marcher!!!!

    pour mon souci d'effectif, je teste ton code cet aprem aussi je te retiens au courant dès que c'est fait....

    Quand tu parles de doublon ça veut dire quoi? Des observations qui pourraient avoir le même nombre de point, le même coef dans la même catégorie? en théorie ce n'est pas impossible...

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Alors la gplot avec pct au mieu de eff effectivement ça marche beaucoup mieux.

    Pour mes soucis d'effectifs c'est la prise en compte de extr2 qui fait merder le truc.
    J'ai utilisé tes deux codes, j'ai les mêmes résultats aux arrondis près. D'ailleurs je ne comprends pas pourquoi il y a des décimales, je devrais avoir des nombres entiers.
    J'ai comparé les résultats avec mes effectifs "théoriques", à chaque fois j'ai le bon nombre pour N obs, mais Somme ça merde, il sort un total toujours plus grand que mon total à moi (cf PJ)
    Images attachées Images attachées  

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    je ne m'en sors pas... je crois que le problème est lié au sum pour la prise en compte de mon coefficient extr2.

    Dans mes autres procédures je le prends en compte avec freq
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc means DATA=fichier n;
    where (categorie =15) or (categorie =45) ;
    freq extr2;
    class categorie;
    var extr2;
    run;
    mais je ne sais pas comment le prendre en compte de cette façon là avec une proc sql

  14. #14
    Membre habitué
    Homme Profil pro
    Chargé d'études stats
    Inscrit en
    Mai 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'études stats
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 49
    Points : 186
    Points
    186
    Par défaut
    Je ne comprends pas non plus d'où vient le delta que tu mets en évidence dans ton tableau. Sans la base c'est difficile d'y voir plus clair.

    L'instruction FREQ ajoute simplement une variable de pondération dans le calcul des résultats fournies par ta PROC.

Discussions similaires

  1. Nombre d'observations en utilisant la PROC CONTENTS
    Par viruppan dans le forum SAS Base
    Réponses: 2
    Dernier message: 07/05/2013, 20h56
  2. Proc GPlot et affichage du nombre d'observations
    Par Goliath1 dans le forum SAS STAT
    Réponses: 2
    Dernier message: 15/11/2011, 15h36
  3. Nombre d'observations d'une table
    Par stefsas dans le forum Macro
    Réponses: 4
    Dernier message: 21/04/2011, 16h43
  4. [PROC GPLOT] axe des abscisses coupe l'axe des ordonnées en 0
    Par perloub dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 02/08/2010, 16h20
  5. [PROC RANK] Connaître le nombre d'observations
    Par PAULOM dans le forum SAS Base
    Réponses: 6
    Dernier message: 01/06/2010, 15h20

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