5  Acquisition et importation des données

5.1 Introduction

Avant d’analyser, il faut obtenir les données et les lire correctement dans R. Ce chapitre couvre les sources courantes (CSV, Excel, texte), l’export, les jeux intégrés, les chemins de fichiers, ainsi que les principes d’accès aux bases et au Web — le tout de façon utilisable hors ligne une fois les fichiers présents dans data/.

5.2 Objectifs pédagogiques

  • Identifier les principales sources de données
  • Importer CSV, Excel et fichiers texte
  • Exporter des résultats
  • Gérer les chemins et le dossier de travail
  • Vérifier la qualité d’un import
  • Comprendre (sans dépendance réseau) bases de données et API

5.3 Prérequis

Chapter 4 (data frames, fonctions). Fichiers disponibles dans data/.

5.4 Comprendre les sources de données

Source Exemple Package / fonction
CSV exports ERP, open data readr::read_csv, read.csv
Excel fichiers métier readxl::read_excel
Texte logs, exports TSV read.table, read_tsv
R intégré mtcars, iris data()
Base SQL PostgreSQL, SQLite DBI, RSQLite
API / Web JSON, HTML httr2, jsonlite
Vocabulaire
  • Encodage : représentation des caractères (UTF-8 recommandé).
  • Séparateur : , ; ou tabulation entre colonnes.
  • En-tête : première ligne = noms de variables.
  • Données brutes : fichier original non modifié.

5.5 Importer des fichiers CSV

library(readr)

ventes <- read_csv("data/ventes.csv", show_col_types = FALSE)
head(ventes, 3)
#> # A tibble: 3 × 7
#>   id_vente date       region produit quantite prix_unitaire montant
#>   <chr>    <date>     <chr>  <chr>      <dbl>         <dbl>   <dbl>
#> 1 V0001    2023-03-07 Nord   Cahier         6          7.32    43.9
#> 2 V0002    2023-02-06 Nord   Agenda        19          5.45   104. 
#> 3 V0003    2023-02-14 Nord   Stylo          4          9.78    39.1
nrow(ventes)
#> [1] 201
colnames(ventes)
#> [1] "id_vente"      "date"          "region"        "produit"      
#> [5] "quantite"      "prix_unitaire" "montant"

Avec le R de base :

ventes_base <- read.csv("data/ventes.csv", fileEncoding = "UTF-8")
# stringsAsFactors = FALSE est le défaut depuis R 4.0
readr vs read.csv

read_csv est plus rapide, devine mieux les types et retourne un tibble. Pour ce livre, nous privilégions readr (tidyverse).

Fichier « sale » (noms irréguliers) :

brut <- read_csv("data/brut/ventes_brutes.csv", show_col_types = FALSE)
names(brut)
#> [1] "ID"           "Date_Vente"   "REGION"       "Produit"      "Qte"         
#> [6] "PrixUnitaire" "TOTAL"

5.6 Lire des fichiers Excel

library(readxl)

# Lister les feuilles
excel_sheets("data/ventes.xlsx")
#> [1] "Ventes" "Resume"
ventes_xl <- read_excel("data/ventes.xlsx", sheet = 1)
head(ventes_xl, 2)
#> # A tibble: 2 × 7
#>   id_vente date                region produit quantite prix_unitaire montant
#>   <chr>    <dttm>              <chr>  <chr>      <dbl>         <dbl>   <dbl>
#> 1 V0001    2023-03-07 00:00:00 Nord   Cahier         6          7.32    43.9
#> 2 V0002    2023-02-06 00:00:00 Nord   Agenda        19          5.45   104.

Arguments utiles : sheet, range, skip, na.

5.7 Importer des fichiers texte

meteo_txt <- read_tsv("data/meteo_extrait.txt", show_col_types = FALSE)
head(meteo_txt, 3)
#> # A tibble: 3 × 5
#>   date       temperature_c precipitations_mm humidite_pct ville       
#>   <date>             <dbl>             <dbl>        <dbl> <chr>       
#> 1 2023-01-01          10.1               1.8           74 Exempleville
#> 2 2023-01-02          12.1               0.6           61 Exempleville
#> 3 2023-01-03          12.4               0.2           67 Exempleville

Ou :

meteo2 <- read.table(
  "data/meteo_extrait.txt",
  header = TRUE,
  sep = "\t",
  fileEncoding = "UTF-8"
)

5.8 Exporter des données

write_csv(ventes, "outputs/ventes_export.csv")
write.csv(ventes, "outputs/ventes_export_base.csv", row.names = FALSE)
dir.create("outputs", showWarnings = FALSE)
write_csv(head(ventes, 10), "outputs/ventes_apercu.csv")
file.exists("outputs/ventes_apercu.csv")
#> [1] TRUE

