options nocenter ;
/* ods html file="d:/Travail/Cours/Market_research/MM_ADD2008/Cas/cas_1_08.html"; */
Title1 H=2 J=l "Master Marketing - 2008" J=r "ADD : Cas Libraire";
Footnote1 H=1 J=r "(c) Desmet Pierre" ;
* ouverture des possibilités graphiques ;
* à fermer (off)) après la procédure ;
****************************************;
ods graphics on ;
* "http://www.ats.ucla.edu/stat/mult_pkg/whatstat/default.htm";
data in ;
infile "d:/Travail/Cours/Market_research/MM_ADD2008/Cas/cas_1_08.csv";
input statut rec sex catotal_0 catotal_1 rca_0 rca_1 liv_1 promo_1 club_0 club_1;
Numobs=_N_ ;
* traitement des données à problème ;
********************************************;
IF catotal_0=9999 then delete ;
IF catotal_0<0 or catotal_1<0 then delete ;
IF sex=. then delete ;
IF rec>6 then delete ;
* transformation des variables ;
********************************************;
IF catotal_0>0 then logCA_0=log(catotal_0) ; else logCA_0=. ;
IF catotal_1>0 then logCA_1=log(catotal_1) ; else logCA_1=. ;
dif_CA = catotal_0 - catotal_1 ;
* des étiquettes (Label) pour les variables ;
********************************************;
label statut ="Statut semestre 2"
rec ="Recrutement"
sex ="Genre"
catotal_0 ="Chiffre d affaires Semestre 0"
catotal_1 ="Chiffre d affaires Semestre 1"
rca_0 ="Rang CA semestre 0"
rca_1 ="Rang CA semestre 1"
liv_1 ="Achat livre semestre 1"
promo_1 ="Pression promotionnelle semestre 1"
club_0 ="Club semestre 0"
club_1 ="Club semestre 1";
* imprimer les 20 premières observations ;
* (par défaut de toutes les variables, sinon mettre Var X ;
**********************************************************;
proc print data=in (obs =20);
* VAR var1 var2 ... ;
run ;
* dans une proc, possibilité de ne travailler que sur un groupe avec WHERE ;
****************************************************************************;
title3 "Print pour REC=6";
proc print data=in (obs =20);
where rec=6;
run ;
*=================================================================;
*========= Format des modalités ==================================;
*=================================================================;
* le format est ensuite disponible pendant toute la session ;
* un format supplémentaire peut être créé n'importe quand ;
Proc format ;
Value sexfmt 1="Homme" 2="Femme";
value promofmt 1="Faible" 2="Moyenne" 3="Forte";
value ouifmt 0="Non" 1="Oui";
value recfmt 1="Mailing" 2="Téléphone" 3="Magasin" 4="Porte-à-porte" 5="Parrainage" 6="Autre" 7-high="Inconnu";
value statutfmt 1="Inactif" 0="Actif" ;
*=================================================================;
*========= Graphiques ============================================;
*=================================================================;
* http://support.sas.com/sassamples/graphgallery/PROC_GCHART.html ;
title3 h=2 'Un histogramme fréquence par mode de recrutement ';
Proc GChart data=in ;
vbar REC / discrete type=percent inside=percent;* percent = effectifs ;
format REC recfmt. ;
run;
title3 h=2 'Un histogramme Gchart moyenne par mode de recrutement ';
Proc GChart data=in ;
vbar REC / discrete sumvar=catotal_0 inside=mean;* mean = moyenne ;
format REC recfmt. ;
run;
title3 h=2 'Un histogramme Gchart fréquence par mode de recrutement et sexe';
Proc gchart data=in ;
vbar REC / discrete type=percent subgroup=sex inside=mean;* percent = effectifs ;
format REC recfmt. sex sexfmt.;
run;
title3 'Histogramme de la somme des moyennes de CAtotal_0 selon le recrutement et le sexe';
Proc gchart data=in ;
vbar REC / discrete type=mean sumvar=catotal_0 subgroup=sex inside=mean; * calcul de la moyenne (mean) au lieu des effectifs ;
format sex sexfmt. REC recfmt. ;
run;
proc tabulate data=in ;
class rec sex;
var catotal_0;
tables (rec all)*(sex all),
catotal_0*(N mean sum);
format sex sexfmt. REC recfmt. ;
run;
title3 'Un histogramme Horizontal Gchart CAtotal_0 selon le statut';
Proc gchart data=in ;
hbar Statut / discrete type=mean sumvar=catotal_0 group=sex ; * group fait deux graphiques ;
format sex sexfmt. statut statutfmt.;
title3 'Un camembert simple (rec) ';
proc gchart data=in;
pie rec /
DISCRETE PERCENT=INSIDE SLICE=OUTSIDE ;* position des informations value= , percent= ;
format rec recfmt.;
run ;
title3 'Un camembert imbriqué sex(rec) selon le catotal_0';
proc gchart data=in;
pie sex /
detail=rec
sumvar=CATOTAL_0
DETAIL_PERCENT=best DETAIL_SLICE=best DETAIL_VALUE=best
slice=arrow percent=arrow value=none DETAIL_THRESHOLD=5
DESCENDING; * type de tri de modalités ;
format sex sexfmt. rec recfmt.;
run ;
title3 'Un graphique en "Block" ';
proc Gchart data=in;
block rec / discrete sumvar=catotal_0 ;
format rec recfmt.;
RUN;
title3 'Un graphique point*point individuel';
SYMBOL1 V=circle C=black H=0.5;
proc gplot DATA=in;
where sex=1;
PLOT logca_0*logca_1 ;
RUN;
title3 'Un graphique point*point individuel avec point selon le genre';
SYMBOL1 V=circle C=black ;
SYMBOL2 V=star C=red ;
proc gplot DATA=in;
PLOT log_CA0*log_CA1 =sex ;
RUN;
*=================================================================;
*========= Fréquences ============================================;
*=================================================================;
* http://www.technion.ac.il/docs/sas/proc/zlesstmt.htm;
title3 'Procédure FREQ';
* tableau de fréquences simples ;
********************************;
proc freq data=in ;
tables statut rec sex rca_0 rca_1 liv_1 promo_1 club_0 club_1;
run;
* tableau de fréquences simples avec format pour les modalités;
**************************************************************;
proc freq data=in ;
tables statut rec sex rca_0 rca_1 liv_1 promo_1 club_0 club_1;
format statut statutfmt. rec recfmt. sex sexfmt. club_0 clubfmt. club_1 clubfmt. promo_1 promofmt.;
run;
* un format pour discrétiser une variable continue ;
* plusieurs découpages possibles ;
***************************************************;
Proc format ;
value CAfmt 0="0" 1-50="1-50" 51-100="51-100" 101-high=">100";
value CA1fmt low-100="<=100" 101-high=">100";
proc freq data=in ;
tables catotal_0;
format catotal_0 cafmt.;
run;
* tableau croisés avec test du Khi2 (chisq);
* sans les fréquences "cas" ni les fréq colonne, (autre dim = norow) ;
*********************************************************************;
proc freq data =in ;
tables (rec sex liv_1 club_0 club_1 promo_1)*statut / chisq nofreq nocol;
format statut statutfmt. rec recfmt. sex sexfmt. liv_1 ouifmt. club_0 ouifmt. club_1 ouifmt. promo_1 promofmt.;
run ;
* mesures répétées variables nominales (agree) ;
* tableau croisés "carré" avec tests Mc Nemar, Kappa, ...;
* sans les fréquences "cas" ni les fréq colonne, (autre dim = rorow) ;
*********************************************************************;
proc freq data=in ;
tables rca_0*rca_1 / chisq agree measures ;
run ;
* test de friedman : plus de 2 groupes appariés , variables ordinales;
*********************************************************************;
proc freq data=in ;
tables catotal_0*catotal_1 / cmh2 scores=rank noprint ;
title3 "Friedman avec neutralisation du genre ";
* avec neutralisation de la variable genre (la première) ;
proc freq data=in ;
tables sex*catotal_0*catotal_1 / cmh2 scores=rank noprint;
title3 "Friedman avec neutralisation du genre ";
run;
* association variables binaires et tableau "carré" (mêmes dimensions);
* mesures répétées McNemar ;
* ********************************************************************;
proc freq data=in;
tables club_0*club_1 / agree ;
format club_0 ouifmt. club_1 ouifmt. ;
title3 "Association 2 var ordinales : McNemar";
run;
* association variables ordinales ;
* *********************************;
proc freq data=in;
tables rca_0*rca_1 / agree measures ;
title3 "Association 2 var ordinales";
run;
* association variables non métrique ;
* kendall (b) ;
* ***********************************;
proc corr data=in kendall spearman;
var rca_0 rca_1 ;
title3 "Procédure CORR Association var non métriques";
run;
* association variables métrique ;
* COV ajoute la matrice de variance-covariance ;
* *********************************************;
proc corr data=in cov;
var catotal_0 catotal_1 ;
title3 "Procédure CORR Association var métriques";
run;
*=================================================================;
*========= Tableaux ============================================;
*=================================================================;
* création d'un tableau de statistiques pour les variables ;
* VAR : les variables sur lesquelles on fait des calculs ;
* CLASS : les variables de classification ;
* TABLE (sans "s" !) avant la virgule (les lignes), (puis les colonnes) * (statistiques)*format=;
* ALL pour demander aussi le total des modalités ;
****************************************************************************************;
proc tabulate data=in ;
var catotal_0 catotal_1;
class sex ;
table
(catotal_0 catotal_1)*(n mean std max min skewness kurtosis),
(sex all);
title3 'Procédure TABULATE';
run;
* description des variables métriques par MEANS ;
*************************************************;
proc means data=in n mean median min max skewness kurtosis;
var catotal_0 catotal_1;
title3 "MEANS : Description de la variable métrique";
run;
*=================================================================;
*========= IC intervalle de confiance ============================;
*=================================================================;
* Pour générer un intervalle de confiance sur le niveau "M" (masculin);
* utiliser l’option BINOMIAL de l’instruction TABLES de la procédure FREQ.;
proc freq data=in;
tables sex /testp=(0.3333, 0.6667) ; * la somme doit faire 100 ! ;
title3 "FREQ Comparaison d'une proportion à une norme 33% 67%";
run;
* intervalle de confiance à 95% par CLM (confid limit interval);
* spécifier le risque alpha ;
**************************************************************;
proc means data = in n mean clm alpha=0.05 probt;
var catotal_0;
title3 "MEANS : intervalle de confiance";
run;
* Description de la distribution par Univariate ;
* possibilité de tester une moyenne ;
* plot boite à moustache QQ PP ;
* Normal test de la normalité ;
*************************************************;
proc univariate data=in normal plot
mu0=70; * test de la valeur d'une moyenne de 70 ;
var catotal_0;
histogram / normal (mu=est sigma=est);
qqplot /normal (mu=est sigma=est);
title3 "Univariate : Comparaison à moyenne=70";
run;
*=================================================================;
*========= Différence entre des groupes =========================;
*=================================================================;
* test des signes (non paramétrique)dans Univariate ;
****************************************************;
proc univariate data=in
mu0=2;
var RCA_0 ;
title3 "Univariate : RCA mu0=2 ";
run;
* test des rangs signés (non paramétrique)dans Univariate ;
* sur la différence des rangs ;
****************************************************;
data in1 ;
set in ;
diff_rca = RCA_0-RCA_1 ;
proc univariate data=in1 mu0=0;
var diff_RCA ;
run;
* Différence de groupes sur des variables non métriques ;
* analyse de variance non paramétrique univariée NPar1Way ;
* test de la Médiane (median) ;
********************************************************************;
proc npar1way data=in
median ;
class statut;
var catotal_0;
title3 "NPar1Way : test de la médiane, données non normales échant indépendants";
run;
* Test de Mann-Whitney (2g) (ou Wilcoxon rangs signés ;
* et Kurskal-Wallis (>2g) (wilcoxon) ;
********************************************************************;
proc npar1way data=in
wilcoxon;
class statut;
var rca_1;
title3 "NPar1Way : Différence de rangs - Mann-Whitney (Kurskall-Wallis >2 groupes) échantillons indep";
run;
* test de K-S (edf) ;
********************************************************************;
proc npar1way data=in
edf ;
class statut;
var rca_1;
title3 "NPar1Way : Différence de rangs - K-S échantillons indépendants";
run;
* comparaison des moyennes de 2 groupes : test en t, intervalle de confiance ;
* CLASS : variable de regroutement VAR : variable de calcul ;
* teste aussi l'homogénéité des variances ;
*****************************************************************************;
proc ttest data=in ;
class statut ;
var catotal_1;
title3 "TTEST ";
run ;
* Différence moyenne échant appariés (mesures répétées) ;
********************************************************;
proc ttest data=in ;
PAIRED CATOTAL_0:CATOTAL_1;
title3 "TTEST Différence de moyennes- échantillons appariés";
run;
* Dépendante (métrique), indépendante (nominale, plusieurs groupes) ;
* Analyse de variance ;
********************************************************************;
proc anova data=in ;
class promo_1;
model CATOTAL_1 = promo_1 ;
title3 "ANOVA Analyse de variance ";
run;
proc glm data=in ;
class promo_1 ;
model CATOTAL_1 = promo_1 CATOTAL_0 / solution ;
means promo_1 / bon scheffe ;
contrast "1/2 et 3" promo_1 1 -.5 -.5;
contrast "1/2" promo_1 1 -1 0;
contrast "1/3" promo_1 1 0 -1;
contrast "2/3" promo_1 0 1 -1;
title3 "GLM ANCOVA Analyse de covariance ";
run;
proc glm data=in ;
class promo_1 ;
model CATOTAL_0 CATOTAL_1 = promo_1 ;
title3 "GLM MANOVA Analyse de variance ";
run;
ods graphics off ;
*=================================================================;
*========= sélection échantillon aléatoire ======================;
*=================================================================;
*création d'un DATA SAMPLE par tirage aléatoire sans remise (SRS) de N=300 ;
*********************************************************************;
Proc SQL;
create view data_temp
as select statut, rec, sex, catotal_0, catotal_1, rca_0, rca_1, liv_1, promo_1, club_0, club_1
FROM in; * in , c'est le tableau d'entrée ;
quit;
Proc Surveyselect data=data_temp
out= sample
method =SRS
N=300;
ID statut rec sex catotal_0 catotal_1 rca_0 rca_1 liv_1 promo_1 club_0 club_1;
run;
*=================================================================;
*========= redressement ==========================================;
*=================================================================;
* constat des différences de structure ;
***************************************;
proc freq data=in ;
tables sex;
title3 "fréquence genre pour la population" ;
run;
proc freq data= sample;
tables sex;
title3 "fréquence genre pour l'échantillon" ;
run;
* création d'un nouveau tableau DATA SAMPLE1 avec le poids (W) ;
***************************************************************;
data sample1;
set sample ;
IF sex="1" then w= 1.1519 ; else w= 0.9588 ;
* poids = fréq(échant)/fréq (population) ;
* vérification du redressement ;
*******************************;
proc freq data= sample1;
weight w;
tables sex;
title3 "fréquence genre redressée" ;
run;
* calcul de la valeur redressée ;
********************************;
proc tabulate data=sample1;
var catotal_0;
tables catotal_0* (N mean) ;
title3 "Valeur brute" ;
run;
proc tabulate data=sample1;
var catotal_0;
weight w;
tables catotal_0*(N mean);
title3 "Valeur redressée de la différence de structure par sexe" ;
run;
proc tabulate data=in;
var catotal_0;
tables catotal_0* (N mean) ;
title3 "Valeur sur la population" ;
run;
* insertion directe d'un commentaire sur la page html à partir du programme ;
* ================= ne pas dépasser la longueur de cette ligne ===============================*;
data comments ; length comment $ 100 ;input comment $ & ; cards ;
en tenant compte des individus, le résultat est significatif en tenant compte des individus, le
;proc print data=comments ;