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 ;