1 Importer des jeux de données

Pour manipuler des données, il nous faut d’abord savoir importer des jeux de données. L’importation dépend en grande partie du format de votre jeu de données : yyy.csv, yyy.xlsx, yyy.xls, yyy.number,… Le format de vos données vont nécessiter l’utilisation d’une méthode plutôt qu’un autre. Prenons l’exemple d’un fichier excel tout à fait classique : il faut, en premier lieu, importer une librairie dans R afin de pouvoir utiliser des fonctions d’imports.

library(openxlsx) ### Librairie pour l'import de fichier excel
library(tidyverse) ### Librairie incontournable, mais nous y reviendrons
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(questionr) ### QuestionR apporte un ensemble de fonctions et de données classique de R
library(kableExtra)
## 
## Attachement du package : 'kableExtra'
## 
## L'objet suivant est masqué depuis 'package:dplyr':
## 
##     group_rows

Une fois nos librairies installées, on peut se lancer dans l’import de fichier. En particulier, la librairie openxlsx est très efficace dans l’import de fichier excel. Mais regardons pour elle est particulièrement efficace. Nous allons importer un fichier avec les fonctinonalités standards de R.

df <- read.csv2("../Sources/vico2020.xlsx", col.names = TRUE)
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## line 1 appears to contain embedded nulls
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## line 2 appears to contain embedded nulls
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## line 3 appears to contain embedded nulls
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## line 4 appears to contain embedded nulls
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## line 5 appears to contain embedded nulls
## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,
## : Fin de fichier (EOF) dans une chaîne de caractères entre guillements
## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,
## : caractère(s) 'nul' au milieu de l'entrée
## Error in read.table(file = file, header = header, sep = sep, quote = quote, : la duplication de 'row.names' est interdite

Décrivons rapidement ce bout de chunk. Nous créons une variable df dans laquelle nous souhaitons importer un fichier qui s’appelle vico2020.xlsx. Nous utilisons pour ce faire la fonction read.csv2(), à laquelle nous donnons un chemin relatif (mais on pourrait aussi lui fournir un chemin absolu) vers le fichier que nous voulons importer. En somme, au lieu de naviguer dans nos dossiers comme nous avons l’habiture, nous donnons un chemin à R pour charger le fichier.

Le chemin se lit de cette manière :

  • "../" : Les “.” signifient que nous souhaitons accéder à un dossier “parent” par rapport à l’endroit où R se situe, c’est-à-dire un dossier plus proche de la racine. Dans un chemin relatif (c’est-à-dire qui ne part pas de la racine de l’ordinateur), le ./ signifie “à l’endroit où nous sommes”.
  • Utiliser TAB : En utilisant la touche TAB après un ‘/’, vous pourrez voir où R vous situe, et choisir à l’aide de la touche Entrée, les dossier et fichiers vers lesquelles vous souhaitez naviguer.
  • Sources/vico2020.xlsx : Ce sont l’ensemble des dossiers par lesquelles nous passons pour charger le fichier vico2020.xlsx

Pour vérifier que nous avons bien récupérer notre fichier, et qu’il est correctement importé, nous utilisons ici la fonction head(), qui permet de montrer les premiers individus d’un tableau.

Mais il semble ici que rien de ce que nous avons voulu faire n’est fonctionner. Nous obtenons un Warning de R, ce qui signifie que nous n’avons pas pu importer le jeu de données correctement. Nous pouvons réessayer cette même manipulation avec le package (ou librairie) openxlsx

df <- openxlsx::read.xlsx("../sources/vico2020.xlsx", colNames = TRUE)
head(df)
ID SEXE AGE SITCONJ RESNB
1 Une femme 30 Non 1
2 Une femme 30 Non 5
3 Une femme 24 Non 2
4 Une femme 45 Oui 2
5 Une femme 57 Non 1
6 Un homme 35 Oui 4

Cette fois-ci, l’import a bien fonctionné. C’est pourquoi je ne vous recommanderais jamais assez d’utiliser la librairie openxlsx pour importer vos données au format excel. On remarque également que la fonction head nous affiche le nombre de lignes et de colonnes du tableau : ici il y a 6 individus et 20 variables df[6 x 20]. On peut bien sûr importer des données sous une grande variété de format, y compris celles issues de logiciel comme STATA, SAS ou encore SPSS.

Une fois notre jeu de données importé, nous pouvons regarder rapidement comment celui-ci est construit. Nous avons déjà vu la fonction head() qui permet d’observer les premiers lignes, voici plusieurs autres fonctions :

