Séance du 26 janvier et 26 janvier Bis

Import des libraries

library(stringr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ purrr     1.2.1
## ✔ forcats   1.0.1     ✔ readr     2.1.6
## ✔ ggplot2   4.0.1     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.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(tidytext)
data_textuelle <- tibble( nom = c("Mr Eric Legrand", "Mme Anabelle Dupont", "Mme Fatou Slaoui"), adresse = c("12 rue Archimède", "47 avenue de la Libération", "3 rue des Fleurs"), ville = c("Niort", "Poitiers", "Marseille") )

Exercice 1

# Conversion en minuscules
data_textuelle_lower <- str_to_lower(data_textuelle)
## Warning in stri_trans_tolower(string, locale = locale): argument is not an
## atomic vector; coercing
# Conversion en majuscules
data_textuelle_upper <-str_to_upper(data_textuelle)
## Warning in stri_trans_toupper(string, locale = locale): argument is not an
## atomic vector; coercing
# Format capitalisé
data_textuelle_to_string <-str_to_title(data_textuelle)
## Warning in stri_trans_totitle(string, opts_brkiter = stri_opts_brkiter(locale =
## locale)): argument is not an atomic vector; coercing

Exercice 1 Bis

data_textuelle <- data_textuelle %>%
  mutate(
    # Majuscules
    nom_maj = toupper(nom),
    adresse_maj = toupper(adresse),
    ville_maj = toupper(ville),

    # Minuscules
    nom_min = tolower(nom),
    adresse_min = tolower(adresse),
    ville_min = tolower(ville),

    # Capitalisation (première lettre en majuscule)
    nom_cap = str_to_title(nom),
    adresse_cap = str_to_title(adresse),
    ville_cap = str_to_title(ville)
  )

# Afficher le résultat
print(data_textuelle)
## # A tibble: 3 × 12
##   nom            adresse ville nom_maj adresse_maj ville_maj nom_min adresse_min
##   <chr>          <chr>   <chr> <chr>   <chr>       <chr>     <chr>   <chr>      
## 1 Mr Eric Legra… 12 rue… Niort MR ERI… 12 RUE ARC… NIORT     mr eri… 12 rue arc…
## 2 Mme Anabelle … 47 ave… Poit… MME AN… 47 AVENUE … POITIERS  mme an… 47 avenue …
## 3 Mme Fatou Sla… 3 rue … Mars… MME FA… 3 RUE DES … MARSEILLE mme fa… 3 rue des …
## # ℹ 4 more variables: ville_min <chr>, nom_cap <chr>, adresse_cap <chr>,
## #   ville_cap <chr>

Exercice 2

# On crée une nouvelle colonne avec la ville en majuscules
data_ex2 <- paste0(data_textuelle[["adresse"]], data_textuelle[["ville"]], sep=",")
data_ex2
## [1] "12 rue ArchimèdeNiort,"              "47 avenue de la LibérationPoitiers,"
## [3] "3 rue des FleursMarseille,"

Exercice 2 Bis

data_textuelle <- data_textuelle %>%
  mutate(adresse_complete = paste(adresse, toupper(ville)))
data_textuelle

Exercice 3

# Version avec séparateur "_"
data_sep <- paste(data_textuelle$nom, data_textuelle$adresse, data_textuelle$ville, sep = "_")

# Version avec collapse "|" (crée une seule grande chaîne de caractères)
data_collapsed <- paste(data_textuelle$nom, data_textuelle$adresse, data_textuelle$ville, collapse = " | ")

data_collapsed
## [1] "Mr Eric Legrand 12 rue Archimède Niort | Mme Anabelle Dupont 47 avenue de la Libération Poitiers | Mme Fatou Slaoui 3 rue des Fleurs Marseille"

Exercice 3 Bis

data_textuelle <- data_textuelle %>%
  mutate(
    info_complete = paste(nom, adresse, toupper(ville), sep = "-", collapse = "|")
  )

Exercice 4

liste_decoupee <- str_split(data_collapsed, pattern = fixed("|"))

liste_decoupee
## [[1]]
## [1] "Mr Eric Legrand 12 rue Archimède Niort "                  
## [2] " Mme Anabelle Dupont 47 avenue de la Libération Poitiers "
## [3] " Mme Fatou Slaoui 3 rue des Fleurs Marseille"

Exercice 4 Bis

data_textuelle <- data_textuelle %>%
  mutate(
    # Extraire le genre (Mr/Mme)
    genre = str_extract(nom, "^(Mr|Mme)"),
    # Extraire le prénom (mot après le genre)
    prénom = str_extract(nom, "(?<=Mr|Mme )[A-Za-z]+"),
    # Extraire le nom de famille (le reste)
    nom_famille = str_extract(nom, "(?<=[A-Za-z] ).+")
  )

# Afficher le résultat
print(data_textuelle)
## # A tibble: 3 × 17
##   nom            adresse ville nom_maj adresse_maj ville_maj nom_min adresse_min
##   <chr>          <chr>   <chr> <chr>   <chr>       <chr>     <chr>   <chr>      
## 1 Mr Eric Legra… 12 rue… Niort MR ERI… 12 RUE ARC… NIORT     mr eri… 12 rue arc…
## 2 Mme Anabelle … 47 ave… Poit… MME AN… 47 AVENUE … POITIERS  mme an… 47 avenue …
## 3 Mme Fatou Sla… 3 rue … Mars… MME FA… 3 RUE DES … MARSEILLE mme fa… 3 rue des …
## # ℹ 9 more variables: ville_min <chr>, nom_cap <chr>, adresse_cap <chr>,
## #   ville_cap <chr>, adresse_complete <chr>, info_complete <chr>, genre <chr>,
## #   prénom <chr>, nom_famille <chr>

Exercice 5

data_split_cols <- data_textuelle %>%
  separate(nom, into = c("genre", "prenom", "nom"), sep = " ")

data_split_cols

Exercice 6

data_text <- tibble( id = 1 :3, texte = c( "La data science est un domaine interdisciplinaire.", "Le text mining permet d’analyser des documents.", "Les ingénieurs utilisent R et Python pour le NLP." ) )

Exercice 6 Bis

# Identifier les adresses contenant "Libération"
id_liberation <- which(grepl("Libération", data_textuelle$adresse))

# Compter le nombre d'adresses contenant "Libération"
nombre_liberation <- sum(grepl("Libération", data_textuelle$adresse))

# Afficher les résultats
print(id_liberation)
## [1] 2
print(nombre_liberation)
## [1] 1

Exercice 7

# Exercice 7 : Nettoyage
data_text_propre <- data_text %>%
  mutate(texte = str_to_lower(texte)) %>%
  mutate(texte = str_replace_all(texte, "[:punct:]", "")) %>%
  mutate(texte = str_replace_all(texte, "[:digit:]", ""))

Exercice 7 Bis

# Extraire les adresses contenant "Libération"
adresses_liberation <- data_textuelle$adresse[grepl("Libération", data_textuelle$adresse)]

# Afficher le résultat
print(adresses_liberation)
## [1] "47 avenue de la Libération"

Exercice 8

# Tokenisation
tokens <- data_text_propre %>%
  unnest_tokens(word, texte)

# Calcul de la fréquence
frequence <- tokens %>%
  count(word, sort = TRUE)

frequence

Exercice 8 Bis

# Remplacer "Mr" par "M." dans la colonne `nom`
data_textuelle$nom <- str_replace(data_textuelle$nom, "Mr", "M.")

# Remplacer "rue" par "Rue" et "avenue" par "Avenue" dans la colonne `adresse`
data_textuelle$adresse <- str_replace(data_textuelle$adresse, "rue", "Rue")
data_textuelle$adresse <- str_replace(data_textuelle$adresse, "avenue", "Avenue")

# Isoler les numéros de rue dans une nouvelle colonne `numero_rue`
data_textuelle$numero_rue <- str_extract(data_textuelle$adresse, "^\\d+")

print(data_textuelle)
## # A tibble: 3 × 18
##   nom            adresse ville nom_maj adresse_maj ville_maj nom_min adresse_min
##   <chr>          <chr>   <chr> <chr>   <chr>       <chr>     <chr>   <chr>      
## 1 M. Eric Legra… 12 Rue… Niort MR ERI… 12 RUE ARC… NIORT     mr eri… 12 rue arc…
## 2 Mme Anabelle … 47 Ave… Poit… MME AN… 47 AVENUE … POITIERS  mme an… 47 avenue …
## 3 Mme Fatou Sla… 3 Rue … Mars… MME FA… 3 RUE DES … MARSEILLE mme fa… 3 rue des …
## # ℹ 10 more variables: ville_min <chr>, nom_cap <chr>, adresse_cap <chr>,
## #   ville_cap <chr>, adresse_complete <chr>, info_complete <chr>, genre <chr>,
## #   prénom <chr>, nom_famille <chr>, numero_rue <chr>

Exercice 9

texte_alice <- "Tom was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice he had peeped into the book his sister was reading, but it had no pictures or conversations in it, 'and what is the use of a book,' thought Alice 'without pictures or conversation ?'" 

# Tokenisation et calcul des probabilités
alice_stats <- tibble(texte = texte_alice) %>%
  unnest_tokens(word, texte) %>%
  count(word, name = "nb_occurrences") %>% 
  mutate(probabilite = nb_occurrences / sum(nb_occurrences)) 

# Évaluation 
alice_stats %>% 
  filter(word %in% c("of", "tom", "was", "to"))

Exercice 10

id_liberation <- str_which(data_textuelle$adresse, "Libération")
nombre_concerne <- length(id_liberation)

Exercice 11

valeurs_liberation <- str_extract(data_textuelle$adresse, "Libération")

Exercice 12

data_textuelle_clean <- data_textuelle %>%
  # Remplacer Mr par M. 
  mutate(nom = str_replace(nom, "Mr", "M.")) %>%
  # Remplacer rue/avenue par Rue/Avenue 
  mutate(adresse = str_replace_all(adresse, c("rue" = "Rue", "avenue" = "Avenue"))) %>%
  # Isoler les numéros de rue 
  mutate(num_rue = str_extract(adresse, "\\d+")) 

data_textuelle_clean

Exercice 13

# Ajout des espaces 
data_espaces <- data_textuelle %>%
  mutate(adresse_pad = str_pad(adresse, width = 30, side = "both"))

# Supprimer les espaces
data_espaces %>%
  mutate(adresse_clean = str_trim(adresse_pad)) %>%
  select(adresse_pad, adresse_clean)

Exercice 14

data_textuelle %>%
  mutate(
    a_un_numero = str_detect(adresse, "[:digit:]+"), # ou "\\d+" [cite: 340]
    numero_extrait = str_extract(adresse, "[:digit:]+"))

Exercice 15

#création dataframe
df_prix <- tibble(
  Id = 1:4,
  Montant = c("10$", "20$", "40$", "50$"))

#  Détecter le symbole $ 
str_detect(df_prix$Montant, fixed("$"))
## [1] TRUE TRUE TRUE TRUE
# mean(df_prix$Montant) on a pas réussit

# Nettoyage
df_prix <- df_prix %>%
  mutate(Prix = as.numeric(str_replace(Montant, fixed("$"), "")))

mean(df_prix$Prix)
## [1] 30

Exercice 15 Bis

# 15.1

# Création du Dataframe
df <- tibble(
  Id = 1:4,
  Montant = c("10$", "20$", "40$", "50$")
)

# 15.2

# Détecter la présence du symbole "$" dans la colonne Montant
presence_dollar <- grepl("\\$", df$Montant)

print(presence_dollar)
## [1] TRUE TRUE TRUE TRUE
# 15.3

# Pour calculer la moyenne de la colonne Montant, il faut d'abord enlever le symbole "$" et convertir les valeurs en numérique avec as.numeric(gsub("\\$", "", Montant)). Ensuite, on peux utiliser mean() pour obtenir la moyenne.

# 15.4

df <- df %>%
  mutate(Prix = as.numeric(gsub("\\$", "", Montant)))

moyenne_prix <- mean(df$Prix, na.rm = TRUE)
print(moyenne_prix)
## [1] 30
df

Exercice 16

# Chargement des données 
library(nycflights13)

flights_logic <- flights %>%
  mutate(
    retard_dep = dep_delay > 0,
    retard_extreme = dep_delay >= 60,
    on_time = dep_delay == 0
  ) %>%
  mutate(statut = case_when(
    dep_delay > 0 ~ "Retard",
    dep_delay == 0 ~ "A l'heure",
    dep_delay < 0 ~ "En avance"
  ))

# Résultat
flights_logic %>% select(dep_delay, retard_dep, retard_extreme, on_time, statut) %>% head()

Créer une variable classe_retard (Bis)

flights <- flights %>%
  mutate(classe_retard = case_when(
    dep_delay <= 0 ~ "à l'heure ou avance",
    dep_delay >= 1 & dep_delay <= 15 ~ "petit retard",
    dep_delay >= 16 & dep_delay <= 60 ~ "retard moyen",
    dep_delay > 60 ~ "retard important",
    TRUE ~ NA_character_
  ))
flights

Détecter les créneaux horaires (Bis)

flights <- flights %>%
  mutate(
    heure_dep = dep_time / 60  # Convertit en décimal pour comparaison
  ) %>%
  mutate(creneau = case_when(
    heure_dep >= 5.00 & heure_dep < 8.99 ~ "matin",
    heure_dep >= 9.00 & heure_dep < 12.99 ~ "fin matin",
    heure_dep >= 13.00 & heure_dep < 16.99 ~ "après-midi",
    heure_dep >= 17.00 & heure_dep < 20.99 ~ "soir",
    (heure_dep >= 21.00) | (heure_dep < 5.00) ~ "nuit",
    TRUE ~ NA_character_
  ))
flights