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.
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)