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 11/04/2011, 10h29   #1
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
Par défaut analyse univariée - présentation des résultats

Bonjour à tous !

Je vous expose mon problème.

Je dispose d'une base de données stockant les réponses de N individus à un questionnaire composé de 28 questions, dont les modalités de réponse sont identiques (1:pas du tout d'accord, 2: pas d'accord, 3: d'accord, 4:tout à fait d'accord)

Le dataset se présente donc ainsi

item1 item2 ... item28
3_____1________3
2_____4________1
1_____1________2

je souhaite effectué l'analyse descriptive de l'ensemble de ces items (taux de réponse, effectif ayant choisi la modalité de cet item, pourcentage ayant choisi la modalité de cet item), en présentant si possible les résultats sous cette forme:

__________________________________________Modalités
_________Taux de réponse______1__________2__________3_________4
__________________________n____%_____n____%____n____%____n___%
item 1__________98
item 2__________97
...
item 28________100

Je me suis renseigné sur les procédures Report et Tabulate, mais sans résultat pour le moment.

Je vous remercie d'avance.
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h33   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour,
Un tableau de ce type de conviendrait? on peux toujours se débrouiller à l'exporter dans un classeur Excel.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA TEST;
input individus$ item1$ item2$ item3$ item4$;
CARDS;
A 1 2 1 2
B 2 3 4 4
C 3 4 2 4
D 4 1 3 1
E 2 3 4 3
F 3 3 2 4
;
RUN;
PROC FREQ DATA=TEST;
TABLES individus*(item1-item4 )/out=OUT;
RUN;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h48   #3
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
Bonjour Megamind2 et merci de te pencher sur mon problème.

Le problème avec ta solution, c'est que le tableau de résultats présente en ligne les individus, alors que moi je souhaiterais y voir figurer les items. Par contre en colonne, c'est bien la présentation voulue.

Merci
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h52   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
ça te va comme ça Juju ?

Code :
1
2
3
PROC FREQ DATA=TEST;
TABLES (item1-item4 )*individus;
RUN;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h59   #5
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
inverser les lignes et les colonnes ne suffit pas à résoudre mon problème...
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 12h09   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par juju44 Voir le message
Bonjour à tous !



je souhaite effectué l'analyse descriptive de l'ensemble de ces items (taux de réponse, effectif ayant choisi la modalité de cet item, pourcentage ayant choisi la modalité de cet item), en présentant si possible les résultats sous cette forme:

__________________________________________Modalités
_________Taux de réponse______1__________2__________3_________4
__________________________n____%_____n____%____n____%____n___%
item 1__________98
item 2__________97
...
item 28________100
J'ai du mal à comprendre ce que tu veux (cf. citation ci-dessus)
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 12h13   #7
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
dans l'absolu, je souhaiterais avoir le tableau que j'ai présenté


pour être plus clair:
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 12h48   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Tu pourrais poster un échantillon de ton fichier au format txt?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 14h25   #9
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
Voila un échantillon de mon dataset
Fichiers attachés
Type de fichier : txt base.txt (9,9 Ko, 6 affichages)
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 16h19   #10
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Il faudrait générer 4 tables par item (ce qui fait 4*27), les concaténées puis transposer avant d 'appliquer la proc freq. Je réfléchis à la solution la plus optimale sinon ça promet d'être long...
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 16h59   #11
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
j'ai tenté cela:

proc freq sur chacun des items et on enregistre le résultat dans une table (si 27 items, 27 tables)

Puis on transpose chacune des tables crées précédemment, en écrasant les tables précédentes.

et enfin, on fait une jointure horizontale des tables transposées.

Je pense bien sur automatiser tout cela dans une macro.

On obtient ceci (pour les 2 premiers items)



Maintenant, comment présenter les résultats proprement...
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 17h12   #12
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
J'ai avancé de mon coté, il reste plus qu'a calculer des pourcentages en ligne sans passer par une proc freq (_1/ som (of _1 _2 _3 _4 _5)., ...) Si tu n'arrives par à faire le calcul, fais moi signe.
Tu remplace BASE par le nom de ta table SAS.
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
35
36
PROC CONTENTS DATA=BASE OUT=OUT;
RUN;


PROC SQL noprint;
SELECT NAME INTO: L SEPARATED BY ' ' FROM OUT;
SELECT COUNT(*) INTO:  NB FROM OUT;
QUIT;

%PUT L=&L.;
%PUT NB=&NB.;


%MACRO MISE_EN_FORME;
%DO i=1 %TO &NB.;
	%LET TABLE&i=%SCAN(&L,&i.,' ');

	PROC SQL;
	CREATE TABLE &&TABLE&i. AS SELECT &&TABLE&i.,COUNT(*) AS NB&i FROM BASE GROUP BY &&TABLE&i.;
	QUIT;

	PROC TRANSPOSE DATA=&&TABLE&i. OUT=&&TABLE&i. name=item&i.;
	VAR NB&i;
	ID &&TABLE&i.;
	RUN;

	DATA &&TABLE&i.;
	SET &&TABLE&i.;
	IF item&i="NB&i." THEN item&i="item&i.";
	rename item&i.=item;
	RUN;

	DATA synthese; set %DO i=1 %to &NB.; item&i. %end;; RUN;