tail(df)   ### Permet d'afficher les dernières lignes d'un tableau
ncol(df)    ### Affiche le nombre de colonnes (variables)
nrow(df)    ### Affiche le nombre de lignes (individus)
dim(df)     ### Affiche les nombres de lignes et de colonnes
names(df)   ### ou colnames(d) affiche les noms des colonnes (variables)
str(df)    ### Permet de voir les caractéristiques de chaque variable
## 'data.frame':    2000 obs. of  20 variables:
##  $ ID         : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ SEXE       : chr  "Une femme" "Une femme" "Une femme" "Une femme" ...
##  $ AGE        : num  30 30 24 45 57 35 35 36 21 64 ...
##  $ SITCONJ    : chr  "Non" "Non" "Non" "Oui" ...
##  $ RESNB      : num  1 5 2 2 1 4 2 2 1 1 ...
##  $ RESISOL    : chr  "Oui, autant que je voulais" "Oui, mais pas autant que je voulais" "Oui, autant que je voulais" "Oui, autant que je voulais" ...
##  $ LOGAUTRE   : chr  "Non, je suis toujours dans mon logement habituel." "Non, je suis toujours dans mon logement habituel." "Non, je suis toujours dans mon logement habituel." "Non, je suis toujours dans mon logement habituel." ...
##  $ MASQUE     : chr  "Non sélectionné" "Non sélectionné" "Oui" "Non sélectionné" ...
##  $ TEMPS      : chr  "Non, je ne manque pas du tout de temps libre" "Oui, je manque un peu de temps libre" "Non, je ne manque pas vraiment de temps libre" "Non, je ne manque pas du tout de temps libre" ...
##  $ INQUIET    : chr  "Non sélectionné" "Oui" "Non sélectionné" "Non sélectionné" ...
##  $ VOISINS    : chr  "Non sélectionné" "Oui" "Non sélectionné" "Non sélectionné" ...
##  $ CONTROL    : chr  "Non, jamais" "Oui, une seule fois" "Non, jamais" "Non, jamais" ...
##  $ AMIS       : chr  "Ni plus ni moins" "Moins souvent" "Plus souvent" "Plus souvent" ...
##  $ FAMILLE    : chr  "Plus souvent" "Plus souvent" "Ni plus ni moins" "Plus souvent" ...
##  $ POL        : chr  "Je ne me retrouve pas dans ces catégories" "Au centre" "A gauche" "A gauche" ...
##  $ DIPLONIV   : chr  "Un diplôme universitaire correspondant à plus de 4 années d'études supérieures après le baccalauréat (maîtrise, DEA, DES" "Un diplôme universitaire correspondant à moins de 4 années d'études supérieures après le baccalauréat (par exemple : DUT" "Un diplôme universitaire correspondant à plus de 4 années d'études supérieures après le baccalauréat (maîtrise, DEA, DES" "Un diplôme universitaire correspondant à moins de 4 années d'études supérieures après le baccalauréat (par exemple : DUT" ...
##  $ SITPROF_rec: chr  "A la recherche d'un emploi" "En études" "A la recherche d'un emploi" "En emploi" ...
##  $ PCS_rec6   : chr  "Cadres et professions intellectuelles supérieures" "Cadres et professions intellectuelles supérieures" "Cadres et professions intellectuelles supérieures" "Professions intermédiaires" ...
##  $ REV        : chr  "Moins de 800 euros par mois" "Moins de 800 euros par mois" "6000 euros par mois et plus" "De 5000 euros à moins de 6000 euros par mois" ...
##  $ POIDS_init : num  0.234 0.745 0.231 0.562 0.206 ...

Arrêtons-nous un peu sur la fonction str et ses résultats :

  • On remarque que les variables ont un type, ici num et chr. Pourquoi des types ? Parce que les variables d’un langage de programmation on souvent des propriétés particulières : on ne fait pas les mêmes traitements entre des nombres et des lettres, de la même manière qu’on ne fait pas les mêmes traitements entre des variables qualitatives et quantitatives.
  • Il existe une variété assez large de type de variable. Les numreprésentents les variables numériques, pas forcément des entiers, qui sont décrits par la variable int.
  • chr représente les variables de texte, sans plus de spécificités. On peut retrouver plusieurs type de ces variables comme les factor, qui permettent de regrouper des modalités sous un même nom, mais aussi logical,…

Sans nous attarder sur les types - sur lesquels nous reviendrons - nous pouvons voir qu’a priori toutes les variables n’ont pas été importé de la meilleure des manières : des variables comme AGE devrait être une variable de type int puisque l’age ici n’est représenté que par des nombres entiers. La variable SEXE devrait être au format factor, et on pourrait recoder ses modalités. Regardons ça ici.