logo

RPLUS DEPP EXERCICE N°11

RPLUS DEPP EXERCICE N°11

Les descriptifs des fichiers sont ici.   Mettre à jour le document Word disponible ici avec trois tableaux dérivés de ceux de l’exercice 10, le nombre total d’établissements et la date de production de la note. Pour rappel, NATURE_UAI de 101 à 150 = maternelle, de 151 à 199 = élémentaire, de 300 à 399 = second degré.

RPLUS DEPP EXERCICE N°12

Les descriptifs des fichiers sont ici.   Mettre à jour le classeur Excel disponible ici avec les effectifs des agents par académie selon leur sexe ; l’académie est indiquée dans la colonne C, l’effectif d’agents hommes (sexe=1) en colonne D et d’agents femmes (sexe=2) en colonne F.

RPLUS DEPP EXERCICE N°10

Les descriptifs des fichiers sont ici.   A partir du résultat de crosstab(etab, rows= »NATURE_UAI », cols= »SECTEUR_PUBLIC_PRIVE ») produire le flextable ci-dessous.   La fonction crosstab a été créée lors de l’exercice 9. Si besoin voici son code : crosstab <- function(df, rows, cols, percent= »no »){ res <- df %>% group_by(r=.[[{{rows}}]], c=.[[{{cols}}]]) %>% # pour simplifier les manipulations futures, on donne des noms aux variables # de groupement, ici r et c summarise(n=n()) %>% ungroup() if (tolower(percent) == « total ») { res <- res %>% […]

RPLUS DEPP EXERCICE N°9

Les descriptifs des fichiers sont ici.   Construire une fonction crosstab avec les paramètres suivants : df : le data.frame contenant les données rows : indique le nom d’une variable définissant les lignes du tableau cols : indique le nom d’une variable définissant les colonnes du tableau percent : vaut « no » par défaut, autres valeurs possibles : « total », « row » ou « col »   Le but de cette fonction est de construire un tableau croisé (avec la variable rows en ligne et […]

RPLUS DEPP EXERCICE N°8

Les descriptifs des fichiers sont ici.   Comme dans l’exercice 6, on veut exporter dans autant de fichiers CSV à séparateur point-virgule (avec la fonction write.table) les agents selon leur académie. Chaque fichier portera le nom de l’académie, par exemple LYON.CSV. Réaliser cela avec une fonction de package {purrr}, en ayant au préalable « éclaté » le data.frame agents avec la fonction base::split.

RPLUS DEPP EXERCICE N°7

Les descriptifs des fichiers sont ici.   Faites une nouvelle version du data.frame etab (etab2) dans laquelle toutes les variables de type caractère avec moins de 50 valeurs distinctes sont transformées en facteurs.

RPLUS DEPP EXERCICE N°6

Les descriptifs des fichiers sont ici.   Exporter dans autant de fichiers CSV à séparateur point-virgule (avec la fonction write.table) les agents selon leur académie. Chaque fichier portera le nom de l’académie, par exemple LYON.CSV.

RPLUS DEPP EXERCICE N°5

Paramétrer le département (sur 3 chiffres avec des zéros à gauche) et calculer pour un département donné le nombre d’agents et leur âge moyen par nature d’établissement et par sexe (uniquement les sexes renseignés).

RPLUS DEPP EXERCICE N°4

Pour les agents de sexe féminin, quel est l’âge moyen par académie ? Quelles sont les 3 académies où ces agents sont les plus jeunes en moyenne ? Réponse : 1-Guyane, 2-Corse, 3-Aix-Marseille

RPLUS DEPP EXERCICE N°3

Créer un data.frame contenant les agents qui exercent en LP (nature = 320) à La Rochelle (commune = 17300) à partir de etab et agents. Ils doivent être 137.

RPLUS DEPP EXERCICE N°2

L’objet etab contient une colonne DATE_OUVERTURE. Quel est son type ? En dériver une colonne de type Date, et s’en servir pour calculer l’ancienneté en années de l’établissement par rapport à la date du jour. Si l’établissement est fermé, remplacer l’ancienneté par NA. Indice : aidez-vous des fonctions de {lubridate}, en particulier today() et years(1).

RPLUS DEPP EXERCICE N°1

Créer un objet lp_antilles des agents des académies de Guadeloupe et de Martinique exerçant en lycée professionnel (nature 320) ; on ne conservera que les colonnes Clef, etab, sexe et age. On obtient 924 observations et 4 variables

RPLUS Créer et modifier un classeur Excel (13 minutes)

  Le classeur Excel à compléter est disponible ici : https://od-datamining.com/data/airbnb_modele.xlsx library(openxlsx) # export Excel # classeur vide classeur <- createWorkbook() # un tableau par onglet / quartier for (onglet in unique(houses$neighbourhood_cleansed)){ addWorksheet(classeur, sheetName = onglet) writeDataTable(classeur, onglet, houses %>% filter(neighbourhood_cleansed == {{onglet}}) %>% select(-neighbourhood_cleansed)) } # enregistrement du classeur saveWorkbook(classeur, file= »c:/temp/airbnb.xlsx », overwrite = TRUE) # mise à jour d’un classeur existant classeur2 <- loadWorkbook(« c:/temp/airbnb_modele.xlsx ») # insertion de données writeData(classeur2, sheet= »Par quartier », flats %>% group_by(neighbourhood_cleansed) %>% summarise(N=n()) %>% ungroup() %>% […]

RPLUS Modifier un document Word ou PowerPoint (11 minutes)

  Le fichier Word est à télécharger ici : https://od-datamining.com/data/airbnb2.docx word <- read_docx(« c:/temp/airbnb2.docx ») # sauvegarde du graphique comme image ggsave(« c:/temp/airbnb_graphique1.emf », plot=graphique, width=4, height=4.5) # insertion du nombre d’appartements word %>% body_replace_text_at_bkm(« nbApparts », as.character(nrow(flats))) %>% body_replace_img_at_bkm(« graphique1 », external_img(« c:/temp/airbnb_graphique1.emf », width=4, height=4.5)) %>% body_replace_flextable_at_bkm(« tableau1″, tableau_fxt) %>% print(target= »c:/temp/airbnb_complete.docx »)

RPLUS Construire un document Word ou PowerPoint (25 minutes)

  # packages —- library(officer) # création de doc Word ou PowerPoint library(ggplot2) # graphiques # Word —- # création du document Word vierge word % body_add_par(« Logements Airbnb sur Paris », style= »heading 1″) %>% body_add_par( » « ) %>% body_add_fpar(fpar(« Le tableau ci-dessous résume le nombre d’appartements « , « loués par Airbnb à la date du 03/07/2016. « , nrow(flats),  » appartements sont décrits. »)) %>% body_add_par( » « ) %>% body_add_par( » « ) %>% body_add_par(« Tableau 1 – Appartements selon le prix à la nuit et le type de location ») […]

RPLUS Tableaux statistiques avec {formattable} (13 minutes)

  library(formattable) # tableaux pour sortie HTML / Markdown # transformation en formattable formattable(tableau2) # gestion des alignements dans les cellules tableau_ftt

RPLUS Tableaux statistiques avec {flextable} (40 minutes)

Avant de commencer cette leçon, il pourrait vous être utile de réviser le fonctionnement des fonctions de transposition sous R, et en particulier tidyr::pivot_wider que nous utiliserons dans les exemples de cette leçon et dans les exercices pour construire nos tableaux croisés. Une présentation de cette fonction et de sa soeur tidyr::pivot_longer est disponible ici.   # packages utiles —- library(tidyverse) # requêtes avec {dplyr} et %>% avec {magrittr} library(flextable) # tableaux statistiques mis en forme library(formattable) # pour la […]

RPLUS Création de fonction (23 minutes)

  # nuage de points nuage

RPLUS Le package {purrr} (11 minutes)

  # nombre de valeurs distinctes de chaque colonne de flats map_int(flats, function(x){length(unique(x))}) # idem en lambda-fonction map_int(flats, ~ length(unique(.))) # nombre de NA et de valeurs distinctes par colonne de flats map2(flats, colnames(flats), ~ { res

RPLUS Quelques packages pour exporter (7 minutes)

RPLUS Fonctions-boucles (26 minutes)

  # type de chaque colonne de houses lapply(houses, class) # moyenne de chaque colonne de houses sapply(houses, mean, na.rm=TRUE) # nombre de valeurs distinctes de chaque colonne de houses sapply(houses, function(x){ length(unique(x))}) # prix moyen par type de location tapply(houses$price, houses$room_type, mean, na.rm=TRUE) # prix moyen par capacité tapply(houses$price, houses$accommodates, mean, na.rm=TRUE) # fonctions-boucles de {dplyr} —- # mettre les noms de toutes les colonnes en majuscules houses2 % rename_all(toupper) glimpse(houses2) # nombre de valeurs distinctes de toutes les […]

RPLUS Boucles (8 minutes)

  for (type in unique(houses$property_type) ){ print(type) houses %>% filter(property_type == {{type}}) %>% count() %>% print() }

RPLUS Paramétrage (20 minutes)

   # paramètre = valeur limite <- 100 nrow(flats[which(flats$price < limite),]) # paramètre = nom de colonne d’un df variable <- « beds » valeur <- 5 nrow(flats[which(flats[[variable]] == valeur),]) # écriture pour {dplyr} et autres syntaxes NSE limite <- 50 houses %>% filter(price < {{limite}}) %>% count() # création de variable avec un nom paramétré new_var <- « prix_moyen » houses %>% summarise({{new_var}} := mean(price)) # alternative avec la syntaxe du package {glue} suffixe <- « _moyen » houses %>% summarise(« prix{suffixe} » := mean(price), « nbPlaces{suffixe} » […]

RPLUS Statistiques descriptives (11 minutes)

  # prix moyen flats %>% summarise(mean(price)) # prix moyen par quartier flats %>% group_by(neighbourhood_cleansed) %>% summarise(mean(price)) %>% ungroup() # prix moyen par type de logement et de location flats %>% group_by(room_type, property_type) %>% summarise(mean(price)) %>% ungroup() # plusieurs statistiques flats %>% group_by(room_type, property_type) %>% summarise(moy=mean(price), med=median(price), n=length(price)) %>% ungroup() # top 5 des loueurs proposant le plus d’appartements flats %>% group_by(host_id, host_name) %>% summarise(nb_apparts = length(id)) %>% ungroup() %>% arrange(desc(nb_apparts)) %>% slice(1:5)

RPLUS Tris et doublons (11 minutes)

  library(gdata) # diverses fonctions dont duplicated2 # tri des appartements par prix (croissant) flats %>% arrange(price) %>% slice(1:10) %>% select(id,price,room_type,accommodates) # puis par prix décroissant flats %>% arrange(desc(price)) %>% slice(1:10) %>% select(id,price,room_type,accommodates) # par prix décroissant et pour un même prix, # par nombre de personnes accueillies décroissant flats %>% arrange(desc(price), desc(accommodates)) %>% slice(1:10) %>% select(id,price,room_type,accommodates) # liste des loueurs d’appartements # sans doublons (chaque loueur n’apparaît qu’une fois même # s’il loue plusieurs appartements) loueurs % select(host_id, host_name) […]

RPLUS Combinaison de tables (11 minutes)

  # empilement des trois catégories de logement logements % bind_rows(houses) glimpse(logements) # avec plus de 2 tables logements % bind_rows(houses, other, .id= »category ») glimpse(logements) # quels appartements du quartier Bourse sont dispos le 15/08/2016 ? # on commence par extraire les données pertinentes bourse % filter(neighbourhood_cleansed == « Bourse ») quinze_aout % filter(date == « 2016-08-15 ») # croisement (jointure interne par défaut) apparts_bourse_dispos_08_15 % inner_join(quinze_aout, by=c(« id »= »listing_id »)) # en gardant tous les logements, disponibles ou non apparts_bourse % left_join(quinze_aout, by=c(« id »= »listing_id »)) %>% # dans ce […]

RPLUS Création de variables (14 minutes)

  # ratio prix/nombre de personnes en 2 catégories # plus simple que d’utiliser cut dans ce cas houses % mutate(categ_prix = ifelse(price/accommodates > 40, « cher », « acceptable »)) houses %>% slice(1:10) %>% select(price,accommodates,categ_prix) # plus de 2 cas flats % mutate(type = case_when( room_type == « Entire home/apt » ~ « Logement entier », room_type == « Private room » & accommodates < 4 ~ "Chambre pour 1-3 personnes", room_type == "Private room" ~ "Chambre pour > 3 personnes », accommodates < 3 ~ "Chambre partagée pour 1-2 […]

RPLUS Sélections (17 minutes)

  # données exemples —- load(« airbnb.Rdata ») # packages utiles —- library(tidyverse) # requêtes etc. (avec {dplyr}) # la colonne « price » houses$price # syntaxes {dplyr} pull(houses, price) houses %>% pull(price) # les colonnes id, price, accommodates houses %>% select(id, price, accommodates) %>% slice(1:20) # les colonnes id et price en premier houses %>% select(id, price, everything()) %>% slice(1:10) # les colonnes dont le nom commence par « host » houses %>% select(starts_with(« host »)) %>% slice(1:10) # toutes les colonnes sauf celles dont # le […]

RPLUS Principe de {dplyr} (10 minutes)

Organisation de la leçon (valable pour toutes les pages de ce cours, sauf les exercices et les QCM) 1) Un support Powerpoint à lire (pas de son). Possibilité de le télécharger ou de le passer en plein écran (en bas à droite du diaporama). Pour faire défiler les diapos, il suffit de cliquer dessus. 2) Une vidéo (avec du son) pour revenir sur les exemples du support. Possibilité de plein écran (en bas à droite, juste à côté de VIMEO). […]

