Chapitre 5 Importer des données dans R

5.1 Introduction

5.1.1 Objectif de ce cours

Dans le flux de travail (workflow) du data scientist, l’importation constitue très généralement le point de départ. Les données ne sont toujours disponibles sous le format qui se prête à l’analyse souhaitée. Elles peuvent exister dans un classeur Excel sous format xls, xlsx ou csv. Elles peuvent aussi se trouver dans une base de données relationnelles, où diverses tables sont connectées entres elles. Elles peuvent même être disponibles sur Internet (page Wikipédia, Twitter, Facebook, etc.) Dans tous les cas, il revient au data scientist de connaitre la techique appropriée pour les importer dans son environnement de travail, les organiser et les analyser selon l’objectif qu’il s’assigne.

Dans ce chapitre, nous allons voir quelques techniques d’importation de données dans R.

5.1.2 Que nous faut-il?

  • R (évidemment) et RStudio (de préférence) installés sur le poste de travail

  • les fichiers fournis dans le cadre du module

  • un connexion Internet pour illustrer les exemples d’importation depuis la toile

5.1.3 Données

Nous allons illustrer ce chapitre avec une compilation de données tirées des Recensements Généraux de la Population et de l’Habitat au Mali, menés respectivement en 1976, 1987, 1998 et 2009. Le tableau suivant affiche un aperçu (l’année 1976 seulement) des données dont il est question.

Table 5.1: Un aperçu des données démographiques
annee id groupage Homme-Urbain Homme-Rural Femme-Urbain Femme-Rural source office
1976 1 0-4 100416 486599 99453 489941 RGPH DNSI
1976 2 5-9 80816 411456 82665 400186 RGPH DNSI
1976 3 10-14 60647 282160 65075 256884 RGPH DNSI
1976 4 15-19 58662 249945 60765 272743 RGPH DNSI
1976 5 20-24 46239 172152 47487 218355 RGPH DNSI
1976 6 25-29 36390 163705 43143 223875 RGPH DNSI
1976 7 30-34 30895 154834 33504 190446 RGPH DNSI
1976 8 35-39 27926 133457 28505 137444 RGPH DNSI
1976 9 40-44 22479 116947 22007 125822 RGPH DNSI
1976 10 45-49 17864 93466 15445 83008 RGPH DNSI
1976 11 50-54 14692 89927 13238 90369 RGPH DNSI
1976 12 55-59 10659 66919 8928 53989 RGPH DNSI
1976 13 60-64 8630 67990 9337 72129 RGPH DNSI
1976 14 65-69 5043 35236 5032 31800 RGPH DNSI
1976 15 70-74 3460 28430 4610 33137 RGPH DNSI
1976 16 75-79 2084 15065 2650 14080 RGPH DNSI
1976 17 80+ 2188 25958 3677 29082 RGPH DNSI
1976 99 ND 125 272 93 281 RGPH DNSI
1976 18 Total 529215 2594518 545614 2723571 RGPH DNSI

Notre fichier se nomme: “RGPH_MLI”. Nous l’avons enregistré sous divers formats, qui seront traduits par diverses extensions (.csv, .txt, .xls, .xlsx, etc). Nous allons les ouvrir progressivement.

Pour permettre l’exécution des codes depuis n’importe quel poste de travail, nous allons utiliser la plateforme Github. Toutefois, il convient de noter que les codes seront tout aussi valides que si l’on accède aux fichiers au niveau local.

Nous allons spécifier la source.

masource <- "https://raw.githubusercontent.com/fousseynoubah/dswr_slides/master/4_Importer_Donnees_dans_R/data/"

A partir de celle-ci, nous allons opérer comme au niveau local (à condition d’avoir une connexion Internet active bie sûr). Pour accéder à un fichier quelconque, monfichier, disponible dans le dossier, il suffit d’orienter sa requête vers:

paste0(masource, "monfichier" )
## [1] "https://raw.githubusercontent.com/fousseynoubah/dswr_slides/master/4_Importer_Donnees_dans_R/data/monfichier"

5.2 Fichiers plats: cas du format CSV

5.2.1 Aperçu

Comme son nom l’indique, le format CSV (Comma Separated Values) est un format où les valeurs de données rectangulaires sont séparées par une virgule (,). Cette règle de base est commode pour les anglophones, pour lesquels les décimales viennent après un point (.) et non après une virgule. Par contre, pour les francophones, le format de sauvegarde de données réquiert une règle différente. Pour ne pas confondre le séparateur de valeurs et la virgule de la décimale, l’on utilise le point-virgule (;). Nous verrons les fonctions qui conviennent pour chacun de ces deux formats.