%END;
%MEND MISE_EN_FORME;
%MISE_EN_FORME;
ps: il y a aussi une question 5
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 17h20   #13
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
Citation:
Envoyé par MEGAMIND2 Voir le message

ps: il y a aussi une question 5
le codage 5 correspond aux données manquantes
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 17h30   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par juju44 Voir le message
le codage 5 correspond aux données manquantes
Cela veut dire que le taux de réponse est égal à 100% si codage5=. ?
Tu t'en sors?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 17h47   #15
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Le code en entier, tu réajusteras si ça ne te convient pas...

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
PROC CONTENTS DATA=BASE OUT=OUT;
RUN;
 
 
PROC SQL noprint;
	SELECT NAME INTO: L SEPARATED BY ' ' FROM OUT;
	SELECT COUNT(*) INTO:  NB FROM OUT;
QUIT;
 
%PUT L=&L.;
%PUT NB=&NB.;
 
 
%MACRO MISE_EN_FORME;
%DO i=1 %TO &NB.;
	%LET TABLE&i=%SCAN(&L,&i.,' ');
 
	PROC SQL noprint;
	CREATE TABLE &&TABLE&i. AS SELECT &&TABLE&i.,COUNT(*) AS NB&i FROM BASE GROUP BY &&TABLE&i.;
	QUIT;
 
	PROC TRANSPOSE DATA=&&TABLE&i. OUT=&&TABLE&i. name=item&i.;
	VAR NB&i;
	ID &&TABLE&i.;
	RUN;
 
	DATA &&TABLE&i.;
	SET &&TABLE&i.;
	IF item&i="NB&i." THEN item&i="item&i.";
	RENAME item&i.=item;
	RUN;
 
 
%END;
       DATA STAT; SET %DO i=1 %TO &NB.; item&i. %end;; RUN;
 
DATA STAT;
	retain item taux_reponse _1 pct1 _2 pct2 _3 pct3 _4 pct4 _5 pct5;
	SET STAT;
	IF _5=. then _5=0;
	array eff[*] _1 _2 _3 _4 _5;
	array pct[*] pct1-pct5;
	DO i=1 TO dim(eff);
	pct(i)=(eff(i)/sum(of _1 _2 _3 _4 _5));
	end;
	DROP i;
	taux_reponse=sum(of  _1 _2 _3 _4 )/sum (of  _1 _2 _3 _4 _5);
	format pct1-pct5 taux_reponse percent.;
RUN;
%MEND MISE_EN_FORME;
 
%MISE_EN_FORME;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 18h09   #16
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 823
Points : 2 823
Bonsoir à tous.
Comme souvent j'arrive après la bataille, et comme souvent je vais faire mon chieur en expliquant qu'on s'en sort sans macro à condition de mettre ses données dans la forme qui convient.
TABULATE est une excellente option pour faire ton tableau Juju, à condition : 1) d'avoir mis une ligne par réponse à un item pour un questionnaire (il y aura donc une proc TRANSPOSE en amont)
2) d'avoir calculé d'avance le taux de réponses parce que sinon c'est une galère sans nom de sortir l'item 5 du tableau (alors que si le taux de réponses est pré-calculé on n'a qu'à mettre un WHERE).

Je suis parti de ton fichier exemple, importé dans une table WORK.BASE. La suite c'est
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
DATA work.base ;
  SET work.base ;
  id = _N_ ; /* on ajoute un identifiant pour mieux maîtriser le pivot */
RUN ;
PROC TRANSPOSE DATA=work.base OUT=work.base2 ;
  VAR item: ;
  BY id ;
RUN ; /* au final une ligne par item et questionnaire */
PROC SQL ; /* calcul à l'avance du taux de réponse, mixé avec les données de détail : le SQL est imbattable pour faire ça */
  CREATE TABLE work.base3 AS
    SELECT *, MEAN(col1 NE 5) AS txRep
	FROM work.base2
	GROUP BY _name_ ;
QUIT ;
PROC TABULATE DATA=work.base3 ;
  WHERE col1 NE 5 ; /* on élimine la réponse 5 du tableau */
  CLASS _name_ col1 ;
  VAR txRep ;
  TABLE _name_="", /* une ligne par item */
           txRep=""*MEAN="Taux de réponse"*F=PERCENTN9.2
/* 1e colonne reprise du taux de réponses précalculé. Le choix de MEAN est bidon puisque le calcul est déjà fait : MIN ou MAX ou MEDIAN donnent le même résultat */
		   (col1="Modalité de réponse" ALL="Ensemble")*(N="N"*F=5. ROWPCTN="%"*F=6.2) 
 /* l'éclatement par réponse avec comptage et % ; j'ai ajouté une colonne de récap car j'aime bien montrer où les % font 100% */
	/ BOX="Item" ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 18h14   #17
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Je me suis pas tapé tout ça et que tu viennes à la fin de la journée dire qu'il y plus simple Olivier
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 09h36   #18
Invité régulier
 
Inscription : mars 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 31
Points : 6
Points : 6
Vraiment merci Olivier !

Quand on voit la solution on se dit que ça parait simple, mais encore faut-il être en mesure de bien poser le problème pour y arriver, et toi, tu sais le faire à la perfection

Merci à toi également Megamind2 pour le temps et l'énergie que tu as consacré à mon problème !

Bonne journée et à bientôt !
juju44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h42.


 
 
 
 
Partenaires

Hébergement Web