RBASE dplyr Formules (conversion) (13 minutes)

  library(tidyverse) # requêtes etc. # types d’origine str(calendar) # conversion texte -> Date calendar <- calendar %>% mutate(date2 = as.Date(date, « %Y-%m-%d »)) # vérification str(calendar) # types d’origine str(flats %>% select(property_type, price)) # conversion texte -> facteur flats <- flats %>% mutate(prop_type = as.factor(property_type), # mise en tranches (conversion numérique -> facteur) tranche_prix = cut(price, c(-Inf, 50, 75, 100, 125, 150, 200, Inf), dig.lab=10) ) # vérification str(flats %>% select(property_type,prop_type, price,tranche_prix)) # facteurs : levels() permet de voir les valeurs […]

SASMACRO Présentation du langage macro (5 minutes)

Organisation de la leçon (valable pour toutes les pages de ce cours, sauf les exercices et les QCM) 1) Un support Powerpoint à lire (pas de son). Possibilité de le télécharger ou de le passer en plein écran (en bas à droite du diaporama). Pour faire défiler les diapos, il suffit de cliquer dessus. 2) Une vidéo (avec du son) pour revenir sur les exemples du support. Possibilité de plein écran (en bas à droite, juste à côté de VIMEO). […]

SASMACRO Correction – EXERCICE N°9