5.2.2 Importation avec R-base: read.csv

La version d’installation de R, couramment appelée R-base (ou base-R), vient avec un ensemble de fonctions qui sont disponibles par défaut. Parmi celles-ci: read.csv. L’importation d’un fichier csv avec R-base se fait de la façon suivante:

RGPH_MLI <- read.csv(
  # Spécifier le nom du fichier
  file = paste0(masource, "RGPH_MLI.csv"), 
  # Déclarer la première ligne comme nom de colonne/variable
  header = TRUE, 
  # Déclarer la virgule comme séparateur
  sep = ",", 
  # Ne pas systématiquement transformer les caractères en facteurs.
  stringsAsFactors = TRUE 
)

Les éléments à l’intérieur de la fonction (file, header, sep, stringsAsFactors, etc.) sont les arguments de la fonction read.csv. Celles-ci ont des valeurs défaut, qui peuvent toutefois être altérer par l’utilisateur. Pour voir ces valeurs par défaut, consulter la documentation intégrer à R en entrant:

?read.csv

Regardons la structure de nos données.

str(RGPH_MLI)
## 'data.frame':    77 obs. of  14 variables:
##  $ ï..annee    : int  1976 1976 1976 1976 1976 1976 1976 1976 1976 1976 ...
##  $ id          : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ groupage    : Factor w/ 20 levels "","0-4","10-14",..: 2 11 3 4 5 6 7 8 9 10 ...
##  $ Homme.Urbain: int  100416 80816 60647 58662 46239 36390 30895 27926 22479 17864 ...
##  $ Homme.Rural : int  486599 411456 282160 249945 172152 163705 154834 133457 116947 93466 ...
##  $ Femme.Urbain: int  99453 82665 65075 60765 47487 43143 33504 28505 22007 15445 ...
##  $ Femme.Rural : int  489941 400186 256884 272743 218355 223875 190446 137444 125822 83008 ...
##  $ Homme       : int  587015 492272 342807 308607 218391 200095 185729 161383 139426 111330 ...
##  $ Femme       : int  589394 482851 321959 333508 265842 267018 223950 165949 147829 98453 ...
##  $ Urbain      : int  199869 163481 125722 119427 93726 79533 64399 56431 44486 33309 ...
##  $ Rural       : int  976540 811642 539044 522688 390507 387580 345280 270901 242769 176474 ...
##  $ Total       : int  1176409 975123 664766 642115 484233 467113 409679 327332 287255 209783 ...
##  $ source      : Factor w/ 2 levels "","RGPH": 2 2 2 2 2 2 2 2 2 2 ...
##  $ office      : Factor w/ 2 levels "","DNSI": 2 2 2 2 2 2 2 2 2 2 ...

5.2.3 Importation avec R-base: read.csv2

Avec read.csv déjà, le séparateur peut être spécifié pour permettre la prise en charge des fichiers qui ont point-virgule comme séparateur (;). Toutefois, il existe une fonction bâtie au dessus de celle-ci, qui prend en charge les spécificités de tels fichiers. Il s’agit de read.cvs2.

RGPH_MLI2 <- read.csv2(
  # Spécifier le nom du fichier
  file = paste0(masource, "RGPH_MLI2.csv"), 
  # Déclarer la première ligne comme nom de colonne/variable
  header = TRUE, 
  # Déclarer le point-virgule comme séparateur
  sep = ";", 
  # Ne pas systématiquement transformer les caractères en facteurs.
  stringsAsFactors = TRUE 
)

Ici aussi, les valeurs par défaut des arguments sont maintenues. Pour en savoir plus sur read.csv2, explorer la documentation R en tapant:

?read.csv2

Regardons la structure de ces données aussi.

