Chapitre 3 Prise en main de r
Pour démarrer :
- 1 - Télécharger et installer r sur le site du Comprehensive r Archive Network
- 2 - Télécharger et installer Rstudio.(version free)
- 3 - Dans le cadre de cet atelier, on adopte la méthode du rmarkdown. On recommande fortement de lire l’ouvrage de référence, même si la prise en main est très rapide.
- 4 - Il est désormais indispensable d’utiliser le package
tidyverse
et en particulier les fonctions de manipulation et de pipe (%>%) fournies pardplyr
. Ce sera donc le premier package à installer (attention, il appele de nombreuses dépendences, l’installation peut prendre plusieurs minutes )
3.1 La convention du Rmarkdown
Différentes manières d’interagir avec r sont possibles : la première est le mode console, pour de petite opérations et un utilisateur chevronné, celà peut être commode car rapide mais très rapidement on sera amené à enregistrer les opérations dans des scripts. Une idée novatrice a été d’intégrer l’ensemble des élements dans un seul document : le script découpé en petits éléments : des chunks, le commentaire et l’analyse verbabe dans un format texte, et le résultat. Dans l’univers python il s’agit des carnets Jupiter, pour r c’est le rmarkdown.
C’est un dialecte du markdown générique adapté au langage r. On recommande au lecteur d’en lire le manuel et de le garder dans ses onglets.
Quelques éléments de base :
un document markdown est composé de plusieurs éléments
- Yalm : dans cet entête les éléments essentiels sont définis et paramétrés
- Texte : il suit les conventions de mise en forme du html :
- des # pour les niveau de titres
- une syntaxe (x)[.xxx] pour des liens vers les URLS ou des images.
- Les chunks sont isolés par 3 tiks au début et à la fin.
- Résultats apparaissent sous les chunks après avoir été exécutés
Ce document peut être publié sous différents formats : html, pdf ou même word.
Il comprend les éléments suivants :
- Plan
- Texte
- Code
- Résultats
- Bibliographie
- Références
- Liens
- Images
3.2 Lire les données
La première étape c’est la lecture des données. On commence par lecture de fichiers locaux, dont les formats sont multiples : csv, tsv, xlsx, Spss, etc… Pour chacun d’eux existe une fonction dédiée.
Le package readr
contribue à cette tâche pour les fichiers *.csv.
<- read_csv("./Data/BXL_listings.csv")
df head(df,5)
## # A tibble: 5 x 16
## id name host_id host_~1 neigh~2 neigh~3 latit~4 longi~5 room_~6 price
## <dbl> <chr> <dbl> <chr> <lgl> <chr> <dbl> <dbl> <chr> <dbl>
## 1 2352 Triplex-2~ 2582 Oda NA Molenb~ 50.9 4.31 Entire~ 91
## 2 2354 COURT/Lon~ 2582 Oda NA Molenb~ 50.9 4.31 Entire~ 74
## 3 45145 B&B Welco~ 199370 <NA> NA Bruxel~ 50.9 4.37 Hotel ~ 120
## 4 48180 Top Apart~ 219560 Ahmet NA Woluwe~ 50.8 4.41 Entire~ 200
## 5 52796 Bright ap~ 244722 Pierre NA Ixelles 50.8 4.36 Entire~ 74
## # ... with 6 more variables: minimum_nights <dbl>, number_of_reviews <dbl>,
## # last_review <date>, reviews_per_month <dbl>,
## # calculated_host_listings_count <dbl>, availability_365 <dbl>, and
## # abbreviated variable names 1: host_name, 2: neighbourhood_group,
## # 3: neighbourhood, 4: latitude, 5: longitude, 6: room_type
Il est possible aussi d’accéder en direct aux données du web, c’est bien utile pour s’assurer que les données sont bien fraîches. Par exemple une connexion à Nsppolls qui propose une compilation de tous les sondages d’intention de vote de la présidentielle 2022.
<- read_delim("https://raw.githubusercontent.com/nsppolls/nsppolls/master/presidentielle.csv",
df_pol delim = ",", escape_double = FALSE, trim_ws = TRUE)
Bien d’autre possibilités sont offertes, on pourra utiliser des API, des programmes de scrapping., ire en bouche des fichiers dans un répertoire, interroger des bases SQL des SGBD) ou d’autres systèmes.
3.3 Dplyr
pour manipuler les données
Dès lors que les données sont chargées en mémoire il va souvent être nécessaire d’en travailler, l’aspect et la structure. L’aspect concerne les formats et les significations, les recodages. La structure est relative à la forme des tableaux. Il faudra souvent traiter les données brutes pour proposer à nos modèles des structures appropriées.
Dplyr
est un des packages essentiels de la suite tidyverse. Il permet de manipuler aisément les données et mérite une étude approfondie. Un point de départ ou en français : dplyr.
Deux idées sont au coeur de Dplyr
d’abord celle du pipe, ensuite celle du verbe. Dplyr
encourage une approche processus et performative.
3.3.1 Des pipes %>%
Une grand part de l’intérêt de dplyr est de reprendre un opérateur de magritr très utile : le pipe noté data %>% f() %>% g()..
. Celui ci permet de passer le résultat de l’opération à gauche f() sur les données data
, dans la fonction g() à droite.
Un exemple simple : dans la ligne de code suivante, une première fonction lit le fichier CSV, et envoie le résultat de cette lecture dans une fonction graphique élémentaire: compter les occurrences des modalités de la variable room_type.
<- read_csv("./Data/BXL_listings.csv") %>%
g ggplot(aes(x=room_type))+
geom_bar()+
coord_flip()+
labs(x=NULL, y= "Fréquence", title=" Distribution des types de logement à Bruxelles en 2020")
g
3.3.2 Des verbes
L’originalité de dplyr
est de définir les fonctions comme des verbes. Chaque verbe désigne une action particulière. On va les examiner progressivement.
* transformer une variable,
* filtrer les observations selon un critère,
* isoler des variables,
* les grouper pour en calculer des résultats statistiques (somme, moyenne, variance, max min etc),
* les déployer selon un format long ou les distribuer en différents critères,
* les fusionner enfin.
3.3.2.1 Mutate
En Français c’est “transformer”. On modifie la valeur d’une variable par une fonction plus ou moins complexe, éventuellement en ajoutant des conditions.
Dans notre exemple, faisant au plus simple, puisque la distribution est asymétrique, une transformation du prix par les log10 peut donner des résultats intéressants. Et c’est le cas, on retrouve une distribution qui semble être gaussienne.
<- read_csv("./Data/BXL_listings.csv") %>%
g mutate(price=log10(price))%>%
ggplot(aes(x=price))+
geom_histogram()
g
3.3.2.2 Filter
On peut vouloir se concentrer sur une sous population. Par exemple les chambres privées.
<- read_csv("./Data/BXL_listings.csv") %>%
g filter(room_type=="Private room" ) %>%
mutate(price=price)%>%
ggplot(aes(x=log10(price)))+
geom_histogram()
g
3.3.2.3 select
On peut sélectionner des colonnes pour créer un tableau spécifique. On en profite pour introduire ‘flextable’ , une solution élégante pour éditer des tableaux en html.
<- read_csv("./Data/BXL_listings.csv") %>%
foo ::select(room_type,price)
dplyr
<- flextable(foo[ sample.int(10),])%>%
ft set_header_labels(room_type="Type de logement",
price = "Prix en euros")%>%
theme_vanilla()%>% fontsize(size = 9)%>%
autofit()
ft
Type de logement | Prix en euros |
Entire home/apt | 65 |
Entire home/apt | 85 |
Entire home/apt | 74 |
Entire home/apt | 80 |
Hotel room | 120 |
Entire home/apt | 80 |
Entire home/apt | 95 |
Entire home/apt | 91 |
Entire home/apt | 74 |
Entire home/apt | 200 |
3.3.2.4 Group_by et summarize
c’est une opération clé, en groupant les observations selon les modalités d’une variables, on peut construire des tableaux agrégés avec summarise
qui permet de calculer de nombreuses statistiques : somme, moyenne, variance, max, min .. à travers les groupes.
<- read_csv("./Data/BXL_listings.csv")%>%
foo ::select(neighbourhood, price)%>%
dplyrgroup_by(neighbourhood ) %>%
summarise(averageprice=round(mean(price),1),
nombreoffre=n())
#mise en forme flextable
<- flextable(foo)%>%
ft set_header_labels(neighbourhood="Quartier",
averageprice = "Prix en euros",
nombreoffre="Nombre d'offre", size=9)%>%
fontsize(size = 9)%>%
theme_vanilla()
ft
Quartier | Prix en euros | Nombre d'offre |
Anderlecht | 71.9 | 232 |
Auderghem | 66.3 | 77 |
Berchem-Sainte-Agathe | 65.9 | 31 |
Bruxelles | 91.0 | 1,759 |
Etterbeek | 75.8 | 296 |
Evere | 70.0 | 41 |
Forest | 64.9 | 226 |
Ganshoren | 50.5 | 21 |
Ixelles | 81.5 | 849 |
Jette | 70.3 | 75 |
Koekelberg | 70.7 | 37 |
Molenbeek-Saint-Jean | 67.4 | 179 |
Saint-Gilles | 76.1 | 589 |
Saint-Josse-ten-Noode | 55.2 | 136 |
Schaerbeek | 61.9 | 364 |
Uccle | 75.5 | 274 |
Watermael-Boitsfort | 74.8 | 65 |
Woluwe-Saint-Lambert | 62.5 | 121 |
Woluwe-Saint-Pierre | 111.0 | 81 |
3.3.2.5 Pivot_wider et pivot_longer
Si pour l’habitué des feuilles de calculs, les données croisent des observations avec des variables, ce format n’est pas le seul moyen de représenter des données, et pas forcément le meilleur.
Une théorie des tidy data a été proposé par wickham : Un ensemble de données est une collection de valeurs, généralement des nombres (si elles sont quantitatives) ou des chaînes de caractères (si elles sont qualitatives). Les valeurs sont organisées de deux manières. Chaque valeur appartient à une variable et à une observation. Une variable contient toutes les valeurs qui mesurent le même attribut sous-jacent (comme la hauteur, la température, la durée) dans différentes unités. Une observation contient toutes les valeurs mesurées sur la même unité (comme une personne, ou un jour, ou une course) à travers les attributs.
Pour passer d’un tableau individu x variable à une structure ordonnée, la fonction pivot_longer est particulièrement appropriée. En voici l’anatomie.
Et un exemple numérique :
<- foo %>%
foo pivot_longer(-neighbourhood,names_to= "Variables",values_to = "Values")
ggplot(foo, aes(x=neighbourhood, y=Values, group=Variables))+
geom_line()+facet_wrap(vars(Variables),scales="free")+
coord_flip()
L’opération inverste est de partir d’un tableau long vers un tableau large.
On remarquera que l’usage de cette fonction est nécessaire dans l’emploi de ggplot qui suit la logique des tidy data, ou données ordonnées
3.3.3 Fusionner les données
On sera souvent amené à construire des tableaux de données en les enrichissant par d’autres tableaux et à fusionner les données.
Le cas le plus simple est d’ajouter d’autres observations à un fichier de données. On distingue deux cas :
- les deux tableaux concernent les mêmes individus classé dans le même ordre, seules les colonnes diffèrent. On utilisera la fonction
cbind()
- si les variables sont identiques mais que les individus sont différents on peut concatène des données avec
rbind()
(L’équivalent de DPLYR est row_bind et column_bind)
<-as.data.frame(c(1,2,3,4,5)) %>%rename(x=1)
x1
<-as.data.frame(c("a","b","c","d","e")) %>%rename(y=1)
y
<-cbind(x1,y)
z
<-flextable(z)
ft ft
x | y |
1 | a |
2 | b |
3 | c |
4 | d |
5 | e |
<-as.data.frame(c(9,8,7,6)) %>%rename(x=1)
x2
<-rbind(x1,x2)
w
<-flextable(w)
ft ft
x |
1 |
2 |
3 |
4 |
5 |
9 |
8 |
7 |
6 |
mais très souvent on sera dans des cas différents et la fusion des données devra suivre des index
Plusieurs types de fusion sont proposées.
genérale
fusion à gauche
fusion à droite
(Voir ce cours)[https://coletl.github.io/tidy_intro/lessons/dplyr_join/dplyr_join.html]