%MACRO export(table, var, rep) ; PROC SORT DATA=&table (KEEP=&var) NODUPKEY OUT=work.valeurs ; BY &var ; RUN ; DATA _NULL_ ; SET work.valeurs ; CALL SYMPUTX(COMPRESS(« val »!!_N_),&var); CALL SYMPUTX(« nb_val » , _N_); CALL SYMPUTX(« typevar » ,VTYPE(&var)) ; RUN ; /* pour information */ %PUT on va créer &nb_val classeurs Excel ; %DO i=1 %TO &nb_val ; %PUT création du classeur n°&i ; %PUT correspondant à &var = « &&val&i » ; ODS EXCEL FILE= »&rep/export &var &&val&i…xlsx » OPTIONS(SHEET_NAME= »Export de &table ») ; PROC PRINT DATA=&table ; %IF &typevar […]

SASMACRO Correction – EXERCICE N°8

%MACRO descrip_all (bib) ; DATA _NULL_ ; SET sashelp.vtable (WHERE=(UPCASE(libname)= UPCASE(« &bib »))) ; CALL SYMPUTX(COMPRESS(« tab »!!_N_), memname) ; CALL SYMPUTX(« nb_tab » , _N_) ; RUN ; %DO i=1 %TO &nb_tab ; PROC CONTENTS DATA=&bib..&&tab&i ; RUN ; %END ; %MEND descrip_all ; %descrip_all(bib = sashelp) ;

SASMACRO Correction – EXERCICE N°7

%MACRO compte_obs(table) ; %IF %SYSFUNC(EXIST(&table))=1 %THEN %DO ; DATA _NULL_ ; SET &table ; CALL SYMPUTX(« nb », _N_, « L ») ; RUN ; %PUT la table &table compte &nb observations ; %END ; %ELSE %DO ; %PUT ERROR: la table &table n%STR(%’)existe pas ; %END ; %MEND compte_obs ; %compte_obs(table = sashelp.cars) ; /* affiche 428 obs */ %compte_obs(table = sashelp.cars2) ; /* affiche une erreur */