5.9 Jeux de données intégrés

data(mtcars)
data(iris)
# Liste partielle
head(ls("package:datasets"), 15)
#>  [1] "ability.cov"   "airmiles"      "AirPassengers" "airquality"   
#>  [5] "anscombe"      "attenu"        "attitude"      "austres"      
#>  [9] "beaver1"       "beaver2"       "BJsales"       "BJsales.lead" 
#> [13] "BOD"           "cars"          "ChickWeight"

Des packages apportent aussi des données (palmerpenguins, ggplot2::mpg, etc.).

5.10 Chemins de fichiers et dossiers de travail

getwd()
#> [1] "C:/Users/Alhamdoulilah/Desktop/LIVRE R/formation-r"
list.files("data")
#> [1] "brut"              "clients.csv"       "commandes.csv"    
#> [4] "demographie.csv"   "etudes_notes.csv"  "meteo.csv"        
#> [7] "meteo_extrait.txt" "ventes.csv"        "ventes.xlsx"
file.exists("data/ventes.csv")
#> [1] TRUE
Évitez setwd() dans les scripts partagés

Le chemin absolu d’un collègue diffère du vôtre. Préférez un projet RStudio (.Rproj) ou le package here.

# Bon : relatif au projet
read_csv("data/ventes.csv")

# Fragile : chemin absolu machine-dépendant
# read_csv("C:/Users/Moi/Desktop/ventes.csv")

5.11 Principes d’accès aux bases de données

Sans installer de serveur, retenez le schéma mental :

# Exemple conceptuel avec SQLite
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), "data/exemple.sqlite")
dbListTables(con)
df <- dbGetQuery(con, "SELECT * FROM ventes LIMIT 10")
dbDisconnect(con)

Idées clés : connexion → requête SQL → data frame → fermer la connexion. Ne committez jamais de mots de passe dans Git.

5.12 API et données Web (principes hors ligne)

Les API renvoient souvent du JSON. Le flux typique :

  1. Requête HTTP (httr2 / httr)
  2. Parsing JSON (jsonlite)
  3. Normalisation en data frame (tidyr::unnest, etc.)

Pour ce livre, les exercices restent sur fichiers locaux afin de fonctionner sans Internet.

5.13 Vérifier la qualité des données importées

library(dplyr)

glimpse(ventes)
#> Rows: 201
#> Columns: 7
#> $ id_vente      <chr> "V0001", "V0002", "V0003", "V0004", "V0005", "V0006", "V…
#> $ date          <date> 2023-03-07, 2023-02-06, 2023-02-14, 2023-07-07, 2023-09…
#> $ region        <chr> "Nord", "Nord", "Nord", "Ouest", NA, "Ouest", "Nord", "S…
#> $ produit       <chr> "Cahier", "Agenda", "Stylo", "Marqueur", "Cahier", "Clas…
#> $ quantite      <dbl> 6, 19, 4, 20, 10, 6, 14, 3, 18, 1, 17, 9, 15, 9, 7, 1, 8…
#> $ prix_unitaire <dbl> 7.32, 5.45, 9.78, 3.16, 13.57, 12.47, 19.46, 23.10, 16.9…
#> $ montant       <dbl> 43.92, 103.55, 39.12, 63.20, 135.70, 74.82, 272.44, 69.3…
summary(ventes)
#>    id_vente              date               region            produit         
#>  Length:201         Min.   :2023-01-01   Length:201         Length:201        
#>  Class :character   1st Qu.:2023-04-15   Class :character   Class :character  
#>  Mode  :character   Median :2023-07-07   Mode  :character   Mode  :character  
#>                     Mean   :2023-07-03                                        
#>                     3rd Qu.:2023-09-29                                        
#>                     Max.   :2023-12-29                                        
#>                                                                               
#>     quantite     prix_unitaire      montant      
#>  Min.   : 1.00   Min.   : 1.62   Min.   :  3.72  
#>  1st Qu.: 5.00   1st Qu.: 7.32   1st Qu.: 41.58  
#>  Median :10.00   Median :12.39   Median :104.09  
#>  Mean   :10.38   Mean   :12.93   Mean   :129.52  
#>  3rd Qu.:15.00   3rd Qu.:19.02   3rd Qu.:195.36  
#>  Max.   :20.00   Max.   :24.73   Max.   :483.20  
#>  NA's   :1
# Valeurs manquantes par colonne
colSums(is.na(ventes))
#>      id_vente          date        region       produit      quantite 
#>             0             0             2             0             1 
#> prix_unitaire       montant 
#>             0             0
# Doublons potentiels
sum(duplicated(ventes))
#> [1] 1