str(RGPH_MLI2)
## 'data.frame':    77 obs. of  14 variables:
##  $ Ã...annee   : int  1976 1976 1976 1976 1976 1976 1976 1976 1976 1976 ...
##  $ id          : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ groupage    : Factor w/ 20 levels "","0-4","10-14",..: 2 11 3 4 5 6 7 8 9 10 ...
##  $ Homme.Urbain: int  100416 80816 60647 58662 46239 36390 30895 27926 22479 17864 ...
##  $ Homme.Rural : int  486599 411456 282160 249945 172152 163705 154834 133457 116947 93466 ...
##  $ Femme.Urbain: int  99453 82665 65075 60765 47487 43143 33504 28505 22007 15445 ...
##  $ Femme.Rural : int  489941 400186 256884 272743 218355 223875 190446 137444 125822 83008 ...
##  $ Homme       : int  587015 492272 342807 308607 218391 200095 185729 161383 139426 111330 ...
##  $ Femme       : int  589394 482851 321959 333508 265842 267018 223950 165949 147829 98453 ...
##  $ Urbain      : int  199869 163481 125722 119427 93726 79533 64399 56431 44486 33309 ...
##  $ Rural       : int  976540 811642 539044 522688 390507 387580 345280 270901 242769 176474 ...
##  $ Total       : int  1176409 975123 664766 642115 484233 467113 409679 327332 287255 209783 ...
##  $ source      : Factor w/ 2 levels "","RGPH": 2 2 2 2 2 2 2 2 2 2 ...
##  $ office      : Factor w/ 2 levels "","DNSI": 2 2 2 2 2 2 2 2 2 2 ...

5.2.4 Importation avec readr

5.2.4.1 Aperçu

readr est un package créé par Hadley Wickham. Ses fonctions sont similaires à celles de read.csv et de read.csv2. readr présente l’avantage de faire partie du tidyverse. Il travaille harmonieusement avec les autres packages de cet écosystème. Sa syntaxe est très simple: pour importer un fichier csv, on utilise read_csv au lieu de read.csv. Cette logique est valable pour d’autres formats, dont il suffit seulement d’ajouter l’extension après le tiret d’en bas (“_“). Ainsi, on a :

  • read_csv2: pour les fichiers CSV ayant le point-virgule (;) comme séparateur;

  • read_tsv: pour les fichiers avec les valeurs séparées par des tabulations;

  • read_fwf: pour les fichiers avec les valeurs séparées par des espaces fixes.

5.2.4.2 read_csv et read_csv2

Ouvrons le fichier csv avec read_csv.

# Chargement du package "readr"
library(readr) 
# Importation du fichier
RGPH_MLI <- read_csv(
  # Spécifier le nom du fichier
  file = paste0(masource, "RGPH_MLI.csv"), 
  # Déclarer la première ligne comme nom de colonne/variable
  col_names = TRUE, 
  # Indiquer la valeur à attribuer aux cellules vides 
  na = "", 
  # Nombre de lignes à ne pas importer, partant du ficher
  skip = 0
  )

et read_csv2

# Chargement du package "readr"
library(readr) 
# Importation du fichier
RGPH_MLI <- read_csv2(
  # Spécifier le nom du fichier
  file = paste0(masource, "RGPH_MLI2.csv"), 
  # Déclarer la première ligne comme nom de colonne/variable
  col_names = TRUE, 
  # Indiquer la valeur à attribuer aux cellules vides 
  na = "", 
  # Nombre de lignes à ne pas importer, partant du ficher
  skip = 0
  )

5.2.4.3 Généralisation

read_csv est un cas spécifique d’une fonction généraliste qui couvre un large spectre de formats : read_delim.

# Chargement du package "readr"
library(readr) 
# Importation du fichier
RGPH_MLI <- read_delim(
  # Spécifier le nom du fichier
  file = paste0(masource, "RGPH_MLI.csv"), 
  # Indiquer le séparateur
  delim = ","
  )

RGPH_MLI2 <- read_delim(
  # Spécifier le nom du fichier
  file = paste0(masource, "RGPH_MLI2.csv"), 
  # Indiquer le séparateur
  delim = ";"
  )