SASMACRO Correction – EXERCICE N°6

%MACRO valeurs (table, var) ; PROC SQL NOPRINT ; SELECT DISTINCT &var INTO : liste_val SEPARATED BY « , » FROM &table ; QUIT ; %PUT les valeurs de &var dans &table sont : &liste_val ; %MEND valeurs ; /* quelques essais */ %valeurs (table=sashelp.cars, var=make) ; %valeurs (table=sashelp.class, var=sex) ;

SASMACRO Correction – EXERCICE N°5

%LET mois = %SYSFUNC(TODAY(), YYMMN6.) ; %LET mois_prec = %SYSFUNC( INTNX(MONTH, %SYSFUNC(TODAY()), /* chaque fonction SAS a son propre %SYSFUNC */ -1), YYMMN6.) ; %LET mois_annee_prec = %EVAL(%SUBSTR(&mois,1,4)-1)%SUBSTR(&mois,5,2) ; %PUT mois = &mois mois_prec = &mois_prec mois_annee_prec = &mois_annee_prec ; /* pour vérifier */

SASMACRO Correction – EXERCICE N°4

%LET table = sashelp.cars ; %LET var = make ; PROC SQL NOPRINT ; SELECT DISTINCT &var INTO : liste_val SEPARATED BY « , » FROM &table ; QUIT ; %PUT les valeurs de &var dans &table sont : &liste_val ;

SASMACRO Correction – EXERCICE N°3

PROC MEANS DATA=sashelp.class MEAN ; VAR Height ; CLASS Sex ; ODS OUTPUT summary=work.moy ; RUN ; DATA _NULL_ ; SET work.moy ; CALL SYMPUTX(sex, height_mean) ; RUN ; PROC SGPLOT DATA=sashelp.class ; VBAR age / STAT=MEAN RESPONSE=height ; REFLINE &f / AXIS=Y LABEL= »Moyenne filles » ; REFLINE &m / AXIS=Y LABEL= »Moyenne garçons » ; RUN ;

SASMACRO Correction – EXERCICE N°2

%LET table = sashelp.cars ; DATA _NULL_ ; SET &table ; CALL SYMPUTX(« nbObs », _N_) ; RUN ; %PUT &table contient &nbObs lignes ;

SASMACRO Correction – EXERCICE N°1

%LET valeur_sexe = M ; /* ne pas mettre de guillemets pour une insertion simple dans le titre */ /*********************************************************/ /* IL N’EST PAS NECESSAIRE DE CHANGER QUOI QUE CE SOIT */ /* DANS LA SUITE DE CE CODE */ /*********************************************************/ TITLE1 « Statistiques pour sexe=&valeur_sexe » ; PROC MEANS DATA=sashelp.class (WHERE=(sex = « &valeur_sexe »)) ; RUN ; PROC SGPLOT DATA=sashelp.class (WHERE=(sex = « &valeur_sexe »)) ; HISTOGRAM height ; RUN ; TITLE ;

SASMACRO EXERCICE N°9

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Construire un macro-programme avec les paramètres suivants : table : indique une table SAS var : indique le nom d’une variable, de type numérique ou texte rep : indique un répertoire existant où on dispose de droits en écriture Le but du macro-programme est de créer dans le répertoire autant de classeurs Excel que la variable en 2e argument a de valeurs distinctes. Chaque classeur Excel contiendra […]

SASMACRO EXERCICE N°8

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Construire un macro-programme qui produit une procédure CONTENTS sur chaque table d’une bibliothèque. La bibliothèque en question sera l’unique paramètre du macro-programme. Pour rappel, la syntaxe de la procédure CONTENTS : PROC CONTENTS DATA=bib.table ; RUN ;   Indice : pour lister les tables d’une bibliothèque, vous pouvez utiliser SASHELP.VTABLE (depuis l’étape DATA) ou DICTIONARY.TABLES (depuis la proc SQL) qui ont exactement la même structure.

SASMACRO EXERCICE N°7

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Créer un macro-programme %compte_obs avec le paramètre table. A l’intérieur de ce macro-programme, un test est fait sur l’existence de la table proposée en paramètre. (Pour rappel la fonction SAS exist(bib.table) renvoie 1 si la table existe et 0 sinon.) Si la table existe, le macro-programme compte son nombre d’observations et l’affiche avec un %PUT dans le journal ; sinon, c’est un message […]

SASMACRO EXERCICE N°6

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Transformer le code de l’exercice 4 en macro-programme avec deux paramètres au lieu des %LET. Le tester sur les variables SEX dans la table SASHELP.CLASS et MAKE dans SASHELP.CARS.

SASMACRO EXERCICE N°5

Créer des macro-variables avec des %LET qui contiennent : le mois courant sous la forme AAAAMM (par exemple 202005 pour mai 2020) le mois précédent sous la même forme (dans notre exemple 202004) le mois il y a un an (dans l’exemple 201905) Indices : la fonction INTNX est sûrement utile pour la deuxième macro-variable. Le format YYMMN6. est également un compagnon agréable.

SASMACRO EXERCICE N°4

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Créez une unique macro-variable contenant les valeurs distinctes d’une variable avec SELECT INTO. La table et la variable seront paramétrées par des %LET. La macro-variable sera affichée dans le journal avec %PUT. Tester sur SEX dans SASHELP.CLASS et MAKE dans SASHELP.CARS.

SASMACRO EXERCICE N°3

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Le code suivant génère un diagramme en bâtons avec 2 lignes horizontales. PROC SGPLOT DATA=sashelp.class ; VBAR age / STAT=MEAN RESPONSE=height ; REFLINE 60 / AXIS=Y LABEL= »Moyenne filles » ; REFLINE 65 / AXIS=Y LABEL= »Moyenne garçons » ; RUN ; Modifier ce code pour que les lignes horizontales correspondent aux vraies moyennes par sexe que vous pouvez récupérer avec une procédure MEANS ou SUMMARY et […]