Checklist d’import :

  1. Nombre de lignes / colonnes attendu ?
  2. Types corrects (dates en date, nombres en numeric) ?
  3. Encodage des accents OK ?
  4. NA, doublons, valeurs extrêmes ?
meteo <- read_csv("data/meteo.csv", show_col_types = FALSE)
summary(meteo$temperature_c)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   -3.60    5.80   11.90   12.11   18.30   27.00
range(meteo$date)
#> [1] "2023-01-01" "2023-12-31"

5.14 Démonstration complète

library(readr)
library(dplyr)

ventes <- read_csv("data/ventes.csv", show_col_types = FALSE)

rapport_import <- list(
  lignes = nrow(ventes),
  colonnes = ncol(ventes),
  na_total = sum(is.na(ventes)),
  periode = range(ventes$date, na.rm = TRUE),
  montant_moyen = mean(ventes$montant, na.rm = TRUE)
)
rapport_import
#> $lignes
#> [1] 201
#> 
#> $colonnes
#> [1] 7
#> 
#> $na_total
#> [1] 3
#> 
#> $periode
#> [1] "2023-01-01" "2023-12-29"
#> 
#> $montant_moyen
#> [1] 129.5235

5.15 Erreurs fréquentes

Symptôme Cause Remède
Accents cassés Mauvais encodage locale = locale(encoding = "UTF-8") ou fileEncoding
Une seule colonne Mauvais séparateur read_csv2 (;) ou delim
Dates en caractère Parsing col_date() ou lubridate
Fichier introuvable Mauvais getwd() Projet RStudio + chemins relatifs

5.16 Exercices

5.16.1 Niveau 1

  1. Importez data/demographie.csv et affichez glimpse().
  2. Combien de feuilles dans data/ventes.xlsx ?

5.16.2 Niveau 2

  1. Importez data/meteo_extrait.txt et calculez la température moyenne.
  2. Exportez les 20 premières lignes de ventes vers outputs/exo_ventes.csv.

5.16.3 Niveau 3

  1. Écrivez une fonction diagnostiquer(chemin) qui retourne un tibble : n_lignes, n_cols, n_na, n_doublons.
  2. Comparez read_csv("data/brut/ventes_brutes.csv") et read_csv("data/ventes.csv") : que remarquez-vous sur les noms de colonnes ?

5.17 Corrections

demo <- read_csv("data/demographie.csv", show_col_types = FALSE)
glimpse(demo)
#> Rows: 150
#> Columns: 6
#> $ id             <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, …
#> $ age            <dbl> 26, 68, 150, 61, 22, 30, 54, 31, 60, 30, 64, 44, 55, 27…
#> $ sexe           <chr> "Femme", "Homme", "Femme", "Homme", "Homme", "Homme", "…
#> $ ville          <chr> "Lille", "Marseille", "Paris", "Marseille", "Toulouse",…
#> $ revenu_mensuel <dbl> 1388, 2050, 1104, 2117, 2953, 2382, 50000, 3007, 1655, …
#> $ niveau_etudes  <chr> "Licence", "Bac", "Bac", "Autre", "Master", "Licence", …
excel_sheets("data/ventes.xlsx")
#> [1] "Ventes" "Resume"
m <- read_tsv("data/meteo_extrait.txt", show_col_types = FALSE)
mean(m$temperature_c)
#> [1] 14.03333
write_csv(head(ventes, 20), "outputs/exo_ventes.csv")
diagnostiquer <- function(chemin) {
  x <- read_csv(chemin, show_col_types = FALSE)
  tibble(
    fichier = basename(chemin),
    n_lignes = nrow(x),
    n_cols = ncol(x),
    n_na = sum(is.na(x)),
    n_doublons = sum(duplicated(x))
  )
}
diagnostiquer("data/ventes.csv")
#> # A tibble: 1 × 5
#>   fichier    n_lignes n_cols  n_na n_doublons
#>   <chr>         <int>  <int> <int>      <int>
#> 1 ventes.csv      201      7     3          1

5.18 Points clés

  • Préférez chemins relatifs et fichiers dans data/.
  • Vérifiez toujours types, NA et dimensions après import.
  • CSV / Excel / texte couvrent 90 % des besoins débutants.
  • Bases et API suivent le même principe : connecter → lire → tabulariser.

5.19 Ressources

  • vignette("readr"), documentation readxl
  • Wickham et al. (2019)

5.20 Suite

Chapter 6 : nettoyer, transformer et joindre les données avec dplyr et tidyr.