Avec read_delim, divers format de fichiers peuvent être importés, à partir du moment où le séparateur est bien spécifié:

  • virgule (,);

  • point-virgule (;);

  • tabulation (\t);

  • barre verticale (|);

  • espace (" “); etc.

Les autres arguments peuvent être ajustés pour prendre en compte les spécificités des données. Toutefois, il faut noter que read_delim est assez intuitive pour détecter le type des données (entiers, réels, caractères, etc.). Elle inspecte jusqu’à 1000 lignes (et peut aller jusqu’à la nième ligne) pour déterminer le type de données d’une colonne.

5.3 Excel: xls, xlsx

5.3.1 Aperçu

Faisant partie de la suite MS Office, Excel est l’un des tableurs les plus populaires. Il est difficile de l’exclure du workflow du data scientist car c’est l’outil de prédilection dans beaucoup de domaines et secteurs (entreprises, administrations) en matière d’organisation et de sauvegarde des données . Les data scientist opérant exclusivement sur des bases de données constituent une niche. Pour la majorité, amenée à interagir avec des spécialistes d’autres domaines, il est important de pourvoir disposer de techniques pour importer les données collectées et organisées par leurs soins dans Excel.

Dans R, plusieurs solutions existent. Nous verrons deux packages:

5.3.2 Importation avec xlsx: read.xlsx

Le package xlsx offre deux fonctions majeures pour lire des formats xls et xlsx. Il s’agit de read.xlsx et read.xlsx2 (plus rapide sur les fichiers lourds).

Pour le format xls

# Chargement du package "xlsx"
library(xlsx)

# Ne pouvant accéder au fichier depuis le net,
# il faut le télécharger localement d'abord.
library(downloader)
download(url = paste0(masource, "RGPH_MLI.xls?raw=true"), 
         dest = "RGPH_MLI.xls", 
         mode="wb")

# Exemple avec fichier Excel 97-2003
RGPH_MLI_xls <- read.xlsx( 
  # Spécifier le nom du fichier (format "xls")
  file = "RGPH_MLI.xls", 
  # Indiquer le numéro d'ordre de l'onglet à importer
  sheetIndex = 1, 
  #  sheetName = "RGPH_MLI" # indiquer le nom de l'onglet (alternative au numéro d'ordre)
  # Déclarer la première ligne comme nom de colonne/variable
  header = TRUE
)

…et pour le format xlsx

# Chargement du package "xlsx"
library(xlsx)

# Ne pouvant accéder au fichier depuis le net,
# il faut le télécharger localement d'abord.
library(downloader)
download(url = paste0(masource, "RGPH_MLI.xlsx?raw=true"), 
         dest = "RGPH_MLI.xlsx", 
         mode="wb")

# Exemple avec fichier Excel 2007-plus
RGPH_MLI_xlsx <- read.xlsx( 
  # Spécifier le nom du fichier  (format "xlsx")
  file = "RGPH_MLI.xlsx", 
  # Indiquer le numéro d'ordre de l'onglet à importer
  sheetIndex = 1, 
  #  sheetName = "RGPH_MLI" # indiquer le nom de l'onglet (alternative au numéro d'ordre)
  # Déclarer la première ligne comme nom de colonne/variable
  header = TRUE
)

5.3.3 Importation avec readxl: read_excel

Le package readxl est bâti sur les mêmes principes que readr. Il permet d’importer des formats Excel avec la même logique syntaxique. Il contient des fonctions spécifiques, read_xls et read_xlsx, et une fonction généraliste, read_excel.

# Chargement du package "readxl"
library(readxl) 

# Exemple avec fichier Excel 97-2003
RGPH_MLI_xls <- read_excel(
# Spécifier le nom du fichier (format "xls")
path = "RGPH_MLI.xls", 
# indiquer le nom de l'onglet ou le numéro d'ordre, les deux sont acceptés
sheet = "RGPH_MLI", 
# Déclarer la première ligne comme nom de colonne/variable
col_names = TRUE
)

# Exemple avec fichier Excel 2007-plus
RGPH_MLI_xlsx <- read_excel(
# Spécifier le nom du fichier (format "xls")
path = "RGPH_MLI.xlsx", 
# indiquer le nom de l'onglet ou le numéro d'ordre, les deux sont acceptés
sheet = "RGPH_MLI", 
# Déclarer la première ligne comme nom de colonne/variable
col_names = TRUE
)

5.4 Formats issues d’autres logiciels statistiques: Stata et SPSS

5.4.1 Aperçu

Le data scientist peut aussi être amené à travailler sur des données sauvegardées à partir d’autres programmes de traitement de données tels que Stata, SPSS, SAS, etc. Dans R, les solutions sont nombreuses. Ici, nous allons voir deux packages: foreign et haven.

5.5 Importation avec foreign

Le package foreign permet d’ouvrir des fichiers dta, issus de Stata

# Chargement du package "foreign"
library(foreign) 

# Ne pouvant accéder au fichier depuis le net,
# il faut le télécharger localement d'abord.
library(downloader)
download(url = paste0(masource, "RGPH_MLI.dta?raw=true"), 
         dest = "RGPH_MLI.dta", 
         mode="wb")

# Importation
RGPH_MLI_stata <- read.dta(
  # Spécifier le nom du fichier
  file = "RGPH_MLI.dta",
  # Conversion des dates du format Stata au format R (pour dire simple)
  convert.dates = TRUE, 
  # Conversion des étiquettes de variables catégorielles en facteurs
  convert.factors = TRUE, 
  # Convertir "_" de Stata en "." dans R (surtout nom des variables)
  convert.underscore = FALSE, 
  # Donner ou pas une valeur particulière aux cellules vides?
  missing.type = FALSE, 
  # Si oui, cet argument indique si cette valeur est présente ou pas
  warn.missing.labels = TRUE 
)

et des fichiers sav, issus de SPSS.

# Chargement du package "foreign"
library(foreign) 

# Ne pouvant accéder au fichier depuis le net,
# il faut le télécharger localement d'abord.
library(downloader)
download(url = paste0(masource, "RGPH_MLI.sav?raw=true"), 
         dest = "RGPH_MLI.sav", 
         mode="wb")

# Importation

RGPH_MLI_spss <- read.spss(
  # Spécifier le nom du fichier
  file = "RGPH_MLI.sav", 
  # Conservation des étiquettes de variables catégorielles (facteurs)
  use.value.labels = TRUE, 
  # Importation en data frame au lieu de matrice
  to.data.frame = TRUE 
  )

5.6 Base de données relationnelles

5.6.1 Aperçu

R peut aussi importer des données depuis une base de données relationnelles. Celle-ci peut aussi bien être locale, installée sur le poste de travail, que distante, installée sur un serveur accessible via Internet. Nous allons illustrer ici avec une base locale.

Les packages varient d’un type de base à un autre:

  • RMySQL pour MySQL,

  • RPostgreSQL pour PostgreSQL

  • RSQLite: pour SQLite

  • etc.

Pour plus de détails, consulter cette page.

5.6.2 Importation avec RODBC

Commençons par ouvrir le chaine de communication entre R et la base via ODBC (Open Data Base Connectivity).

# Chargement du package "RODBC"
library(RODBC) 
dswr <- odbcConnect(
  # Indiquer le nom de la chaîne de connection 
  dsn = "dswr", 
  # Indiquer l'identifiant (s'il y'en a)
  uid = "", 
  # Indiquer le mot de passe (s'il y'en a)
  pwd = "" 
  )

Maintenant, importons la table qui nous intéresse, RGPH_MLI. Pour celà, deux méthodes sont possibles.

# Méthode 1: extraction de la table
RGPH_MLI_rodbc_tbl <- sqlFetch(
  # Indiquer le nom de la chaîne de connection
  dswr, 
  # Indiquer le nom de la table
  sqtable = "RGPH_MLI"
  ) 

# Méthode 2: requête SQL
RGPH_MLI_rodbc_sql <- sqlQuery(
  # Indiquer le nom de la chaîne de connection
  channel = dswr, 
  # Selectionner toutes les colonnes et lignes de la table "RGPH_MLI"
  query = "SELECT * FROM RGPH_MLI;"
  )

Une fois les extractions de données finie, il faut penser à briser la chaîne de connection, fermer la porte.

odbcClose(dswr)

5.6.3 Importation avec odbc

Une autre solution est de passe par le package odbc.

# Chargement du package "odbc"
library(odbc)
# Chargement du package "DBI"
library(DBI) 

# Importation
dswr <- dbConnect(
  # Indiquer le package utilisé par l'interfacee "DBI"
  odbc::odbc(), 
  # Indiquer le nom de la chaîne de connection
  "dswr"
  )

Comme avant, on peut importer la table d’intérêt par deux méthodes.

# Méthode 1: extraction de la table
RGPH_MLI_odbc <- dbReadTable(
  # Indiquer le nom de la chaîne de connection
  conn = dswr, 
  # Indiquer le nom de la table indiquer
  name = "RGPH_MLI"
  ) 

# Méthode 2: requête SQL
RGPH_MLI_odbc_sql <- dbGetQuery(
  # Indiquer le nom de la chaîne de connection
  conn = dswr, 
  # Selectionner toutes les colonnes et lignes de la table "RGPH_MLI"
  "SELECT * FROM RGPH_MLI;"
  )

Comme avant, en bon invité, on ferme la porte en sortant.

dbDisconnect(dswr)

5.7 Depuis Internet

5.7.1 Aperçu

Les données peuvent aussi être tirées de la toile mondiale. Les outils disponibles dans R varient selon le type de données.

5.7.2 Chargement de fichier CSV

Pour un fichier CSV, le chargement dans l’environnement R se fait de la même façon que pour des fichiers locaux.

url <- "https://raw.githubusercontent.com/fousseynoubah/dswr_slides/master/4_Importer_Donnees_dans_R/data/RGPH_MLI.csv"
RGPH_MLI_csv_online <- read.csv(url)
# ou
RGPH_MLI_csv_online <- read_csv(url)