SASMACRO EXERCICE N°2

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Compter le nombre d’observations d’une table et le stocker dans une macro-variable à l’aide de l’instruction CALL SYMPUTX. Aide : la variable _N_ interne à l’étape Data contient le numéro de l’observation lue. Tester sur SASHELP.CARS qui contient 428 observations. Si vous paramétrez le nom de la table avec un %LET, tester aussi sur SASHELP.CLASS qui contient 19 observations.

SASMACRO EXERCICE N°1

Les données pour les exercices sont dans la bibliothèque SASHELP. Les descriptifs des fichiers sont ici.   Dans le code suivant, on produit des statistiques et un graphique pour les garçons (SEX= »M »). Ajouter un paramètre à ce code avec %LET pour qu’on puisse indiquer en un seul endroit du programme si on souhaite ces résultats pour les garçons (valeur M) ou les filles (valeur F). TITLE1 « Statistiques pour sexe=M » ; PROC MEANS DATA=sashelp.class (WHERE=(sex = « M »)) ; RUN ; PROC […]

SASMACRO Macro-variables automatiques (10 minutes)

  %PUT _ALL_ ;

SASMACRO Débuggage (7 minutes)

  OPTIONS MLOGIC ; %head(table=sashelp.class) ; OPTIONS NOMLOGIC ; OPTIONS SYMBOLGEN ; %head(table=sashelp.class) ; OPTIONS NOSYMBOLGEN ; OPTIONS MPRINT ; %head(table=sashelp.class) ; OPTIONS NOMPRINT ;

SASMACRO Stockage et appel des macro-programmes (12 minutes)

  LIBNAME perso « ~/e-sasmacro » ; OPTIONS SASMSTORE=perso MSTORED ; %MACRO head (table, first=6) / STORE SOURCE ; /* macro-programme utilitaire pour lister les 6 premières obs d’une table */ PROC PRINT DATA=&table (OBS=&first) ; RUN ; %MEND head ; %COPY head / SOURCE ; %head(table=sashelp.class) ;

SASMACRO Portée des macro-variables (13 minutes)

  %LET n = 12 ; /* globale */ %MACRO ajoute(combien) ; %LET n = %EVAL(&n + &combien) ; %MEND ajoute ; %ajoute(3) ; %PUT n vaut maintenant &n ; %LET n = 12 ; /* globale */ %MACRO modifie(combien) ; %LOCAL n ; /* locale */ %LET n = &combien ; /* locale */ %PUT n vaut maintenant &n ; /* celle qui est locale */ %MEND modifie ; %modifie(3) ; %PUT n vaut maintenant &n ; /* la […]

SASMACRO Macro-boucles (17 minutes)

  %MACRO eclate (table, variableTxt) ; PROC SQL NOPRINT ; SELECT DISTINCT &variableTxt INTO : valeur1 – FROM &table ; SELECT COUNT(DISTINCT &variableTxt) INTO : nbValeurs FROM &table ; QUIT ; %DO num_val = 1 %TO &nbValeurs ; DATA work.&&valeur&num_val ; SET &table (WHERE=(&variableTxt = « &&valeur&num_val »)) ; RUN ; %END ; %MEND eclate ; %eclate(table=sashelp.cars, variableTxt=origin) ; /* version plus efficace (mais moins lisible) */ %MACRO eclate (table, variableTxt) ; PROC SQL NOPRINT ; SELECT DISTINCT &variableTxt INTO : valeur1 […]

SASMACRO Macro-conditions (11 minutes)

  %MACRO listing(table) ; DATA _NULL_ ; SET &table NOBS=n ; CALL SYMPUTX(« nbobs », n) ; STOP ; RUN ; %IF &nbobs < 20 %THEN %DO ; TITLE1 "Contenu intégral de &table" ; PROC PRINT DATA=&table ; RUN ; TITLE ; %END ; %ELSE %DO ; TITLE1 "Contenu des 20 premières lignes de &table" ; PROC PRINT DATA=&table (OBS=20) ; RUN ; TITLE ; %END ; %MEND listing ; %listing(table=sashelp.air) ; %listing(table=sashelp.class) ; /* version abrégée du même macro-programme */ %MACRO […]

SASMACRO Macro-programmes (11 minutes)

  %MACRO stats(donnees, varAnalyse, varGroupe) ; PROC TABULATE DATA=&donnees ; CLASS &varGroupe ; VAR &varAnalyse ; TABLE (MEAN= »Moyenne » MEDIAN= »Médiane » N= »Effectif » NMISS= »Valeurs manquantes »)* (&varGroupe ALL= »Ensemble »), (&varAnalyse) ; RUN ; %MEND stats ; %stats(donnees = sashelp.cars, varAnalyse = invoice horsepower, varGroupe = origin) ; %MACRO stats(donnees, varAnalyse, varGroupe, lesquelles=MEAN= »Moyenne » MEDIAN= »Médiane ») ; PROC TABULATE DATA=&donnees ; CLASS &varGroupe ; VAR &varAnalyse ; TABLE (&lesquelles)* (&varGroupe ALL= »Ensemble »), (&varAnalyse) ; RUN ; %MEND stats ; %stats(donnees = sashelp.cars, varAnalyse = invoice horsepower, varGroupe = origin) […]

SASMACRO Macro-fonctions (10 minutes)

  TITLE1 « Elèves inscrits pour l’année %SUBSTR(&sysdate9,6,4) » ; FOOTNOTE1 « Listing édité par %UPCASE(&sysuserid) » ; PROC PRINT DATA=sashelp.class ; RUN ; TITLE ; FOOTNOTE ; %LET annee = %SUBSTR(&sysdate9,6,4) ; TITLE1 « Elèves inscrits pour l’année %EVAL(&annee-1)-&annee » ; PROC PRINT DATA=sashelp.class ; RUN ; TITLE ; TITLE1 « Sortie produite le %LOWCASE(%SYSFUNC(TODAY(),FRADFWKX.)) » ; PROC PRINT DATA=sashelp.class ; RUN ; TITLE ;

SASMACRO SELECT INTO (14 minutes)

  PROC SQL NOPRINT ; SELECT MEAN(weight) INTO : moyenne FROM sashelp.class ; QUIT ; PROC SGPLOT DATA=sashelp.class ; VBAR age / RESPONSE=weight STAT=MEAN ; REFLINE &moyenne / AXIS=Y LABEL= »Moyenne générale » ; RUN ; PROC SQL NOPRINT ; SELECT MEAN(weight) INTO : moy1 – FROM sashelp.class GROUP BY sex ; /* dans l’ordre, F et M */ QUIT ; PROC SGPLOT DATA=sashelp.class ; VBAR age / RESPONSE=weight STAT=MEAN ; REFLINE &moy1 / AXIS=Y LABEL= »Moyenne filles » ; REFLINE &moy2 / AXIS=Y […]

SASMACRO CALL SYMPUTX (11 minutes)

  DATA _NULL_ ; SET sashelp.class ; CALL SYMPUTX(« dernier_enfant », name) ; RUN ; %PUT le dernier enfant est &dernier_enfant ; DATA _NULL_ ; SET sashelp.class (OBS=1) ; CALL SYMPUTX(« premier_enfant », name) ; RUN ; %PUT le premier enfant est &premier_enfant ; PROC SORT DATA=sashelp.class OUT=work.class ; BY height ; RUN ; DATA _NULL_ ; SET work.class ; CALL SYMPUTX(« plus_grand », name) ; RUN ; %PUT le plus grand enfant est &plus_grand ; DATA _NULL_ ; SET sashelp.class ; CALL SYMPUTX(CATS(« prenom »,_N_), name) ; […]

SASMACRO Valeur d’une macro-variable (9 minutes)

  %PUT bonjour &sysuserid, nous sommes le &sysdate9 ;

SASMACRO %LET (6 minutes)

  %LET donnees = sashelp.class ; PROC PRINT DATA=&donnees ; RUN ; %LET donnees = sashelp.cars ; %LET varAnalyse = invoice ; %LET varGroupe = origin ; PROC TABULATE DATA=&donnees ; CLASS &varGroupe ; VAR &varAnalyse ; TABLE (MEAN= »Moyenne » MEDIAN= »Médiane » N= »Effectif » NMISS= »Valeurs manquantes »)* (&varGroupe ALL= »Ensemble »), (&varAnalyse) ; RUN ; /* en changeant juste les paramètres (%LET) mais pas le reste */ %LET donnees = sashelp.class ; %LET varAnalyse = age height weight ; %LET varGroupe = sex ; PROC TABULATE […]

SASMACRO Quoting (6 minutes)

  %LET table = sashelp.class ; DATA _NULL_ ; SET &table ; CALL SYMPUTX(« nbobs », _N_) ; RUN ; %PUT nombre d%STR(%’)observations dans &table = &nbobs ;

données SASHELP Présentation des données SASHELP

La table SASHELP.CLASS recense 19 enfants de 11 à 16 ans (colonne AGE). On connaît leur prénom avec NAME, leur poids en livres avec WEIGHT et leur taille en pouces avec HEIGHT. La table SASHELP.CARS recense 428 modèles de voitures identifiés par leur marque (MAKE) et leur référence (MODEL). Entre autres informations, on repère le type de carrosserie (TYPE), le continent de la marque (ORIGIN valant Asia, Europe ou USA), le prix catalogue et facturé (respectivement MSRP et INVOICE), le […]

RBASE DEPP Correction – EXERCICE N°13

# packages utiles —- library(lubridate) # gestion des Dates # récupération des données —- etab$annee_ouv

RBASE DEPP EXERCICE N°13

Pour rappel les descriptifs des fichiers sont ici.   Calculer le nombre d’établissements ouverts par an (à partir de la colonne DATE_OUVERTURE dans etab) et reporter cette information sous forme de courbe comme ci-dessous.

RBASE DEPP Correction – EXERCICE N°12

# récupération des données —- premier_degre

RBASE DEPP EXERCICE N°12

Pour rappel les descriptifs des fichiers sont ici.   Représenter par un diagramme en bâtons empilés le nombre d’établissements du 1er degré (uniquement les écoles maternelles, nature UAI 101 ; et les écoles primaires, nature UAI 151) croisé avec le secteur (PU pour public, PR pour privé).

RBASE DEPP Correction – EXERCICE N°11

# A partir des données agents, # construire un tableau indiquant # par académie la répartition hommes/femmes # sous forme de % ligne (chaque académie = 100%). # Arrondir ces pourcentages à une seule décimale. round( prop.table(table(agents$acad, agents$sexe2), 1)*100, 1)

RBASE DEPP EXERCICE N°11

Pour rappel les descriptifs des fichiers sont ici.   A partir des données agents, construire un tableau indiquant par académie la répartition hommes/femmes sous forme de % ligne (chaque académie = 100%). Arrondir ces pourcentages à une seule décimale.

RBASE DEPP Correction – EXERCICE N°10

# Pour les agents de sexe féminin, # quel est l’âge moyen par académie ? age_moy_femmes

RBASE DEPP EXERCICE N°10

Pour rappel les descriptifs des fichiers sont ici.   Pour les agents de sexe féminin, quel est l’âge moyen par académie ? Quelles sont les 3 académies où ces agents (de sexe féminin donc) sont les plus jeunes ? Réponse : 1-Créteil, 2-Versailles, 3-Mayotte.

RBASE DEPP Correction – EXERCICE N°9

# Dans l’académie de Versailles, # quel est l’âge moyen des agents ? mean(agents[which(agents$acad== »VERSAILLES »), « age »], na.rm=TRUE)

RBASE DEPP EXERCICE N°9

Pour rappel les descriptifs des fichiers sont ici.   Dans l’académie de Versailles, quel est l’âge moyen des agents ? Réponse : 41,11 ans

RBASE DEPP Correction – EXERCICE N°8

# packages utiles —- library(openxlsx) # export vers Excel # export simple —- write.xlsx(agents_lp_laRochelle, file= »c:/temp/agents La Rochelle.xlsx », asTable=TRUE, sheetName= »LP », overwrite=TRUE)

RBASE DEPP EXERCICE N°8

Pour rappel les descriptifs des fichiers sont ici.   Créer un classeur Excel contenant une feuille nommée « LP » avec les données extraites à l’exercice 5 (agents exerçant dans les lycées professionnels de La Rochelle).

RBASE DEPP Correction – EXERCICE N°7

# packages utiles —- library(reshape2) # transposition # transposition —- dcast(agents[which(!is.na(agents$sexe)),], acad ~ sexe2, fun.aggregate=mean, value.var= »age »)

RBASE DEPP EXERCICE N°7

Pour rappel les descriptifs des fichiers sont ici.   A partir des données du data.frame agents, construire un data.frame avec une ligne par académie et une colonne par sexe (on pourra utiliser la colonne sexe2 créée précédemment pour des noms de colonnes plus clairs), chaque colonne contenant l’âge moyen des agents. Les agents dont le sexe est inconnu ne seront pas utilisés pour cet exercice.

RBASE DEPP Correction – EXERCICE N°6

# tri par âge croissant # en cas d’ex-aequos sur l’âge, on les trie par sexe # puis par académie agents_age_croissant <- agents[order(agents$age, agents$sexe, agents$acad) , ]

RBASE DEPP EXERCICE N°6

Pour rappel les descriptifs des fichiers sont ici.   Trier les agents par âge croissant ; en cas d’ex-aequos sur l’âge, on les trie par sexe puis par académie.

RBASE DEPP Correction – EXERCICE N°5

lp_laRochelle

RBASE DEPP EXERCICE N°5

Pour rappel les descriptifs des fichiers sont ici. Créer un data.frame contenant les agents qui exercent en LP (nature = 320) à La Rochelle (commune = 17300) à partir de etab et agents. Ils doivent être 137.

RBASE DEPP Correction – EXERCICE N°4

# packages utiles —- library(lubridate) # gestion des dates # type de la colonne etab$DATE_OUVERTURE —- class(etab$DATE_OUVERTURE) # conversion en Date —- etab$OUV <- as.Date(etab$DATE_OUVERTURE) class(etab$OUV) # ancienneté —- etab$ANC <- (today()-etab$OUV)/dyears(1) # supprimer les variables inutilisées —- agents$geostat4 <- NULL agents$grade <- NULL agents$angrade <- NULL agents$echelon <- NULL # créer de nouvelles colonnes —- agents$sexe2 <- ifelse(agents$sexe == 1, « HOMME », « FEMME ») agents$sexe2 <- as.factor(agents$sexe2)

RBASE DEPP EXERCICE N°4

Pour rappel les descriptifs des fichiers sont ici.   L’objet etab contient une colonne date.ouverture. Quel est son type ? En dériver une colonne de type Date, et s’en servir pour calculer l’ancienneté en années de l’établissement par rapport à la date du jour. Dans les données agents, supprimer les colonnes geostat4, grade, angrade et echelon. Créer une colonne sexe2 qui sera un facteur avec deux valeurs, HOMME et FEMME.

RBASE DEPP Correction – EXERCICE N°3

# agents de sexe féminin dans l’académie de BORDEAUX —- femmes_bordeaux <- agents[which(agents$sexe == 2 &                                 agents$acad == « BORDEAUX »),] # agents exerçant en lycée pro en Guadeloupe / Martinique —- lp_antilles <- agents[which(agents$nature == 320 &                             agents$acad %in% c(« GUADELOUPE »,                                                « MARTINIQUE »)),] # autre solution sans %in% lp_antilles <- agents[which(agents$nature == 320 &                               (agents$acad == »GUADELOUPE » |                                agents$acad == »MARTINIQUE »)),]        # établissements de Charente-Maritime —- etab17 <- etab[which(grepl(« ^017 »,                            etab$NUMERO_UAI)),]

RBASE DEPP EXERCICE N°3

Pour rappel les descriptifs des fichiers sont ici.   Créer… un objet femmes_bordeaux à partir des agents de sexe féminin (code 2) de l’académie de Bordeaux dans le data.frame agents (10 204 obs) un objet lp_antilles des agents des académies de Guadeloupe et de Martinique exerçant en lycée professionnel (nature 320) (924 obs) un objet etab17 à partir des établissements (data.frame etab) dont le numéro UAI commence par 017 (659 obs)

RBASE DEPP Correction – EXERCICE N°2

# afficher les 20 premières lignes de l’objet agents agents[1:20,] print(agents[1:20,]) (etab20 <- agents[1:20,])

RBASE DEPP EXERCICE N°2

Pour rappel les descriptifs des fichiers sont ici.   Afficher dans la Console les 20 premières lignes du data.frame agents. Pour afficher un objet, on peut : juste écrire son nom sans affectation, a affecter et mettre l’affectation entre parenthèses pour afficher l’objet créé, (b <- a) utiliser explicitement la fonction print, print(a)

RBASE DEPP Correction – EXERCICE N°1

# packages utiles —- library(haven)    # import tables SAS library(readxl)   # import fichiers Excel library(arrow) # import fichiers Parquet # répertoire par défaut setwd(« C:/olivier/depp ») # imports —- etab    <- read_sas(« bce_uai.sas7bdat ») agents  <- read.delim(« agents.csv »,                       sep= »; »,                       header=TRUE,                       stringsAsFactors = FALSE) service <- read_parquet(« service.parquet »)

RBASE DEPP EXERCICE N°1

Les descriptifs des fichiers sont ici. Importer les fichiers AGENTS.CSV (dans un objet appelé agents) BCE_UAI.SAS7BDAT (dans un objet appelé etab) SERVICE.PARQUET (dans un objet appelé service) avec la fonction read_parquet du package {arrow}. Cette fonction a la même syntaxe que quand on importe une table SAS.  

données DEPP Présentation des données DEPP

Ces données sont réalistes mais fictives. Le fichier AGENTS.CSV est un descriptif d’agents du MEN (âge, sexe, ancienneté, …) identifiés par la colonne Clef. Le fichier est à séparateur point-virgule. Il compte 361 231 lignes et 7 colonnes. Ces agents exercent dans un établissement dont le numéro UAI est dans la colonne etab et dont le type est décrit par le code dans nature (par exemple, 320 pour les lycées professionnels). Leur académie est indiquée en toutes lettres dans la […]

RBASE dplyr Correction – EXERCICE N°13

library(ggplot2) # beaux graphiques library(dplyr) # requête evol % group_by(an) %>% summarise(LIT=sum(LIT, na.rm=TRUE)) %>% mutate(an = as.numeric(an)) ggplot(evol) + aes(x=an, y=LIT) + geom_line() + geom_point()

RBASE dplyr Correction – EXERCICE N°12

library(forcats) # pour réordonner les facteurs library(ggplot2) # beaux graphiques capa2015 % filter(an == 2015) %>% group_by(Discipline) %>% summarise(LIT = sum(LIT, na.rm=TRUE)) ggplot(capa2015) + aes(y=Discipline, x=LIT) + geom_bar(stat= »identity ») # et en rangeant les barres capa2015 % filter(an == 2015) %>% group_by(Discipline) %>% summarise(LIT = sum(LIT, na.rm=TRUE)) %>% mutate(Discipline = fct_reorder(Discipline, LIT, sum)) ggplot(capa2015) + aes(y=Discipline, x=LIT) + geom_bar(stat= »identity »)

RBASE dplyr Correction – EXERCICE N°10

capa %>% filter(an == 2010 & substr(fi,1,2) == « 17 ») %>% group_by(fi) %>% summarise(capacite_totale = sum(LIT, na.rm=TRUE))

RBASE dplyr Correction – EXERCICE N°6

# tri par lits, toutes disciplines confondues sae16_tri % filter(an == 2016) %>% arrange(desc(LIT)) %>% select(fi,rs,Discipline,LIT) # tri par lits à l’intérieur d’un tri par discipline sae16_tri2 % filter(an == 2016) %>% arrange(Discipline, desc(LIT)) %>% select(fi,rs,Discipline,LIT)

RBASE dplyr Correction – EXERCICE N°5

sae2016_etab <- capa %>% filter(an == 2016) %>% left_join(etab, by=c(« fi »= »finess »))

RBASE dplyr Correction – EXERCICE N°4

library(lubridate) # gestion des dates class(etab$date.ouverture) # variable texte # on convertit en Date etab % mutate(date.ouverture2 = as.Date(date.ouverture)) # ancienneté de l’établissement etab % mutate(anciennete = (today() – date.ouverture2)/ dyears(1)) # on corrige les dates dont les années sont étranges etab% mutate(anciennete = ifelse(anciennete < 0 | anciennete > 200, NA, anciennete))

RBASE dplyr Correction – EXERCICE N°3

# objet sae2010 à partir des seules données # de l’année 2010 dans le data.frame capa sae2010 % filter(an == 2010) # 7779 lignes et 24 colonnes # objet sae_bretagne à partir des seules données # des établissements des départements 22, 29, 35 et 56 # dans le data.frame capa sae_bretagne % filter(dep %in% c(« 22″, »29″, »35″, »56 »)) # 6768 lignes et 24 colonnes # objet cliniques à partir des établissements # (data.frame etab) dont le nom (colonne rs) # contient le mot […]

RBASE dplyr Correction – EXERCICE N°2

# afficher les 20 premières lignes de l’objet etab # et seulement les colonnes finess, rs, # et celles dont le nom commence par « lib » library(tidyverse) # inclut {dplyr} pour les requêtes etab %>% slice(1:20) %>% select(finess, rs, starts_with(« lib »)) etab %>% slice(1:20) %>% select(finess, rs, starts_with(« lib »)) %>% print() (etab20 <- etab %>% slice(1:20) %>% select(finess, rs, starts_with(« lib »)))

RBASE dplyr EXERCICE N°10

Pour rappel les descriptifs des fichiers sont ici.   Pour l’année 2010, quelle est la capacité totale (total du nombre de lits indiqués dans la colonne LIT de capa) par établissement ? On se limitera aux établissements de Charente-Maritime (le numéro FINESS contenu dans la colonne fi commence par 17).

RBASE dplyr EXERCICE N°6

Pour rappel les descriptifs des fichiers sont ici.   Trier les établissements de l’enquête SAE (objet capa) pour 2016 : * Par nombre de lits (colonne LIT) décroissant, toutes disciplines confondues * Par nombre de lits décroissant, à l’intérieur d’un tri par discipline (colonne Discipline)